Faire dialoguer un Raspberry et un Arduino via nRF24L01

Proposer ou rechercher un tutoriel concernant le Raspberry Pi

Modérateur : Francois

domi
Administrateur
Messages : 3253
Enregistré le : mer. 17 sept. 2014 18:12
Localisation : Seine et Marne

Re: Faire dialoguer un Raspberry et un Arduino via nRF24L01

Message par domi » dim. 14 oct. 2018 11:06

m3sh331 a écrit :
dim. 14 oct. 2018 10:41
Comment avez-vous résolu le problème de l'installation de la bibliothèque libjson0-dev (impossible de trouver le packet libjson0-dev)?
Bonjour,

Code : Tout sélectionner

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install libjson0-dev
Le paquet est dans les sources.
Passionné de Raspberry, Arduino, ESP8266, ESP32, et objets connectés :
Spécial débutant, concevez vous-même votre domotique DIY : https://www.youtube.com/c/DomoticDIY
Conception d'une station météo DIY, et envoi des infos à votre Domotique.

plct333
Messages : 5
Enregistré le : sam. 22 févr. 2020 17:20

Re: Faire dialoguer un Raspberry et un Arduino via nRF24L01

Message par plct333 » mar. 29 nov. 2022 11:30

Bonjour Domi,

Merci pour ce tutoriel qui va me rendre un enorme service dans la retransmission des données de mes différents capteurs. J'ai suivi ce tutoriel à la lettre mais je butte sur la compilation de "sender" le RPI4 me renvoie :
pascal@raspberrypi:/home/nrf24l01 $ make
g++ -o sender -Wall -I../ sender.cpp -Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s -l json -l rf24-bcm
sender.cpp:5:10: fatal error: RF24/RF24.h: Aucun fichier ou dossier de ce type
5 | #include <RF24/RF24.h>
| ^~~~~~~~~~~~~
compilation terminated.
make: *** [Makefile:13 : sender] Erreur 1


Le fichier RF24.h est bien présent dans le répertoire RF24 , je suis un peu perdu ...

Merci pour votre aide

domi
Administrateur
Messages : 3253
Enregistré le : mer. 17 sept. 2014 18:12
Localisation : Seine et Marne

Re: Faire dialoguer un Raspberry et un Arduino via nRF24L01

Message par domi » mar. 29 nov. 2022 13:31

Bonjour,

Le tuto date un peu et je ne peu garantir qu'avec les différentes mises à jour il soit toujours d'actualité.

Mais si cela est le cas, au vu du message d'erreur il ne trouve effectivement pas le fichier RF24.h.

Par contre je constate un chose bizarre, c'est que tu es positionné dans le répertoire "/home/nrf24l01", alors qu'avec le user PI tu devrais être dans le dossier "/home/pi/nrf24l01" (home directory de "pi")
Vérifier également que l'utilisateur pi à bien les droits sur le répertoire "RF24" et ses fichiers.
Passionné de Raspberry, Arduino, ESP8266, ESP32, et objets connectés :
Spécial débutant, concevez vous-même votre domotique DIY : https://www.youtube.com/c/DomoticDIY
Conception d'une station météo DIY, et envoi des infos à votre Domotique.

piper
Modérateur
Messages : 697
Enregistré le : sam. 5 juin 2021 18:57

Re: Faire dialoguer un Raspberry et un Arduino via nRF24L01

Message par piper » mar. 29 nov. 2022 19:35

Je pense que tu à un sousis de répertoire :
Tu étais là : /home/nrf24l01
Tu as lancé make

/home/nrf24l01 $ make
g++ -o sender -Wall -I../ sender.cpp -Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s -l json -l rf24-bcm
sender.cpp:5:10: fatal error: RF24/RF24.h: Aucun fichier ou dossier de ce type

donc là, if il dit ne trouve pas RF24/RF24.h
C'est à dire qu'il ne trouve pas /home/nrf24l01/RF24/RF24.h

Bon après, si ce fichier existe, peut-être que comme tu étais loggé en tant que pascal, pascal n'a pas les droits qui vont bien sur /home/nrf24l01/RF24
3 Pi4 : Emby / Samba , Librelec, Android TV
3 Pi3 : Hifiberry /OSMC, Games station, Samba / VPN / HotSpot Wifi
2 Pi2 : RFID, radio reveil (PiReveil)
1 Pi0 : traker GPS et acquisitions
1 Pi0 2W : tests divers
5 Arduinos dont 4 nanos et 1 Mega
1 ESP32

plct333
Messages : 5
Enregistré le : sam. 22 févr. 2020 17:20

Re: Faire dialoguer un Raspberry et un Arduino via nRF24L01

Message par plct333 » mer. 30 nov. 2022 11:15

Merci Domi et Piper pour vos infos, j'ai corrigé les droits sur les répertoires et les fichiers et me suis calé sur le bon répertoire.

Je ne sais pas si c'est l'ancienneté du tuto ou mon installation un peu bancale mais j'ai rencontré d'autres erreurs de compilation qui m'ont conduit à modifier sender.cpp avec des infos trouvées dans les différents forums:

#include <json/json.h> en #include <json-c/json.h>
et RF24 radio(RPI_V2_GPIO_P1_15, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_16MHZ);
en RF24 radio(7,8); //(CE,CSN) à ajuster en fonction du câblage.

par contre je rencontre un autre pb :
g++ -o sender -Wall -I../ sender.cpp -Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s -l json -l rf24-bcm
sender.cpp: In function ‘int main(int, char**)’:
sender.cpp:81:11: warning: ‘char* strncpy(char*, const char*, size_t)’ specified bound 14 equals destination size [-Wstringop-truncation]
81 | strncpy(request.message, (char *) json_object_get_string(key), 14);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/ld : ne peut ouvrir le fichier de sortie sender : Permission non accordée
collect2: error: ld returned 1 exit status
make: *** [Makefile:13 : sender] Erreur 1

quel est le fichier de sortie de sender ? ou se trouve t-il ?

piper
Modérateur
Messages : 697
Enregistré le : sam. 5 juin 2021 18:57

Re: Faire dialoguer un Raspberry et un Arduino via nRF24L01

Message par piper » dim. 4 déc. 2022 00:16

Bon sans ouvrir la boite de pandore c'est pas facile mais on va essayer.
Pour faire simple :
sender.cpp est un code source écrit en c plus plus
là, le script tente de le compiler avec g++ et les options qui vont bien.
L'option -o (=output) dit que le résultat final doit être le fichier sender
Il n'y a pas de chemin, donc sender sera créé dans le dossier dans lequel tu te trouves

En fait, la compilation est une mauvaise expression : ça se passe en plusieurs étapes (la 1ère est la "vrai" compilation qui génère des fichiers dont l'extension est o et ne sont pas exécutables)
A la fin, il faut faire le linkedit (edition de liens), c'est le job de ld :g++ passe la main à ld sans que tu ne t'en aperçoives

C'est lui fait cette dernière étape en créant le fichier exécutable (c'est le résultat final désiré : un fichier exécutable que tu peux lancer)
ce fichier exécutable se nomme "sender" sans extension, tel que c'est précisé derrière g++ -o

Là, ld te dis juste qu'il n'a pas les droits d'écrire ce fichier sender

Poses-toi les questions suivantes :
- est-ce que la doc précise que tu dois le faire en root (avec sudo) ou pas ? (normalement non mais bon...)
- quand tu lances ce script, dans quel dossier étais-tu ? ton user a-t-il les droits d'écriture dessus ?
3 Pi4 : Emby / Samba , Librelec, Android TV
3 Pi3 : Hifiberry /OSMC, Games station, Samba / VPN / HotSpot Wifi
2 Pi2 : RFID, radio reveil (PiReveil)
1 Pi0 : traker GPS et acquisitions
1 Pi0 2W : tests divers
5 Arduinos dont 4 nanos et 1 Mega
1 ESP32

plct333
Messages : 5
Enregistré le : sam. 22 févr. 2020 17:20

Re: Faire dialoguer un Raspberry et un Arduino via nRF24L01

Message par plct333 » lun. 5 déc. 2022 09:40

Merci piper pour ton aide, effectivement il faut utiliser sudo mais je retombe sur une autre erreur:
g++ -o sender -Wall -I../ sender.cpp -Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s -l json -l rf24-bcm
sender.cpp: In function ‘int main(int, char**)’:
sender.cpp:81:11: warning: ‘char* strncpy(char*, const char*, size_t)’ specified bound 14 equals destination size [-Wstringop-truncation]
81 | strncpy(request.message, (char *) json_object_get_string(key), 14);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/bin/ld : ne peut trouver -ljson
collect2: error: ld returned 1 exit status
make: *** [Makefile:13 : sender] Erreur 1

Je pense que je vais arrêter d'explorer cette voie et en rechercher une autre plus récente.

jelopo
Raspinaute
Messages : 319
Enregistré le : mer. 11 oct. 2017 10:23

Re: Faire dialoguer un Raspberry et un Arduino via nRF24L01

Message par jelopo » mar. 6 déc. 2022 07:50

Bonjour,

Effectivement, l'installation/compilation/configuration de NRF24 sur Raspberry a souvent posé des problèmes.
Personnellement, j'avais contourné le problème en ajoutant une couche WIFI. C'est à dire que j'avais installé un boitier passerelle contenant un ESP8266 (contenant une puce WIFI) et un NRF24L01. Cet équipement était mono directionnel il transformait le message reçu en RF24 vers du WIFI.

