Pour Pascal

Sahelanthropus
Messages : 12
Inscription : 01 juin 2016, 20:03

Pour Pascal

Message par Sahelanthropus »

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);
}
}
Pascal
Messages : 482
Inscription : 13 oct. 2014, 21:45

Re: Pour Pascal

Message par Pascal »

Première analyse:

* Je ne vois pas de gros problème avec la gestion de ton capteur, alors sauf une erreur de PIN autrement cela devrait fonctionner.
- Isole le problème, fait un programme qui ne contient que le minimum:
- La fonction de mesure ValeurRecueParCapteur
- Un setup minimaliste (initialise pin, serial.begin)
- Une loop qui lit la valeur de ValeurRecueParCapteur, l'affiche sur le port série et attend 500ms
- Tant que cela ne fonctionne pas ce n'est pas la peine d'ajouter du code :-)

* Il y a un problème avec tes boucles while: ton code ne met jamais à jours la variable distanceEnCm, donc dès que tu rentres dans une boucle tu y reste ad vitam aeternam...

* Concernant le valeur de 59, elle s'explique ainsi:
- Tu mesures le temps d'aller-retour d'un 'son', mesure retournée en microsondes
- Le son se propage à une vitesse de 340 m/s soit 34000 cm/s soit 34 cm/ms soit 0.034 cm/µs
- Le signal a donc parcouru une distance de duration * 0.034 cm
- Comme le signal fait un aller-retour tu dois diviser par 2 soit duration * 0.017
- Hors 1/0.017 = 58.8 donc duration * 0.017 c'est la même chose que duration / 58.8, arrondi à 59
Dernière modification par Pascal le 03 juin 2016, 17:30, modifié 2 fois.
Pascal
Messages : 482
Inscription : 13 oct. 2014, 21:45

Re: Pour Pascal

Message par Pascal »

Tiens moi informé du point 1: code de test du capteur
Sahelanthropus
Messages : 12
Inscription : 01 juin 2016, 20:03

Re: Pour Pascal

Message par Sahelanthropus »

Bonjour! Désolé du retard de ma réponse, je n'avais ABSOLUMENT pas vu que vous m'aviez écrit il y a 4 jours car je m'attendais à une notif mail! :S
Ok ok, merci de toutes ces infos! Je vais bosser le code d'ici demain, et si vous êtes là demain soir, vous pourrez éventuellement corriger la nouvelle version. Quant à mon problème de boucle infinie, je suppose que je dois juste relancer la fonction de prise de mesure de distance après avoir effectué l'action?
Merci de votre temps et désolé du retard;
Cordialement,
Valentin
PMorel
Messages : 3748
Inscription : 04 déc. 2013, 22:44
Localisation : Yutz

Re: Pour Pascal

Message par PMorel »

Il faut s'abonner au sujet ou au forum en question pour recevoir des notifications.
Sahelanthropus
Messages : 12
Inscription : 01 juin 2016, 20:03

Re: Pour Pascal

Message par Sahelanthropus »

Voilà qui explique bien des choses...
Pascal
Messages : 482
Inscription : 13 oct. 2014, 21:45

Re: Pour Pascal

Message par Pascal »

Sahelanthropus a écrit :Bonjour! Désolé du retard de ma réponse, je n'avais ABSOLUMENT pas vu que vous m'aviez écrit il y a 4 jours car je m'attendais à une notif mail! :S
Ok ok, merci de toutes ces infos! Je vais bosser le code d'ici demain, et si vous êtes là demain soir, vous pourrez éventuellement corriger la nouvelle version. Quant à mon problème de boucle infinie, je suppose que je dois juste relancer la fonction de prise de mesure de distance après avoir effectué l'action?
Merci de votre temps et désolé du retard;
Cordialement,
Valentin
Pas de problèmes ;)

Oui, un petit "distanceEnCm = ValeurRecueParCapteur( 5 , 3 ) ;" avant chaque "}" de while.
Sahelanthropus
Messages : 12
Inscription : 01 juin 2016, 20:03

Re: Pour Pascal

Message par Sahelanthropus »

Je teste ça dans l'instant et je bous tiens au courant!
Tout compte fait, je ne pense pas passer au Thilab ce soir.
Cependant, la dernière fois nous avions parlé (ou était-ce avec Gérard?) des capteurs de ligne noire ou blanche (les line finder, je pense que c'était avec Gérard). Si vous en avez en stock, cela vous dérangerait-il de nous les avancer? Nous vous les rembourserions dans les plus brefs délais, bien évidemment!
Répondre