dimanche 25 février 2018

Communication RF 433 MHz entre ATTiny85 et Arduino

Je vous propose aujourd'hui un petit projet consistant à transmettre à une carte Arduino la mesure d'un capteur analogique branché à un ATTiny85, au moyen d'un signal radio de 433 MHz.  Si vous le désirez, vous pouvez utiliser les principes exposés dans ce billet pour mettre en place un réseau constitué de plusieurs capteurs satellites peu coûteux qui communiquent leurs données à un seul Arduino.

Si vous préférez, vous pouvez également utiliser les informations présentées ici pour créer une communication entre deux ATTiny85, ou entre deux cartes Arduino.

Matériel nécessaire pour faire cette activité: une paire émetteur/récepteur 433 MHz, une carte Arduino, un ATTiny85 (avec une alimentation et ce qu'il faut pour le programmer). et un potentiomètre qui tiendra lieu de capteur.



Installation de la bibliothèque Manchester

Le sketch que je vous propose pour l'émetteur et pour le récepteur nécessitent tous deux la bibliothèque Manchester, que vous devrez donc installer dans votre IDE Arduino.

Deux fichiers d'exemple sont fournis avec la bibliothèque: "ManchesterRX_Array-unfixed_length" et "ManchesterTX_Array-unfixed_length".  Ces deux sketches fonctionnent très bien (ils ont d'ailleurs servi de fondation aux sketches que je vous propose ci-dessous), mais pour obtenir de bons résultats, j'ai dû supprimer l'appel à la routine "man.workAround1MhzTinyCore()" dans le sketch de l'émetteur et diminuer la vitesse de la communication (2400 plutôt que 9600).

Sketch de l'émetteur (pour l'ATTiny85)

Voici le sketch destiné à l'ATTiny85.  Au besoin, vous pouvez vous référer à ce précédent billet qui explique comment programmer l'ATTiny avec l'IDE Arduino et une carte Arduino Uno.  Comme d'habitude, j'ai utilisé le noyau de David A. Mellis.

Le sketch est plutôt simple: une fois par seconde, l'ATTiny enverra, par l'entremise de l'émetteur RF, un message constitué de 4 octets: le premier octet contient la taille du message, et le deuxième octet contient le numéro de l'émetteur (qui n'a aucune utilité si votre carte Arduino ne reçoit des messages qu'en provenance d'un seul ATTiny, mais qui pourrait s'avérer essentiel pour distinguer plusieurs ATTiny émetteurs l'un de l'autre).

Les deux autres octets contiennent la lecture analogique que nous désirons transmettre.  Puisque le convertisseur analogique-numérique de l'ATTiny produit des valeurs à 10 bits, la lecture du potentiomètre doit être distribuée sur deux octets distincts, grâce aux fonctions highByte et lowByte (l'Arduino récepteur s'occupera de les fusionner lors de la réception).



Sketch du récepteur (pour la carte Arduino)

Rien de très complexe de ce côté non plus, puisque c'est la bibliothèque Manchester qui effectue le sale boulot: chaque fois qu'un message est reçu, il est affiché sur le moniteur série.



Circuit de l'émetteur (ATTiny85)

Une LED indicatrice est branchée à la pin 0, l'émetteur est branché à la pin 1, et le potentiomètre est branché à la pin 2 de l'ATTiny85, tel qu'indiqué sur le schéma ci-dessous.
La LED n'est pas obligatoire;  elle change d'état chaque fois qu'un message est envoyé, ce qui peut être utile pour savoir si votre ATTiny est actif ou non.



Circuit du récepteur

Le récepteur est connecté à la broche 4 de l'Arduino.  C'est la LED intégrée à la carte qui change d'état pour indiquer la réception d'un message.



Résultats

Toutes les secondes, l'ATTiny mesure la position du potentiomètre et envoie le résultat à l'Arduino. Sur réception d'un message, l'Arduino l'affiche dans le moniteur série.  Lorsque vous tournez le potentiomètre, la valeur transmise est modifiée.


Et ensuite?

Vous trouverez ici d'autres projets impliquant l'ATTiny85.  En ce qui concerne les émetteurs et récepteurs RF 433 MHz, vous serez peut-être intéressé par ce projet impliquant deux cartes Arduino, ou celui qui établit une communication entre Arduino et Raspberry Pi.

Yves Pelletier   (TwitterFacebook)

3 commentaires:

  1. Bonjour , ce tutoriel est très intéressant...
    par contre j'aimerai pour mon application transmettre l'état d'une entrée arduino vers un 2ème arduino, il s'agit juste d'envoyer l'information lorsque l'entrée change d'état...
    Merci d'avance de votre aide.

    RépondreSupprimer
  2. Bonjour, quelle est ta version de ton IDE ?
    Je cherche simplement à transmettre un flag ON/OFF à partir d'un ATtiny85 vers soit un autre ATtiny85 ou un ATmega328p mais ça semble complètement surréaliste:
    - Manchester ne marche pas (chez moi) même entre 2 Arduino UNO
    - idem avec RCSwitch....
    - par contre tout fonctionne à merveille avec VirtualWire qui est pourtant décrite comme vieille et obsolète. Seulement cette librairie n'est pas supportée pour l'ATtiny85....

    RépondreSupprimer
    Réponses
    1. Ma dernière utilisation d'un ATTiny date de quelques années, c'est bien possible que ça ne fonctionne plus.

      Supprimer