Peut-on lier / faire interagir deux cartes arduino ayant deux programmes différents ?

gg_du95
ven, 04/27/2018 - 19:24
Bonjour,
Voici mon problème, j'ai réalisé le projet voiture autonome présenté par Alexandre Pailhoux à l'aide d'une carte arduino.
A l'arrière de la voiture j'ai conçu un radar de recul à l'aide d'un deuxième capteur à ultrason, un écran LCD pour afficher la distance à l'obstacle, et un buzzer. J'ai donc utilisé pour cela une deuxième carte arduino.
Puis-je relier les deux cartes arduino pour pouvoir profiter du programme du radar de recul dans le programme de la voiture autonome ?
J'ai dans l'idée de vouloir faire arrêter les moteurs de la voiture lorsqu'elle se rapproche d'un obstacle quand elle recule.
Merci d'avance à vous.
meuh
ven, 04/27/2018 - 21:13
Salut gg_95, je ne suis pas le plus qualifié pour te répondre mais les arduino peuvent communiquée entre elles de plusieurs façons il me semble que tu dois pouvoir via la liaison série Rx et Tx en filaire.Je te met une adresse pris sur le net.Je pense que d autres personne te renseignerons mieux que moi sur le site .
https://create.arduino.cc/projecthub/harshmangukiya/serial-communication...
tiens une autre :ROBOT avec deux cartes :http://robotic-controls.com/learn/arduino/arduino-arduino-serial-communi...
A+
gg_du95
ven, 04/27/2018 - 23:41
Merci de ta réponse, je me suis déjà renseigné sur cela. J'ai relié mes arduino via leurs TX et RX mais je ne sais pas comment modifier mon programme voiture autonome et radar de recul. J'aimerais que le programme de recul puisse envoyer l'ordre de couper l'énergie des broches des moteurs (ce que je sais déjà faire pour gérer la voiture autonome) lorsque l'obstacle arrière est à moins de 4cm. Merci beaucoup de ton aide !
gg_du95
ven, 04/27/2018 - 23:50
Si je comprends bien il faut placer un module radio sur chaque carte. Où puis-je le placer si toutes les sorties digitales sont déjà prises sur la carte qui gère l'autonomie de la voiture ?
gg_du95
ven, 04/27/2018 - 23:32
Merci beaucoup je vais voir ça !
gg_du95
sam, 04/28/2018 - 12:27
Salut Gael, je pense que je vais utiliser deux modules NRF24L01 mais j'ai une question. L'avant et l'arrière étant indépendant grâce à deux cartes et deux programmes différents, lorsque le module radio de la carte arduino qui gère le radar de recul envoie l'ordre d'arrêter les moteurs à la carte qui gère la voiture, comment réceptionner pour se servir de cette information dans le code ? Je pense qu'il faut d'abord déclarer les modules en début de chaque programme. Dans le seul cas où un obstacle se trouve à moins de 4 cm à l'arrière de la voiture de la voiture, je dis au module arrière d'envoyer une info à l'autre module. Lorsqu'il l'a reçoit cela signifie que j'arrête la procédure de marche arrière de la voiture, je laisse un délay et je la refais redémarrer. En gros, est-ce cela ?
Voici la partie du programme de radar de recul : (alerte = 20 cm et distance = duration/58.2 où duration = pulseIn(echoPin, HIGH) )
if (distance <= alerte / 4)
{
// j'ajoute ici que le module doit envoyer l'information au module avant de stopper les moteurs ?
lcd.setCursor(3,1);
lcd.print(" STOP !!! ");
digitalWrite(buzzer, HIGH);// Faire du bruit
digitalWrite(REDPin, HIGH);
delay(50);// Attendre 10ms
digitalWrite(buzzer, LOW);// Silence
digitalWrite(REDPin, LOW);
delay(100);// Attendre 10ms
}
else if (distance > (alerte / 4) and (distance <= alerte / 2))
{
lcd.setCursor(3,1);
lcd.print(" ATTENTION !! ");
digitalWrite(buzzer, HIGH);// Faire du bruit
digitalWrite(REDPin, HIGH);
delay(100);// Attendre 10ms
digitalWrite(buzzer, LOW);// Silence
digitalWrite(REDPin, LOW);
delay(100);// Attendre 10ms
}
else if (distance > (alerte / 2) and (distance <= alerte-5))
{
lcd.setCursor(3,1);
lcd.print(" OBSTACLE ! ");
digitalWrite(buzzer, HIGH);// Faire du bruit
digitalWrite(REDPin, HIGH);
delay(200);// Attendre 10ms
digitalWrite(buzzer, LOW);// Silence
digitalWrite(REDPin, LOW);
delay(100);// Attendre 10ms
}
else {
lcd.setCursor(3,1);
lcd.print("OK ");
delay(50); //Attendre 50ms avant d'effectuer la lecture suivante.
}
Voici le code qui gère les moteurs en marche arrière puis demi-tour :
void DemiTour()
{
digitalWrite(D0UT_MOTEUR_GAUCHE_1,LOW);
digitalWrite(D0UT_MOTEUR_GAUCHE_2,HIGH); // Fais tourner les roues gauches en arrière
digitalWrite(D0UT_MOTEUR_DROIT_3,LOW);
digitalWrite(D0UT_MOTEUR_DROIT_4,HIGH);
digitalWrite(DOUT_MOTEUR_GAUCHE_EN,HIGH); //Energie au moteur gauche
digitalWrite(DOUT_MOTEUR_DROIT_EN,HIGH); //Energie au moteur droit
delay(dureeDunDemiTour);
digitalWrite(D0UT_MOTEUR_GAUCHE_1,LOW);
digitalWrite(D0UT_MOTEUR_GAUCHE_2,HIGH);
digitalWrite(D0UT_MOTEUR_DROIT_3,LOW);
digitalWrite(D0UT_MOTEUR_DROIT_4,HIGH);
digitalWrite(DOUT_MOTEUR_GAUCHE_EN,LOW);
digitalWrite(DOUT_MOTEUR_DROIT_EN,HIGH);
delay(dureeDemiTourPivoter);
laVoitureEstAlArret = true;
allumeLEDRouge();
}
Je dois rajouter une boucle qui permette d'arrêter la procédure lorsque le premier moduler reçoit l'info qu'un obstacle se situe à l'arrière ?
Merci de ton aide Gael !
gg_du95
sam, 04/28/2018 - 12:30
Salut Brossden, si je dois mettre les deux cartes arduinos en séries par leurs TX et RX, c'est le même problème je ne vois pas comment envoyer l'information et que la carte qui gère les moteurs la reçoive.
gg_du95
sam, 04/28/2018 - 12:31
Je vais aller voir ça de suite !
gg_du95
sam, 04/28/2018 - 12:33
Je peux donc lier les cartes en série si j'ai bien compris ?
gg_du95
sam, 04/28/2018 - 13:32
Merci beaucoup !
Sinon tu ne reçois pas mes messages privés ?
gg_du95
sam, 04/28/2018 - 16:01
Voici mon code radar de recul (carte maître) et quand je veux le téléverser vers la carte j'ai ce message qui s'affiche.
" Le croquis utilise 7014 octets (21%) de l'espace de stockage de programmes. Le maximum est de 32256 octets.
Les variables globales utilisent 467 octets (22%) de mémoire dynamique, ce qui laisse 1581 octets pour les variables locales. Le maximum est de 2048 octets.
Une erreur est survenue lors du transfert du croquis "
Voici mon code :
/* Senseur de distance Ultrason HC-SR04:
VCC sur Arduino 5v
GND sur Arduino GND
Echo sur Arduino broche 7
Trig sur Arduino broche 8
*/
// Senseur de distance Ultrason HC-SR04:aa
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(0,1); // RX, TX
LiquidCrystal lcd(12,11,5,4,3,2); //liaison 4 bits de données
#define echoPin 6 // broche Echo
#define trigPin 7 // broche Trigger (declenchement)
#define LEDPin 13 // LED de la carte Ardiono (branché sur la broche 13)
#define REDPin 5 // LED rouge alerte
int buzzer = 9;// Borne de sortie
int alerte = 20; // distance alerte recul
int maximumRange = 400; // distance Maximale acceptée (en cm)
int minimumRange = 0; // distance Minimale acceptée (en cm)
long duration, distance; // Durée utilisé pour calculer la distance
void setup() {
Serial.begin(115200);
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Distance : ");
lcd.setCursor(0,1);
// Activer les broches
pinMode(buzzer,OUTPUT);// Définir la sortie du buzzer
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(LEDPin, OUTPUT); // activer la LED sur la carte (si nécessaire)
pinMode(REDPin, OUTPUT); // activer la LED rouge alerte
}
// Partie du code continuellement exécuté
// Son but est d'effectuer un cycle de détection pour déterminer
// la distance de l'objet le plus proche (par réverbération de
// l'onde sur ce dernier)
void loop(){
// Envoi une impulsion de 10 micro seconde sur la broche "trigger"
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Attend que la broche Echo passe au niveau HAUT
// retourne la durée
duration = pulseIn(echoPin, HIGH);
//Calculer la distance (en cm, basé sur la vitesse du son).
distance = duration/58.2;
// Si la distance mesurée est HORS des valeurs acceptables
if (distance >= maximumRange || distance <= minimumRange)
{
// Eteindre la LED pour indiquer l'erreur */
digitalWrite(LEDPin, LOW);
}
else {
/* Allumer la LED pour indiquer une lecture correcte. */
lcd.setCursor(11,0);
String stringOne = "cm ";
String stringTwo = distance + stringOne;
lcd.print(stringTwo);
digitalWrite(LEDPin, HIGH);
digitalWrite(REDPin, LOW);
}
if (distance <= alerte / 4)
{
Serial.println("MOTEUR OFF");
lcd.setCursor(3,1);
lcd.print(" STOP !!! ");
digitalWrite(buzzer, HIGH);// Faire du bruit
digitalWrite(REDPin, HIGH);
delay(50);// Attendre 10ms
digitalWrite(buzzer, LOW);// Silence
digitalWrite(REDPin, LOW);
delay(100);// Attendre 10ms
}
else if (distance > (alerte / 4) and (distance <= alerte / 2))
{
Serial.println("MOTEUR ON");
lcd.setCursor(3,1);
lcd.print(" ATTENTION !! ");
digitalWrite(buzzer, HIGH);// Faire du bruit
digitalWrite(REDPin, HIGH);
delay(100);// Attendre 10ms
digitalWrite(buzzer, LOW);// Silence
digitalWrite(REDPin, LOW);
delay(100);// Attendre 10ms
}
else if (distance > (alerte / 2) and (distance <= alerte-5))
{
Serial.println("MOTEUR ON");
lcd.setCursor(3,1);
lcd.print(" OBSTACLE ! ");
digitalWrite(buzzer, HIGH);// Faire du bruit
digitalWrite(REDPin, HIGH);
delay(200);// Attendre 10ms
digitalWrite(buzzer, LOW);// Silence
digitalWrite(REDPin, LOW);
delay(100);// Attendre 10ms
}
else {
Serial.println("MOTEUR ON");
lcd.setCursor(3,1);
lcd.print("OK ");
delay(50); //Attendre 50ms avant d'effectuer la lecture suivante.
}
}
gg_du95
dim, 04/29/2018 - 11:43
J'ai réglé le problème, j'ai compilé en ayant débranché les fils rx et tx puis après compilation je les ai rebranchés.
gg_du95
dim, 04/29/2018 - 13:04
J'ai un problème concernant la communication en série des deux arduinos. L'arduino qui gère le radar de le recul est le maître et celui qui gère les moteurs est l'esclave. Les moteurs devraient s'arrêter lorsque ce dernier reçoit "LED OFF". Dans le cas contraire, le robot peut entreprendre sa marche arrière s'il y a "LED ON". La LED (une LED de l'arduino du radar de recul) est verte lorsque l'obstacle est à plus de 4 cm et est atteinte en dessous.
Voici mes codes, je ne vois pas où est l'erreur. Lorsque le robot rencontre un obstacle à l'avant, aucun moteur ne s'enclenche (alors qu'il y a aucun obstacle à l'arrière), par contre le servo-moteur monté du capteur à ultrason continu de tourner.
Code radar de recul :
/* Senseur de distance Ultrason HC-SR04:
VCC sur Arduino 5v
GND sur Arduino GND
Echo sur Arduino broche 7
Trig sur Arduino broche 8
*/
// Senseur de distance Ultrason HC-SR04:aa
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(0,1); // RX, TX
LiquidCrystal lcd(12,11,5,4,3,2); //liaison 4 bits de données
#define echoPin 6 // broche Echo
#define trigPin 7 // broche Trigger (declenchement)
#define LEDPin 13 // LED de la carte Ardiono (branché sur la broche 13)
#define REDPin 9 // LED rouge alerte
int buzzer = 9;// Borne de sortie
int alerte = 20; // distance alerte recul
int maximumRange = 400; // distance Maximale acceptée (en cm)
int minimumRange = 0; // distance Minimale acceptée (en cm)
long duration, distance; // Durée utilisé pour calculer la distance
void setup() {
mySerial.begin(57600);
Serial.begin(115200);
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Distance : ");
lcd.setCursor(0,1);
// Activer les broches
pinMode(buzzer,OUTPUT);// Définir la sortie du buzzer
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(LEDPin, OUTPUT); // activer la LED sur la carte (si nécessaire)
pinMode(REDPin, OUTPUT); // activer la LED rouge alerte
}
// Partie du code continuellement exécuté
// Son but est d'effectuer un cycle de détection pour déterminer
// la distance de l'objet le plus proche (par réverbération de
// l'onde sur ce dernier)
void loop(){
// Envoi une impulsion de 10 micro seconde sur la broche "trigger"
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Attend que la broche Echo passe au niveau HAUT
// retourne la durée
duration = pulseIn(echoPin, HIGH);
//Calculer la distance (en cm, basé sur la vitesse du son).
distance = duration/58.2;
// Si la distance mesurée est HORS des valeurs acceptables
if (distance >= maximumRange || distance <= minimumRange)
{
// Eteindre la LED pour indiquer l'erreur */
digitalWrite(LEDPin, LOW);
digitalWrite(REDPin, LOW);
}
else {
/* Allumer la LED pour indiquer une lecture correcte. */
lcd.setCursor(11,0);
String stringOne = "cm ";
String stringTwo = distance + stringOne;
lcd.print(stringTwo);
digitalWrite(LEDPin, HIGH);
digitalWrite(REDPin, LOW);
}
if (distance <= alerte / 4)
{
mySerial.write("LED OFF");
Serial.println("LED OFF");
digitalWrite(LEDPin, LOW);
lcd.setCursor(3,1);
lcd.print(" STOP !!! ");
digitalWrite(buzzer, HIGH);// Faire du bruit
delay(50);// Attendre 10ms
digitalWrite(buzzer, LOW);// Silence
delay(50);// Attendre 10ms
}
else if (distance > (alerte / 4) and (distance <= alerte / 2))
{
mySerial.write("LED ON");
Serial.println("LED ON");
digitalWrite(LEDPin, HIGH);
lcd.setCursor(3,1);
lcd.print(" ATTENTION !! ");
digitalWrite(buzzer, HIGH);// Faire du bruit
delay(100);// Attendre 10ms
digitalWrite(buzzer, LOW);// Silence
delay(100);// Attendre 10ms
}
else if (distance > (alerte / 2) and (distance <= alerte-5))
{
mySerial.write("LED ON");
Serial.println("LED ON");
digitalWrite(LEDPin, HIGH);
lcd.setCursor(3,1);
lcd.print(" OBSTACLE ! ");
digitalWrite(buzzer, HIGH);// Faire du bruit
delay(200);// Attendre 10ms
digitalWrite(buzzer, LOW);// Silence
delay(200);// Attendre 10ms
}
else {
mySerial.write("LED ON");
Serial.println("LED ON");
digitalWrite(LEDPin, HIGH);
lcd.setCursor(3,1);
lcd.print("OK ");
}
}
Code marche arrière (arduino esclave) :
void DemiTour()
{
while (mySerial.available()) { // tant qu'il y a des caractères à lire
delay(10); //delay to allow byte to arrive in input buffer
char ledState = mySerial.read();
readString += ledState;
}
if (readString.length() > 0) {
Serial.println(readString);
if (readString.indexOf("LED ON") != -1) {
digitalWrite(D0UT_MOTEUR_GAUCHE_1,LOW);
digitalWrite(D0UT_MOTEUR_GAUCHE_2,HIGH);
digitalWrite(D0UT_MOTEUR_DROIT_3,LOW);
digitalWrite(D0UT_MOTEUR_DROIT_4,HIGH);
digitalWrite(DOUT_MOTEUR_GAUCHE_EN,HIGH);
digitalWrite(DOUT_MOTEUR_DROIT_EN,HIGH);
delay(dureeDunDemiTour);
digitalWrite(D0UT_MOTEUR_GAUCHE_1,LOW);
digitalWrite(D0UT_MOTEUR_GAUCHE_2,HIGH);
digitalWrite(D0UT_MOTEUR_DROIT_3,LOW);
digitalWrite(D0UT_MOTEUR_DROIT_4,HIGH);
digitalWrite(DOUT_MOTEUR_GAUCHE_EN,LOW);
digitalWrite(DOUT_MOTEUR_DROIT_EN,HIGH);
delay(dureeDemiTourPivoter);
}
if (readString.indexOf("LED OFF") != -1) {
digitalWrite(DOUT_MOTEUR_GAUCHE_EN,LOW);
digitalWrite(DOUT_MOTEUR_DROIT_EN,LOW);
digitalWrite(D0UT_MOTEUR_GAUCHE_1,LOW);
digitalWrite(D0UT_MOTEUR_GAUCHE_2,LOW);
digitalWrite(D0UT_MOTEUR_DROIT_3,LOW);
digitalWrite(D0UT_MOTEUR_DROIT_4,LOW);
AvanceEnLigneDroite();
}
readString = "";
}
allumeLEDRouge();
}
Avec ceci en haut de page :
#include <SoftwareSerial.h>
SoftwareSerial mySerial(0, 1); // RX, TX
String readString;
Et ceci au début du setup():
Serial.begin(115200);
while (!Serial) {
;
}
Serial.println("Ecoute");
mySerial.begin(57600);
où sont ensuite activés les pin des moteurs et du servo-moteur en dessous.
Merci à ceux qui m'aident et qui y consacrent leur temps. Je débute en arduino.
PS : dans le moniteur série du programme qui gère le moniteur de recul, "LED ON" est affiché tant que l'obstacle est à plus de 4cm, "LED OFF" sinon.
gg_du95
dim, 04/29/2018 - 16:34
J'ai supprimé les #include <SoftwareSerial.h> et SoftwareSerial mySerial(0,1); et les mySerial.write dans les if du radar de recul. J'ai laissé dans les setup les Serial.begin(..) et supprimé les mySerial...
Le code est ci-dessous.
Merci
meuh
lun, 04/30/2018 - 07:58
Salut gg_du95, je suis en train de lire ton programme radar de recul et je note que tu as déclaré des entrées/sorties pour 2 composant ( #define REDPin 9 // LED rouge alerte ET int buzzer = 9;// Borne de sortie) est ce normal?Idem avec les declarations faitent en commentaire ( Echo sur Arduino broche 7
Trig sur Arduino broche 8 ET
#define echoPin 6 // broche Echo
#define trigPin 7 // broche Trigger (declenchement).
sinon tu devrais penser a mettre le schéma de câblage et quelques photos de ta machine ...C est + sympa et ça ferait un projet complet.
Bravo, pour ton code...
A+
gg_du95
lun, 04/30/2018 - 22:46
Salut Meuh, oui c'est normal j'ai branché la LED rouge sur le pin du buzzer (à l'aide de la breadboard) pour faire en sorte que la LED clignotte de la même intensité que le buzzer sonne. Plus l'obstacle se rapproche, plus le buzzer sonne à intervalles rapprochés.
Je posterai le projet une fois vraiment fini, j'attends une carte MEGA pour pouvoir gérer les moteurs (partie voiture autonome) et le radar de recul. J'integrerai ensuite le module HC06 pour pouvoir le contrôler à l'aide de la voix (je m'aiderai de la vidéo d'Alexandre sur la reconnaissance vocale).
A +