Commit 3640d6b1 authored by Victor Dubois's avatar Victor Dubois

petit robot

parent 848833ae
#include "Capteur.h"
#include "Arduino.h"
#include "Sharp.h"
#include "Ultrason.h"
Capteur::Capteur(int capteurPin) : capteurPin(capteurPin), valeur(0)
{
//capteurPin = capteurPin;
//valeur = 0;
}
Capteur::Capteur(int capteurPin, int valeur) : capteurPin(capteurPin), valeur(valeur)
{
//capteurPin = capteurPin;
//valeur = 0;
}
Capteur::~Capteur()
{
}
int Capteur::GetValue()
{
Update();
return valeur;
}
void Capteur::Update()
{
}
#ifndef DEF_CAPTEUR // Si la constante n'a pas été définie` le fichier n'a jamais été inclus
#define DEF_CAPTEUR // On définit la constante pour que la prochaine fois le fichier ne soit plus inclus
class Capteur
{
public:
Capteur(int capteurPin);
Capteur(int capteurPin, int valeur);
~Capteur();
int GetValue();
void Update();
private:
protected://Les capteurs sharp peuvent modifier leurs "valeur".
int valeur; //Distance ou autre, la valeur renvoyée par le capteur.
int capteurPin;
};
#endif
#include "Detection.h"
#include "Arduino.h"
#include "Capteur.h"
#include "Ultrason.h"
#include "Sharp.h"
//enum sharpDetectant { AUCUN, GAUCHE, DROITE, TTAVANT, ARRIERE, TTGAUCHE, TTDROITE, TT, AUCUNETHAUT, GAUCHEETHAUT, DROITEETHAUT, TTAVANTETHAUT, ARRIEREETHAUT, TTGAUCHEETHAUT, TTDROITEETHAUT, TTETHAUT, AUCUNETMILIEU, GAUCHEETMILIEU, DROITEETMILIEU, TTAVANTETMILIEU, ARRIEREETMILIEU, TTGAUCHEETMILIEU, TTDROITEETMILIEU, TTETMILIEU, AUCUNETHAUTETMILIEU, GAUCHEETHAUTETMILIEU, DROITEETHAUTETMILIEU, TTAVANTETHAUTETMILIEU, ARRIEREETHAUTETMILIEU, TTGAUCHEETHAUTETMILIEU, TTDROITEETHAUTETMILIEU, TTETHAUTETMILIEU};
//enum sharpDetectant { AUCUN, GAUCHE, DROITE, TTAVANT, ARRIERE, TTGAUCHE, TTDROITE, TT };
enum numeroSharp { GAUCHE, DROITE, MILIEU, HAUT, ARRIERE };
enum sens { AVANCER, RECULER, TOURNEGAUCHE, TOURNEDROITE, AVANCERBOUTEILLE };
/*#define pinSharpAvG A6
#define pinSharpAvD A4
#define pinSharpArr A7
#define pinUltrason 10*/
#define seuilSharpAvG 350
#define seuilSharpAvD 350
#define seuilSharpMilieu 350
#define seuilSharpHaut 350
#define seuilSharpArr 350
Detection::Detection()
{
for (int initcvqqch = 0 ; initcvqqch<NOMBRECAPTEUR ; initcvqqch++)
{
capteurVoitQQch[initcvqqch]=0;
capteurVoitObstacle[initcvqqch]=0;
}
//int t=0;
//Ultrason ping(10);
capteurSharp = (Sharp**) malloc(sizeof( Sharp*)*NOMBRECAPTEUR);
capteurSharp[GAUCHE] = new Sharp(A1, seuilSharpAvG);
capteurSharp[DROITE] = new Sharp(A3, seuilSharpAvD);
capteurSharp[MILIEU] = new Sharp(A5, seuilSharpMilieu);
capteurSharp[HAUT] = new Sharp(A4, seuilSharpHaut);
capteurSharp[ARRIERE]= new Sharp(A6, seuilSharpArr);
//Sharp capteurAvantG(A6, seuilSharpAvG), capteurAvantD(A4, seuilSharpAvD), capteurArriere(A7, seuilSharpArr);//Initialisation des 3 capteurs sharp.
/*capteurAvantG = new Sharp(A1, seuilSharpAvG);
capteurAvantD = new Sharp(A3, seuilSharpAvD);
capteurMilieu = new Sharp(A5, seuilSharpMilieu);//peut-etre l'inverse avec haut
capteurHaut = new Sharp(A4, seuilSharpHaut);//peut-etre l'inverse avec milieu
capteurArriere = new Sharp(A6, seuilSharpArr);//Initialisation des 5 capteurs sharp.*/
//ping = new Ultrason(t);
}
Detection::~Detection()
{
}
int Detection::JePeuxAvancer(int sensVoulu)//Utilise LireCapteursSharp pour déterminer si le robot peux avancer ou non.
{
LireCapteursDistance();//On met à jour
if(sensVoulu==AVANCER)
{
return !(capteurVoitObstacle[GAUCHE] || capteurVoitObstacle[DROITE] || capteurVoitObstacle[MILIEU]|| capteurVoitQQch[HAUT]);// || capteurVoitQQch[HAUT]);
}
if(sensVoulu==RECULER)
{
return !(capteurVoitObstacle[ARRIERE]);
}
if(sensVoulu==TOURNEGAUCHE)
{
return !(capteurVoitObstacle[GAUCHE] || capteurVoitObstacle[MILIEU]);
}
if(sensVoulu==TOURNEDROITE)
{
return !(capteurVoitObstacle[DROITE] || capteurVoitObstacle[MILIEU]);
}
if(sensVoulu==AVANCERBOUTEILLE)
{
if((capteurVoitObstacle[GAUCHE] || capteurVoitObstacle[DROITE] || capteurVoitObstacle[MILIEU]) && !capteurVoitObstacle[HAUT])
{
return 2;//On est à deux doigts de taper la bouteille
}
else
{
return !(capteurVoitObstacle[HAUT]);
}
}
}
void Detection::LireCapteursDistance()//Systeme de mémoire hystérisis : si on a vu qqch, il faut rien voir pendant 8 tours pour décider qu'il n'y a plus d'obstacle, et inversement pour voir si on n'a rien vu.
{
for(int iLireCapteurs = GAUCHE ; iLireCapteurs<= ARRIERE ; iLireCapteurs++)
{
if(capteurVoitObstacle[iLireCapteurs])//Si on sait etre devant un obstacle
{
if(!capteurSharp[iLireCapteurs]->VoitQQch())
{
capteurVoitQQch[iLireCapteurs]--;//On décrémente si on ne voit rien.
}
else
{
capteurVoitQQch[iLireCapteurs]=8;//Sinon on remet le compteur à 8.
}
if(capteurVoitQQch[iLireCapteurs]==0)
{
capteurVoitObstacle[iLireCapteurs]=0;
}
}
else//Si on n'est pas devant un obstacle
{
if(capteurSharp[iLireCapteurs]->VoitQQch())
{
capteurVoitQQch[iLireCapteurs]++;//On décrémente si on ne voit rien.
}
else
{
capteurVoitQQch[iLireCapteurs]=0;//Sinon on remet le compteur à 8.
}
if(capteurVoitQQch[iLireCapteurs]==8)
{
capteurVoitObstacle[iLireCapteurs]=1;
}
}
}
/*
capteurVoitQQch[GAUCHE]=min(8,(capteurVoitQQch[GAUCHE]+1)*capteurAvantG->VoitQQch());
capteurVoitQQch[DROITE]=min(8,(capteurVoitQQch[DROITE]+1)*capteurAvantD->VoitQQch());
capteurVoitQQch[MILIEU]=min(8,(capteurVoitQQch[MILIEU]+1)*capteurMilieu->VoitQQch());
capteurVoitQQch[HAUT]=min(8,(capteurVoitQQch[MILIEU]+1)*capteurHaut->VoitQQch());
capteurVoitQQch[ARRIERE]=min(8,(capteurVoitQQch[ARRIERE]+1)*capteurArriere->VoitQQch());*/
/*capteurVoitQQch[GAUCHE]=capteurAvantG->VoitQQch();
capteurVoitQQch[DROITE]=capteurAvantD->VoitQQch();
capteurVoitQQch[MILIEU]=capteurMilieu->VoitQQch();
capteurVoitQQch[HAUT]=capteurHaut->VoitQQch();
capteurVoitQQch[ARRIERE]=capteurArriere->VoitQQch();*/
}
#ifndef DEF_DETECTION // Si la constante n'a pas été définie` le fichier n'a jamais été inclus
#define DEF_DETECTION // On définit la constante pour que la prochaine fois le fichier ne soit plus inclus
#include "Sharp.h"
#include "Ultrason.h"
#define NOMBRECAPTEUR 5
class Detection
{
public:
Detection();
~Detection();
int JePeuxAvancer(int sensVoulu);
void LireCapteursDistance();
private:
int capteurVoitQQch[NOMBRECAPTEUR];
int capteurVoitObstacle[NOMBRECAPTEUR];//tableau permettant de pallier le problème du bruit : il faut capter 8 fois d'affillée pour voir un obstacle
//Ultrason ping;
/*Sharp *capteurAvantG;
Sharp *capteurAvantD;
Sharp *capteurMilieu;
Sharp *capteurHaut;
Sharp *capteurArriere;*/
Sharp **capteurSharp;
};
#endif
#include "Diode.h"
#include "Arduino.h"
//using namespace std;
Diode::Diode(int diodePin)//Constructeur
{
int duree = 0;
diodePin = diodePin;
}
Diode::~Diode()//Destructeur
{
}
//On éteind les diodes qui doivent l'etre
//permet d'avoir des diodes allumées pendant des cycles entiers, pour qu'elles soient suffisament lumineuses.
void Diode::DiodeOff()
{
if(dureeEncoreAllumee>1)
{
dureeEncoreAllumee--;
}
else
{
if(dureeEncoreAllumee==1)
{
digitalWrite(diodePin,LOW);
dureeEncoreAllumee--;
}
}
}
void Diode::DiodeOn(int duree)
{
dureeEncoreAllumee=duree;
digitalWrite(diodePin,HIGH);
}
#ifndef DEF_DIODE // Si la constante n'a pas été définie` le fichier n'a jamais été inclus
#define DEF_DIODE // On définit la constante pour que la prochaine fois le fichier ne soit plus inclus
class Diode
{
public:
Diode(int diodePin);
~Diode();
void DiodeOff();//eteind une diode
void DiodeOn(int duree);//allume une diode
private:
int dureeEncoreAllumee;//Correspond au nombre de cycles pendant lesquels la diode va continuer à etre allumée.
int diodePin;//le pin de l'arduino auquel est attché la diode.
};
#endif
#include "Sharp.h"
#include "Arduino.h"
Sharp::Sharp(): Capteur(0)
{
this->seuilDetection=200;
}
Sharp::Sharp(int capteurPin, int seuil) : Capteur(capteurPin, valeur), seuilDetection(seuil)
{
//this->seuilDetection=200;
//valeur=0;
}
void Sharp::Update()
{
valeur = analogRead(capteurPin);
//Serial.println( capteurPin);
//Serial.println( analogRead(capteurPin));
//valeur=0;
}
int Sharp::VoitQQch()
{
Update();
//if(valeur>seuilDetection)
if(valeur>seuilDetection)
{
//delay(100);
return 1;
}
else
{
//Serial.println(0);
return 0;
}
}
#ifndef DEF_SHARP // Si la constante n'a pas été définie` le fichier n'a jamais été inclus
#define DEF_SHARP // On définit la constante pour que la prochaine fois le fichier ne soit plus inclus
#include "Capteur.h"
class Sharp : public Capteur//Un sharp est un capteur : héritage !
{
public:
Sharp();
Sharp(int capteurPin, int seuil);
void Update();//Met à jour la valeur du capteur.
int VoitQQch();//Renvoit 1 si le capteur voie qqch (d'après seuil), 0 sinon.
private:
int seuilDetection;
};
#endif
#include "Ultrason.h"
#include "Arduino.h"
#include "Capteur.h"
#define DELAI_ATTENTE_MAX 10000//On max, on attent 10ms que le son revienne.
#define DISTANCE_MAX_DETECTION 25//S'il y a qqch à moins de 25cm, on s'arrete.
#define DIST_MIN_DETECTION 1//si le capteur renvoit 0, c'est soit que l'objet est très loin, soit qu'il y a un pb.
Ultrason::Ultrason() : Capteur(0)//Je ne vois pas trop comment faire sans mettre un constructeur bidon...
{
}
Ultrason::Ultrason(int capteurPin) : Capteur(capteurPin)
{
}
int Ultrason::VoitQQch()
{
Update();
if(distance < DISTANCE_MAX_DETECTION)
{
return 1;
}
else
{
return 0;
}
}
//int Ultrason::Distance()//Renvoit la distance du plus proche objet du capteur
void Ultrason::Update()
{
// establish variables for duration of the ping,
// and the distance result in inches and centimeters:
long duration, cm;
// The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
// Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
pinMode(capteurPin, OUTPUT);
digitalWrite(capteurPin, LOW);
delayMicroseconds(2);
digitalWrite(capteurPin, HIGH);
delayMicroseconds(5);
digitalWrite(capteurPin, LOW);
// The same pin is used to read the signal from the PING))): a HIGH
// pulse whose duration is the time (in microseconds) from the sending
// of the ping to the reception of its echo off of an object.
pinMode(capteurPin, INPUT);
duration = pulseIn(capteurPin, HIGH,10000);//On n'attend pas plus de 10 millisecondes le signal de retour.
// convert the time into a distance
cm = duration / 29 / 2;
// The speed of sound is 340 m/s or 29 microseconds per centimeter.
// The ping travels out and back, so to find the distance of the
// object we take half of the distance travelled.
if(cm<DIST_MIN_DETECTION)//si le signal n'est pas revenu à temps, il retourne 0. mais en fait l'objet est à au moins 50 cm.
{
cm=50;
}
distance = cm;
}
#ifndef DEF_ULTRASON // Si la constante n'a pas été définie` le fichier n'a jamais été inclus
#define DEF_ULTRASON // On définit la constante pour que la prochaine fois le fichier ne soit plus inclus
#include "Capteur.h"
class Ultrason : public Capteur//Un capteur de distance ultrason est un capteur : héritage !
{
public:
Ultrason();//Constructeur bidon... Uniquement utilisé pour l'initialisation de detection...
Ultrason(int capteurPin);
void Update();//Met à jour la valeur du capteur.
int VoitQQch();//Renvoie 1 s'il y a un objet suffisament proche.
private:
int distance;//distance à laquelle est l'objet le plus proche.
};
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment