Skip to content

Protocole UART

Bastien Clément edited this page May 20, 2014 · 3 revisions

Le protocole de communication entre le Raspberry Pi et le microcontrôleur est construit par dessus un canal de transmission série de type UART, géré nativement par les deux éléments.

Ce canal assure la transmission byte par byte d'un système à l'autre, et permet de ne pas s'occuper de la partie technique de la transmission pour plutôt se concentrer sur les données à transmettre.

La configuration utilisée est dite 115200/8-N-1, c’est à dire 8 bits de données - pas de parité - 1 bit d’arrêt, avec une cadence de transmission fixée à 115200 bauds.

Mise en place

Rapsberry Pi

Le système UART du Rapsberry Pi est associé aux pins GPIO 14 et 15 (ports physiques 8 et 10), et nécessite également l’utilisation du port Ground adjacent (port physique 6).

Par défaut, l’entrée/sortie de la console du Rapsberry est également transmis par UART, ce qui permet d'utiliser le port série d’un ordinateur pour accéder au système. La première étape est de désactiver cette fonctionnalité.

Par la suite, le canal UART apparaît dans l'environnement Linux comme un périphérique série sous l'adresse /dev/ttyAMA0. Celui-ci peut être ouvert, configuré et utilisé depuis un programme (en C) d’une façon similaire à un simple fichier texte.

Microcontrôleur

Le composant UART du microcontrôleur fonctionne indépendamment du reste du système. Cependant, par défaut ses entrées / sorties ne sont pas directement accessible sur les différents ports du système. Pour connecter physiquement le composant UART, il est nécessaire de configurer les registres du Crossbar de tel façon que l’UART soit accessible depuis les pins 0 et 1 du port 0. D’une façon similaire au Raspberry, il sera nécessaire d’utiliser le pin Ground de ce même port.

Protocole

Conception

La communication entre le Raspberry Pi et le microcontrôleur est construite sous la forme de messages indépendants et asynchrones. Ceux-ci sont constitués d’un byte représentant le type du message, suivi éventuellement d’un byte d’information supplémentaire.

Les messages envoyés par le microcontrôleur au Raspberry Pi sont pour la plupart événementiels. C’est à dire qu’il sont envoyés dès lors qu’un changement dans les informations qu’il véhicule est détecté, sans requête préalable du Raspberry Pi.

Messages

Note: la notation [R->M, +1] utilisée dans cette section signifie que le message est transmis du RaspberryPi au Microcontrôleur et qu’il est accompagné de 1 byte d’information supplémentaire.

0x2E KEEP_ALIVE [R->M, M->R]

Message envoyé périodiquement par le microcontrôleur auquel le Raspberry doit simplement répondre par un message identique.

Lorsqu’un des deux éléments détecte une absence prolongée de messages KEEP_ALIVE, le système est considéré déconnecté et les mesures de sécurité provoquent l’arrêt du circuit.

0x31 POWER_ON [R->M]

Active la sortie de contrôle d’alimentation du microcontrôleur.

Lorsqu’à la fois le Raspberry Pi et le microcontrôleur ont leur sortie de contrôle d’alimentation activée, le relais d’alimentation commute et le circuit est alimenté.

0x32 POWER_OFF [R->M]

Désactiver la sortie de contrôle d’alimentation du microcontrôleur.

0x41 SENSORS_1 [M->R, +1]

Indique un changement d’au moins un bit sur la première série de capteurs. Ce message est suivi d’un byte supplémentaire indiquant l’état de chaque capteur.

0x42 SENSORS_2 [M->R, +1]

Indique un changement d’au moins un bit sur la seconde série de capteurs. Similaire à 0x41.

0x43 SENSORS_3 [M->R, +1]

Indique un changement d’au moins un bit sur la troisième série de capteurs. Similaire à 0x41.

0x44 SWITCHES [M->R, +1]

Indique un changement d’état d’au moins un aiguillage du circuit. Ce message est suivi d’un byte supplémentaire indiquant l’état de chaque aiguillage.

0x45 READY [M->R]

Indique que le microcontrôleur a terminé sa routine d’initialisation et qu’il est à présent prêt pour un fonctionnement opérationnel normal.

0x61 GET_SENSORS_1 [R->M]

Demande l’envoi par le microcontrôleur d’un message SENSORS_1. Opération non exploité.

0x62 GET_SENSORS_2 [R->M]

Demande l’envoi par le microcontrôleur d’un message SENSORS_2. Opération non exploité.

0x63 GET_SENSORS_3 [R->M]

Demande l’envoi par le microcontrôleur d’un message SENSORS_3. Opération non exploité.

0x64 GET_SWITCHES [R->M]

Demande l’envoi par le microcontrôleur d’un message SWITCHES. Opération non exploité.

0x65 SET_SWITCHES [R->M, +1]

Défini la position de tous les aiguillages en une seule opération. Ce message est suivi d’un byte supplémentaire avec l’état souhaité pour chaque aiguillage.

0x66 SET_SWITCH_ON [R->M, +1]

Commute un aiguillage en position alternativee. Ce message est suivi d’un byte supplémentaire indiquant l’aiguillage à modifier sous la forme d’un entier non signé sur 8 bits.

0x67 SET_SWITCH_OFF [R->M, +1]

Commute un aiguillage en position par défaut. Similaire à 0x66.

0x5A HELLO [M->R]

Envoyé par le microcontrôleur lorsque celui-ci effectue sa routine de démarrage (à l’enclenchement ou lors de sa réinitialisation).

Lors de la réception de ce message, le Raspberry Pi transmet au microcontrôleur l’état initial dans lequel il souhaite positionner chaque aiguillage.

0x7A RESET [R->M]

Provoque la réinitialisation du microcontrôleur. Il est envoyé au démarrage de Raild afin de placer le micro dans un état déterminé.