C'est une piste...
Si ça intéresse, je devrait retrouver le code

Autre piste, ce serait de connecter un Arduino + NRF24 récepteur sur un port série du PI ?

A+

plct333
Messages : 5
Enregistré le : sam. 22 févr. 2020 17:20

Re: Faire dialoguer un Raspberry et un Arduino via nRF24L01

Message par plct333 » mar. 6 déc. 2022 10:29

Bonjour jelopo,

Justement je regardais pour implémenter une Gateway My sensor construit avec un esp8266 ou 32 qui ferait l'interface avec Raspberry / Domoticz via une entrée USB. Le but est de recueillir des informations en provenance de capteurs et de les exploiter dans Domoticz.

Ta solution s'en rapproche un peu et si cela ne te dérange pas merci de m'envoyer ton code.

A+

jelopo
Raspinaute
Messages : 319
Enregistré le : mer. 11 oct. 2017 10:23

Re: Faire dialoguer un Raspberry et un Arduino via nRF24L01

Message par jelopo » mar. 6 déc. 2022 23:03

Bonjour,
Voici le sketch utlilisé sur un ESP8266 modèle ESP12. L'arduino et le NRF24L01 doivent être alimentés en 3.3V
L'utilisation des MQTT pour le diffusion du message n'est qu'une possibilité, tout autre protocole est bien sûr possible.

Code : Tout sélectionner

/*
* Nom du projet : RF24_Gateway
* Auteur        : jelopo
* Version       : 1.0.2
* Date          : 2020-04-21
* Description   : Passerelle RF24 vers MQTT
* Fonctions     : RF24 + ESP8266Wifi + MQTT
************************************************************************************
* Fonctionne avec un ESP-12
*    Choisir le Board "Generic ESP8266 Module"
*    Compiler avec Flash size = 4M
*    
* Branchements: NRF24L01: GND:15; VCC:8, CE:19; CSN:20; SCK:5; MOSI:7; MISO:6
* 
* Chargement du code: Appuyer sur RESET + GPIO0; Cliquer sur Téléverser
*                     Relacher RESET quand `Connecting...` apparait
*                     Relacher *GPIO0* quand `Writing at ..` apparait
************************************************************************************
*/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <SPI.h>
#include "nRF24L01.h"
#include <RF24.h>
#include "printf.h"

// Definition parametres WIFI
const char* ssid = "ssid_du_reseau_WIFI";
const char* password = "mot_de_passe_du_WIFI";
WiFiClient espClient;
String espname = "ESP_";
byte mac[6];

// Definition parametres MQTT
const char* mqtt_server = "192.168.1.10";
PubSubClient client(espClient);
long lastMsg = 0;
char msg[32];
char outTopic[22];

// Definition variable NRF24L01
RF24 radio(4, 5);                          // CE, CSN
const byte address[6] = "00001";
const int taille = 32;
char message[taille + 1]; 

void setup() {
  Serial.begin(115200);
  // WIFI setup
  setup_wifi();
  // MQTT Setup
  client.setServer(mqtt_server, mqtt_port);
  //// Initialize OutTopic
  String outTopicString = "RF24GW/" + espname + "/out";
  outTopicString.toCharArray(outTopic, 22);
  // RF24 setup
  setup_RF24();
  }

void setup_wifi() {
  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.print("MAC: ");
  Serial.println (WiFi.macAddress());
  Serial.print("espname: ");
  WiFi.macAddress(mac);
  espname = espname + String(mac[3],HEX) + String(mac[4],HEX) + String(mac[5],HEX);
  espname.toUpperCase();
  Serial.println(espname);
}

void reconnect() {
  // loop until MQTT connection
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection to ");
    Serial.print(mqtt_server);
    Serial.print(":");
    Serial.println(mqtt_port);
    // Attempt to connect
    // client.connect require a char argument for the clientId. 
    // c_str change String to char.
    if (client.connect(espname.c_str())) {
      Serial.println("MQTT connected");
      }
    else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup_RF24 () {
  delay(100);
  printf_begin();
  radio.begin();
  radio.setDataRate(RF24_250KBPS);
  //radio.setAutoAck(false);
  Serial.println("Radio Print Details:");
  radio.printDetails();
  radio.openReadingPipe(1, address);
  radio.startListening();
  }

void loop() {
  // Restart MQTT if needed
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  // RF24 
   while ( radio.available() )
  {
    radio.read(message, taille);
    Serial.print("Message recu : ");
    Serial.println(message);
    Serial.println("Publication MQTT.");
    client.publish(outTopic, message);
  }
}
Bonnes bidouilles.
A+

Répondre

Retourner vers « Tutoriels »