pb com MAX485

bonjour,

j'ai un problème de communication série entre un arduino MEGA et un UNO avec 2 MAX485.
la MEGA (emetteur) utilise le port serial 1, et la UNO (recepteur) les broches 10 et 11 avec la lib. SoftwareSerial (pour pouvoir débugger par la console).

ça semble être un pb matériel, car en reliant directement les ports serie RX1/TX1 - 10/11, tout fonctionne parfaitement.
en passant par les 2 MAX485, plus rien... :frowning:

la UNO reçoit bien une trame serie, mais après plusieurs debugs, il appparait que le 1er carractère du buffer de réception de la UNO est un "0" (byte) et le script arrête la récupération de l'ensemble.

j'ai essayé en modifiant les résistances de fin de ligne (avec 2 Res. de 690 ohms) sur A et B du MAX récepteur, ça ne change rien.....

j'utilise des circuits MAX485 déjà montés sur CI courants sur le net.
je viens de commander ces MAX485 en circuits intégrés seuls (pour pouvoir modifier plus facilement les résistances), mais en attendant de les recevoir je suis bloqué.
les petits CI de 485 ont une resit. de 20k entre le A et le +5v, le B et la masse, et une de 120 ohms entre A et B.
je suis tombé sur des tests ou il fallait 2 resits de 690 ohms et une de 240, j'attents mes circuits intégrés pour tester..

j'ai aussi essayé d'utiliser directement le port RX/TX de la UNO pour ne pas utiliser la lib softwareSerial (tant pis pour les debugs), même problème....

comme tout est OK en RX/TX direct (sans 485), c'est un pb matériel des 485 en cause je suppose.
j'ai essayé quelques tutos et avis trouvés sur le net pour les 485, mais toujours pareil....

si quelqu'un à une idée ou une piste, je suis preneur...
cordialement.
JL.

PS:
debug avec RX/TX directs, sans 485:

EMISSION MEGA:
-----> Emission vers [MAX id:2 >> per02] #PER_SET#02:ON

RECEPTION UNO (avec détail du buffer):
index= 0 -byte max485.read()= 35 --> char()= '#'
index= 1 -byte max485.read()= 80 --> char()= 'P'
index= 2 -byte max485.read()= 69 --> char()= 'E'
index= 3 -byte max485.read()= 82 --> char()= 'R'
index= 4 -byte max485.read()= 95 --> char()= '_'
index= 5 -byte max485.read()= 83 --> char()= 'S'
index= 6 -byte max485.read()= 69 --> char()= 'E'
index= 7 -byte max485.read()= 84 --> char()= 'T'
index= 8 -byte max485.read()= 35 --> char()= '#'
index= 9 -byte max485.read()= 48 --> char()= '0'
index= 10 -byte max485.read()= 50 --> char()= '2'
index= 11 -byte max485.read()= 58 --> char()= ':'
index= 12 -byte max485.read()= 79 --> char()= 'O'
index= 13 -byte max485.read()= 78 --> char()= 'N'
<----- Réception #PER_SET#02:ON

debug avec MAX485:

EMISSION MEGA:
-----> Emission vers [MAX id:2 >> per02] #PER_SET#02:ON

RECEPTION UNO:
index= 0 -byte max485.read()= 0 --> char()= ' '
<----- Réception _ _

met ton code ici entre balise [ code ] [ /code ]

j'ai essayé en modifiant les résistances de fin de ligne (avec 2 Res. de 690 ohms) sur A et B du MAX récepteur, ça ne change rien.....

Bonjours
regarde la norme : il faut 3 résistances en fin de chaque ligne
mets les 2 qui manquent au moins d'un côté, ça changera beaucoup les choses !

Est-ce que tu gères correctement le DE des émetteurs? Il faut faire attention à ne pas désactive DE avant que le tampon d'émission soit vide.
La 110ohms entre A et B est nécessaire. Les 2 autres résistances sont utiles mais pas indispensables. Elles fixent l'état de la ligne si aucun émetteur n'est actif.

les pins RE et DE du 485 sont reliées.
DI sur TX, RO sur RX.

les résistances sont déja incorporées sur le CI du 485 (les mêmes 485 emission/reception))
2 de 20k et une de 120 ohms entre A et B.

le schéma des modules 485 utilisés:

