Liaison RS485

Bonsoir,

Il y a quelques années, j'ai conçu un système de tir pour les artifices de divertissement. Le projet se composait de deux ou trois boîtiers (Emetteur / (2) Recepteur(s)). Ils communiquent ensembles via une liaison série grâce au module RS485.

Je pensait l'améliorer en y ajoutant un contrôle des liaisons entre les boîtiers grâce à des led qui s'allumeraient dans les cas suivant :

Emetteur->''envoi une donnée" ->Récepteur "lit la donnée/allume la led de liaison/envoi une autre donnée" ->Emetteur "lit l'autre donnée/allume la led de confirmation"

On envoi D pour allumer la led de liaison et on reçoit C pour allumé la confirmation
On envoi A pour allumer la led de tir et on envoi B pour l'éteindre

Le prototype se compose de

(Emetteur)

  • Arduino nano
  • RS485
  • 1 Led de comfirmation
  • 1 bouton pour la commande d'une ligne de tir
  • 1 bouton pour la demande de confirmation vers le recpteur

(Recepteur)

  • Arduino nano
  • RS485
  • 1 led pour confirmer la liaison
  • 1 led qui simule le tir d'une lignes

J'ai réalisé un bout de code, j'ai un soucis lorsque je passe l'émetteur en récepteur et inversement. Le récepteur reçoit n'importe quoi sur son port de série du style "AfgthBAE??htfzsxf?" (ce qui est dangereux pour l'utilisation de se projet) :o et les led du récepteur s'allumes et celle de tir s’éteint lorsque les bonnes lettres sont lue sur le port de série. Par contre l'émetteur de reçoit pas la confirmation.

Code Emetteur

const int L1 = 2;
const int bouton1Pin = 3;
const int bouton2Pin = 4;
int senstrans = 8;

int bouton1etat = 0;
int lastbouton1etat = 0;
int bouton2etat = 0;
int lastbouton2etat = 0;

void setup() {

pinMode(L1,OUTPUT);
pinMode(bouton1Pin,INPUT);
pinMode(bouton2Pin,INPUT);
pinMode(senstrans,OUTPUT);
Serial.begin(9600);
}

void loop() {

  digitalWrite(senstrans,LOW);
  
  if(Serial.available()>0){
  
  char letter = Serial.read();
  Serial.print(letter);

  if(letter == 67)
  {
    digitalWrite(L1,HIGH);
    delay(10);
    }
  }

  digitalWrite(senstrans,HIGH);
  
bouton1etat = digitalRead(bouton1Pin);
if(bouton1etat != lastbouton1etat){
  
  if(bouton1etat==HIGH){
  Serial.write(68); // send a byte with the value 68
  }
  lastbouton1etat = bouton1etat;
  }
  
bouton2etat = digitalRead(bouton2Pin);
if(bouton2etat != lastbouton2etat){
    
  if(bouton2etat==HIGH){
    Serial.write(65);
  }
  else{
    Serial.write(66);
  }
  lastbouton2etat = bouton2etat;
  }
}

Code Récepteur

const int L1 = 2;
const int L2 = 3;
int senstrans = 8;

void setup() {
 pinMode(L1,OUTPUT);
 pinMode(L2,OUTPUT);
 pinMode(senstrans,OUTPUT);
 Serial.begin(9600);
 delay(10);
}

void loop() {

  digitalWrite(senstrans,LOW);
  
if(Serial.available()>0){
  
  char letter = Serial.read();
  Serial.print(letter);

  if(letter == 68)
  {
    digitalWrite(L1,HIGH);
    digitalWrite(senstrans,HIGH);
    delay(1000);
    Serial.write(67);
  }
  
  if(letter == 65)
  {
    digitalWrite(L2,HIGH);
  }
  if(letter == 66)
  {
    digitalWrite(L2,LOW);
  }
}
}

J'avais commencé le proto en utilisant la liaison série des arduino et ca fonctionnait très bien, depuis j'ai inclus les modules RS485 c'est le souk ! :-[

Quelqu'un aurait une idée de l'erreur ?

La ligne est bien adaptée avec des résistances de terminaisons?

Si la ligne peut se trouver sans émetteur pour maintenir la polarisation de la ligne il faut placer des résistances de polarisation afin que le bus ne flotte pas pendant cette période.

contenteetimes-images-01steve-t-understandrs485intersilkugelstadt-f1x600.jpg

Je n'ai pas mis de resistances de terminaison dans le circuit, car avant la modif avec un émetteur et récepteur sans changement fonction, ca fonctionnait très bien.

Si je comprend bien, il arrive un moment dans le programme où le récepteur se trouve sans émetteur et inversement, d'où le problème de communication ?

A quoi servent les résistances entre le pin A et GND puis le pin B et GND ?

Quels la valeur approprier des résistances selon vous ?

Sur internet on trouve plusieurs montage de ses resistances avec des valeurs différentes.

J'ai trouver un document sur le module RS485, il conseil de mettre deux resistances de terminaison de 120 ohm. Mais pas de resistances en A et 5v et B et GND.
Je vais essayer

J'ai réalisé les branchements de ton schéma fdufnews.

Rt1 et Rt2 = 120 ohm
Rb x2 = 650 ohm

La communication fonctionnent correctement avec ces resistances, la liaison n'est plus perturbé :smiley: Le récepteur reçoit la demande de confirmation et allume la led puis il envoi la lettre C, mais l'émetteur ne reçoit pas la lettre C.

Le code à l'aire bon en mon sens ::slight_smile:

La valeur des résistances RT1 et RT2 dépendent de l'impédance caractéristique du câble utilisé.
C'est pour cela que différentes valeurs sont conseillées mais généralement la raison n'est pas expliquée.

Comme elles sont placées en mode différentiel leur valeur est celle du double de l'impédance caractéristique du câble.
Avec du cable cat 5, dont l'impédance carractéristique est de 100 ohms, il est conseillé de mettre des résistances de 200 Ohms.

Lors de l'installation des boîtiers sur le site de tir, je relie les boîtiers avec du câble pour haut parleur de 1mm2. Il faut je regard ses caractéristiques pour trouver l'impedance du fil.

L'impédance d'une telle paire de fil dépend des dimensions géométriques du câble.
S= 1 mm2 => d = 0,6mm
J'estime à 2mm le diamètre du câble avec son isolant
J'estime à 4 la valeur epsilon_relatif
et en utilisant l'outil "PCB_Calculator" de Kicad j'obtiens une valeur, forcément estimée , de 170 ohms.

Comme ce sont des estimations tant que cela fonctionne reste avec la valeur déjà câblée qui est déjà bien meilleure que rien du tout.
Si tu venais à rencontrer des nouvelles difficultés tu pourra essayer d'augmenter cette valeur dans la limite de 2 fois 170 ohms.
Par expérience, et c'est difficile d'expliquer l'expérience, j'ai toujours obtenu de meilleurs résultats avec une valeur inférieure à la valeur théorique.

Supert ! Merci pour l'explication :slight_smile:

Il me manque juste à comprendre pourquoi l'émetteur ne reçoit pas la confirmation et à le corriger :grinning: