Je travaille actuellement sur une architecture un peu "tentaculaire" :
Un maître (Mega 2560) converse avec 4 esclaves (Nano) sur un bus RS485.
J'ai traité facilement les échanges sous la forme de 4 programmes organisés identiquement selon le canevas suivant :
Le maître envoie l'entête du premier esclave et éventuellement des données associées.
Il passe ensuite en écoute et attend l'entête de l'escalve concerné et traite les données reçues.
Un exemple de code :
currentMillis = millis();
if (currentMillis - previousMillis >= 500) // toutes les 0.5 secondes
{digitalWrite(2, HIGH); // passage en mode émission du RS485
delay(10); // attente de de la commutation
Serial1.println("40 1234 1345 1456"); // envoi de l'en-tête 40 et de trois variables
delay(20); // attente de fin de transmission
digitalWrite(2, LOW); // passage en mode réception du RS485
previousMillis = currentMillis;}
while (Serial1.available()>0) { // écoute du port série
header = Serial1.parseInt(); // réception d'une en-tête
if (header == 4) // si c'est ce qu'il attend
{Mode = (Serial1.parseInt()); // enregistrement des variables reçues
ChaufBU = (Serial1.parseInt());
ChaufBV = (Serial1.parseInt());
ChaufBW = (Serial1.parseInt());
TempB = (Serial1.parseFloat()); }
Chaque dialogue a été codé sur le même schéma . J'ai donc écrit et validé 4 codes :
Mega vers Nano1
Mega vers Nano2
Mega vers Nano3
Mega vers Nano4
Par contre j'avoue sécher sur "l'assemblage" (ou concaténation) des 4 codes du Mega en un seul.
J'avais imaginé un switch / case avec la prise en compte de l'état "prêt" de chaque Nano pour éviter le blocage.
Avec ou sans cete précaution, je ne trouve pas de solution qui marche.
J'ai aussi enchaîné bêtement 2 codes tels que mentionné (donc pour 2 esclaves) et les données reçues se répètent de manière irrégulière...
Connaissez-vous un canevas qui fonctionnerait proprement?
Il faut d'abord expliquer ce que tu veux.
Veux-tu écouter en même temps que le Méga émet, ou bien les phases d'émission et de réception sont-elles distinctes ?
Chaque nano a t-il son propre canal de communication ?
c'est très simple : le Mega est le patron : il fait le tour des "popotes" en s'adressant aux Nano à tour de rôle avec une entête (+ données).
Il attend que le nano concerné lui réponde avant de faire de même pour le suivant.
Il n'y a jamais de conflit.
Tout le monde est sur le même bus RS485 (A+B+ GND).
C'est l'écriture du code du Mega qui me perturbe (en fait la séquence passant d'un Nano à l'autre)
Je pense que je vais finalement abandonner l'idée de créer mon propre protocole pour m'orienter vers le ModbusRTU.
En fouillant je suis tombé sur une bibliothèque écrite pour un shield MKR dont les exemples sont d'une simplicité renversante (et précieuse pour le vieux newbee que je suis ) :
pour l'émetteur :
#include <ArduinoRS485.h>
void setup() {
Serial.begin(9600);
while (!Serial);
RS485.begin(9600);
// enable reception, can be disabled with: RS485.noReceive();
RS485.receive();
}
void loop() {
if (RS485.available()) {
Serial.write(RS485.read());
}
}
Ne possédant pas de MKR je vais émettre d'un maître Mega 2560 vers plusieurs Nano V3.
Pourrais-je espérer de l'aide pour modifier cette bibliothèque en laissant libres les infos spécifiques au MKR comme TX pin, DE pin, Re pin - infos à définir en #define ?
Je suis par ailleurs surpris de ne pas trouver de définiton de pin RX et de trouver une définition de pin RE, qui en fait est connectée avec celle de DE...
Je ne vois pas non plus comment définir les identités des récepteurs...
Je n'ai personnellement pas d'expérience sur un bus RD485.
Modifier une bibliothèque peut s'avérer compliqué, je ne sais pas si les membres du forum seront motivés par cette demande...
Bref, si cette bibliothèque ne te convient pas, je te suggère de tester celle-ci :
@robtillaart est un gage de qualité et aussi un membre du forum (in english though), donc il pourra peut-être t'aider si tu rencontres des problèmes.