Arduino Arduino Leonardo avec nRF24L01+

Arduino Leonardo avec nRF24L01+


Voici un tutoriel qui va introduire une longue série concernant la communication sans fil entre différents matériels.

A propos du code source :

Vous remarquerez que j’attache la plus grande importance à commenter mon code. Un code bien commenté, c’est un code mieux compris. C’est aussi pour cette raison que je ne m’étale pas trop dans le tutoriel sur le code lui même.

A propos des systèmes de communications sans fils :

Pour avoir fait le tour des systèmes de communications sans fils, je dirais qu’ils ont tous des avantages et des inconvénients. Pour les différents projets à réaliser, je retiendrais essentiellement 2 ou 3 systèmes en fonction de l’usage.

Il ne faut pas oublier qu’il s’agit d’ondes et si vous multipliez le matériel utilisé, vous vous exposez à des ondes qui peuvent être néfastes. Aussi, pour cette raison, j’abandonnerai déjà la communication Wifi.

Nos objets connectés peuvent avoir à communiquer avec votre téléphone portable, la communication bluetooth peu alors être intéressante.

Pour les autres systèmes, j’ai retenu la communication via Xbee, qui permet de faire des réseaux en tout genre. Le système s’apparente à la communication série, donc fiable et rapide. Par contre, les modules ne sont pas données (Les modules pro sont parfait pour une communication longue distance, pour un drone par exemple).

Pour les autres applications intérieures, j’ai retenu la communication 2,4 Ghz pour deux raisons essentiellement : La communication bi directionnelle (Pas le cas des modules 433 Mhz en général),  leur coût peu élevé et leur taille.

Apparemment, ces modules sont suffisamment souples pour créer tout type de réseau, il y a d’ailleurs déjà une librairie mesh pour ces modules.

1. Pré requis

a. Librairies utilisées :

SPI.h : référence Arduinoexplications en Français

RF24.h : Github, et les autres RF24 qui sont contenu dans le même package.

b. Connaissance utile :

Le tutoriel n°2 permet d’appréhender l’utilisation du bouton poussoir et la gestion par automate (à état).

2. Objectif

L’objectif est assez simple, établir une communication uni directionnelle entre deux Arduino. L’un sera émetteur (Code client), l’autre sera récepteur (code serveur).

Je parle ici volontairement en effet de client/serveur, car cette base de communication nous servira par l’avenir à établir une réseau de communication.

Chaque Arduino pourra émettre sur deux canaux de communication potentiel. Le clic sur un bouton permettra de switcher d’un canal à l’autre.

Les Led :

  • Jaune : Le 1er canal de communication est activé.
  • Bleu : Le second canal de communication est activé.
  • Rouge : La communication ne passe pas ou rien n’a été reçu.
  • Vert : Les données sont bien envoyées ou reçu.

Nous allons introduire une nouvelle notion qui me semble très importante. En effet, lorsque l’on programme des micros contrôleurs, on se retrouve confronté à l’utilisation des divers composants. Mais bien souvent, nous ne voulons pas utiliser ces composants à la fréquence. En effet, ici, le clic sur le bouton doit être réactif. Le temps d’affichage des leds doit être paramétrable. La fréquence de communication d’informations doit se faire également à un rythme particulier.

Bien trop souvent dans les tutoriaux, on remarque des « delay » à tout va dans le code de la boucle loop. Si pour le temps d’affichage d’une led, je mettais directement dans le code un delay de 200 ms, c’est un temps qui serait perdu pour faire autre chose !

Vos ordinateurs ne sont que depuis très récemment multicœurs, cela n’a jamais empêché par ailleurs votre système d’exploitation de permettre à différents programmes, services, … de s’exécuter en même temps.

Il est donc possible a travers une gestion adapté de laisser la main à notre système pour faire éventuellement d’autres tâches. Sur les Arduinos, il s’agit de la boucle loop. Elle est exécuté inlassablement, il faut donc la rendre la plus souple possible.

Ainsi, nous allons utiliser la méthode millis(), qui permet d’obtenir le temps depuis lequel l’arduino est lancé. Pour chacune des gestions indépendantes, nous avons une variable diffTime ainsi qu’une constante en #define pour déterminer la fréquence.

Dans le loop, on fait des mesures pour savoir si on dépasse le temps depuis lequel on veut intervenir. Si tel est cas, on rentre dans un if d’actions (Ou il ne faut pas oublier de reconsolider la valeur temporelle). C’est simple et cela permet de gérer à merveille la temporalité des différentes actions.

Remarque : La fréquence de réception a été définie deux fois plus rapide que la fréquence d’émission. C’est pour cette raison, vous le verrez dans la vidéo que les led de réception sont tanto verte, tanto rouge. Un coup, j’ai des données, un coup j’en ai pas.

