Go Down

Topic: Problème de communication entre 2 arduino Mega via module RS485 (Read 185 times) previous topic - next topic

Sylenix

Bonjour bonjour,


Cela fait un petit moment que je survole le forum pour résoudre mes problèmes et j'ai toujours trouvé les réponses à mes questions jusque là.

J'ai à présent un problème dont je ne comprend pas la cause et je n'ai rien trouvé ici.



J'ai réalisé un montage afin de faire communiquer deux cartes arduino (Uno tout d'abord en attendant mes livraisons) par le biais de modules RS485.
Tout fonctionne normalement, les informations transmises/reçues sont les bonnes etc donc le code est ok.

Je voudrais maintenant faire communiquer deux cartes arduino Mega entre elles de la même façon mais cela ne fonctionne pas. Je choisis bien évidemment le bon port et je change le type de carte.

Ce qui est drôle, c'est que si je mets un Mega en Maître et un Uno en Esclave, ça fonctionne parfaitement, mais pas l'inverse, et pas non plus avec 2 Mega.

Auriez-vous une idée de ce qui cause ce problème ?


Code partie Maître :
Code: [Select]

#include <SoftwareSerial.h>

/***** COM *****/
#define RX       3              //Serial Receive pin
#define TX       4              //Serial Transmit pin
#define Dir   2                 //RS485 Direction control
#define COMTx     HIGH
#define COMRx     LOW
#define LEDA       13
SoftwareSerial COM(RX, TX);     //RX, TX

/***** INFORMATIONS *****/

/***** VARIABLES *****/
int BoutonTIR = 5;            //BoutonTIR défini sur la broche 5
int ClefTIR = 6;              //ModeTir défini sur la broche 6
int ClefTEST = 7;             //ModeTest défini sur la broche 7
int LEDTir = 9;              //LEDTest défini sur la broche 9

int Commande;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  
  //attachInterrupt(0, InterruptionTEST, LOW);
  pinMode(BoutonTIR, INPUT_PULLUP);      // Pin  5 Définie en entrée
  pinMode(ClefTIR, INPUT_PULLUP);        // Pin  6 Définie en entrée
  pinMode(ClefTEST, INPUT_PULLUP);       // Pin  7 Définie en entrée
  pinMode(LEDTir, OUTPUT);          // Pin  Définie en sortie
  
  pinMode(Dir,OUTPUT);
  COM.begin(9600);                //Détermine la fréquence de donnée
  
  Serial.println("Mallette Commande");
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(Dir,COMTx);                    //Activer la transmission
  
  if(digitalRead(BoutonTIR) == LOW){
    Serial.print("Commande envoyée : ");
    if(digitalRead(ClefTEST) == LOW){
      Serial.println("1");
      Eteindre();
      digitalWrite(LEDTir, LOW);
    }
    else if(digitalRead(ClefTIR) == LOW){
      Serial.println("2");
      Allumer();
      digitalWrite(LEDTir, HIGH);
    }
  }
}

void Allumer(){
  COM.write(2);
}

void Eteindre(){
  COM.write(1);
}


Code partie Esclave :
Code: [Select]
#include <SoftwareSerial.h>

#define RX       3              //Serial Receive pin
#define TX       4              //Serial Transmit pin

#define Dir      2              //RS485 Direction control
#define COMTx    HIGH
#define COMRx    LOW

#define LEDA     13

SoftwareSerial COM(RX, TX);     //RX, TX

int ClefTEST = 5;             //ClefTEST défini sur la broche 5
int ClefTIR = 6;              //ClefTIR défini sur la broche 6
int BoutonTEST = 7;           //BoutonTEST défini sur la broche 7
int LEDTir = 9;               //LEDTir défini sur la broche 9

int Commande;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  
  pinMode(BoutonTEST, INPUT_PULLUP);    //BoutonTEST Définie en entrée
  pinMode(ClefTEST, INPUT_PULLUP);      //ClefTEST Définie en entrée
  pinMode(ClefTIR, INPUT_PULLUP);       //ClefTIR Définie en entrée
  pinMode(LEDTir, OUTPUT);              //LEDTir Définie en sortie
  
  pinMode(Dir,OUTPUT);
  COM.begin(9600);                      //Détermine la fréquence de donnée

  Serial.println("Mallette Puissance");
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(Dir,COMRx);                    //Activer la réception
  
  if(COM.available()){
    Commande = COM.read();
    Serial.print("Commande reçue : ");
    Serial.println(Commande);
    if(Commande == 1){
      digitalWrite(LEDTir, LOW);
    }
    else if(Commande == 2){
      digitalWrite(LEDTir, HIGH);
    }
  }
}



Sylenix

fdufnews

Cela fait un petit moment que je survole le forum pour résoudre mes problèmes
Après avoir survolé, il faut mantenant passer à la pratique. Donc ça commence par ici pour poser des questions correctement

Sylenix

Après avoir survolé, il faut mantenant passer à la pratique. Donc ça commence par ici pour poser des questions correctement
Pourrais-tu m'expliquer ce que tu entends par "poser des questions correctement" ?
C'est mon tout premier post et j'ai pourtant fait attention de bien exprimer ma demande ainsi que de décrire ce que j'ai fait, le matériel que j'utilisais, ai-je oublié quelque chose ?

Je rajoute le code au cas où.

fdufnews

Avec le code s'est effectivement mieux.
La mega possède nativement 4 liens série matériels donc il vaudrait mieux utiliser Serial1, Serial2 ou Serial3 plutôt qu'un lien série Software.

De plus, si tu lis la doc de SoftwareSerial tu verras que l'on ne peut pas utiliser n'importe quelle I/O pour réaliser une UART avec SoftwareSerial (voir la partie Limitations).

Sylenix

Merci de ta réponse.

Donc d'après la librairie, mon problème vient du fait que j'utilise la pin 3 en Rx. Je vais le mettre sur la pin 10 et tester ça de suite.

Edit : C'était bien ça, la communication fonctionne dans les deux sens désormais, merci beaucoup !

fdufnews

L'utilisation des ports série matériels en lieu et place de softwareSerial rendrait le système bien plus performant.

Go Up