Les moyens de faire communiquer sans fil deux microcontrôleurs ne manquent pas. Si l’on prend le cas d’Arduino, les plus populaires sont peut-être les modules XBee. L’inconvénient majeur de ces modules sont leur coût.
Pour des projets wireless, surtout s’ils demandent plusieurs liaisons, ce coût peut-être trop élevé. Une alternative intéressante est fournie par les puces nRF24L01+ de Nordic Semiconductors. On les trouve montées sur des circuits, prêtes à l’emploi pour environ 2€ chez seedstudio. A ce tarif là, cela vaut le coup de se pencher sur ce que ce petit transducteur peut proposer.
Je vous propose un petit tour d’horizon des fontionnalités de la puce ainsi qu’une prise en main rapide pour faire communiquer deux cartes Arduino.
Tour d’horizon
C’est un transducteur - c’est à dire que la puce peut soit émettre soit recevoir - qui opère dans la bande des 2.4GHz (comme le Wi-Fi, le Bluetooth et les fours à micro-ondes).
La communication entre la puce et un microcontroleur est assurée par un bus SPI (qui est très bien supporté par votre Arduino favori).
La vitesse de transmission des données est configurable et peut atteindre 2Mbps. La portée maximale est d’environ 100m pour un débit de 250kbps. Cette puce utilise un protocole propriétaire (mais documenté) appelé Enhanced ShockBurst.
La puce peut travailler sur 126 canaux de communication. En mode récepteur elle peut écouter sur 6 canaux simultanement. Dans ce cas, chaque canal est associé à un "pipe" (=une adresse). En cas de réception d’un paquet pour cette adresse, la puce gère le protocole en envoyant un ACK en retour puis en désassemblant le paquet pour ne garder que son contenu utile (=les données transmises) dans une file d’attente (FIFO) spécifique pour chaque canal d’écoute. Cette dernière peut être lue par le microcontrôleur associé à l’aide de la liaison série SPI. La taille des données transmises ne peut pas excéder 32 octets par paquet.
Pour plus de détails, je vous recommande la lecture du datasheet, ainsi que la page consacrée sur le site de Nordic Semiconductors.
Voilà, après ce survol des fonctionnalités, je vous propose d’essayer de faire causer deux Arduinos entre eux à l’aide de deux de ces puces.
Faire communiquer deux Arduinos
J’utilise les cartes de SeedStudio que vous pouvez voir sur la photo ci-dessous [1]:
La connexion de la carte à l’Arduino ne pose aucun souci particulier. Attention toutefois à une chose: selon le type d’Arduino que vous utilisez, le bus SPI n’est pas disponible de la même manière. En particulier, le Leonardo et le micro n’ont pas connecté ce bus aux pins 11, 12 et 13 comme pour la Uno par exemple. Il faut se connecter directement au bus SPI sur le connecteur ICSP. Dans le doute, branchez-vous au connecteur ICSP, cela marchera toujours !
J’ai un peu galéré pour trouver les pinouts de la carte nRF24L01, je vous les livre donc ici pour éviter de chercher :
Pour plus de clarté, voici un petit schéma récapitulatif de la chose :
Nom du signal | RF module pin | Arduino pin |
---|---|---|
GND | 1 | GND |
VCC | 2 | 3.3V |
CE | 3 | configurable dans la lib - utiliser 9 pour les exemples |
CSN | 4 | configurable dans la lib - utiliser 10 pour les exemples |
SCK | 5 | 13 ou SCK de ICSP |
MOSI | 6 | 11 ou MOSI de ICSP |
MISO | 7 | 12 ou MISO de ICSP |
IRQ | 8 | en l’air |
Remarquez que le module RF est alimenté à l’aide de la sortie 3.3V de l’Arduino. Ne le mettez pas sur du 5V, vous pourriez le détériorer. D’après ce que j’ai pu lire à différents endroits, il peut arriver que l’émetteur tire un peu trop de courant et fasse chuter la tension d’alimentation créant ainsi des dysfonctionnements. Le problème se résoud en ajoutant une capacité de 10µF entre les bornes 3.3V et la masse. Je n’ai personnellement pas (encore ?) eu ce souci, mais c’est toujours bon à savoir.
Le driver pour Arduino que j’utilise est développé par un certain Maniacbug et est disponible sur Github. Il s’installe comme n’importe quelle autre librairie Arduino et fournit quelques exemples intéressants. Le mieux est de commencer par le bien-nommé GettingStarted.
Le pin IRQ n’est pas utilisé dans les exemples de la librairie, mais il est bon de savoir qu’il permet de notifier de l’arrivée ou du départ de paquets. Il est là pour permettre de gérer des interruptions côté Arduino lors d’arrivée de paquets par exemple.
Connectez vos deux Arduinos aux cartes RF et uploadez le sketch (le même) sur chacun d’eux. Ouvrez un moniteur série et envoyez un caratère T à l’un des terminaux pour le faire passer en mode émetteur et un R à l’autre pour le faire passer en mode récepteur. Vous devriez alors voir une conversation tout à fait intéressante s’engager entre les deux compères.
Je n’en dit pas plus pour aujourd’hui. Le but était de vous présenter la puce et de montrer comment rapidement se mettre sur les rails avec. J’ai personnellement perdu un peu de temps à cause des différences de disposition des pins du bus SPI pour le Leonardo.
Faites-vous plaisir et on reparle de ces petits chips bientôt, d’accord ?