3. Matériel utilisé

  • 2 Arduino Leonardo Rev3
  • 2 module de communication nrf24l01+ : Datasheet
  • 8 Led : 2 bleu, 2 rouge, 2 vertes, 2 jaune.
  • 8 résistances de 220 Ohms (pour les Led).
  • 2 résistances de 10K Ohms  (Pour les boutons poussoir).
  • 2 bouton poussoir
  • Quelques cables, j’ai utilisé des cables à 4 broches pour les nrf24l01.

4. Schéma

tuto3_schema1

Attention le branchement des nrf24l01+ sur Arduino Uno ne se fait pas de la même façon.

5. Programme

a. Le code client

[pastacode lang= »cpp » manual= »%2F%2F%20Par%20S%C3%A9bastien%20DELAPORTE%20en%202015.%0A%23include%20%3CSPI.h%3E%20%09%09%09%09%2F%2F%20librairie%20utilisant%20le%20protocole%20SPI%0A%23include%20%3CnRF24L01.h%3E%20%09%09%09%2F%2F%20librairie%20de%20base%20nRF24L01%0A%23include%20%3CRF24.h%3E%20%09%09%09%09%2F%2F%20librairie%20RF24%0A%23include%20%3CRF24_config.h%3E%20%09%09%2F%2F%20librairie%20RF24%20configuration%20%20%0A%0A%2F*%20DEFINITION%20DES%20CONSTANTES%20*%2F%0A%23define%20CE_ADDRESS%207%20%20%20%20%20%20%20%20%20%20%2F%2F%20Port%20CE%20de%20la%20communication%20SPI%0A%23define%20CSN_ADDRESS%208%20%20%20%20%20%20%20%20%20%2F%2F%20Port%20CSN%20de%20la%20communication%20SPI%0A%23define%20LED_TRANSMIT_OK%203%20%20%20%20%20%2F%2F%20LED%20de%20Transmission%20OK%20sur%20Digit%203%0A%23define%20LED_TRANSMIT_KO%204%20%20%20%20%20%2F%2F%20LED%20de%20Transmission%20KO%20sur%20Digit%204%0A%23define%20PIPE_2%205%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20LED%20du%20Canal%20de%20Communication%200%20sur%20post%20it%20sur%20Digit%205%0A%23define%20PIPE_3%206%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20LED%20du%20Canal%20de%20Communication%201%20sur%20post%20it%20sur%20Digit%206%0A%23define%20BTN%209%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Bouton%20poussoir%20sur%20Digit%209%0A%23define%20DELAY_TO_TRANSMIT%20500%20%2F%2F%20D%C3%A9lai%20pour%20la%20transmission%20des%20donn%C3%A9es%0A%23define%20DELAY_CLICK%20200%20%20%20%20%20%20%20%2F%2F%20D%C3%A9lai%20pour%20la%20senssibilit%C3%A9%20du%20clic%20bouton%0A%23define%20DELAY_LIGHT%20100%20%20%20%20%20%20%20%2F%2F%20Dur%C3%A9e%20d’allumage%20des%20LED%20de%20transmission.%0A%23define%20DELAY_LOOP%2050%20%20%20%20%20%20%20%20%20%2F%2F%20Dur%C3%A9e%20d’attente%20dans%20la%20boucle.%0A%23define%20DEBUG%201%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Mode%20debug%20%3A%200%20%3D%3E%20Inactif%2C%201%20-%3E%20Actif.%0A%2F*%20DECLARATION%20DES%20VARIABLES%20GLOBALES%20*%2F%0A%2F%2F%20D%C3%A9claration%20des%20diff%C3%A9rents%20composants%0ARF24%20radio(CE_ADDRESS%2C%20CSN_ADDRESS)%3B%20%09%2F%2F%20Utilisation%20du%20constructeur%20radio%20pin%20RF24%20radio(CE%2CCSN)%0Aconst%20uint64_t%20m_comPipeList%5B%5D%20%3D%20%7B%200×48495049444102%2C%200×48495049444103%20%7D%3B%09%2F%2F%20Liste%20des%20canaux%20de%20communication%0Auint64_t%20m_CurrentPipe%3B%20%09%09%09%09%2F%2F%20Canal%20Courant%0Astruct%0A%7B%0A%09byte%20value%3B%0A%09int%20count%3B%0A%7D%20m_dataToTransmit%3B%20%09%09%2F%2F%20Structure%20des%20donn%C3%A9es%20%C3%A0%20transf%C3%A9rer.%0A%0A%2F%2F%20Gestion%20de%20la%20temporalit%C3%A9.%0Along%20m_diffTimeBtn%3B%20%09%09%2F%2F%20Mesure%20du%20temps%20pour%20le%20bouton%0Along%20m_diffTimeTransmit%3B%20%09%2F%2F%20Mesure%20du%20temps%20pour%20la%20transmission%0Along%20m_diffTimeLight%3B%20%09%09%2F%2F%20Mesure%20du%20temps%20d’allumage%20des%20Led%20de%20transmission.%0Abyte%20btn_status%3B%20%09%09%09%2F%2F%20Status%20du%20bouton.%200%20rien%2C%201%20press%2C%202%20apr%C3%A8s%20relachement%20%3D%3E%20clic » message= »Partie déclarative, similaire dans le code serveur » highlight= » » provider= »manual »/]

