Acquisition de données de capteurs via RS485

Bonjour tout le monde .

Ceci est mon tout premier poste ,oui je débute dans ce domaine de l'arduino et le début est compliqué.

Je vais vous expliquer mon projet :

Je récupère des données de température avec des capteurs DS18B20 ( 7 capteurs)

Cest capteurs sont a différents endroits.
J'ai regrouper 4 capteurs dans une boîte/ dans une autre 3 capteurs avec donc différentes cartes arduino.

J'ai donc le programme pour récupérer la température de capteurs mais je voudrais communiquer ces température avec un bus de terrain à une autre carte arduino Mairre qui interrogera les esclaves afin de transmettre les données.

Je communiquer en RS485.

J'ai du mal à établir un programme pour communiquer entre les esclaves et la carte maître.

Voilà j'espère que je me suis bien expliquer , si vous me répondez n'hésitez pas a me refaire expliquer si il y a besoin.

Merci d'avance , tout aide sera bonne a prendre.

Bonjour et bienvenue,
Prendre connaissance des des bonnes pratiques du Forum Francophone
Tu ne dis pas ce qui te pose problème dans l'établissement de la connexion au bus RS485.
Tu ne donnes pas le code que tu fais tourner, le protocole mis en place et les librairies que tu utilises.
Tu ne donnes pas non plus d'informations sur ta configuration matérielle (longueur du bus, adaptation de ligne, ...)

Bonjour,

Tu peux créer un protocole ex nihilo. Mais tu peux aussi utiliser le protocole modbus, il y a plusieurs librairies pour ça.

Bonjour a tous et tout d'abord merci de vos réponses.

Mon projet est de récupérer plusieurs température dans différents silo à céréales.

Comme vous pouvez le voir sur cette modélisation solidworks , il y a plusieurs cellules ou j'installe des capteurs de température.

J'ai donc 4 capteurs de température à installer et a câbler sur 1 carte arduino pour C1/C2/C3.

Et 3 capteurs de température a installer sur 1 carte arduino pour C4.

Boite cellule 4 : 1 carte nano , 3 capteurs DS18B20

Etc...

Chaque boite sera relier par un câble d'alimentation pour établir un bus de terrain qui sera relier a l'armoire électrique.

Je souhaite donc que ces donnés de température soient transmise à 1 carte arduino Maitre qui sera placer dans l'armoire électrique pour que celle ci recupere TOUTES les donnes et ensuite les transmettent à un automate programmable.

J'utilise comme bibliothèque :
OneWire.h

Donc ça c'est pour récupérer les donnes des capteurs de température DS18B20

Maintenant j'en suis a la , je souhaite que toutes les cartes arduino nano qui qui recupere des donnés de ces capteurs DS18B20 les transfère sur 1 carte nano Maitre.

J'utilise les modules RS485 mais je n'ai pas encore commencer le programme pour envoyer les donnés de différentes cartes sur la carte aduino maître.

Les différentes cartes esclaves seront positionnées dans des boîtes de protection à environ 20 m de distance chacune

Je viens de faire un 1er test concluant afin de comprendre comment communiquer entre 2 cartes ( bon ca va vous paraître simple mais j'ai fait communiquer 2 cartes entres elles ) grave a ce code:

Code pour la carte maitre:

#define LED       13    // Declare LED pin
#define MASTER_EN   8   // connected to RS485 Enable pin

void setup() {
  pinMode(LED , OUTPUT);            // Declare LED pin as output
  pinMode(MASTER_EN , OUTPUT);      // Declare Enable pin as output
  Serial.begin(9600);               // set serial communication baudrate 
  digitalWrite(MASTER_EN , LOW);    // Make Enable pin low
                                    // Receiving mode ON 
}

void loop() {
  digitalWrite(MASTER_EN , HIGH);     // Make Enable pin high to send Data
  delay(5);                           // required minimum delay of 5ms
  Serial.println('A');                // Send character A serially
  Serial.flush();                     // wait for transmission of data
  delay(1000);
  digitalWrite(MASTER_EN , LOW);      // Receiving mode ON
}

Code pour la carte esclave : 



#define LED       13
#define SLAVE_EN  8

void setup() {
  pinMode(LED , OUTPUT);                        // Declare LED pin as output
  pinMode(SLAVE_EN , OUTPUT);                   // Declare Enable pin as output
  Serial.begin(9600);                           // set serial communication baudrate 
  digitalWrite(SLAVE_EN , LOW);                 // Make Enable pin low
                                                // Receiving mode ON 
}

void loop() {
  while(Serial.available())                     // If serial data is available then enter into while loop
  {
    if(Serial.read() == 'A')                    // if available data is A
    {
      digitalWrite(LED , !digitalRead(LED));    // LED Blink
    }
  }
}

Voilà ceci était un 1er test pour moi pour essayer de voir comment fonctionne une communication entre 2 cartes.

Désormais je souhaite faire ceci avec plusieurs cartes esclaves qui transmettent les données de température par un bus de terrain et 1 carte maitre qui va recevoir ces donnés.

Je ne sais pas si je me suis bien expliquer, je m'excuse d'avance car j'ai peur être du mal a faire comprendre mon projet à l'écrit.

N'hésitez pas à me posez des questions.

Je vous remercie d'avance.

Si c'est pour transmettre les données à un automate, pourquoi utiliser une carte maître. Beaucoup d'automates peuvent être maître modbus, ils peuvent sans doute communiquer directement avec les arduino reliés aux capteurs.

Pourquoi ne pas tout mettre sur un seul bus 1wire ? Si on met trois fils (gnd / data / +5V) on peut aller loin et/ou mettre pas mal de capteurs sur le bus. Du fait qu'on ne trouve pas de câble 3 fils économiques sur le marché, je recommanderais de mettre un câble 4 fils (2 paires) et de doubler la paire GND. Pour la connectique, le RJ11 me parait adapté.

Là on parle d'une installation de type industriel avec sans doute plusieurs dizaines de mètres.

Si ma mémoire est bonne le bus 1wire est donné pour 100 mètres.

Il n'y a pas que la longueur à prendre en compte.
Qu'elle est la tolérance du one wire aux perturbations en mode commun?
Sur la représentation de la configuration au #4 on voit une trémie, il y a aussi ce qui semble être un silo. Si on surveille la température on peut parier qu'il doit y avoir de la ventilation. Tout ça utilise des moteurs.
Tu ne penses pas qu'un bus RS485 sera plus fiable qu'un bus one wire dans une telle ambiance?

Le 1wire, si on prend des précautions de câblage, et le choix d'un câble à deux paires torsadées en est une, est aussi résistant aux perturbations qu'un rs485. Le pire qu'il puisse arriver est le coup de foudre, et dans ce cas là je pense que le 1wire résistera mieux qu'un rs485, dont les émetteurs et récepteurs sont alimentés localement. En effet, avec une possibilité de terres séparées s'il y a des bâtiments distincts et de grandes excursions de tension en mode commun, dans le cas de courants de retour importants par la terre suite au coup de foudre, le rs485 peut avoir bien plus de dégats sur les interfaces que le 1wire qui a un point d'alimentation centralisé avec la référence du GND à cet endroit là. Par contre, si on veut protéger le numérique (arduino, etc.) il peut être prudent d'optocoupler le lien numérique - 1wire. Inconvénient du 1wire, c'est lent. Mais pour mesurer des températures, en général on s'en fiche.

Je l'ai fait pour vous cette fois ci, mais merci de penser aux balises de de code

  • sélectionner la partie du texte qui correspond au code
  • appuyez sur l'icône </> dans la barre d'outils pour indiquer que c'est du code

(Assurez vous aussi d'indenter le code correctement dans l'IDE avant de le copier pour le coller ici. Cela se fait en pressant ctrlT sur PC ou cmdT sur un Mac)

Je n'ai aucune expérience dans du 0neWire de grande longueur et je peux pas dire si ici c'est jouable ou pas. Si tu nous dis que tu as déjà réalisé je te croirais sans problème.
Par contre, je ne partage pas tes justifications.

Le 1wire, (qui est un deux fils n'oublions pas la masse) est une liaison à haute impédance, le 485 est une liaison différentielle adaptée sur 3 fils.

Adaptée veut dire que la ligne fait une impédance de 200 ohms quelle que soit sa longueur. Que l'effet capacitif et inductif est théoriquement inexistant. Les imperfections font qu'il existe mais réduit à des valeurs très faibles.

Différentielle veut dire que le signal est double :

  • À l'émission deux signaux sont émis en opposition de phase.
  • La réception est un étage différentiel (entrée directe et entrée inverseuse) et l'organe de réception fait la différence entre les signaux.
    Ce qui revient à en faire la somme.

À l'exception près du bruit :
Le bruit ambiant touche de manière égale les deux signaux, mais du fait de la différence des signaux à l'entrée du récepteur le bruit est éliminé.

C'est quelque peu différent du OneWire où le bruit n'est pas éliminé et où la capacité s'ajoute avec la longueur.
Ce n'est pas la paire torsadée qui protège du bruit, elle permet seulement de préserver la forme des signaux dans la mesure où elle est adaptée sur son impédance caractéristique.

Pour moi le rs485 est une liaison deux fils en différentiel et pas trois. Le 1 wire peut s'utiliser en deux fils, auquel cas l'énergie est transmise sur le même support que le signal, ou bien en trois fils, le troisième étant destiné à alimenter les esclaves en énergie. Il est clair d'après la doc que si on veut mettre un nombre important d'esclaves et/ou aller loin, il faut travailler en trois fils. Et comme on ne trouve pas de câble trois conducteur dans ces faibles sections, on peut avantageusement utiliser un câble quatre conducteurs, à deux paires torsadées. La torsade des paires est un moyen de se protéger contre les parasites extérieurs. En réalité, comme l'énergie provient du noeud du réseau (point unique), on peut pratiquement considérer qu'on est en présence d'une transmission différentielle, le parasitage étant avant tout un mode commun entre les trois potentiels (GND / VCC / DATA). Personnellement j'ai testé le 1 wire sur une bobine de câble téléphone de 50m environ et je n'ai pas vu de différence avec la lecture d'une sonde de température située à 1,5 m d'un système numérique. MAIS, pour reprendre ce qui est écrit plus haut, il faut adapter l'impédance par une résistance de terminaison, essentiellement pour éviter les réflexions. Comme quoi il n'y a pas que le RS485 qu'il faut adapter. Bien entendu le RS485 est bien plus rapide, et ce n'est pas le même usage.

concernant le 1 wire : merci de rappeler qu'une ligne qui n'à que 2 fils est forcément équilibrée, ce qui permet une bonne réjection des perturbations en mode différentiel, avec du fil torsadé : on avait tendance à oublier ce point, vu l'echec commercial du 1 wire ; sans doute dommage

concernant le rs485, wikipédia : L'expérience pratique montre néanmoins que si la longueur de ligne de transmission dépasse une dizaine de mètres, il est nécessaire, soit de raccorder ensemble les potentiels de référence (0 V) de tous les dispositifs (dans ce cas la liaison RS-485 nécessite donc en réalité trois fils), soit de prendre des mesures drastiques (opto-isolation, composants spécifiques) pour s'assurer que les tensions entre masses et terres ne soient pas destructrices

en fait, dans un context industriel, et généralement dès qu'on sort d'un bâtiment, il faut absolument tenir compte du fait que les conducteurs d'un câble type "courants faibles" peut, non seulement être sujet à des influences pouvant perturber le fonctionnement, mais surtout être porté à des potentiels (en mode commun) dangereux, ce qui oblige à une mise à la terre de chaque nœud, donc la perte du bénéfice de la réjection des perturbations en mode différentiel ... pas simple dans la vraie vie

Dans le contexte cité par le créateur du fil, à savoir exclusivement des mesures de température par des sondes qui sont en natif en 1wire et un système numérique light (arduino), je ne m'embêterais pas avec du rs485. Je mettrais du 1wire avec un point central sur lequel je mettrais l'arduino et... la mise à la terre du noeud commun GND de l'Arduino et du 1wire. Par précaution j'alimenterais mon bus 1wire avec une alim séparée de celle de l'Aduino, par exemple avec une petite alim 5V à enficher dans une prise 220V. En cas de gros pépin électrique, de flash, etc. les composants à renouveler ne sont pas chers.

Maintenant que les arguments sont avancés si on stoppait là et si on laissait @apprentidu2899
faire ses choix ou continuer dans ce qu'il avait choisit le RS485.