Bonjour,
Je suis actuellement entrain de concevoir un robot et j'aimerais qu'il puisse se repérer à l'aide d'ultrasons.
Le principe serait d'avoir trois récepteurs fixes(connectés à une première carte arduino) et un émetteur positionné sur le robot(connecté à une autre carte arduino), on en déduit alors les distances séparant les récepteurs à l'émetteur, et ainsi sa position.
Un peu naïf, j'ai acheté des modules HC-SR04, (sans s'avoir qu'on ne pouvait recevoir que si le module avait déjà émis), dont j'ai déssoudé l'émetteur pour trois d'entre eux.
L'idée est donc de "feinter" le module en envoyant l'onde depuis un autre module.
Mais pour se faire, je dois synchroniser les deux modules. J'utilise alors des modules bluetooth. Mais la synchronisation ne se passe pas tout a fait comme prévu(je crois).
En effet, à partir de ces deux codes :
Code récepteur :
#include <SoftwareSerial.h>
SoftwareSerial slave(10, 11);
//int testVar = 0;
//
#define trigPin 5
#define echoPin 4
#define avertisseur 13
#include <stdlib.h>
void setup()
{
// j'ai augmenté les différents baudRate pour accéler la transmission de données
Serial.begin(57600);
slave.begin(115200);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(avertisseur, OUTPUT);
//
}
void loop() {
long duree,distance,sommeDistance;
int nbMesures;
int t1,t2;
String car;
sommeDistance = 0;
int flag =0,envoi =0;
String chaineReception="";
int comptImpulsion = 0;
String tpsMaster;
long tpsSlave,tpsMasterLong,tpsDechlenche;
char char_envoi;
while (slave.available()>0)
{ // Si l'émetteur nous avertit qu'il va envoyer une onde
// On fait "semblant" d'envoyer une onde depuis le recepteur (dont le hp à été déssoudé)
digitalWrite(trigPin,LOW);
digitalWrite(trigPin,HIGH);
delayMicroseconds(10);
digitalWrite(trigPin,LOW);
duree = pulseIn(echoPin,HIGH);
distance = 340*duree/1000;
Serial.print(distance);
Serial.println(" mm");
Serial.print(duree);
Serial.println(" microsecondes");
while(slave.available()) // on vide le buffer
{
char t =slave.read();
}
}
}
Code Emetteur
#include <SoftwareSerial.h>
SoftwareSerial master(8, 7); // (RX, TX) (pin Rx BT, pin Tx BT)
#define trigPin 5
#define echoPin 4
#define avertisseur 13
int envoi =0 ;
char char_envoi;
int premierCarac = 1;
void setup()
{
Serial.begin(57600);
master.begin(115200);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(avertisseur, OUTPUT);
}
void loop()
{
int comptImpulsion =0;
// On envoie sur la voie série pour signaler l'émission US.
master.println(0);
comptImpulsion =0;
// Envoi de l'onde
digitalWrite(trigPin,LOW);
digitalWrite(trigPin,HIGH);
delayMicroseconds(10);
digitalWrite(trigPin,LOW);
// On recommence une seconde plus tard
delay(1000);
}
,j'ai pas mal de soucis:
-avec ce code, le récepteur ne reçoit pas l'onde (elle est passé avant qu'il n'écoute).
-Lorsque je rajoute un délai dans le code de l'émetteur (déterminé empiriquement), l'émetteur reçoit bien l'onde mais ne calcule pas la bonne distance, mais le gros problème est que la distance calculée varie énormément d'une impulsion à une autre ( plus de 10m de différence).
J'aimerais donc savoir si il est possible de mieux synchroniser des arduinos,et si cette technique de localisation est finalement envisageable ( j'ai fait pas mal d'essais infructueux).