Go Down

Topic: Communication minimale entre deux cartes arduino (Read 1 time) previous topic - next topic

maxdata63

Bonjour,

Je viens solliciter votre aide car je n'arrive pas à faire communiquer mes deux cartes Educa DUINO

J'aimerai que l'une des carte envoie un signal à l'autre pour interrompre le cycle de la deuxième carte

Voici mon code



Il s'agit de la carte réceptrice
Code: [Select]
//définition des broches
const int rouge_1 = 4;
const int jaune_1 = 3;
const int vert_1 = 2;
int veille = 7;
unsigned long misenv;
 
void setup()
{
    //initialisation en sortie de toutes les broches
    pinMode(rouge_1, OUTPUT);
    pinMode(jaune_1, OUTPUT);
    pinMode(vert_1, OUTPUT);
    //on initialise toutes les LED éteintes au début du programme
    digitalWrite(rouge_1, LOW);
    digitalWrite(jaune_1, LOW);
    digitalWrite(vert_1, LOW);
   
}
void loop()
{
  misenv = pulseIn(veille,LOW);
  if(misenv == LOW){
    // première séquence
    digitalWrite(rouge_1, HIGH);
    digitalWrite(jaune_1, LOW);
    digitalWrite(vert_1, LOW);
   
    delay(5000);
   
    // deuxième séquence
    digitalWrite (rouge_1, LOW);
    digitalWrite(vert_1, HIGH);
    digitalWrite(jaune_1, LOW);
   
    delay(7000);
   
    // troisième séquence
    digitalWrite(jaune_1, HIGH);
    digitalWrite(rouge_1, LOW);
    digitalWrite(vert_1, LOW);
   
    delay(2000);
  }
   else {
 
   digitalWrite(jaune_1, HIGH);
   delay (1000);
   digitalWrite(jaune_1, LOW);
 

 
 }
}
 




Et ici la carte qui enverrai le signal.

Code: [Select]
//**********************************************************

// Les leds s'allument selon la distance trop près / trop loin
//**********************************************************
#define trigPin 13  //Trig Ultrasons (sortie)
#define echoPin 12  //Echo Ultrasons (entrée)
#define ledVerte 11      //Led verte
#define ledRouge 10     //Led rouge
#define veille 7


void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);  //Trig est une sortie
  pinMode(echoPin, INPUT);   //Echo est le retour, en entrée
  pinMode(ledVerte, OUTPUT);
  pinMode(ledRouge, OUTPUT);
  pinMode(veille, OUTPUT);
}

void loop() {
  int N=0;
  long duration, distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); //Trig déclenché 10ms sur HIGH
  digitalWrite(trigPin, LOW);
 
  // Calcul de l'écho
  duration = pulseIn(echoPin, HIGH);
  // Distance proportionnelle à la durée de sortie
  distance = duration*340/(2*10000);  //Vitesse du son théorique
 
  if (distance < 30) {
    digitalWrite(ledVerte,HIGH); //Vert éclairé seulement
    digitalWrite(ledRouge,LOW);
  }
  while(N != 300 ){
    delay(10);
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10); //Trig déclenché 10ms sur HIGH
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    distance = duration*340/(2*10000);  //Vitesse du son théorique
    if(distance > 30){
      N=N+1;
    }
    else{
     digitalWrite(ledVerte,HIGH);
     digitalWrite(ledRouge,LOW);
    }
  }
   digitalWrite(ledVerte,LOW);
   digitalWrite(ledRouge,HIGH);
   digitalWrite(veille,HIGH);
   }
 
 



J'ai beau testé , ça ne fonctionne pas...

Merci d'avance pour votre aide ^^  :)

fdufnews

#1
Feb 20, 2016, 07:31 pm Last Edit: Feb 20, 2016, 07:32 pm by fdufnews
En même temps si tu ne nous expliques pas quelle est la forme du signal que tu veux envoyer et sur quelle broche il devrait sortir de l'un et entrer sur l'autre on va avoir du mal à t'aider.

maxdata63

J'aimerai que ce soit un signal logique envoyé sur la broche 7 des deux cartes

fdufnews

