Décoder une trame RS485 à l'oscilloscope
Bonjour à tous,
J'écris actuellement un pilote MicroPython pour la carte MOD-RS485-ISO permettant à un microcontrôleur de dialoguer sur un bus RS485 par l'intermédiaire d'un bus I2C.
J'ai voulu vérifier l'émission sur le bus RS485 de visu en poussant le vis jusqu'au décodage des informations bit par bit.
Exemple d'émission RS485
Le script de test_sender.py envoi une flopée de messages sur le bus RS485 à 9600 bauds par l'intermédiaire d'une MicroPython Pyboard et d'un MOD-RS485-ISO.
PYB: sync filesystems PYB: soft reboot MicroPython v1.10 on 2019-01-25; PYBv1.1 with STM32F405RG Type "help()" for more information. >>> import test_sender Setting TX control... Setting bridged mode... Setting baud... Sending... 1/50: MCHobby is the best Sending... 2/50: MCHobby is the best ... ... Sending... 47/50: MCHobby is the best Sending... 48/50: MCHobby is the best Sending... 49/50: MCHobby is the best Sending... 50/50: MCHobby is the best That s all Folks
Voulant vérifier la transmission j'ai branché un oscilloscope sur les signaux A et B (donc en HALF-DUPLEX) puis j'ai fais une capture des signaux.
Capture partielle d'une trame RS485. Visualisation RS485 A (bleu) et B (rouge). Résultat de A-B (vert) puisque RS485 est un protocole différentiel. |
Maintenant que nous avons un signal type (et son équivalent), nous allons nous pencher sur le décodage de l'information.
Start bit et Stop Bit
Pour commencer, chaque octet fait 8 bits et celui-ci est émis avec un Start bit et un Stop Bit exactement comme sur une ligne série.
Nous devons donc rechercher 10 bits au total par octet.
- Sur le bus RS485, le niveau 1 est en bas et le niveau 0 en haut.
C'est exactement l'inverse d'une ligne série / RS232. - Le start bit est à 1, donc en bas
- Le stop bit est à 0, donc en haut
Ce que met en évidence le graphique ci-dessous (en plus des différences de niveau logique).
Sur base de cet information j'ai détecté deux candidats potentiels pouvant représenter des Start Bit (puisqu'il est possible de dénoter un format de trame... mais attention a ne pas tomber trop vite dans le piège!).
Start Bit potentiel |
Le mieux aurait été de capturer le début de transmission (donc le premier Start Bit)... mais ce n'est pas toujours possible.
Longueur de la trame
Nous savons que nous avons un débit de 9600 bauds et qu'il faut 10 bits par octet.
9600 baud = 9600 bits par seconde.
1 bit prend donc 1 / 9600 sec = 0.000104 sec = 104 µS
Pour 10 bits, il faudra donc 1040 µS
Côté oscilloscope, la résolution horizontale (l'échelle du temps) est de 500µS par division.
Un octet = 10 bits = 2 divisions horizontales.Tracer la trame et les bits
C'est le moment d'imprimer votre capture d'écran et de sortir la règle.
Dans mon cas, 2 division fait 3.5cm sur le papier, donc 1/10 = 1 bit = 3.5mm au tracé.
A la fin de chaque trame (2 divisions, 3.5cm sur le papier) débutant au start bit, on doit impérativement se terminer par un stop bit (suivit rapidement d'un start bit).
Voici donc un relevé des trames en bleu (10 bits) avec reprise des start bit en rouge et stop bit en vert.
Trames RS485 |
Pour rappel:
- En RS485 le start bit est un flan descendant, le stop bit est un flan montant.
- La trame commence au flan descendant du start bit, ni avant, ni après.
Décodage d'un octet
On commence à tracer les 10 bits à partir du front descendant (du Start Bit).
Lecture de l'octet sur le bus RS485 |
La séquence binaire est 0b00100000 .
Si vous la saisissez dans une console Python, celle-ci est transformée en valeur numérique (soit 32).
En consultant une table ASCII (comme celle www.purebasic.com), l'entier 32 correspond au caractère "espace". Vu qu'il y a plusieurs espace dans le message c'est plausible.
Note: nous avons eu la chance de tomber directement sur un start bit (puisque le stop bit était au bon endroit. Si ce n'était pas le cas... il aurait fallut chercher le start bit ailleurs sur la trame.
Décodage de la trame RS485
Maintenant, nous pouvons poursuivre le décodage des autres octets....
Décodage de la trame - cliquer pour agrandir |
Au final, nous obtenons " is t", ce qui correspond bien à une partie du texte émis:
2/50: MCHobby is the best
Conclusion
Une petite recherche très intéressante, pas forcement très académique mais l'approche DIY a néanmoins démontrée qu'il était possible de contrôler le bon fonctionnement de la transmission des informations.
Maintenant, je termine le pilote et m'attaque à DMX (qui utilise RS485).
Écrire un commentaire