Quelques méthodes (les autres dans le .ino à télécharger)

Vous verez que j’ai également fait une méthode de Debug et on peut l’activer via une constante. Cela permet d’afficher des messages complémentaires sur le moniteur série lors de la programmation.

Les modules peuvent se paramétrer en détail, j’ai donc fait une méthode pour simplifier tout cela:

[pastacode lang= »cpp » manual= »%2F*%20Nom%20%3A%20InitRf24%0ADescription%20%3A%20Permet%20d’initialiser%20le%20module%20de%20communication%20sans%20fil%20RF24RL01%202%2C4%20Ghz%0AParam%C3%A8tre%20%3A%20p_level%20%3D%3E%20De%20type%20CommunicationSecurityLevel%20permet%20de%20d%C3%A9finir%20le%20niveau%20de%20s%C3%A9curit%C3%A9%20de%20communication.%0ANothing%20%3D%200%2C%20Low%20%3D%201%2C%20Medium%20%3D%202%2C%20High%20%3D%203%2C%20fine%20%3D%204%0ANothing%20%3E%20Non%20s%C3%A9curis%C3%A9%2C%20pas%20de%20CRC%20ni%20d’accus%C3%A9%2C%20vitesse%20moyenne%0ALow%20%3E%20Accus%C3%A9%20de%20r%C3%A9ception%2C%20pas%20de%20validation%20CRC%2C%20vitesse%20rapide%0AMedium%20%3E%20Accus%C3%A9%20de%20r%C3%A9ception%2C%20pas%20de%20validation%20CRC%2C%20vitesse%20moyenne%0AHigh%20%3E%20Accus%C3%A9%20de%20r%C3%A9ception%2C%20validation%20CRC%208bits%2C%20vitesse%20rapide%0Afine%20%3E%20Accus%C3%A9%20de%20r%C3%A9ception%2C%20validation%20CRC%2016bits%2C%20vitesse%20moyenne%0ARetour%20%3A%20bool%C3%A9en%2C%20true%20si%20la%20configur%C3%A9%20est%20ok%2C%20false%20sinon.%0A*%2F%0Abool%20InitRf24(byte%20p_level)%0A%7B%0A%09bool%20v_isRF24RL01p%20%3D%20radio.isPVariant()%3B%09%09%09%09%2F%2F%20True%20si%20on%20a%20un%20module%20N%20RF24RL01%2B%0A%09bool%20v_return%20%3D%20false%3B%0A%09radio.begin()%3B%09%09%09%09%09%09%09%09%09%09%09%2F%2F%20Initialisation%20de%20la%20communication%20RF24.%0A%09radio.setPALevel(RF24_PA_MIN)%3B%09%09%09%09%09%09%09%2F%2F%20Puissance%20de%20la%20communication%2C%20au%20minimum%20tant%20que%20faire%20se%20peu.%0A%09switch%20(p_level)%0A%09%7B%0A%09case%200%3A%0A%09%09v_return%20%3D%20radio.setDataRate(RF24_1MBPS)%3B%09%09%09%2F%2F%20d%C3%A9finition%20de%20la%20vitesse%20%C3%A0%201MBPS%09%0A%09%09radio.setAutoAck(false)%3B%09%09%09%09%09%09%09%2F%2F%20Pas%20d’accus%C3%A9%20de%20r%C3%A9ception%09%09%09%09%09%09%09%09%09%09%09%09%09%09%09%09%0A%09%09radio.disableCRC()%3B%09%09%09%09%09%09%09%09%09%2F%2F%20Pas%20de%20validation%20CRC.%0A%09%09radio.setRetries(5%2C%205)%3B%09%09%09%09%09%09%09%09%2F%2F%20D%C3%A9finie%20la%20dur%C3%A9e%20d’attente%20et%20le%20nombre%20de%20tentative.%0A%09%09break%3B%0A%09case%201%3A%0A%09%09v_return%20%3D%20radio.setDataRate(RF24_2MBPS)%3B%09%09%09%2F%2F%20d%C3%A9finition%20de%20la%20vitesse%20%C3%A0%202MBPS%09%0A%09%09radio.setAutoAck(true)%3B%09%09%09%09%09%09%09%09%2F%2F%20Accus%C3%A9%20de%20r%C3%A9ception%09%09%09%0A%09%09radio.disableCRC()%3B%09%09%09%09%09%09%09%09%09%2F%2F%20Pas%20de%20validation%20CRC.%0A%09%09radio.setRetries(5%2C%2010)%3B%09%09%09%09%09%09%09%2F%2F%20D%C3%A9finie%20la%20dur%C3%A9e%20d’attente%20et%20le%20nombre%20de%20tentative.%09%0A%09%09break%3B%0A%09case%202%3A%0A%09%09if%20(v_isRF24RL01p)%0A%09%09%09v_return%20%3D%20radio.setDataRate(RF24_250KBPS)%3B%09%09%2F%2F%20Seulement%20si%20RF24RL01%2B%0A%09%09else%0A%09%09%09v_return%20%3D%20radio.setDataRate(RF24_1MBPS)%3B%09%09%2F%2F%20d%C3%A9finition%20de%20la%20vitesse%20%C3%A0%201MBPS%09%0A%09%09radio.setAutoAck(true)%3B%09%09%09%09%09%09%09%09%2F%2F%20Accus%C3%A9%20de%20r%C3%A9ception%09%09%09%0A%09%09radio.disableCRC()%3B%09%09%09%09%09%09%09%09%09%2F%2F%20Pas%20de%20validation%20CRC.%0A%09%09radio.setRetries(10%2C%205)%3B%09%09%09%09%09%09%09%2F%2F%20D%C3%A9finie%20la%20dur%C3%A9e%20d’attente%20et%20le%20nombre%20de%20tentative.%09%0A%09%09break%3B%0A%09case%203%3A%0A%09%09v_return%20%3D%20radio.setDataRate(RF24_2MBPS)%3B%09%09%09%2F%2F%20d%C3%A9finition%20de%20la%20vitesse%20%C3%A0%202MBPS%09%0A%09%09radio.setAutoAck(true)%3B%09%09%09%09%09%09%09%09%2F%2F%20Accus%C3%A9%20de%20r%C3%A9ception%0A%09%09%09%09%09%09%09%09%09%09%09%09%09%09%09%2F%2F%20Permet%20de%20d%C3%A9finir%20la%20longueur%20de%20la%20cl%C3%A9%20CRC%20(Cyclic%20Redundancy%20Check)%20pour%20d%C3%A9tecter%20les%20erreurs%20de%20transmissions.%0A%09%09radio.setCRCLength(RF24_CRC_8)%3B%09%09%09%09%09%09%2F%2F%20Validation%20CRC%208bit.%0A%09%09radio.setRetries(10%2C%2010)%3B%09%09%09%09%09%09%09%2F%2F%20D%C3%A9finie%20la%20dur%C3%A9e%20d’attente%20et%20le%20nombre%20de%20tentative.%09%0A%09%09break%3B%0A%09case%204%3A%0A%09%09v_return%20%3D%20radio.setDataRate(RF24_1MBPS)%3B%09%09%09%2F%2F%20d%C3%A9finition%20de%20la%20vitesse%20%C3%A0%201MBPS%09%0A%09%09radio.setAutoAck(true)%3B%09%09%09%09%09%09%09%09%2F%2F%20Accus%C3%A9%20de%20r%C3%A9ception%0A%09%09radio.setCRCLength(RF24_CRC_16)%3B%09%09%09%09%09%2F%2F%20Validation%20CRC%2016bit.%0A%09%09radio.setRetries(15%2C%2015)%3B%09%09%09%09%09%09%09%2F%2F%20D%C3%A9finie%20la%20dur%C3%A9e%20d’attente%20et%20le%20nombre%20de%20tentative.%09%0A%09%09break%3B%0A%09%7D%0A%09return%20v_return%3B%0A%7D%0A » message= »InitRF24″ highlight= » » provider= »manual »/]

