Projet ICN robot parlant 2018/2019

De Informatique et Création Numérique
(Différences entre les versions)
Aller à : Navigation, rechercher

Version du 12 décembre 2018 à 14:37

Projet robot parlant Gautier ICN 2018/2019

I/ PARTI MANUEL

Première étape; montage du robot (avec le manuel)(facile mais demande d'être minutieux) 2eme etape :soudure sur le robot des fils et branchement des fils sur la carte arduino

II/ PARTI PROGRAMMATION

/*setup() qui s'exécute qu'une fois ;

loop() qui s'exécute à l'infini ;

void (qui se met toujours devant loop et setup et dont vous comprendrez le sens plus loin dans ce cours) ;

pinMode() qui permet de définir une sortie en mode envoi d'électricité ou non ;

digitalWrite() qui envoie de l'électricité par une sortie ;

delay() qui met le programme en pause pendant un nombre défini de millisecondes.

  • /

int pwmB = 3;

int bin2 = 4;
int bin1 = 5;
int stby = 6;
int ain1 = 7;
int ain2 = 8;
int pwmA = 9;
void avancer(void)//Déclare la fonction qui fait avancer le robot
{
  Serial.println("Avant");
  digitalWrite(ain1, HIGH);//Lance le courant
  digitalWrite(ain2, LOW);
  digitalWrite(stby, HIGH);
  digitalWrite(bin1, HIGH);
  digitalWrite(bin2, LOW);
  analogWrite(pwmA, 131.125);//Donne la puissance du moteur 1
  analogWrite(pwmB, 125);//Donne la puissance du moteur 2 (pour qu'il aille droit)
}
void tour(void) //Déclare la fonction qui fait effectuer un tour au robot
{
  Serial.println("Tour");
  digitalWrite(ain1, LOW);//Lance le courant...
  digitalWrite(ain2, HIGH);//et fait en sorte qu'un des moteurs tourne a l'envers pour que le robot tourne sur lui-même
  digitalWrite(stby, HIGH);
  digitalWrite(bin1, HIGH);
  digitalWrite(bin2, LOW);
  analogWrite(pwmA, 131.125);//Donne la puissance du moteur 1
  analogWrite(pwmB, 125);//Donne la puissance du moteur 2 
  delay(3750);//Donne le temps durant lequel le robot va tourner sur lui-même
  digitalWrite(stby, LOW);//arrête les moteurs
}
void demitour(void)
{
  Serial.println("Tour");
  digitalWrite(ain1, LOW);
  digitalWrite(ain2, HIGH);
  digitalWrite(stby, HIGH);
  digitalWrite(bin1, HIGH);
  digitalWrite(bin2, LOW);
  analogWrite(pwmA, 131.125);
  analogWrite(pwmB, 125);
  delay(890);
  digitalWrite(stby, LOW);
}
void quarttour(void)
{
  Serial.println("Tour");
  digitalWrite(ain1, LOW);
  digitalWrite(ain2, HIGH)
  ;
  digitalWrite(stby, HIGH);
  digitalWrite(bin1, HIGH);
  digitalWrite(bin2, LOW);
  analogWrite(pwmA, 131.125);
  analogWrite(pwmB, 125);
  delay(450);
  digitalWrite(stby, LOW);
}

/*

Programme d'évitement d'obstacle sans contact

  • /

//pin 12 et 13 pour le capteur à ultrason


  1. define PROCHE 20
  2. define DANGER 10
  3. define AFOND 200
  4. define PRUDENT 50
  5. define NBMESURE 5
  6. define VSON 59

//initialisation int pinSRF= 13; //(mettre la pin correspondante au capteur a ultrason) //pin numérique utilisé pour le capteur ultrasons.


void setup() { Serial.begin(9600); avance(AFOND); //on démarre le robot Serial.begin(9600);

  pinMode(pwmB, OUTPUT);
  pinMode(bin2, OUTPUT);
  pinMode(bin1, OUTPUT);
  pinMode(stby, OUTPUT);
  pinMode(ain1, OUTPUT);
  pinMode(ain2, OUTPUT);
  pinMode(pwmA, OUTPUT);
  tour(); // Exécute la fonction du tour
  avancer();
  demitour();
  avancer(); 
  tour();

}

void loop() {

// mettez votre code principal ici, pour exécuter à plusieurs reprises:

 switch (mesure()){ //utilisation de la condition switch
   case 0: //l'obstacle est dans la zone DANGER
     Serial.println("*DANGER*");
     arret(); // on arrête le robot
     delay(200);
     recule(PRUDENT); // on le fait reculer un peu
     delay(200);
     recherche(); // on recherche la bonne voie
     break;
   case 1: //l'obstacle est dans la zone PROCHE
     Serial.println("Attention...");
     avance(PRUDENT); // on ralentit la vitesse
   default:
     avance(AFOND);
 }

} //fonctions int mesure(){

 //fonction qui mesure une distance avec le capteur
 unsigned long mesure = 0; // variable de mesure
 unsigned long cumul = 0; //variable pour la moyenne
 for (int t = 0; t < NBMESURE; t++) { // boucle pour effectuer les mesures
   pinMode (pinSRF, OUTPUT); //on prépare le pin pour envoyer le signal
   digitalWrite(pinSRF, LOW); //on commence à l'état bas
   delayMicroseconds(2); //on attend que le signal soit clair
   digitalWrite(pinSRF, HIGH);//mise à l'état haut
   delayMicroseconds(10); //pendant 10 µs
   digitalWrite(pinSRF, LOW); //mise à l'état bas
   pinMode(pinSRF, INPUT); //on prépare le pin pour recevoir un état
   mesure = pulseIn(pinSRF, HIGH); // fonction pulseIn qui attend un état haut et renvoie le temps d'attente
   cumul+=mesure; //on cumule les mesures
   delay(50); //attente obligatoire entre deux mesures
 }
 mesure=cumul/NBMESURE; //on calcule la moyenne des mesures
 mesure=mesure/VSON;//on transforme en cm
 
 if (mesure<=DANGER){//on teste si l'obstacle est dans la zone DANGER
   return 0; //si oui, on retourne le code de danger
 }
 else if (mesure>DANGER && mesure<=PROCHE){//on teste s'il est dans la zone PROCHE
   return 1; //si oui, on retourne le code de proche
 }
 return 2; // on retourne le code de sans risque

} void recherche(){

 //fonction pour rechercher un passage
 tourneGauche(AFOND); //on positionne le robot à gauche (facultatif)
 delay (300);
 int etat=0; //variable de test de possibilité d'avancer
 while (etat!=2){ // tant que la distance n'est pas suffisante
   etat=mesure(); // on effectue la mesure
   tourneDroite(PRUDENT); //on fait tourner le robot
 }
 Serial.println("La voie est libre !");
 //retour au programme principal

} void arret(){

 Serial.println("Je stoppe");
 //fonction d'arrêt des moteurs

} void avance(int v){

 Serial.print("J'avance");
 affiche(v);
 //fonctin de mise en route des deux moteurs dans le sens avant
 // on utilise la variable v pour le pilotage PWM

} void recule(int v){

 Serial.print("Je recule");
 affiche(v);
 //fonctin de mise en route des deux moteurs dans le sens arrière
 // on utilise la variable v pour le pilotage PWM

} void tourneDroite(int v){

 Serial.print("Je tourne a droite");
 affiche(v);
 //fonction de rotation à droite : un moteur dans un sens, l'autre dans le sens opposé
 // on utilise la variable v pour le pilotage PWM

} void tourneGauche(int v){

 Serial.print("Je tourne a gauche");
 affiche(v);
 //fonction de rotation à gauche : un moteur dans un sens, l'autre dans le sens opposé
 // on utilise la variable v pour le pilotage PWM

} void affiche(int v){

 //fonction complémentaire d'affichage
 if (v==AFOND){
   Serial.println(" a fond !");
 }
 else{
   Serial.println(" prudemment...");
 }

}

Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Outils