#3
Feb 20, 2016, 08:23 pm Last Edit: Feb 20, 2016, 08:24 pm by fdufnews
Ce code ne peut pas fonctionner
Code: [Select]
 misenv = pulseIn(veille,LOW);
  if(misenv == LOW){

pulseIn sert à mesurer la durée d'une impulsion et toi tu sembles t'en servir pour déterminer l'état de ton entrée veille. Il faudrait utiliser un digitalRead à la place.

Dans ton code d'émission, tu mets veille à HIGH à la fin du code mais tu ne le fais jamais redescendre.

maxdata63

En essayant avec digitalRead ça ne réagit pas...
Auriez vous un exemple de ce que je devrai faire ?

fdufnews

#5
Feb 20, 2016, 10:09 pm Last Edit: Feb 20, 2016, 10:10 pm by fdufnews
Utilisez digitalRead(veille) à la place du pulseIn(veille, LOW) tout simplement.
https://www.arduino.cc/en/Reference/DigitalRead

maxdata63

#6
Feb 20, 2016, 11:06 pm Last Edit: Feb 20, 2016, 11:25 pm by maxdata63
J'ai donc fais ceci et ça donne ça :

Carte réceptrice
Code: [Select]
//définition des broches
const int rouge_1 = 4;
const int jaune_1 = 3;
const int vert_1 = 2;
const int veille = 7;
 
void setup()
{
    //initialisation en sortie de toutes les broches
    pinMode(rouge_1, OUTPUT);
    pinMode(jaune_1, OUTPUT);
    pinMode(vert_1, OUTPUT);
    pinMode(veille, INPUT);
   
    //on initialise toutes les LED éteintes au début du programme
    digitalWrite(rouge_1, LOW);
    digitalWrite(jaune_1, LOW);
    digitalWrite(vert_1, LOW);
   
}
void loop()
{   digitalRead(veille);
    if(veille == HIGH){
    // première séquence
    digitalWrite(rouge_1, HIGH);
    digitalWrite(jaune_1, LOW);
    digitalWrite(vert_1, LOW);
   
    delay(5000);
   
    // deuxième séquence
    digitalWrite (rouge_1, LOW);
    digitalWrite(vert_1, HIGH);
    digitalWrite(jaune_1, LOW);
   
    delay(7000);
   
    // troisième séquence
    digitalWrite(jaune_1, HIGH);
    digitalWrite(rouge_1, LOW);
    digitalWrite(vert_1, LOW);
   
    delay(2000);
    }
  else {
    digitalWrite(jaune_1, HIGH);
    delay(1000);
    digitalWrite(jaune_1, LOW);
   
  }

}


Carte d'envoi
Code: [Select]
//**********************************************************

// Les leds s'allument selon la distance trop près / trop loin
//**********************************************************
#define trigPin 13  //Trig Ultrasons (sortie)
#define echoPin 12  //Echo Ultrasons (entrée)
#define ledVerte 11      //Led verte
#define ledRouge 10     //Led rouge
#define veille 7

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);  //Trig est une sortie
  pinMode(echoPin, INPUT);   //Echo est le retour, en entrée
  pinMode(ledVerte, OUTPUT);
  pinMode(ledRouge, OUTPUT);
  pinMode(veille, OUTPUT);
}

void loop() {
  int N=0;
  long duration, distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); //Trig déclenché 10ms sur HIGH
  digitalWrite(trigPin, LOW);
 
  // Calcul de l'écho
  duration = pulseIn(echoPin, HIGH);
  // Distance proportionnelle à la durée de sortie
  distance = duration*340/(2*10000);  //Vitesse du son théorique
 
  if (distance < 30) {
    digitalWrite(ledVerte,HIGH); //Vert éclairé seulement
    digitalWrite(ledRouge,LOW);
  }
  while(N != 300 ){
    delay(10);
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10); //Trig déclenché 10ms sur HIGH
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    distance = duration*340/(2*10000);  //Vitesse du son théorique
    if(distance > 30){
      N=N+1;
    }
    else{
     digitalWrite(ledVerte,HIGH);
     digitalWrite(ledRouge,LOW);
    }
  }
   digitalWrite(ledVerte,LOW);
   digitalWrite(ledRouge,HIGH);
   digitalWrite(veille,HIGH);
   }
 
 


La deuxième carte fonctionne malgré une plus grande latence

Par contre la première reste constamment bloqué en led orange et ne semble pas changé même si la carte d'envoi est censée envoyer des choses différentes .

Peut être le comparateur avec HIGH, je ne suis pas sûr de faire la bonne option.

fdufnews

Je te l'ai déjà dit la carte d'envoi n'envoie rien. La sortie veille bascule 1 fois à un et ne bouge plus par la suite.
Si tu expliquais clairement le comportement que tu attends ce serait plus facile de t'aider.

maxdata63

J'aimerai que la carte envoie un signal à la seconde lorsque veille est vérifiée pour que la Led jaune clignote. Dès que la vielle est à 0, l'autre carte se remet à fonctionner normalement