les parties du code concernées:
(le timer pour l'emission est pour les tests)

emetteur (arduino MEGA)

#include "Timer.h"
#include <string.h>

#define trMAX	3		// MAX485 RE/DE Transmission/Réception

byte nrf[2][6]={"centr","per.."};
bool debugOn=true;

Timer tTrs;
int evTrs=0;

void setup() { 
	Serial.begin(115200);
	Serial1.begin(9600);			// port serie MAX 485
	pinMode(trMAX,OUTPUT);
	digitalWrite(trMAX,LOW);		// MAX485 récepteur
	evTrs=tTrs.every(2000,emmission);	// timer pour emission serial toutes le 2 secs
	}

void loop() { 
	tTrs.update();				// timer pour emission
	}


void emmission() {emissionDATA("#PER_SET#02:ON");}

bool emissionDATA(String trm) {
	debug(F("\n-----> Emission vers [MAX id:"));
	s=trm.substring(9,11); per=(uint8_t)s.toInt();
	debug(String(per));
	for (byte i=0; i<5; i++) prv+= char(nrf[1][i]);
	debug(prv); debug(F("] _"));
	
	digitalWrite(trMAX,HIGH);					// MAX485 émetteur
	delay(1);
	Serial1.print(trm);
 	Serial1.flush();
 	digitalWrite(trMAX,LOW);					// MAX485 récepteur
	
	debug(trm); debugln(F("_ ... envoi OK."));
	}


void debug(String prt) {if (debugOn) Serial.print(prt);}

void debugln(String prt) {if (debugOn) Serial.println(prt);}

recepteur (arduino UNO)

#include <SoftwareSerial.h>
#include <string.h>

#define maxRX	10  	// Serial RX
#define maxTX	11  	// Serial TX
#define trMAX	3   	// RS485 Direction
#define tampon	31

String bufMAX;

SoftwareSerial max485(maxRX,maxTX);		// RX, TX MAX485

void setup() { 
	Serial.begin(115200);
	max485.begin(9600);
	pinMode(trMAX,OUTPUT);
 	digitalWrite(trMAX,LOW);		// MAX485 récepteur
	}

void loop () {
	if (max485.available()) receptionDATA();
	}


void receptionDATA() {
	String t, rcp=""; bufMAX=""; byte i=0;
	Serial.print(F("\n"));
	while (max485.available() && i<tampon-1) {
		byte read=max485.read();
		bufMAX+= (char)read; i++; delay(5);
		
		Serial.print("index= "); Serial.print(i-1);
		Serial.print("  -byte max485.read()= "); Serial.print(read);
		Serial.print(" --> char()= '"); Serial.print((char)read); Serial.println("'");
		}
	bufMAX.toUpperCase();
	Serial.print(F("<----- Réception _"));
	Serial.print(bufMAX); Serial.println("_");
	// if (bufMAX.indexOf("#PER_SET#02:")==0) tTrs.after(200,retourRec);
	}

Les 2 autres résistances sont utiles mais pas indispensables. Elles fixent l'état de la ligne si aucun émetteur n'est actif.

sauf qu'en l'absence de ces résistances, l'état des lignes A et B est tel que lu comme un 0, ce qui fait que si le /RE est activé, le mpu croit recevoir un bit start ... suivi de bits 0

les résistances r5 et r6 sont-elles bien présentes sur tes modules ?

une photo des modules 485 utilisés:

il y a bien r5 et r6.

donc cépaça
je pense que bien entendu, le gnd et le vcc (+5v) sont raccordés, et que les gnd des 2 modules rs485 sont reliés entre eux ?

Les gnd pas seulement reliés à la "mode alimentation" c'est à dire avec un fil qui passe un peu partout mais en "mode transmission" : le gnd doit faire partie du même câble que les fils de données.
C'est mieux pour respecter l'intégrité des signaux.

L'idéal est de la paire torsadée (en fait deux paires) : une paire pour les fils de donnée en mode différentiel et l'autre pour le gnd.

bon j'ai trouvé, mon pb est résolu....

en fait c'était un bug sur la sérigraphie de ma MEGA (made in china)...
ils ont inversé le marquage TX1 et RX1 !!!!
décidemment, on ne peut faire confiance à personne :wink:

merci à vous.

Il est toujours prudent de lire la documentation.
Dans la documentation on trouve de nombreuses informations qui ne sont pas disponible rien qu'en lisant la sérigraphie d'un morceau de circuit-imprimé.
De plus la confusion entre TX et RX est récurente.
Beaucoup pensent qu'on relie les TX ensemble, idem pour les RX. Et bien non ce n'est pas la norme qui a été choisie.
NB : un fil de masse intégré dans les câbles d'interconnexion est toujour d'actualité et recommandé.