Le Festival de Fleurance propose des conférences payantes autour du thème de la Robotique. Damien est allé sur le site du festival et a acheté 10 accès pour des conférences. A présent Il est inscrit et à l’accueil on lui a fourni une carte RFID qu’il devra présenter à chaque session.
Il s’agit ici de construire le périphérique qui permet d’identifier Damien et de vérifier s’il est bien autorisé à assister à cette conférence. Le cas échéant, il faudra lui mettre à jour son crédit sur son compte (site internet du festival).
L’idée est d’utiliser :
– Un shield RFID
– Une arduino pour piloter le shield et pour actionner l’entrée (ouverture de la porte)
– Une Raspberry Pi pour faire l’interface avec le site du festival et pour communiquer avec l’arduino
Rôles de l’Arduino :
- Signaler à RPi que quelqu’un présente sa carte RFID (lire la Carte)
- Envoyer le num de la carte RFID + un code anti-rejeu
- Recevoir la réponse de RPi (ouverture/fermeture)
- Recevoir un nouveau code anti-rejeu de RPi
- Mettre à jour le code anti-rejeu
- Actionner la porte à la demande de RPi
Rôles de RPi
- Attendre que Arduino lui signal que quelqu’un présente sa carte
- Recevoir l’ID + code anti-rejeu
- Vérifier dans sa base de données (SGBD) à qui appartient l’ID+code anti-rejeu
- S’il est autorisé, mettre à jour compte de Damien et générer un nouveau code anti-rejeu
- Envoyer l’autorisation d’ouverture à Arduino (+nouveau code anti-rejeu)
Rôles annexes RPi
– synchronisation de la SGBD avec compte en ligne
Schéma : (désolé pour les non-adeptes de l’écriture du regretté Leonardo DaVicci mais c’était plus simple pour la conception du dessin)
Pour simplifier les connexions, nous avons choisi d’utiliser un protocole de communication I2C entre RPi et Arduino.
Problème n°1
Lorsque Damien se présente, c’est l’arduino qui est la première informée. Elle devra alors envoyer des information à la RPi. Par construction, il est plus simple que ce soit l’Arduino soit Maître et la RPi qui soit esclave.
MAIS.... la RPi ne peut pas être esclave car le noyau Linux ne le permet pas (non implémenté)
Solution : donner la parole à l’esclave 😉
Etablir une liaison en parallèle à l’I2C entre Arduino et RPi sur port GPIO pour signaler que quelqu’un présente une carte RFID. La RPi regarde régulièrement (100ms) l’état de son GPIO (qui est alors une sorte de "drapeau"). Le cas échéant, RPi (maître) demande à Arduino (esclave) de donner l’ID+code anti-rejeu.
Cette solution est un peu couteuse en ressource pour la RPi mais elle fonctionne...
Problème n°2
Le shield que nous avons semble accepter les communication I2C et UART.
Nous avons connecté ("pluggé") le shield et nous utilisons la communication UART (par défaut). Tout fonctionne mais lorsqu’on connecte également la RPi en I2C (fils branchés sur A4 et A5), plus rien ne fonctionne. Au bout de 3 ou 4 tentatives de communications I2C, nous recevons une erreur I/O I2C (pas de detection de carte) !!!
En y regardant de près, lorsque le protocole I2C entre Arduino et RPi est branché, A4 et A5 sont reliés à RSTOUT et RSTON du shield.
Nous n’avons aucune idée de ce à quoi servent les connexions (sachant que I2C devrait être désactivé) mais nous pouvons tout de même repérer des pistes (liaisons électriques) qui doivent perturber la puce...?!?
Solution :
Si on ne connecte pas directement le shield et que l’on se contente de relier les 4 cables (sorties 10,11,12 et 13 sur Arduino) + GND + VCC, tout fonctionne correctement.
La carte est enfin reconnue mais il demeure un problème.
Problème n°3
Dans le sketch adapté de celui de démo du shield Arduino, la lecture du numéro de la carte RFID ne se fait pas complètement (affichage incomplet).
Solution :
En supprimant les accès à Serial.print() nous n’avons plus de problème. Par contre cela devient difficile de débugguer 😉
Il semble que le shield travaille en UART et que cela implique que nous n’avons plus la possibilité d’utiliser le port série pour effectuer des affichages car c’est également de l’UART.
Dans le sketch de démo, il est pourtant utilisé un Serial.print() mais il doit être effectué au bon moment (dans la boucle principale et non lors d’une interruption).
Aucun commentaire ne figure dans ce sketch de démo à ce sujet !