Communication RS485 avec Arduino nano

Bonjour à tous,

Je suis actuellement en stage pour la validation du mon DUT cela fait maintenant un mois que je travaille avec la Arduino nano et aucun problème jusqu'à présent. Voilà, la suite de mon sujet est de pouvoir communiquer avec un SZ48 de chez Ditel, qui est un régulateur de concentration massique. Dans la documentation du régulateur j'ai pu voir que je pouvais communiquer via RS485 j'ai donc fais quelques recherches et vu que le MAX 485 permettais d'ajuster les niveaux de tension, envoyé par la Arduino, pour qu'ils soient compatible en RS485. J'ai alors commandé, câblé le composant en respectant la datasheet et programmé le code suivant:

---------------------------------CODE-----------------------------------
// La pin 2 de la Arduino est connecté aux broches RE&DE du MAX485
#define switchPin 2

#define rxPin 1
#define txPin 0

byte req[]= {0x02, 0x04, 0x00, 0x00, 0x00, 0x01, 0x31, 0xCA}; // La trame à envoyé afin de lire la valeur " PV " de la station n°2

byte RS485Byte = 0;

void setup() {

// Communication a 9600 b/s
Serial.begin(9600);
// pin tx pour envoyer les données
pinMode(txPin, OUTPUT);
// pin rx pour recevoir les données
pinMode(rxPin, INPUT);

pinMode(switchPin, OUTPUT);

digitalWrite(switchPin, HIGH); // Pin 2 à l'état Haut afin d'envoyer des données
Serial.write(req,8);
digitalWrite(switchPin, LOW);// Pin 2 à l'état Bas afin de recevoir des données

}

void loop() {

if( Serial.available()>0)
{
RS485Byte = Serial.read();
Serial.print("incoming Bytes : "); Serial.println(RS485Byte);
}
}

----------------------------------------FIN DU CODE-------------------------------------

et tout ce que je reçois sur le moniteur série c'est ça :

J'espère avoir été assez clair pour que vous puissiez m'aider, si vous le pouvez...

Merci bien et Bonne journée à tous !

et qu'est-ce que "ça" devrait être ?

Je ne sais pas du tout, le régulateur lorsque je lui envoie la trame est sensé me répondre : 0x02, 0x04, 0x02, 0x03, 0x46, 0x38, 0x32

voici le lien de la datasheet : ftp://ftp.cmdl.noaa.gov/aerosol/ugr/etc/Ditel_PID_SZ48-SZ49_Modbus.pdf

je fais le test avec l'exemple de la page 32.

Dans ce cas (données non-ascii) il faudrait déjà faire un Serial.println(RS485Byte, HEX); pour être plus au fait de ce qui arrive.

voir aussi la page 16 sur la config de la liaison série...

Ok pour les données en Hexa mais je n'ai toujours pas la bonne réponse, j'ai bien configuré comme indiqué sur la page 16.

Et même en affichant en Héxa j'ai toujours la même réponse : 1Ê ...

alors le problème est en amont... ta propre liaison série entre l'ordi et l'arduino, pas la bonne vitesse ? hypothèse, à voir...

Le port COM de mon PC est bien réglé à 9600 b/s aussi ...

Tu as sélectionné 9600 en bas de ton moniteur série ?

Un Serial.println(RS485Byte, HEX) ne peut pas afficher "1Ê"

ou bien un truc m'échappe...

edit: de l'héxa mandarin peut-être :slight_smile:

oui

Lorsque je déconnecte les fils de ma liaison série et que je touche une résistance ou bien même mes doigts j'ai bien des valeurs en Héxa qui s'affichent mais toujours le "1Ê" à la première ligne lors de l'envoi de la trame.

Cette partie du code pose problème:

 digitalWrite(switchPin, HIGH); // Pin 2 à l'état Haut afin d'envoyer des données
  Serial.write(req,8);
  digitalWrite(switchPin, LOW);// Pin 2 à l'état Bas afin de recevoir des données

Lorsque tu fais descendre switchPin tu ne sais pas si le buffer de transmission est vide. Tu dois très probablement interrompre la liaison série au milieu du transfert.
Il faudrait utiliser Serial.flush() pour être certain que le message a été complètement envoyé avant de basculer le sens de la liaison RS485.

Merci pour ta réponse ! je vais essayer ça.

Etienne1805:
Lorsque je déconnecte les fils de ma liaison série et que je touche une résistance ou bien même mes doigts j'ai bien des valeurs en Héxa qui s'affichent mais toujours le "1Ê" à la première ligne lors de l'envoi de la trame.

Je suis un peu surpris du fait que la liaison RS485 soit sensible "au toucher". Ton bus est bien adapté avec une résistance de 120 Ohms à chaque extrémités?

Non car je n'ai à disposition que des résistances de 1kOhms ( je suis dans un laboratoire de chimie au Vietnam ils n'ont pas beaucoup de résistance disponible) et j'ai lu que ce n'était pas indispensable sur de courte distance... Mais si cela l'est je peux me débrouiller pour en trouver.

Bonjour,
tu soudes 8 resistances de 1K en parallele et le compte est bon.

Jacques

Bonjour,

Serial.write(req,8);

Serial est utilisé pour le RS485 et le moniteur série? Ne faut il pas 2 liaisons série?

C'est toujours mieux d'en mettre. La faible impédance de la ligne assure une bonne immunité aux perturbations et l'adaptation correcte évite les réflexions sur la ligne.