IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Problèmes de communication avec MAX485.


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Par défaut Problèmes de communication avec 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...

    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 _ _

  2. #2
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 250
    Par défaut
    Salut,
    Citation Envoyé par lutcho Voir le message
    comme tout est OK en RX/TX direct (sans 485), c'est un pb matériel des 485 en cause je suppose.
    Si tout est ok avec Rx sur Tx d'un côté et Rx sur Tx de l'autre oui ça ne peut venir que tu RS485.

    Mettre des résistances de pull-up et pull-down est souvent une mauvaise idée, on pense fixer de cette manière l'état des broches A et B lorsqu'elles sont en haute impédance mais d'une part c'est inutile si on a pris soin du hard et notamment des broches RE/ et DE du driver RS485 et d'autre part, on se retrouverait avec un pont diviseur de tension en lieu et place de la résistance de 120Ω en fin de ligne et il faudrait changer sa valeur afin de conserver l'adaptation d'impédance (que des inconvénients pour au final faire moins bien.)

    - Est ce que tu pilotes correctement les broches RE/ et DE sur le driver RS485 ?
    - As tu placé une résistance de 120Ω en début et en fin de ligne ? (sur une grande distance c'est impératif)

    A+

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Par défaut
    salut et merci,

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

    pour la 1ère remarque
    Mettre des résistances de pull-up et pull-down ....
    je me posais effectivement la question, mais tout les schémas que j'ai pu glaner sur le net les utilisent...
    de toute façon, ces résistances sont déja incorporées sur les modules 485 (les mêmes emission/reception))
    2 de 20k et une de 120 ohms entre A et B.

    le schéma des modules 485 que j'utilise:
    Nom : MAX485-Module-Sch1.jpg
Affichages : 3048
Taille : 76,3 Ko

    quand j'aurais reçu mes circuits intégrés 485 seuls, j'essayerai sans ces résistances, avec seulement la 120 ohms de fin de ligne.

    pour le moment j'en suis à la phase des tests sur breadbord, et la liaison A/B fait 15 cm....

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

    emetteur (arduino MEGA)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    #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)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    #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);
    	}
    @+

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 279
    Par défaut
    Bonjour à tous

    Comment sont reliés les deux MAX485 entre eux?

    Ensuite au sujet de /RE et DE
    DE doit être actif (à 1) uniquement sur le MAX qui envoie des données, si l'autre l'est aussi c'est le confis d’émission assuré! DE peut être couplé à DI (0 étant le repos / écoute) en mode multi-maître le 1 étant alors dominant et le 0 étant fournis par les résistances de polarisation du bus (Celles entre VCC et A et entre GND et B).
    /RE doit être actif donc à 0 pour que le MAX qui reçois les données les transmettent au micro, en général on le relie également à DI pour évité l'écho de l'émission, mais ce n'est pas une obligation.
    Bon apparemment /RE et DE sont gérés proprement par les deux programmes. Au moyen de la broche 3 définie comme trMAX

    Bonne journée

    Delias

  5. #5
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 250
    Par défaut
    Salut,
    Citation Envoyé par Delias
    Bon apparemment /RE et DE sont gérés proprement par les deux programmes
    Je n'en suis pas si sur, du moins sans voir le hard !
    Comme tu le dis, dans ce shield il y a un conflit par défaut car les DE sont activés des deux côtés et, toujours par défaut, /RE n'est jamais activé donc pas de réception possible.

    Normalement l'émetteur n'a à se préoccuper que de DE (de ce côté le programme semble ok) et le récepteur doit mettre DE à 0 et /RE à 0 hors je ne vois qu'un seul trMAX = LOW dans le programme.

    Généralement, je relie DE à /RE dans mes montages comme ça quand l'émetteur envoie ça désactive la réception.

    Pour faire un essai tu n'as qu'a faire ça, sur les tes shiled relie DE et /RE.
    A+

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Par défaut
    Citation Envoyé par Vincent PETIT Voir le message
    Salut,
    Normalement l'émetteur n'a à se préoccuper que de DE (de ce côté le programme semble ok) et le récepteur doit mettre DE à 0 et /RE à 0 hors je ne vois qu'un seul trMAX = LOW dans le programme.

    Généralement, je relie DE à /RE dans mes montages comme ça quand l'émetteur envoie ça désactive la réception.
    les pins DE et /RE de chaque 485 ont toujours été reliées ensemble (trMAX).
    le 485 récepteur a toujours DE/RE à LOW (dans le setup, et jamais modifié)...
    pour le 485 emetteur, DE/RE est à LOW, passe à HIGH seulement pour l'emission, puis repasse à LOW après vidage du buffer d'emission.

    le 485 recepteur détecte bien chaque fois qu'il y a émission, mais le 1er carractère du buffer de réception est toujours un 0 (byte).
    et empèche la lecture du buffer complet.

    et si je fais ma boucle avec avec seulement "while (i<tampon-1) {.....}", sans "max485.available() && ",
    les caractères suivants sont tous à 255 (byte).

    est-ce un pb à l'emiision ou à la réception ???? mystère.

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 279
    Par défaut
    Bonjour à tous

    Bon je repose la question, elle a dû passé inaperçue:
    Citation Envoyé par Delias Voir le message
    Comment sont reliés les deux MAX485 entre eux?
    Bonne fin de journée

    Delias

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Par défaut
    Citation Envoyé par Delias Voir le message
    Bonjour à tous
    Bon je repose la question, elle a dû passé inaperçue:
    Comment sont reliés les deux MAX485 entre eux?
    les deux A reliés, les deux B reliés, le +5v et GND communs aux deux MAX.
    pour les A, les B et GND commun aux 2 c'est le branchement normal non ?

    edit: j'étais tombé sur un schéma (pdf pour RS-485 sur http://www.circuitcellar.com) où le bus avait un fil supplémentaire, avec une résistance de 100 ohms entre la masse de chaque 485 et ce fil de bus suppléméntaire.
    Nom : Sans titre-1.jpg
Affichages : 1525
Taille : 58,7 Ko
    j'avoue ne pas avoir encore essayé...
    mais bon pour le moment le +5v et le GND sont communs, alors...

    JL.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/02/2010, 20h52
  2. Problème dans un projet ATL COM avec DLL et MFC.
    Par jamais34 dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 03/10/2007, 19h03
  3. Problème clavier avec command.com
    Par SLE dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 26/04/2006, 15h48
  4. problème JSP avec JBuilder et Weblogic 7
    Par viny dans le forum JBuilder
    Réponses: 2
    Dernier message: 24/04/2003, 08h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo