Fonction Serial via RS485

Bonjour

j'ai une simple question,

est t'il possible via les borne Rx Tx d'utiliser un max485 et en utilisant les fonctions de base Serial.print(...

je m'explique, j'ai besoin d'envoyer des simple chaîne de caractère entre plusieurs arduino sur des longues distance.

merci a vous !

Bonjour,
Bien sur que c'est possible.
La norme RS485 définit (rapidement) un principe de transport sur 2 paires torsadées.
A partir du moment que tes signaux séries sont des signaux TTL, je ne vois pas où est le problème.
@+

En complément a ce qu'a dit Icare j'ajoute que lors de création de la norme RS485 ils n'ont pas fait les même erreur que lors de la RS232.
La RS 232 mélange le protocole de transmission : débit, bits de start, de stop, parité, etc et le moyen physique : signaux entre +/- 12 V etc.
La RS 485 ne défini que le moyen physique : signaux différentiels 5V, le protocole de transmission est celui du RS232 .

donc je peu/il faut :

  • Juste connecté le max485 sur RxTx --> Mais il ne faut pas rajouté une pin au borne de Re De ?
  • je peu donc faire un simple Serial.Println("Hello Word"); et tous ceux qui sont connecté sur le bus, recevront le message ?
  • je peu mettre plusieurs arduino sur la même paire de cable ? ( A B ) un peu comme un modbus ?

Merci :slight_smile:

Yep!

De mémoire, les bornes DE/RE doivent être branchées sur une pin digital afin d'établir le sens de fonctionnement du MAX485.

RE/DE = 0, envoie.
RE/DE = 1, réception.
(ou l'inverse ?)

Normalement, un "hello world" devrait fonctionner.

Oui. Tu peux mettre tes récepteurs en parallèle sur la ligne RS485. Tu peux aussi définir un protocole d'adressage pour savoir quel récepteur doit traiter le message.

@+

Zoroastre.

S'il n'y a qu'un maitre sur la ligne qui parle à plusieurs esclaves pas de problème.
Par contre, si plusieurs cartes doivent parler sur la ligne il faudra gérer le RE/DE

plusieurs vont communiquer ensemble, ils vont juste envoyé des chaines de caractère
au pire des cas je peu faire une sorte de "clic" avec un compteur, à chaque clic, un envois ses données, puis le suivant, etc...

que me conseiller vous ?

Comme le suggère fdufnews, le maître envoie les ordres et attends les réponses, les accusés de réception, etc. Toutes les communications devront passer par le maître. C'est la méthode la plus commode et l'assurance que la ligne est toujours disponible.
Cela suppose aussi d'interroger chacun des esclaves à tour de rôle pour savoir si un message doit être lu.

Personnellement, je n'ai jamais testé le multi-maîtres.

Salut,
il faut que tu définisses ton protocole (ou que tu utilises un protocole existant) :

  • un seul module peut émettre à la fois
  • un maître invite les autres modules, les esclaves donc, à émettre à leur tour
  • quand un module émet (le maître, ou un esclave à l'invitation du maître), il met la ligne DE/RE de son max485 à 1. Les autres modules sont en réception avec leur ligne DE/RE à 0.

Le fonctionnement peut être :

  • aléatoire comme conseillé ici, cad. le maître appel chaque esclave par son nom (lire son numéro ou son adresse)
  • ou séquentiel comme tu penses : le maître invite le premier esclave et les autres répondent à la suite, avec le risque toutefois que si un esclave ne répond pas, tout s'arrête

Tu peux raccorder une trentaine d'arduinos sur 2 fils. Un émet et tous entendent (sauf éventuellement celui qui émet)

Tu peux compléter ton bus avec des lignes d'alimentation et une ligne d'interruption (ligne qui permet à tout esclave de demander au maître une autorisation d'émettre

Tout est affaire de protocole.
N'importe quelle carte peut prendre la main sur le bus même s'il n'y a pas de maitre pour arbitrer. Il faut juste mettre en place un protocole régissant la prise du bus. C'est le cas dans les systèmes collaboratifs où il n'y a pas de maître mais où chacun dispense des données au profit de tous.

Avec un maître c'est simple, il peut envoyer des messages à tous (broadcast) ou alors il questionne et l'intéressé répond. Il suffit juste que chaque abonné est un identifiant unique.

Sans maître, il faut définir des règles fixant comment un abonné peut prendre le contrôle du bus. Test de la ligne avant de parler (ligne au repos depuis un certain temps), auto-contrôle des données envoyées (pour vérifier s'il n'y a pas de carambolage sur le bus), temps d'attente aléatoire avant de refaire une tentative pour limiter les risques de tentatives avortées.

du csma cd sur la rs485 ?
qui vote pour ?

merci pour vos réponses, franchement ça m'aide pas mal :wink:

je vais tenté l'histoire d'un bus unique ou ils seront tous slave

je m'explique

( X veux parlé a Y sur un bus ou il y a plein d'autre dessus )

  • X réserve la ligne avec un message
  • X envois ensuite un message à tous avec un l'adresse d'Y et une demande
  • Y répond avec la valeur que X a besoin
  • Y renvois un message pour dire que la ligne est libre

Si pendant que X à réservé la ligne, Z veux aussi communiquer, bah il doit attendre que les deux interlocuteur ai dit a tous que la ligne est libre

qu'en pensez vous ?

PS : non je veux pas réinventé un protocole :wink:

ps : je viens de testé bêtement l'idée du rx tx , Serial et le max485, ça ne fonctionne pas, je suis sur que c'est un problème de code, mais avez vous un exemple ?

Gruniek:
ps : je viens de testé bêtement l'idée du rx tx , Serial et le max485, ça ne fonctionne pas, je suis sur que c'est un problème de code, mais avez vous un exemple ?

Yep!

Je ne comprends pas bien la question.

A partir du moment où le câblage est bon, tu utilises les commandes Serial comme de coutume.

Avec si peu d'explication, aucun schéma, aucun code, on ne peut pas savoir ce qui ne fonctionne pas...

Tu peux utiliser une fonction de ce genre pour l'envoie :

void rs485TxMsg(char *msg) {
  Serial.flush();
  digitalWrite(txPin, HIGH);
  delay(10);
  Serial.print(msg);
  delay(10);
  digitalWrite(txPin, LOW);
}

Ce sont les mêmes fonctions que pour communiquer avec le moniteur série de l'arduino !!!

@+

Zoroastre.

mettre aussi la ligne DE/RE à 1

Bonjour, cela fait aussi quelques jours que je galère avec le rs-485 pour ma domotique entre autre.

Mon sujet est consultable ici: voir ma domotique.

Je ne dispose pas de circuits max485 mais des équivalents comme dans le schéma joint. Effectivement, j'appuie aussi les dires de trimarco232. Il faut gérer le sens de communication avec la DE/Re à 1 pendant la transmission de l'esclave au maitre.

J'ai dans mon cas résolu certains problèmes après avoir implémenté cette fonctionnalité! Du genre , TROP COOL ENFIN CA MARCHE... Je rencontre d'autres problèmes... voici un autre sujet que j'ai initié

Bonjour,
Je voudrais tirer l’attention sur mon post Support for Arduino RS485 concurrent multi-drop communication qui pourrait être utile.

bonjour, petit up de 9 mois

j'ai en projet de réaliser un systeme domotique basé sur du rs485 et j'aimerai savoir ou en sont les differents membres qui ont communiqués ici (schema de leur installation, principe de fonctionnement, ptotocole utilisé, état d'avancement).

merci.

Tres simple, je suis passer sur l'ethernet :wink:

ha bon !?

pourtant le rs485 semble assez simple a mettre en oeuvre et les composants sont peu cher.

pourquoi cette décision ?