Pour Pascal
Publié : 02 juin 2016, 11:15
Bonjour Pascal!
Voici mon code pour faire fonctionner le robot!
J'espère qu'il n'est pas aberrant...
// On définit toutes les broches utilisées
int distanceEnCm = 0 ;
int ValeurRecueParCapteur(int trigPin, int echoPin) // Derrière ce pavé de code immonde se cache la fonction automatiquement générée par Ardublock et qui code un capteur ultrason.
{
long duration; //les valeurs de type long sont des variables de taille élargie (pas clair) qui permettent de stocker des entiers, codées en 4 octets
//NB: L'impédance électrique mesure l'opposition d'un circuit électrique au passage d'un courant alternatif sinusoïdal. #Merci Wikipédia
pinMode(trigPin, OUTPUT); //trigPin représente le pin sur lequel sera branché le "trigger" ou "détente" de l'émetteur ultrason. OUTPUT signifie qu'on le définit en "sortie", c'est à dire qu'on le règle en état de basse impédance/résistance: on lui permet de transmettre beaucoup de courant (on lui permet du coup d'envoyer un signal électrique convertit en une onde sonore)
pinMode(echoPin, INPUT); // Au contraire, la broche qui reçoit l'écho -le recepteur- ultrason est branchée en entrée, pour ne délivrer qu'une faible quantité de courant. Elle agit comme une grosse réisstance (100 MegaOhms). Apparemment, c'est utile pour lire une valeur reçue par un capteur. D'où l'intérêt de la mettre là
digitalWrite(trigPin, LOW); // Cela signifie qu'on envoie un courant de 0 Volts sur le trigPin (on n'envoie rien). J'explique avec la suite. On éteint un peu la broche.
delayMicroseconds(2); // 2µs de délai avant la prochaine action
digitalWrite(trigPin, HIGH); // Là on envoie du courant (5V) -c'est du tout ou rien: 5 V ou 0 V- , le temps de la mesure, pour envoyer un signal électrique convertit en ultrason
delayMicroseconds(20); // On donne 20µs de temps à la mesure pour se faire. Au delà du temps, elle est considérée comme perdue.
digitalWrite(trigPin, LOW); // On coupe l'afflux de courant car on a fini la mesure.
duration = pulseIn(echoPin, HIGH); // Dans la variable duration, on stocke la durée de l'impulsion (temps du passage entre l'état bas à haut de la broche echo)
duration = duration / 59; // On divise duration par 59 (allez savoir pourquoi) pour convertir une donnée temporelle en donnée métrique (en cm)
return duration; // Alors on récupère duration
}
int moteur1_enablePin=11; // Je branche le câble de contrôle de la vitesse sur un Pin PWM. Grâce à cela, je pourrai changer la valeur de la vitesse de rotation du moteur (entre 0 et 255 unités)
int moteur1_in1Pin=13; // Le moteur est branché sur trois broches, on choisit arbitrairement - a priori, c'est un peu trouble- les pins 13 et 12 en plus du PWM 11 pour le moteur dit moteur 1.
int moteur1_in2Pin=12;
int moteur2_enablePin=10; //Pareil que celui du dessus , avec le PWM 10 et les pins normaux 8 et 7.
int moteur2_in1Pin=8;
int moteur2_in2Pin=7;
void setup() // Le "void setup" correspond à une boucle unique dans chaque programme Arduino, dans laquelle on définit les variables etc...
{
digitalWrite(5,LOW);
Serial.begin(9600); // Définit la vitesse de transfert de caractère entre la carte et l'ordinateur (pour le moniteur série)
//On commence par initialiser les pins du moteur1
pinMode(moteur1_in1Pin, OUTPUT);
pinMode(moteur1_in2Pin, OUTPUT);
pinMode(moteur1_enablePin, OUTPUT);
//Puis du moteur2
pinMode(moteur2_in1Pin, OUTPUT);
pinMode(moteur2_in2Pin, OUTPUT);
pinMode(moteur2_enablePin, OUTPUT);
}
void SetMoteur1(int speed, boolean reverse) // Boucle qui définit les "données du moteur": speed est un entier entre 0 et 255 qui correspond à la vitesse de rotation et boolean est une variabe de type binaire (true ou false) qui correspond au sens de rotation
{
analogWrite(moteur1_enablePin, speed); // On définit la vitesse de rotation grâce au pin PWN
digitalWrite(moteur1_in1Pin, ! reverse); // Et les sens de rotation grâce aux deux autres pins: reverse signifiant qu'on change le sens. Je suppose, ce n'était précisé nulle part, je fais juste preuve de bon sens?
digitalWrite(moteur1_in2Pin, reverse);
}
void SetMoteur2(int speed, boolean reverse) // Idem avec une autre boucle pour le moteur 2
{
analogWrite(moteur2_enablePin, speed);
digitalWrite(moteur2_in1Pin, ! reverse);
digitalWrite(moteur2_in2Pin, reverse);
}
void loop() // "Loop" = "boucle" en anglais. La fonction "void loop" signifie donc qu'on va lancer en boucle la partie du code qui se situe à l'intérieur, pour que le programme fonctionne. Ca correspond à une fonction lancée dans python finalement.
{
distanceEnCm = ValeurRecueParCapteur( 5 , 3 ) ;
Serial.print("message");
Serial.print(" ");
Serial.print(distanceEnCm);
Serial.print(" ");
Serial.println();
while (distanceEnCm < 10 && distanceEnCm > 5)
{
SetMoteur1(0, true);
SetMoteur2(0, true);
delay(2000);
Serial.print("Obstacle");
Serial.println();
SetMoteur1(255, true);
SetMoteur2(255,true);
}
while (distanceEnCm > 10 && distanceEnCm < 300)
{
SetMoteur1(0, true);
SetMoteur2(0, true);
delay(2000);
Serial.print("rien");
Serial.println();
SetMoteur1(50,true);
SetMoteur2(50,true);
delay(500);
SetMoteur2(75, true);
SetMoteur1(0, true);
delay(4000);
SetMoteur2(50, true);
SetMoteur1(50, true);
}
while (distanceEnCm < 5)
{
SetMoteur1(0, true);
SetMoteur2(0, true);
delay(2000);
SetMoteur1(255, true);
SetMoteur2(255, true);
delay(4000);
SetMoteur1(255, false);
SetMoteur2(255, false);
delay(3000);
SetMoteur1(0, true);
SetMoteur2(150, false);
delay(2000);
}
while (distanceEnCm > 300)
{
SetMoteur1(0, true);
SetMoteur2(0, true);
delay(2000);
SetMoteur2(40, true);
SetMoteur1(0, true);
}
}
Voici mon code pour faire fonctionner le robot!
J'espère qu'il n'est pas aberrant...
// On définit toutes les broches utilisées
int distanceEnCm = 0 ;
int ValeurRecueParCapteur(int trigPin, int echoPin) // Derrière ce pavé de code immonde se cache la fonction automatiquement générée par Ardublock et qui code un capteur ultrason.
{
long duration; //les valeurs de type long sont des variables de taille élargie (pas clair) qui permettent de stocker des entiers, codées en 4 octets
//NB: L'impédance électrique mesure l'opposition d'un circuit électrique au passage d'un courant alternatif sinusoïdal. #Merci Wikipédia
pinMode(trigPin, OUTPUT); //trigPin représente le pin sur lequel sera branché le "trigger" ou "détente" de l'émetteur ultrason. OUTPUT signifie qu'on le définit en "sortie", c'est à dire qu'on le règle en état de basse impédance/résistance: on lui permet de transmettre beaucoup de courant (on lui permet du coup d'envoyer un signal électrique convertit en une onde sonore)
pinMode(echoPin, INPUT); // Au contraire, la broche qui reçoit l'écho -le recepteur- ultrason est branchée en entrée, pour ne délivrer qu'une faible quantité de courant. Elle agit comme une grosse réisstance (100 MegaOhms). Apparemment, c'est utile pour lire une valeur reçue par un capteur. D'où l'intérêt de la mettre là
digitalWrite(trigPin, LOW); // Cela signifie qu'on envoie un courant de 0 Volts sur le trigPin (on n'envoie rien). J'explique avec la suite. On éteint un peu la broche.
delayMicroseconds(2); // 2µs de délai avant la prochaine action
digitalWrite(trigPin, HIGH); // Là on envoie du courant (5V) -c'est du tout ou rien: 5 V ou 0 V- , le temps de la mesure, pour envoyer un signal électrique convertit en ultrason
delayMicroseconds(20); // On donne 20µs de temps à la mesure pour se faire. Au delà du temps, elle est considérée comme perdue.
digitalWrite(trigPin, LOW); // On coupe l'afflux de courant car on a fini la mesure.
duration = pulseIn(echoPin, HIGH); // Dans la variable duration, on stocke la durée de l'impulsion (temps du passage entre l'état bas à haut de la broche echo)
duration = duration / 59; // On divise duration par 59 (allez savoir pourquoi) pour convertir une donnée temporelle en donnée métrique (en cm)
return duration; // Alors on récupère duration
}
int moteur1_enablePin=11; // Je branche le câble de contrôle de la vitesse sur un Pin PWM. Grâce à cela, je pourrai changer la valeur de la vitesse de rotation du moteur (entre 0 et 255 unités)
int moteur1_in1Pin=13; // Le moteur est branché sur trois broches, on choisit arbitrairement - a priori, c'est un peu trouble- les pins 13 et 12 en plus du PWM 11 pour le moteur dit moteur 1.
int moteur1_in2Pin=12;
int moteur2_enablePin=10; //Pareil que celui du dessus , avec le PWM 10 et les pins normaux 8 et 7.
int moteur2_in1Pin=8;
int moteur2_in2Pin=7;
void setup() // Le "void setup" correspond à une boucle unique dans chaque programme Arduino, dans laquelle on définit les variables etc...
{
digitalWrite(5,LOW);
Serial.begin(9600); // Définit la vitesse de transfert de caractère entre la carte et l'ordinateur (pour le moniteur série)
//On commence par initialiser les pins du moteur1
pinMode(moteur1_in1Pin, OUTPUT);
pinMode(moteur1_in2Pin, OUTPUT);
pinMode(moteur1_enablePin, OUTPUT);
//Puis du moteur2
pinMode(moteur2_in1Pin, OUTPUT);
pinMode(moteur2_in2Pin, OUTPUT);
pinMode(moteur2_enablePin, OUTPUT);
}
void SetMoteur1(int speed, boolean reverse) // Boucle qui définit les "données du moteur": speed est un entier entre 0 et 255 qui correspond à la vitesse de rotation et boolean est une variabe de type binaire (true ou false) qui correspond au sens de rotation
{
analogWrite(moteur1_enablePin, speed); // On définit la vitesse de rotation grâce au pin PWN
digitalWrite(moteur1_in1Pin, ! reverse); // Et les sens de rotation grâce aux deux autres pins: reverse signifiant qu'on change le sens. Je suppose, ce n'était précisé nulle part, je fais juste preuve de bon sens?
digitalWrite(moteur1_in2Pin, reverse);
}
void SetMoteur2(int speed, boolean reverse) // Idem avec une autre boucle pour le moteur 2
{
analogWrite(moteur2_enablePin, speed);
digitalWrite(moteur2_in1Pin, ! reverse);
digitalWrite(moteur2_in2Pin, reverse);
}
void loop() // "Loop" = "boucle" en anglais. La fonction "void loop" signifie donc qu'on va lancer en boucle la partie du code qui se situe à l'intérieur, pour que le programme fonctionne. Ca correspond à une fonction lancée dans python finalement.
{
distanceEnCm = ValeurRecueParCapteur( 5 , 3 ) ;
Serial.print("message");
Serial.print(" ");
Serial.print(distanceEnCm);
Serial.print(" ");
Serial.println();
while (distanceEnCm < 10 && distanceEnCm > 5)
{
SetMoteur1(0, true);
SetMoteur2(0, true);
delay(2000);
Serial.print("Obstacle");
Serial.println();
SetMoteur1(255, true);
SetMoteur2(255,true);
}
while (distanceEnCm > 10 && distanceEnCm < 300)
{
SetMoteur1(0, true);
SetMoteur2(0, true);
delay(2000);
Serial.print("rien");
Serial.println();
SetMoteur1(50,true);
SetMoteur2(50,true);
delay(500);
SetMoteur2(75, true);
SetMoteur1(0, true);
delay(4000);
SetMoteur2(50, true);
SetMoteur1(50, true);
}
while (distanceEnCm < 5)
{
SetMoteur1(0, true);
SetMoteur2(0, true);
delay(2000);
SetMoteur1(255, true);
SetMoteur2(255, true);
delay(4000);
SetMoteur1(255, false);
SetMoteur2(255, false);
delay(3000);
SetMoteur1(0, true);
SetMoteur2(150, false);
delay(2000);
}
while (distanceEnCm > 300)
{
SetMoteur1(0, true);
SetMoteur2(0, true);
delay(2000);
SetMoteur2(40, true);
SetMoteur1(0, true);
}
}