[pastacode lang= »cpp » manual= »void%20setup(void)%0A%7B%0A%20%20%20%20m_dataToTransmit.value%20%3D%200%3B%20%2F%2F%20Init%20des%20donn%C3%A9es%20%C3%A0%20transmettre%0A%20%20%20%20m_dataToTransmit.count%20%3D%200%3B%0A%20%20%20%20btn_status%20%3D%200%3B%20%2F%2F%20Init%20du%20statut%20du%20bouton%3C%0A%20%20%20%20InitIO()%3B%20%2F%2F%20On%20initialise%20l’utilisation%20des%20ports%20de%20l’Arduino.%0A%20%20%20%20Serial.begin(9600)%3B%20%2F%2F%20On%20%C3%A9tablie%20la%20communication%20avec%20le%20moniteur%20s%C3%A9rie.%0A%20%20%20%20while%20(!Serial)%3B%20%2F%2F%20Attente%20Leonardo%2C%20%C3%A0%20ne%20pas%20oublier%20!%0A%20%20%20%20m_CurrentPipe%20%3D%20m_comPipeList%5B0%5D%3B%20%2F%2F%20On%20d%C3%A9finie%20le%20canal%20de%20communication%0A%20%20%20%20if%20(InitRf24(2))%20%2F%2F%20Permet%20de%20configurer%20de%20fa%C3%A7on%20fine%20la%20communication%20Rf24.%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20radio.openWritingPipe(m_CurrentPipe)%3B%20%2F%2F%20On%20ouvre%20le%20canal%20d’%C3%A9criture%0A%20%20%20%20%20%20%20%20digitalWrite(PIPE_2%2C%20HIGH)%3B%20%2F%2F%20On%20affiche%20la%20Led.%0A%20%20%20%20%7D%0A%20%20%20%20m_diffTimeBtn%20%3D%20millis()%3B%20%2F%2F%20Initialisation%20des%20variables%20de%20gestion%20du%20temps.%0A%20%20%20%20m_diffTimeTransmit%20%3D%20m_diffTimeBtn%3B%20%2F%2F%20Elles%20sont%20toutes%20initialis%C3%A9%20%C3%A0%20la%20m%C3%AAme%20valeur.%0A%20%20%20%20m_diffTimeLight%20%3D%20m_diffTimeBtn%3B%0A%20%20%20%20Serial.println(%22Test%20Communication%20donnees.%5Cn%5Cn%22)%3B%20%2F%2F%20Un%20petit%20message.%0A%7D » message= »Le setup » highlight= » » provider= »manual »/]

