Bonjour, bonsoir,
Je me tourne vers la communauté arduino pour vous exposer mon problème et aussi pour m'encourager à persévérer en arduino. La programmation ce n'est pas (encore) ma tasse de thé et j'espère ne pas passer pour un bouffon:
Je m'explique, je veux coder mon petit robot qui a deux capteurs IR sharp GP2D150A. Pour visualiser les valeurs analogiques lues, j'utilise bien sûr le serial arduino. Le code fonctionne pour chaque capteur séparé, mais quand je veux lire les deux capteurs dans le serial et que j'approche un obstacle près de l'un seulement, sa valeur lue ne varie pas, comme si il n'y avait aucun obstacle. En revanche, lorsque l'obstacle est devant les deux capteurs à la fois, là les valeurs varient. Un des deux capteurs sharp ne lit rien tant qu'un obstacle n'est pas à la fois devant les deux.
Voici mon code:
//SHARP 2D150A X2
#define sensorIRright A0
#define sensorIRleft A1
float sensorValueRight, sensorValueLeft;
int cmLeft, cmRight;
int ledLeft = 9;
int ledRight = 13;
void setup() {
Serial.begin(9600);
pinMode(ledLeft, OUTPUT);
pinMode(ledRight, OUTPUT);
}
void loop() {
sensorValueLeft = analogRead(sensorIRleft);
delay(10);
sensorValueRight = analogRead(sensorIRright);
cmLeft = 10650.08 * pow(sensorValueLeft,-0.935) - 10;
if (cmLeft>200||cmLeft==0) {
cmLeft = 200;
digitalWrite(ledLeft,LOW);
}
else if(cmLeft<140)
{
digitalWrite(ledLeft,HIGH);
}
else
{
digitalWrite(ledLeft,LOW);
}
cmRight = 10650.08 * pow(sensorValueRight,-0.935) - 10;
if (cmRight>200||cmRight==0) {
cmRight = 200;
digitalWrite(ledLeft,LOW);
}
else if(cmRight<140)
{
digitalWrite(ledRight,HIGH);
}
else
{
digitalWrite(ledRight,LOW);
}
delay(100);
Serial.print("IR gauche: ");
Serial.print(cmLeft);
Serial.print(" | IR droite: ");
Serial.println(cmRight);
delay(10);
}
Ça viendrait pas des deux fonctions if qui, d'affilées, perturbent la lecture? Ou alors au niveau des delays à certains endroits? Parce que j'ai mis 200ms à la fin du code mais ça change rien...
Merci pour votre aide
Cordialement jeunes gens,
Bonjour,
peut-être le Left qui erre dans le § consacré au Right ?
Ok je suis pas assez malin pour tout mettre en "right" quand il s'agit du code du sharp droit.
Par contre là où j'ai fais l'erreur d'avoir mis digitalWrite(ledLeft,LOW) au lieu de digitalWrite(ledRight,LOW) dans la boucle if du capteur droit, c'est une ligne pour éteindre une led. J'ai corrigé mais bien sûr rien n'a changé. Mes branchements sont bons aussi...
Lorsqu'on change de voie analogique il est préférable de jeter la première mesure donc je suggérerais ça:
sensorValueLeft = analogRead(sensorIRleft);
sensorValueLeft = analogRead(sensorIRleft);
delay(10);
sensorValueRight = analogRead(sensorIRright);
sensorValueRight = analogRead(sensorIRright);
ensuite tu mélanges un peut les types de données donc faut pas t'étonner si tu as des trucs incohérents.
analogRead retourne un entier et tu le mets direct dans un float donc il faut le préciser
sensorValueLeft = (float)analogRead(sensorIRleft);
sensorValueLeft = (float)analogRead(sensorIRleft);
delay(10);
sensorValueRight = (float)analogRead(sensorIRright);
sensorValueRight = (float)analogRead(sensorIRright);
Plus loin, tu mets des float dans des entiers
cmLeft = 10650.08 * pow(sensorValueLeft,-0.935) - 10;
il vaudrait mieux faire un cast
cmLeft = (int)(10650.08 * pow(sensorValueLeft,-0.935) - 10.0);
Merci pour votre aide,
J'ai repris un code pour ces capteurs bêtement sans porter un regard critique sur les types de variables déclarées. Je ferai gaffe par la suite. Et pas bête le coup de jeter la première mesure d'analogRead!
Du coup j'ai changé les types des variables et le code ressemble à ça:
//SHARP 2D150A X2
#define sensorIRright A0 //Must be an analog pin
#define sensorIRleft A1
int sensorValueRight, sensorValueLeft;
float cmLeft, cmRight;
int ledLeft = 9;
int ledRight = 13;
void setup() {
Serial.begin(9600);
pinMode(ledLeft, OUTPUT);
pinMode(ledRight, OUTPUT);
}
void loop() {
sensorValueLeft = analogRead(sensorIRleft);
sensorValueLeft = analogRead(sensorIRleft);
delay(10);
sensorValueRight = analogRead(sensorIRright);
sensorValueRight = analogRead(sensorIRright);
cmLeft = 10650.08 * pow(sensorValueLeft,-0.935) - 10.0;
if (cmLeft>200.||cmLeft==0.) {
cmLeft = 200.;
digitalWrite(ledLeft,LOW);
}
else if(cmLeft<140.)
{
digitalWrite(ledLeft,HIGH);
}
else
{
digitalWrite(ledLeft,LOW);
}
cmRight = 10650.08 * pow(sensorValueLeft,-0.935) - 10.0;
if (cmRight>200.||cmRight==0.) {
cmRight = 200.;
digitalWrite(ledRight,LOW);
}
else if(cmRight<140.)
{
digitalWrite(ledRight,HIGH);
}
else
{
digitalWrite(ledRight,LOW);
}
delay(100);
Serial.print("IR gauche: ");
Serial.print(cmLeft);
Serial.print(" | IR droite: ");
Serial.println(cmRight);
delay(10);
}
...mais ça marche toujours pas. Je vois vraiment pas pourquoi les capteurs dépendent l'un de l'autre pour actualiser leurs valeurs.
Bonjour,
tiens, j'ai encore vu une dissymétrie ( volontaire ? ) :
cmLeft = 10650.08 * pow(sensorValueLeft,-0.935) - 10.0;
cmRight = 10650.08 * pow(sensorValueLeft,-0.935) - 10.0;
Bonjour,
Outre le fait qu'encore une fois, je ne vérifie pas si je ne confonds pas les noms des variables lorsque je modifie plusieurs fois mon code pour tests, je pense avoir compris d'où venait mon problème:
Le capteur SHARP que j'utilise, le GP2D150A, a une sortie de type logique donc états haut/bas. J'ai repris un code du capteur GP2Y0A21YK0F qui lui est analogique et que je pensais identique à celui que j'utilise. Donc déjà ça risque pas de marcher si j’emploie de l'analogique pour un capteur numérique...
En plus, j'ai lu que d'autres personnes ayant mon capteur ont vécu des fluctuations (sensibilité aux conditions de luminosité ambiante).
C'était un début laborieux dans le monde arduino! Merci quand même pour vos conseils et réponses.