Projet ICN robot parlant 2018/2019
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
- define PROCHE 20
- define DANGER 10
- define AFOND 200
- define PRUDENT 50
- define NBMESURE 5
- 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..."); }
}