fdufnews

Je ne suis pas certain que l'on donne le même sens à l'adverbe clairement.
Pourrais-tu décrire les étapes du déroulement du programme de chacune des cartes.
Tes programmes sont pleins de delay() qui doivent perturber leur déroulement.
Dans la carte envoi tu as une boucle de comptage qui dans certains cas doit se bloquer parce que le compteur N n'est pa incrémenté.
Au passage, ces deux programmes sont complètement indépendants. Ils peuvent être testés séparément ce qui simplifierait leur mise au point.
Pour la carte d'envoi, tu peux utiliser une LED sur la sortie veille pour voir si elle se comporte comme tu le veux.
Pour la carte réception, tu peux utiliser un bouton poussoir pour simuler le changement d'état de la ligne veille.

maxdata63

La carte d'envoi fonctionne correctement, j'ai corrigé les soucis de plantage.

Code: [Select]
#define trigPin 13  //Trig Ultrasons (sortie)
#define echoPin 12  //Echo Ultrasons (entrée)
#define ledVerte 11      //Led verte
#define ledRouge 10     //Led rouge
#define veille 7

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);  //Trig est une sortie
  pinMode(echoPin, INPUT);   //Echo est le retour, en entrée
  pinMode(ledVerte, OUTPUT);
  pinMode(ledRouge, OUTPUT);
  pinMode(veille, OUTPUT);
}

void loop() {
  int N=0;
  long duration, distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); //Trig déclenché 10ms sur HIGH
  digitalWrite(trigPin, LOW);
 
  // Calcul de l'écho
  duration = pulseIn(echoPin, HIGH);
  // Distance proportionnelle à la durée de sortie
  distance = duration*340/(2*10000);  //Vitesse du son théorique
 
  if (distance < 30) {
    digitalWrite(ledVerte,HIGH); //Vert éclairé seulement
    digitalWrite(ledRouge,LOW);
  }
  while(N != 300 )
   {
    delay(10);
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10); //Trig déclenché 10ms sur HIGH
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    distance = duration*340/(2*10000);  //Vitesse du son théorique
    if(distance > 30)
    {
      N=N+1;
    }
    else
    {
     digitalWrite(ledVerte,HIGH);
     digitalWrite(ledRouge,LOW);
     digitalWrite(veille,LOW);
     N=0;
    }
   }
   if(N == 300){
   digitalWrite(ledVerte,LOW);
   digitalWrite(ledRouge,HIGH);
   digitalWrite(veille,HIGH);
   }
 
}
 
 



La seconde s'éteint donc à la fin du cycle à cause des délais, mais je n'arrive pas à faire clignoter la led jaune ensuite de ce feu tricolor:
Une alternative à delay est possible ?
Code: [Select]
//définition des broches
const int rouge_1 = 4;
const int jaune_1 = 3;
const int vert_1 = 2;
int veille = 7;
unsigned  misev;
 
void setup()
{
    //initialisation en sortie de toutes les broches
    pinMode(rouge_1, OUTPUT);
    pinMode(jaune_1, OUTPUT);
    pinMode(vert_1, OUTPUT);
    pinMode(veille, INPUT);
   
    //on initialise toutes les LED éteintes au début du programme
    digitalWrite(rouge_1, LOW);
    digitalWrite(jaune_1, LOW);
    digitalWrite(vert_1, LOW);
   
}
void loop()
{   
    misev=digitalRead(veille);
    if(misev == LOW){
    // première séquence
    digitalWrite(rouge_1, HIGH);
    digitalWrite(jaune_1, LOW);
    digitalWrite(vert_1, LOW);
   
    delay(5000);
   
    // deuxième séquence
    digitalWrite (rouge_1, LOW);
    digitalWrite(vert_1, HIGH);
    digitalWrite(jaune_1, LOW);
   
    delay(7000);
   
    // troisième séquence
    digitalWrite(jaune_1, HIGH);
    digitalWrite(rouge_1, LOW);
    digitalWrite(vert_1, LOW);
   
    delay(2000);
    }
  else{
    digitalWrite(jaune_1, LOW);
   
   
  }

}

bouault

Le programme est bloqué pendant les delay(), et donc le digitalRead(veille) ne se fait que toutes les 14 secondes...
il faut donc en effet supprimer tous ces delays. Pour cela tu peux t'inspirer du programme "blinkWithoutDelay" que tu trouveras dans Fichier/Exemples/02.Digital
Jacques
arpschuino.fr

Go Up