===== NRF24L01 =====
{{ :start:arduino:nrf24l01-pinout-558314284.jpeg?direct&400 |}}
{{ :start:arduino:nrf24l01.jpg?direct&400 |}}
==== Faire dialoguer un Raspberry et un Arduino via nRF24L01 ====
[[http://www.framboise314.fr/faire-dialoguer-un-raspberry-et-un-arduino-via-nrf24l01/|Arduino et Raspberry : le Dialogue ]]
=== Datasheet NRF24L01 ===
{{ :start:arduino:nrf24l01_prelim_prod_spec_1_2.pdf |}}
[[https://nrf24.github.io/RF24/classRF24.html|Explications Librairie NF24 EN]]
=== Utilisation du module nRF24L01+ avec l’Arduino ===
[[https://itechnofrance.wordpress.com/2013/05/24/utilisation-du-module-nrf24l01-avec-larduino/|NRF24L01 et Arduino -1- ]]
[[http://tiptopboards.free.fr/arduino_forum/viewtopic.php?f=2&t=22|NRF24L01 et Arduino -2-]]
[[https://passionelectronique.fr/tutorial-nrf24l01/|NRF24L01 et Arduino -3-]]
[[https://retroetgeek.com/arduino/comment-utiliser-les-modules-nrf24l01-en-communication-bidirectionnelle/|NRF24L01 et Arduino -4-]]
[[https://cpp.hotexamples.com/fr/examples/-/RF24/setAutoAck/cpp-rf24-setautoack-method-examples.html|Acquitement NRF24L01 ]]
[[start:arduino:nrf24L01:Probleme courant NRF24L01|]]
[[https://cpp.hotexamples.com/fr/examples/-/RF24/setAutoAck/cpp-rf24-setautoack-method-examples.html|C++ (Cpp) RF24::setAutoAck Exemples]]
=== Utilisation du module nRF24L01+ avec un ESP32 ===
[[https://electroniqueamateur.blogspot.com/2019/12/communication-nrf24l01-avec-cartes.html|{{ :start:arduino:circuit_esp32_nrf24l01.png?direct&400 |}}]]
Branchement du module nRF24L01 à la carte ESP32 :
*GND du nRF24L01 - GND de l'ESP32
*VCC du nRF24L01 - 3V3 de l'ESP32
*CE du nRF24L01 - D4 de l'ESP32
*CSN du nRF24L01 - D5 de l'ESP32
*SCK du nRF24L01 - D18 de l'ESP32
*MOSI du nRF24L01 - D23 de l'ESP32
*MISO du nRF24L01 - D19 de l'ESP32
*IRQ du nRF24L01 - Pas branché
== Programmes Exemple ==
/*******************************************************************
Chaque seconde, un nombre est émis par un module nRF24L01
branché à une carte ESP32 ou ESP8266.
********************************************************************/
#include
#include "nRF24L01.h"
#include "RF24.h"
int compteur = 0;
RF24 radio(4, 5);
const uint64_t addresse = 0x1111111111;
const int taille = 32;
char message[taille + 1];
void setup(void)
{
Serial.begin(115200);
Serial.println("Emetteur de donnees");
radio.begin();
radio.openWritingPipe(addresse);
}
void loop(void)
{
compteur++;
itoa(compteur, message, 10);
Serial.print("J'envoie maintenant "); // pour débogage
Serial.println(message);
radio.write( message, taille ); // émission du message via nRF24L01
delay(1000);
}
/***********************************************************
Sketch permettant à un ESP32 ou un ESP8266 de recevoir des messages
en provenance d'un autre microcontrôleur par l'entremise d'un
module nRF24L01.
Les messages reçus sont affichés dans le moniteur série.
*************************************************************/
#include
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(4, 5);
const uint64_t adresse = 0x1111111111;
const int taille = 32;
char message[taille + 1];
void setup(void)
{
Serial.begin(115200);
Serial.println("Recepteur RF24");
radio.begin();
radio.openReadingPipe(1, adresse);
radio.startListening();
}
void loop(void)
{
while ( radio.available() )
{
radio.read( message, taille );
Serial.print("Message recu : ");
Serial.println(message);
}
}
===== Maquette de test =====
#include
#include
#include "nRF24L01.h"
#include "RF24.h"
//definition tunnel communication
#define tunnel1 "PIPE1"
#define tunnel2 "PIPE2"
#define tunnel3 "PIPE3"
#define tunnel4 "PIPE4"
#define tunnel5 "PIPE5"
#define tunnel6 "PIPE6"
DFRobot_MCP23017 mcp(Wire, /*addr =*/0x27);//constructor, change the Level of A2, A1, A0 via DIP switch to revise the I2C address within 0x20~0x27.
#define Led0 mcp.eGPB0
#define Led1 mcp.eGPB1
#define Bp0 mcp.eGPA0
#define Bp1 mcp.eGPA1
int MemLed0 =0;
int MemBp0 =0;
int tempo0 =50;
int MemLed1 =0;
int MemBp1 =0;
int tempo1 =50;
int compteur = 0;
RF24 radio(4, 5);
const byte adresses[][6] = {tunnel1, tunnel2, tunnel3, tunnel4, tunnel5, tunnel6};
const int taille = 32;
char message[taille + 1];
char messageACK[taille +1];
void DebugVar(int nb, int valBP0) {
Serial.print("temps = ");Serial.println(nb);
Serial.print("Bp0 =");Serial.println(digitalRead(mcp.eGPA0));
Serial.print("ValeurBp0 =");Serial.println(digitalRead(valBP0));
Serial.print("MemBp0 =");Serial.println(MemBp0);
Serial.print("MemLed0 =");Serial.println(MemLed0);
delay(250);
}
int LectBp0() {
// Bouton O -- Led0
int valeurBp0 = mcp.digitalRead(mcp.eGPA0);
//Temps 0
if(valeurBp0== 0 && MemBp0 == 0 && MemLed0 == 0){
mcp.digitalWrite(mcp.eGPB0, LOW); MemBp0 = 0; MemLed0 =0;
//delay(tempo0);DebugVar(0,valeurBp0);
}
//Temps 1
if (valeurBp0 == 1 && MemBp0 ==0 && MemLed0 == 0) {
mcp.digitalWrite(mcp.eGPB0, HIGH);MemBp0 =1;MemLed0 = 1;
//delay(tempo0);DebugVar(1,valeurBp0);
}
//Temps 2
if (valeurBp0 == 0 && MemBp0 ==1 && MemLed0 == 1) {
mcp.digitalWrite(mcp.eGPB0, HIGH);MemBp0 =0;MemLed0 = 1;
//delay(tempo0);DebugVar(2,valeurBp0);
}
//Temps 3
if (valeurBp0 == 1 && MemBp0 ==0 && MemLed0 == 1) {
mcp.digitalWrite(mcp.eGPB0, LOW);MemBp0 =1;MemLed0 = 0;
//delay(tempo0);DebugVar(3,valeurBp0);
}
//Temps 4
if (valeurBp0 == 0 && MemBp0 ==1 && MemLed0 == 0) {
mcp.digitalWrite(mcp.eGPB0, LOW);MemBp0 =0;MemLed0 = 0;
//delay(tempo0);DebugVar(4,valeurBp0);
}
delay(20);
return(!valeurBp0);
}
int LectBp1(){
// Bouton 1 -- Led1
uint8_t valeurBp1 = mcp.digitalRead(mcp.eGPA1);
//Temps 0
if(valeurBp1== 0 && MemBp1 == 0 && MemLed1 == 0){
mcp.digitalWrite(mcp.eGPB1, LOW); MemBp1 = 0; MemLed1 =0;
//delay(tempo0);DebugVar(0,valeurBp0);
}
//Temps 1
if (valeurBp1 == 1 && MemBp1 ==0 && MemLed1 == 0) {
mcp.digitalWrite(mcp.eGPB1, HIGH);MemBp1 =1;MemLed1 = 1;
//delay(tempo0);DebugVar(1,valeurBp0);
}
//Temps 2
if (valeurBp1 == 0 && MemBp1 ==1 && MemLed1 == 1) {
mcp.digitalWrite(mcp.eGPB1, HIGH);MemBp1 =0;MemLed1 = 1;
//delay(tempo0);DebugVar(2,valeurBp0);
}
//Temps 3
if (valeurBp1 == 1 && MemBp1 ==0 && MemLed1 == 1) {
mcp.digitalWrite(mcp.eGPB1, LOW);MemBp1 =1;MemLed1 = 0;
//delay(tempo0);DebugVar(3,valeurBp0);
}
//Temps 4
if (valeurBp1 == 0 && MemBp1 ==1 && MemLed1 == 0) {
mcp.digitalWrite(mcp.eGPB1, LOW);MemBp1 =0;MemLed1 = 0;
//delay(tempo0);DebugVar(4,valeurBp0);
}
return(valeurBp1);
}
void setup() {
Serial.begin(115200);
Serial.println("Emetteur de donnees");
radio.begin();
radio.setChannel(125);
radio.setPALevel(RF24_PA_MIN);
radio.setDataRate(RF24_250KBPS);
radio.openWritingPipe(adresses[0]);
//pour recevoir
radio.openReadingPipe(1, adresses[1]);//ouverture tunnel2 en LECTURE (reception Radio)
radio.openReadingPipe(2, adresses[2]);//ouverture tunnel3 en LECTURE (reception Radio)
radio.openReadingPipe(3, adresses[3]);//ouverture tunnel4 en LECTURE (reception Radio)
radio.openReadingPipe(4, adresses[4]);//ouverture tunnel5 en LECTURE (reception Radio)
radio.openReadingPipe(5, adresses[5]);//ouverture tunnel6 en LECTURE (reception Radio)
while(mcp.begin() != 0){
Serial.println("Initialization of the chip failed, please confirm that the chip connection is correct!");
delay(1000);
}
mcp.pinMode(Bp0, INPUT);
mcp.pinMode(Bp1, INPUT);
mcp.pinMode(mcp.eGPB0,OUTPUT);
mcp.pinMode(Led0,OUTPUT);
mcp.digitalWrite(mcp.eGPB0, LOW);
mcp.digitalWrite(Led1, LOW);
}
void loop() {
//Lecture Boutons poussoir
LectBp0();
//LectBp1();
//Serial.println(LectBp0());
compteur = LectBp0();
//Serial.println(compteur);
//delay(200);
// envoie message
if (compteur == 1 ){
radio.stopListening();
itoa(compteur, message, 10);
Serial.print("J'envoie maintenant "); // pour débogage
Serial.println(message);//Serial.print(" ");Serial.println(LectBp0());
radio.write( message, taille ); // émission du message via nRF24L01
delay(200);
compteur = 0;
}
radio.startListening();
if(radio.available()){
while ( radio.available() )
{
radio.read( messageACK, taille );
Serial.print("MessageACK recu : ");
Serial.println(messageACK);
}
delay(20);
}
delay(5);
}
#include
#include
#include "nRF24L01.h"
#include "RF24.h"
DFRobot_MCP23017 mcp(Wire, /*addr =*/0x27);//constructor, change the Level of A2, A1, A0 via DIP switch to revise the I2C address within 0x20~0x27.
#define Led0 mcp.eGPB0
#define Led1 mcp.eGPB1
#define Bp0 mcp.eGPA0
#define Bp1 mcp.eGPA1
int MemLed0 =0;
int MemBp0 =0;
int tempo0 =50;
int MMentier = 0;
int MemLed1 =0;
int MemBp1 =0;
int tempo1 =50;
int compteur = 0;
//definition tunnel de communication
#define tunnel1 "PIPE2"
#define tunnel2 "PIPE1"
#define tunnel3 "PIPE3"
#define tunnel4 "PIPE4"
#define tunnel5 "PIPE5"
#define tunnel6 "PIPE6"
RF24 radio(4, 5);
const byte adresses[][6] = {tunnel1, tunnel2, tunnel3, tunnel4, tunnel5, tunnel6};
const int taille = 32;
char message[taille + 1];
char messageACK[taille +1];
int LectBp0(int ValMessage) {
// Bouton O -- Led0
//int valeurBp0 = mcp.digitalRead(mcp.eGPA0);
int valeurBp0 = ValMessage;
//Temps 0
if(valeurBp0== 0 && MemBp0 == 0 && MemLed0 == 0){
mcp.digitalWrite(mcp.eGPB0, LOW); MemBp0 = 0; MemLed0 =0;
//delay(tempo0);DebugVar(0,valeurBp0);
}
//Temps 1
if (valeurBp0 == 1 && MemBp0 ==0 && MemLed0 == 0) {
mcp.digitalWrite(mcp.eGPB0, HIGH);MemBp0 =1;MemLed0 = 1;
//delay(tempo0);DebugVar(1,valeurBp0);
}
//Temps 2
if (valeurBp0 == 0 && MemBp0 ==1 && MemLed0 == 1) {
mcp.digitalWrite(mcp.eGPB0, HIGH);MemBp0 =0;MemLed0 = 1;
//delay(tempo0);DebugVar(2,valeurBp0);
}
//Temps 3
if (valeurBp0 == 1 && MemBp0 ==0 && MemLed0 == 1) {
mcp.digitalWrite(mcp.eGPB0, LOW);MemBp0 =1;MemLed0 = 0;
//delay(tempo0);DebugVar(3,valeurBp0);
}
//Temps 4
if (valeurBp0 == 0 && MemBp0 ==1 && MemLed0 == 0) {
mcp.digitalWrite(mcp.eGPB0, LOW);MemBp0 =0;MemLed0 = 0;
//delay(tempo0);DebugVar(4,valeurBp0);
}
return(valeurBp0);
}
int LectBp1(){
// Bouton 1 -- Led1
uint8_t valeurBp1 = mcp.digitalRead(mcp.eGPA1);
//uint8_t valeurBp1 = );
//Temps 0
if(valeurBp1== 0 && MemBp1 == 0 && MemLed1 == 0){
mcp.digitalWrite(mcp.eGPB1, LOW); MemBp1 = 0; MemLed1 =0;
//delay(tempo0);DebugVar(0,valeurBp0);
}
//Temps 1
if (valeurBp1 == 1 && MemBp1 ==0 && MemLed1 == 0) {
mcp.digitalWrite(mcp.eGPB1, HIGH);MemBp1 =1;MemLed1 = 1;
//delay(tempo0);DebugVar(1,valeurBp0);
}
//Temps 2
if (valeurBp1 == 0 && MemBp1 ==1 && MemLed1 == 1) {
mcp.digitalWrite(mcp.eGPB1, HIGH);MemBp1 =0;MemLed1 = 1;
//delay(tempo0);DebugVar(2,valeurBp0);
}
//Temps 3
if (valeurBp1 == 1 && MemBp1 ==0 && MemLed1 == 1) {
mcp.digitalWrite(mcp.eGPB1, LOW);MemBp1 =1;MemLed1 = 0;
//delay(tempo0);DebugVar(3,valeurBp0);
}
//Temps 4
if (valeurBp1 == 0 && MemBp1 ==1 && MemLed1 == 0) {
mcp.digitalWrite(mcp.eGPB1, LOW);MemBp1 =0;MemLed1 = 0;
//delay(tempo0);DebugVar(4,valeurBp0);
}
return(valeurBp1);
}
void envoiemessage1(){
radio.stopListening();
itoa(255,messageACK, 10);
radio.write(messageACK, taille);
Serial.print("messageACK1 = ");Serial.println(messageACK);
delay(20);
radio.startListening();
}
void envoiemessage2(){
radio.stopListening();
itoa(128,messageACK, 10);
radio.write(messageACK, taille);
Serial.print("messageACK2 = ");Serial.println(messageACK);
delay(20);
radio.startListening();
}
void setup() {
Serial.begin(115200);
Serial.println("Recepteur RF24");
radio.begin();
radio.setChannel(125);
radio.setPALevel(RF24_PA_MIN);
radio.setDataRate(RF24_250KBPS);
radio.openWritingPipe(adresses[0]); // Ouverture tunnel1 en ECRITURE
radio.openReadingPipe(1, adresses[1]); // Ouverture tunnel2 en LECTURE
radio.openReadingPipe(2, adresses[2]); // Ouverture tunnel3 en LECTURE
radio.openReadingPipe(3, adresses[3]); // Ouverture tunnel4 en LECTURE
radio.openReadingPipe(4, adresses[4]); // Ouverture tunnel5 en LECTURE
radio.openReadingPipe(5, adresses[5]); // Ouverture tunnel6 en LECTURE
while(mcp.begin() != 0){
Serial.println("Initialization of the chip failed, please confirm that the chip connection is correct!");
delay(1000);
}
mcp.pinMode(Bp0, INPUT);
mcp.pinMode(Bp1, INPUT);
mcp.pinMode(mcp.eGPB0,OUTPUT);
mcp.pinMode(Led0,OUTPUT);
mcp.digitalWrite(mcp.eGPB0, LOW);
mcp.digitalWrite(Led1, LOW);
}
void loop() {
//Reception Message
radio.startListening();
if (radio.available()){
while ( radio.available() )
{
radio.read( message, taille );
Serial.print("Message recu : ");
Serial.println(message);
}
delay(20);
}
delay(5);
int Mentier = atoi(message);
if ( Mentier == 0 && MMentier == 0 ) {
message[0] = '\0'; Mentier = 0;
mcp.digitalWrite(mcp.eGPB0, LOW);
delay(500);
}
if ( Mentier == 1 && MMentier == 0 ) {
message[0] = '\0'; Mentier = 0;
mcp.digitalWrite(mcp.eGPB0, HIGH);
MMentier = 1;
envoiemessage1();
delay(500);
}
if ( Mentier == 1 && MMentier == 1 ) {
message[0] = '\0'; Mentier = 0;
mcp.digitalWrite(mcp.eGPB0, LOW);
MMentier = 0;
envoiemessage2();
delay(500);
}
}
=== L'achat de nrf24L01 ===
[[https://fr.aliexpress.com/item/2-4G-1100-Meters-Long-Distance-NRF24L01-PA-LNA-Wireless-Module-with-Antenna-Free-Shipping/32272725011.html?ws_ab_test=searchweb0_0,searchweb201602_2_10152_10065_10151_10068_10084_10083_10080_10082_10081_10110_10136_10137_10111_10060_10138_10112_10113_10062_10156_10114_10153_10141_10056_10055_128_10054_10059_10099_10078_10079_10103_10073_10102_10096_10070_10148_10123_10147_10052_10053_10124_10142_10107_10050_10143_10051-10050_10111,searchweb201603_1,afswitch_1,ppcSwitch_5&btsid=a0d3ea27-e71d-4c2f-86c3-62f27e4b4d0d&algo_expid=5a553854-e70d-49bc-bdf7-f6fc1de8a7fd-6&algo_pvid=5a553854-e70d-49bc-bdf7-f6fc1de8a7fd|Pas presser sur Aliexpress]]
[[http://www.gotronic.fr/art-module-transceiver-nrf24l01-113990011-20628.htm|Plus rapide sur Gotronic ... mais plus cher]]