J'ai fait un petit code aujourd'hui pour tester mon hc-sr04.
Il tourne sur 180 degres et est sensé, à la finn, revenir sur la position qui a enregistré la distance la plus basse.
Sauf que, clairement, ça ne marche pas bien du tout ^^ (ça marche, mais c'est pas la Nasa)
Ce qui m'interpelle, c'est ces mesures à 0mm...
Je soupçonne un manque de temps quelquepart pour faire ses mesures, mais où?
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int IRCapt = 0; // entrée analogique du capteur
int IRVal; // variable lue
int SPos; // position du servo
float distance_mm;
/* Constantes pour les broches */
const byte TRIGGER_PIN = 2; // Broche TRIGGER
const byte ECHO_PIN = 3; // Broche ECHO
/* Constantes pour le timeout */
const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s
/* Vitesse du son dans l'air en mm/us */
const float SOUND_SPEED = 340.0 / 1000;
void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
myservo.write(0);
Serial.begin(115200);
/* Initialise les broches */
pinMode(TRIGGER_PIN, OUTPUT);
digitalWrite(TRIGGER_PIN, LOW); // La broche TRIGGER doit être à LOW au repos
pinMode(ECHO_PIN, INPUT);
Serial.println("POS VAL");
Serial.println("---------");
}
void loop() {
int DistMin=4000;
int PosMin=0;
for (SPos=0;SPos<180;SPos++) { //for (int i=0; i <= 255; i++){
myservo.write(SPos); //positionner le servo
delay(30);
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
/* 2. Mesure le temps entre l'envoi de l'impulsion ultrasonique et son écho (si il existe) */
long measure = pulseIn(ECHO_PIN, HIGH, MEASURE_TIMEOUT);
/* 3. Calcul la distance à partir du temps mesuré */
distance_mm = measure / 2.0 * SOUND_SPEED;
Serial.println();
Serial.print(SPos);
Serial.print(" ");
Serial.print(distance_mm);
if (distance_mm<DistMin) {
DistMin=distance_mm;
PosMin=SPos;
}
}
ps: mais quel bonheur quand on arrive enfin à faire bouger un machin sur la table du salon
bonjour,
ca peut arriver suivant le matériau réfléchissant ou si la distance est largement dépassée.
parfois, un truc que tu pense ne pas être dans son champs va l'être.
une mesure lancée sans retour peut le faire aussi.
Il n'y a rien qui le gene physiquement, il tourne sur la table et j'ai placé des objets, ainsi d'un panneau à 20cm, tout le tour, pour qu'il ne soit jamais obligé de prendre une mesure trop éloignée. Cependant, j'ai deja affiché plus de 4m, donc pour moi, c'est pas ca
Est ce que le delai entre l'émission et la réception est vraiment ideal?
Qu'il se trompe de valeur (enfin facon de parler), ok, mais de là à renvoyer 0,00 ...
ça pourrait venir de conflits entre les types de variables : tu as des float, des unsigned long, des long...
Essaie en déclarant tout en float, sauf measure qui doit être long je suppose, puis mets ce dernier dans un float et calcule tout en float.
Si le problème se reproduit, c'est que ce n'est pas ça...
Sinon, tu pourras revenir vers les types initiaux, un par un, en voyant à partir de quel moment ça recommence...
0, c'est quand il n'a rien capté. Si le capteur tourne on peut toujours imaginer que l'onde envoyée ne soit pas reçue en retour à cause de la rotation. Ca donne quoi quand le capteur reste fixe ?
Et puis entre nous, il ne faut pas trop en demander d'un capteur à 1 €
Bon en fait, si le servo ne bouge pas, je n'ai plus de 0.00mm
c'est donc un souci de calage entre le mouvement et le temps nécessaire au HC pour récupérer ses données
enfin je crois Oo
myservo.write(SPos); //positionner le servo
delay(30);
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
Le délai de 30ms est peut-être un peu court et ne permet pas au servo d'arriver en position et de se stabiliser. Il faudrait sans doute jouer sur ce temps là pour commencer.
En effet, les delay() ne sont pas finement réglés et pas toujours intelligemment placés. J'avais commencé hier à bidouiller ça. Aujourd'hui mon pc n'a bien voulu démarrer qu'il y a ... dix minutes....
Affaire à suivre, j'ai écoulé mon stock de patience. Merci Windows 10.
Je lâche pas l'affaire, je termine ça asap (j'ai vu ça quelque part, c'est moderne, ça veut dire 'au plus vite')