[pastacode lang= »cpp » manual= »void%20loop(void)%0A%7B%0A%20%20%20%20if%20((millis()%20-%20m_diffTimeBtn)%20%3E%20DELAY_CLICK)%20%2F%2F%20Le%20d%C3%A9lai%20est%20d%C3%A9pass%C3%A9%2C%20on%20peut%20donc%20checker%20le%20clic%20du%20bouton%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20m_diffTimeBtn%20%3D%20millis()%3B%0A%20%20%20%20%20%20%20%20CheckBtn()%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20((millis()%20-%20m_diffTimeLight)%20%3E%20DELAY_LIGHT)%20%2F%2F%20Le%20d%C3%A9lai%20est%20d%C3%A9pass%C3%A9%20pour%20la%20dur%C3%A9e%20d’affichage%20des%20leds.%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20digitalWrite(LED_TRANSMIT_OK%2C%20LOW)%3B%0A%20%20%20%20%20%20%20%20digitalWrite(LED_TRANSMIT_KO%2C%20LOW)%3B%0A%20%20%20%20%20%20%20%20m_diffTimeLight%20%3D%20millis()%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20((millis()%20-%20m_diffTimeTransmit)%20%3E%20DELAY_TO_TRANSMIT)%20%2F%2F%20Le%20d%C3%A9lai%20est%20d%C3%A9pass%C3%A9%2C%20on%20peut%20envoyer%20des%20donn%C3%A9es%20et%20modifier%20les%20variables%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20m_diffTimeTransmit%20%3D%20millis()%3B%0A%20%20%20%20%20%20%20%20radio.powerUp()%3B%20%2F%2F%20On%20r%C3%A9active%20le%20RF24%2C%20sortie%20de%20l’%C3%A9conomie%20d’%C3%A9nergie%20et%20puissance%20d’%C3%A9mission%0A%20%20%20%20%20%20%20%20m_dataToTransmit.value%20%3D%20m_dataToTransmit.value%20%2B%201%3B%20%2F%2F%20On%20modifie%20les%20donn%C3%A9es%20%C3%A0%20transmettre.%0A%20%20%20%20%20%20%20%20if%20(m_dataToTransmit.value%20%3D%3D%20255)%20%2F%2F%20value%20%C3%A9volue%20de%200%20%C3%A0%20255%2C%20puis%20lorsqu’il%20repasse%20%C3%A0%20z%C3%A9ro%2C%20count%20est%20incr%C3%A9ment%C3%A9%0A%20%20%20%20%20%20%20%20%20%20%20%20m_dataToTransmit.count%20%3D%20m_dataToTransmit.count%20%2B%201%3B%20%2F%2F%20A%20noter%20que%20les%20donn%C3%A9es%20%C3%A0%20transmettre%20on%20%C3%A9t%C3%A9%20volontairement%20positionn%C3%A9%20dans%20une%20structure.%0A%20%20%20%20%20%20%20%20CheckPipeToTransmit()%3B%20%2F%2F%20V%C3%A9rification%20du%20canal%20de%20transmission%0A%20%20%20%20%20%20%20%20Serial.println(%22%22)%3B%20%2F%2F%20Affichage%20des%20valeurs%20de%20transmission.%0A%20%20%20%20%20%20%20%20Serial.print(%22Canal%20%3D%20%22)%3B%0A%20%20%20%20%20%20%20%20if%20(m_CurrentPipe%20%3D%3D%20m_comPipeList%5B0%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20Serial.println(%220%22)%3B%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20Serial.println(%221%22)%3B%0A%20%20%20%20%20%20%20%20Serial.print(%22Valeur%20%3D%20%22)%3B%0A%20%20%20%20%20%20%20%20Serial.print(m_dataToTransmit.value)%3B%0A%20%20%20%20%20%20%20%20Serial.print(%22%2C%20Compteur%20%3D%20%22)%3B%0A%20%20%20%20%20%20%20%20Serial.println(m_dataToTransmit.count)%3B%0A%20%20%20%20%20%20%20%20Serial.print(%22%20–%3E%20Debut%20envoi%20%3A%20%22)%3B%0A%20%20%20%20%20%20%20%20bool%20v_isSuccess%20%3D%20radio.write(%26m_dataToTransmit%2C%20sizeof(m_dataToTransmit))%3B%20%20%20%20%20%20%20%20%20%2F%2F%20On%20envoi%20les%20donn%C3%A9es.%0A%20%20%20%20%20%20%20%20if%20(v_isSuccess)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20StateTransmitLed(true%2C%20true)%3B%20%2F%2F%20Si%20l’envoi%20des%20donn%C3%A9es%20est%20ok%2C%20on%20allume%20la%20bonne%20led.%0A%20%20%20%20%20%20%20%20%20%20%20%20Debug(%22%20–%3E%20Transmission%20OK%22)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20StateTransmitLed(true%2C%20false)%3B%20%2F%2F%20Si%20l’envoir%20des%20donn%C3%A9es%20est%20ko%2C%20on%20allume%20la%20bonne%20led.%0A%20%20%20%20%20%20%20%20%20%20%20%20Debug(%22%20–%3E%20Transmission%20KO%22)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20radio.powerDown()%3B%20%2F%2F%20On%20passe%20en%20mode%20repos%20pour%20le%20RF24%2C%20%C3%A9conomie%20d’%C3%A9nergie%0A%20%20%20%20%7D%0A%20%20%20%20delay(DELAY_LOOP)%3B%20%2F%2F%20Attente%20standard%20du%20loop.%0A%7D » message= »Le Loop » highlight= » » provider= »manual »/]

b. Le code serveur

[pastacode lang= »cpp » manual= »%2F*%20Nom%20%3A%20checkRadioCommunication%0ADescription%20%3A%20Permet%20de%20v%C3%A9rifier%20s’il%20y%20a%20des%20donn%C3%A9es%20%C3%A0%20r%C3%A9ceptionner.%20Les%20r%C3%A9ceptionnent%2C%20affiche%20le%20r%C3%A9sultat%20et%20affiche%20la%20led%20en%20cons%C3%A9quence.%0ARetour%20%3A%20Aucun%0A*%2F%0Avoid%20checkRadioCommunication()%0A%7B%0A%20%20%20%20if%20(radio.available())%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20while%20(radio.available())%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20radio.read(%26m_dataToTransmit%2C%20sizeof(m_dataToTransmit))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20Serial.print(%22Canal%20%3D%20%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(m_CurrentPipe%20%3D%3D%20m_comPipeList%5B0%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Serial.println(%220%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Serial.println(%221%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20Serial.print(%22Donnees%20lus%20%3A%20valeur%3D%20%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20Serial.print(m_dataToTransmit.value)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20Serial.print(%22%2C%20compteur%3D%20%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20Serial.println(m_dataToTransmit.count)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20StateTransmitLed(true)%3B%0A%20%20%20%20%7D%0A%20%20%20%20else%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20Serial.print(%22Canal%20%3D%20%22)%3B%0A%20%20%20%20%20%20%20%20if%20(m_CurrentPipe%20%3D%3D%20m_comPipeList%5B0%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20Serial.print(%220%2C%20%22)%3B%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20Serial.print(%221%2C%20%22)%3B%0A%20%20%20%20%20%20%20%20Serial.println(%22rien%20a%20lire%22)%3B%0A%20%20%20%20%20%20%20%20StateTransmitLed(false)%3B%0A%20%20%20%20%7D%0A%7D » message= »méthode de réception des données » highlight= » » provider= »manual »/]

La méthode de configuration du canal. Vous noterez qu’ici, on redéfini systématiquement le canal 1. Cela permettait de vérifier qu’il sera possible de gérer plus de 6 clients (comme le permet la librairie RF24 de base).

[pastacode lang= »cpp » manual= »%2F*%20Nom%20%3A%20SetPipeRf24%0ADescription%20%3A%20Permet%20de%20changer%20la%20configuration%20du%20canal%20de%20communication.%0Ap_pipeOffset%20%3D%3E%20id%20du%20canal%20de%20communication.%20Les%20canaux%20sont%20d%C3%A9finis%20dans%20m_comPipeList.%0AIci%20volontairement%20nous%20utilisons%20le%20pipe%201%20de%20la%20librairie%20RF24.%20Il%20est%20possible%20d’en%20configurer%20jusqu’%C3%A0%206.%0AAinsi%20les%20lectures%20pourraient%20lire%206%20origines%20diff%C3%A9rentes.%20Je%20souhaitais%20voir%20s’il%20%C3%A9tait%20possible%20de%20d%C3%A9passer%0Acette%20limite%20en%20reconfigurant%20dynamiquement.%20C’est%20le%20cas%20donc%20%3B).%0ARetour%20%3A%20Aucun%0A*%2F%0Avoid%20SetPipeRf24(byte%20p_pipeOffset)%0A%7B%0A%20%20%20%20byte%20v_countComPipe%20%3D%20sizeof(m_comPipeList)%20%2F%20sizeof(m_comPipeList%5B0%5D)%3B%0A%20%20%20%20if%20(p_pipeOffset%20%3C%20v_countComPipe)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20Debug(String(%22Ouverture%20du%20canal%20n%3D%22)%20%2B%20String(p_pipeOffset))%3B%0A%20%20%20%20%20%20%20%20radio.stopListening()%3B%0A%20%20%20%20%20%20%20%20radio.closeReadingPipe(1)%3B%0A%20%20%20%20%20%20%20%20radio.openReadingPipe(1%2C%20m_comPipeList%5Bp_pipeOffset%5D)%3B%20%2F%2F%20Ouverture%20d’un%20canal%20de%20lecture.%0A%20%20%20%20%20%20%20%20radio.startListening()%3B%20%2F%2F%20Commen%C3%A7ons%20%C3%A0%20lire%20toutes%20les%20donn%C3%A9es%20transmises%20par%20le%20client.%0A%20%20%20%20%7D%0A%20%20%20%20ChangePipe(m_comPipeList%5Bp_pipeOffset%5D)%3B%0A%7D » message= » » highlight= » » provider= »manual »/]

[pastacode lang= »cpp » manual= »void%20setup(void)%0A%7B%0A%20%20%20%20btn_status%20%3D%200%3B%20%2F%2F%20On%20d%C3%A9finie%20le%20statut%20du%20bouton%20%C3%A0%200.%0A%20%20%20%20InitIO()%3B%20%2F%2F%20On%20initialise%20l’utilisation%20des%20ports%20de%20l’Arduino.%0A%20%20%20%20Serial.begin(9600)%3B%20%2F%2F%20On%20%C3%A9tablie%20la%20communication%20avec%20le%20moniteur%20s%C3%A9rie.%0A%20%20%20%20while%20(!Serial)%3B%20%2F%2F%20Attente%20Leonardo%2C%20%C3%A0%20ne%20pas%20oublier%20!%0A%20%20%20%20delay(500)%3B%0A%20%20%20%20if%20(InitRf24(2))%20%2F%2F%20Permet%20de%20configurer%20de%20fa%C3%A7on%20fine%20la%20communication%20Rf24.%0A%20%20%20%20%20%20%20%20SetPipeRf24(0)%3B%20%2F%2F%20D%C3%A9finition%20du%20canal%20de%20communication%0A%20%20%20%20m_diffTimeBtn%20%3D%20millis()%3B%20%2F%2F%20Initialisation%20des%20variables%20de%20gestion%20du%20temps.%0A%20%20%20%20m_diffTimeReceive%20%3D%20m_diffTimeBtn%3B%20%2F%2F%20Elles%20sont%20toutes%20initialis%C3%A9%20%C3%A0%20la%20m%C3%AAme%20valeur.%0A%20%20%20%20m_diffTimeLight%20%3D%20m_diffTimeBtn%3B%0A%7D » message= »Le setup » highlight= » » provider= »manual »/]

le loop propre puisque beaucoup de méthodes. Vous noterez ici la gestion de la temporalité. Il y a trois if pour les gestions du clic souris, de l’affichage des led et de la réception des données.

[pastacode lang= »cpp » manual= »void%20loop()%0A%7B%0A%20%20%20%20if%20((millis()%20-%20m_diffTimeBtn)%20%3E%20DELAY_CLICK)%20%2F%2F%20Le%20d%C3%A9lai%20est%20d%C3%A9pass%C3%A9%2C%20on%20peut%20donc%20checker%20le%20clic%20du%20bouton%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20m_diffTimeBtn%20%3D%20millis()%3B%20%2F%2F%20Le%20fait%20de%20le%20mettre%20au%20d%C3%A9but%20de%20boucle%20permet%20d’%C3%AAtre%20tr%C3%A8s%20r%C3%A9gulier%20(ind%C3%A9pendant%20des%20traitements%20dans%20la%20boucle)%0A%20%20%20%20%20%20%20%20CheckBtn()%3B%20%2F%2F%20V%C3%A9rification%20%C3%A9tat%20bouton%20et%20modification%20du%20statut%20automate.%0A%20%20%20%20%7D%0A%20%20%20%20if%20((millis()%20-%20m_diffTimeLight)%20%3E%20DELAY_LIGHT)%20%2F%2F%20Le%20d%C3%A9lai%20est%20d%C3%A9pass%C3%A9%20pour%20la%20dur%C3%A9e%20d’affichage%20des%20leds.%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20digitalWrite(LED_TRANSMIT_OK%2C%20LOW)%3B%0A%20%20%20%20%20%20%20%20digitalWrite(LED_TRANSMIT_KO%2C%20LOW)%3B%20%2F%2F%20On%20%C3%A9teint%20les%20led%0A%20%20%20%20%20%20%20%20m_diffTimeLight%20%3D%20millis()%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20((millis()%20-%20m_diffTimeReceive)%20%3E%20DELAY_TO_RECEIVE)%20%2F%2F%20Le%20d%C3%A9lai%20est%20d%C3%A9pass%C3%A9%2C%20on%20checker%20si%20on%20re%C3%A7oit%20des%20donn%C3%A9es.%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20CheckPipeToListen()%3B%20%2F%2F%20On%20v%C3%A9rifie%20s’il%20ne%20faut%20pas%20changer%20de%20canal.%0A%20%20%20%20%20%20%20%20checkRadioCommunication()%3B%20%2F%2F%20On%20regarde%20si%20des%20donn%C3%A9es%20sont%20arriv%C3%A9es%0A%20%20%20%20%20%20%20%20m_diffTimeReceive%20%3D%20millis()%3B%20%2F%2F%20Ici%20le%20diff%20Time%20est%20%C3%A0%20la%20fin.%20Selon%20les%20dur%C3%A9es%20de%20traitements%20l’%C3%A9cart%20entre%0A%20%20%20%20%7D%20%2F%2F%20deux%20cycles%20peut%20%C3%AAtre%20sup%C3%A9rieur%20%C3%A0%20DELAY_TO_RECEIVE.%0A%20%20%20%20delay(DELAY_LOOP)%3B%20%2F%2F%20Attente%20standard%20du%20loop.%20%0A%7D » message= »Le Loop » highlight= » » provider= »manual »/]

Vous retrouverez le reste du code source ci dessous.

c. Source à télécharger

Tutoriel n°3 code client fichier ino

Tutoriel n°3 code serveur fichier ino

6. Résultat

En vidéo

Étiquettes : , ,

6 commentaires sur “Arduino Leonardo avec nRF24L01+”

  1. super intéressant votre site j’en ais appris.

    Mais je voudrais savoir si vous vouliez bien m’aider a faire mon projet.

    Déjas je vous dit le topo, je suis éleveur de volailles et je voudrais savoir la température dans mon poulailler.

    J’ais chez moi un arduino uno avec le nRF24L01+  la version avec l’antenne noir pliante.

    Et au poulailler un arduino nano avec le même nRF24L01+ avec pour la température un dht11 .

    En sachant que dans mes montage j’en suis a un dht11 avec écran lcd I2C avec bouton et j’arrive le faire allumer l’écran lcd et il me dit la température et le pourcentage d’humidité pendent 10 sec et il s’éteint (pour un souci d’économie d’énergie ).

    merci d’avance.

    Alex07

    1. Bonjour,

      je vois votre projet. Il n’est pas évident de vous aider ainsi à distance, mais vous devriez trouver les différents éléments clés sur mon site et notamment sur ce tuto : Gestion de la temporalité (pour l’allumage de l’écran) et gestion des nrf.
      Je vous conseil de vous rapprocher d’un Fablab prêt de chez vous, ils se feront un plaisir de vous aider à concrétiser votre projet.

  2. bonjour ou bonsoir je voudrais juste savoir comment brancher votre schéma avec un arduino uno et un nano.bonne journée ou soirée

    merci d’avance

    alex07

  3. Merci pour vos tuto. Je réalise  une gestion météo + panneau solaire + clim + …

    Un Pi4 pilote par USB un arduino nano équipé d’un nRF24L01+ (tête)

    Deux autres nano (pour l’instant) envoient par nRF24L01+ des messages de 32 chr ascii qui sont très bien reçus par la tête. Un de ces deux autres nano reçoit bien les message de la tête, mais pas l’autre. D’innombrables essais on éliminé les problèmes de pannes et de proximité et de collision de messages

    j’utilise comme vous: #include <SPI.h>  #include <nRF24L01.h>  #include <RF24.h> // #include <RF24_config.h>

    je pense qu’il s’agit d’un problème d’adressage ou un détail de syntaxe dans l’adressage. Dans votre article vous parlez de gérer six clients (mon rêve)

    Si vous aviez un texte, un lien ou un code d’adressage multiple çà serait parfait. Je ne vous joins pas mon code car il prend un classeur et ne marche pas. (l’adressage)

    Raspberry Pi and DIY Projects
    https://www.facebook.com/groups/1396784783796037/search/?q=jacques%20machot

    Dans l’attente de votre réponse et à votre service pour toute info

    PS: J’ai vu sur votre site un OLED128x64 le mien n’affiche qu’une ligne sur 2 (à voir)

    Salutations

Leave a Reply

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

Related Post