Faire dialoguer un Raspberry et un Arduino via nRF24L01

Proposer ou rechercher un tutoriel concernant le Raspberry Pi

Modérateur : Francois

abrieg
Messages : 1
Enregistré le : mar. 26 janv. 2016 20:33

Re: Faire dialoguer un Raspberry et un Arduino via nRF24L01

Message par abrieg » mar. 26 janv. 2016 20:40

bonjour, et merci pour ce tuto.

est ce qu' il y a beaucoup de modification à effectuer pour faire fonctionner cette installation avec un DHT11?

Brieuc

finopat
Messages : 7
Enregistré le : mar. 23 août 2016 12:54

Re: Faire dialoguer un Raspberry et un Arduino via nRF24L01

Message par finopat » mar. 23 août 2016 13:15

bonjour,
merci dom pour ce tuto qui a fonctionné pour moi.
J'ai comme besoin de pouvoir commander deux relais sur l'arduino, j'ai donc modifié le programme côté arduino :
j'ai joué sur l'ID de l'arduino, en effet je ne maîtrise pas suffisamment le json pour arriver à envoyer autre chose que set=on set=off et get.
J'aimerai arriver à faire cela avec json, avez vous des pistes à me donner pour cela ?
J'ai aussi utilisé digitalRead pour lire l'état des leds .

voici le code pour ceux que ça intéresse :

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"

/* Définition des Pins CE, CSN et connexion de la LED sur ARDUINO */
#define RF_CE 9
#define RF_CSN 10
#define LED_PIN_1 6
#define LED_PIN_2 7


RF24 radio(RF_CE,RF_CSN);

/* Définition de l'id de l'Arduino */
byte myID1 = 0x01;
byte myID2 = 0x02;

byte pipes[][7] = {"master","slave","idle"};

struct payload_request_t
{
uint8_t number;
uint8_t destination;
char message[14];
};

struct payload_general_t
{
uint8_t number;
char message[15];
};

payload_request_t incoming;
payload_general_t outgoing;


/* Envoi de la réponse */
/* ******************* */
void sendReply()
{
/* Message visible si la console est ouverte */
Serial.print("Message de retour de la commande \"");
Serial.print(outgoing.message);
Serial.println("\"");

/* Retour de la reponse au demandeur */
radio.stopListening();
radio.openWritingPipe(pipes[1]);
delay(10);
radio.write(&outgoing,sizeof(payload_general_t)+1);
delay(10);
radio.startListening();
}


// Variables Etat de la led
int val = 0;
char* etat = "off";


/* Initialisation du programme */
/* *************************** */
void setup()
{
Serial.begin(9600);
/* Définition des pin des LED comme SORTIE */
pinMode(LED_PIN_1, OUTPUT);
pinMode(LED_PIN_2, OUTPUT);
/* On met le pin à l'état éteind */
digitalWrite(LED_PIN_1, LOW);
digitalWrite(LED_PIN_2, LOW);

printf_begin();
radio.begin();
radio.setAutoAck(1);
radio.setRetries(1,3);
radio.enableDynamicPayloads();
radio.openWritingPipe(pipes[1]);
radio.openReadingPipe(1, pipes[0]);
radio.startListening();
radio.printDetails();

}

/* Boucle de "travail" */
/* ******************* */
void loop(void)
{
if(radio.available()) {
radio.read(&incoming, sizeof(payload_request_t));
/* Affichage de la commande demandée dans la console */
Serial.print("Commande recu : ");
Serial.println(incoming.message);

/* Aduino vérifie que c'est bien à son ID que la demande s'adresse */
/*si ID=1 = LED-1 à allumer; si ID=2 LED-2 à allumer */
int LED_PIN = 0;
if (incoming.destination==myID1 || incoming.destination==myID2) {
if (incoming.destination==myID1) {
LED_PIN = LED_PIN_1;
} else if (incoming.destination==myID2) {
LED_PIN = LED_PIN_2;
}

/* Si le message est "get", on retourne l'état enregistré de la LED */
if (strncmp(incoming.message, "get", 3) == 0) {


val = digitalRead(LED_PIN);
if (val == 1) {
etat = "on";
} else {
etat = "off";
}
strcpy(outgoing.message, etat);

/* Sinon, la commande est t'elle de type "set" */
} else if (strncmp(incoming.message, "set", 3) == 0) {
if (strncmp(&incoming.message[4], "on", 2)==0) {
/* Si la commande est "on", on allume la LED */
digitalWrite(LED_PIN, HIGH);
strcpy(outgoing.message, "ok");
} else if (strncmp(&incoming.message[4], "off", 3)==0) {
/* Si la commande est "off", on éteind la LED */
digitalWrite(LED_PIN, LOW);
strcpy(outgoing.message, "ok");
} else
/* Sinon, Commande inconnue, ni"on", ni "off" */
strcpy(outgoing.message, "?");

/* Sinon, Commande inconnue, ni "get", ni "set" */
} else {
strcpy(outgoing.message, "?");
}

/* On retourne le résultat du traitement */
outgoing.number = incoming.number;
sendReply();
}
}
delay(100);
}

jpdlespace
Messages : 4
Enregistré le : ven. 12 mai 2017 23:30

Re: Faire dialoguer un Raspberry et un Arduino via nRF24L01

Message par jpdlespace » sam. 13 mai 2017 00:14

Bonjour,
Je suis un noob en C++ (et en générale), mes bases en informatique remonte à la programmation de ZORGON REVENGE sur mon ORIC 1 à la fin des années 80' (non, non je suis encore jeune). Mais j'ai découvert le RASPBERRY, KODI, DOMOTICZ etc...ET c'est GENIAL. Donc j'ai essayé le tuto (que j'ai suivis à la lettre, et je suis aussi reparti de zéro (2 fois) en formatant la carte SD, car à force de chercher comment résoudre mon problème, je ne savais plus ou j'en étais dans l'installation de bibliothèque et mise à jour divers).
Ceci dit : j'ai toujours le même message d'erreur quand je fais le make ou le sudo make et aussi quand je compile les exemples du répertoire exemple LINUX :

sudo make all && sudo make install "Et là, la galère commence..."

g++ -c -o PiGateway.o PiGateway.cpp -Wall -Ofast -lpthread -g -D__Raspberry_Pi -mfloat-abi=hard -D_TTY_NAME=\"/dev/ttyMySensorsGateway\" -D_TTY_GROUPNAME=\"tty\" -march=armv6zk -mtune=arm1176jzf-s -mfpu=vfp -I. -I/usr/local/include/RF24
PiGateway.cpp: In function ‘void setup()’:
PiGateway.cpp:51:21: error: ‘RPI_V2_GPIO_P1_22’ was not declared in this scope
gw = new MyGateway(RPI_V2_GPIO_P1_22, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ, 60);
^
PiGateway.cpp:51:40: error: ‘RPI_V2_GPIO_P1_24’ was not declared in this scope
gw = new MyGateway(RPI_V2_GPIO_P1_22, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ, 60);
^
PiGateway.cpp:51:59: error: ‘BCM2835_SPI_SPEED_8MHZ’ was not declared in this scope
gw = new MyGateway(RPI_V2_GPIO_P1_22, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ, 60);
^
Makefile:61: recipe for target 'PiGateway.o' failed
make: *** [PiGateway.o] Error 1

Ou avec le fichier SENDER.CPP

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:10:12: error: ‘RPI_BPLUS_GPIO_J8_15’ was not declared in this scope
RF24 radio(RPI_BPLUS_GPIO_J8_15,RPI_BPLUS_GPIO_J8_24, BCM2835_SPI_SPEED_8MHZ);
^
sender.cpp:10:33: error: ‘RPI_BPLUS_GPIO_J8_24’ was not declared in this scope
RF24 radio(RPI_BPLUS_GPIO_J8_15,RPI_BPLUS_GPIO_J8_24, BCM2835_SPI_SPEED_8MHZ);
^
sender.cpp:10:55: error: ‘BCM2835_SPI_SPEED_8MHZ’ was not declared in this scope
RF24 radio(RPI_BPLUS_GPIO_J8_15,RPI_BPLUS_GPIO_J8_24, BCM2835_SPI_SPEED_8MHZ);
^
sender.cpp: In function ‘int main(int, char**)’:
sender.cpp:70:24: warning: ‘json_object* json_object_object_get(json_object*, const char*)’ is deprecated (declared at /usr/include/json/json_object.h:271) [-Wdeprecated-declarations]
json_object * key = json_object_object_get(jobj, "to");
^
sender.cpp:70:57: warning: ‘json_object* json_object_object_get(json_object*, const char*)’ is deprecated (declared at /usr/include/json/json_object.h:271) [-Wdeprecated-declarations]
json_object * key = json_object_object_get(jobj, "to");
^
sender.cpp:77:10: warning: ‘json_object* json_object_object_get(json_object*, const char*)’ is deprecated (declared at /usr/include/json/json_object.h:271) [-Wdeprecated-declarations]
key = json_object_object_get(jobj, "message");
^
sender.cpp:77:48: warning: ‘json_object* json_object_object_get(json_object*, const char*)’ is deprecated (declared at /usr/include/json/json_object.h:271) [-Wdeprecated-declarations]
key = json_object_object_get(jobj, "message");
^
sender.cpp:84:10: warning: ‘json_object* json_object_object_get(json_object*, const char*)’ is deprecated (declared at /usr/include/json/json_object.h:271) [-Wdeprecated-declarations]
key = json_object_object_get(jobj, "TTL");
^
sender.cpp:84:44: warning: ‘json_object* json_object_object_get(json_object*, const char*)’ is deprecated (declared at /usr/include/json/json_object.h:271) [-Wdeprecated-declarations]
key = json_object_object_get(jobj, "TTL");
^
Makefile:13: recipe for target 'sender' failed
make: *** [sender] Error 1


J'ai cherche a comprendre le GPIOXXX was not declared in this scope mais ce que j'ai trouvé ne fonctionne pas..... Lors de mes recherches j'ai trouvé à remplacer :
RPI_V2_GPIO_P1_22, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ, 60
Par:
RPI_BPLUS_GPIO_J8_22,RPI_BPLUS_GPIO_J8_24, BCM2835_SPI_SPEED_8MHZ
Mais idem pour le message d'erreur (j'avais bien noté le changement de P1_22 en J8_22 sur le RASPBERRY mais je ne sais pas si cela a une influence sur la PIN 22 à connecter)

En pensent que la version du RASPBERRY pouvait être le problème... mais non. J' aussi cherché dans le RF24.h, voir si il c'était pas un problème de déclaration. Mais mes compétence sont beaucoup trop limiter pour modifier quoi que ce soit.

Pour les warning... je ne sais pas si ils sont important. j'ai compris qu'il y avait un problème d'obsolescence des bibliothèques mais sans trouver comment les mettre à jour.


Alors je m'en remet à vous et je serais le plus heureux du monde si une âme charitable daignais s'intéresser à mon problème car depuis 2 semaines et quelque nuits de recherche, je n'ai pas trouvé.....

PS: J'ai branché le nrf24l01 à l' ARDUINO NANO, compilé et versé le prog à priori il est prêt.

domi
Administrateur
Messages : 2282
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 » sam. 13 mai 2017 08:26

Tu as installé la bibliothèque WiringPi sur le Raspberry ?

jpdlespace
Messages : 4
Enregistré le : ven. 12 mai 2017 23:30

Re: Faire dialoguer un Raspberry et un Arduino via nRF24L01

Message par jpdlespace » dim. 14 mai 2017 00:28

Bonjour Domi,
Oui j ai installé la bibliothèque wiringpi. J'ai suivis le tuto de ce site: http://wiringpi.com/download-and-install/. A priori l'installation c'est bien passé.
Les commandes gpio -v et gpio readall fonctionnent.

domi
Administrateur
Messages : 2282
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 mai 2017 09:06

Bonjour,

La procédure datant de près de deux ans, dès que j'ai un moment je la testerai sur une distribution récente afin de vérifier si elle est toujours d'actualité, et si il n'y a pas des modifications a apporter.

jpdlespace
Messages : 4
Enregistré le : ven. 12 mai 2017 23:30

Re: Faire dialoguer un Raspberry et un Arduino via nRF24L01

Message par jpdlespace » dim. 14 mai 2017 13:57

Merci, je vais attendre tout en continuant mes recherches...

guillaume9344
Raspinaute
Messages : 629
Enregistré le : mar. 6 janv. 2015 19:44
Localisation : finistere

Re: Faire dialoguer un Raspberry et un Arduino via nRF24L01

Message par guillaume9344 » dim. 14 mai 2017 20:23

Bonsoir,en fouillant un peut dans les sources , je pense que la bibliothèque RF24 utilise plutôt la lib BCM2835 que wiringpi , pour instaler la lib:
http://www.airspayce.com/mikem/bcm2835/index.html.

les terms "‘RPI_V2_GPIO_P1_22" correspondent à la déclaration des pin du pi pour cette lib.
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

jpdlespace
Messages : 4
Enregistré le : ven. 12 mai 2017 23:30

Re: Faire dialoguer un Raspberry et un Arduino via nRF24L01

Message par jpdlespace » lun. 15 mai 2017 00:17

MERCI MERCI MERCI.... Je suis comme un gosse a qui on a offert KINDER surprise. Ca marche !!! (Je suis quand même reparti de zéro car j'avais réussi cet après-midi à faire planter le RASPBERRY, il redémarrais non-stop...)

m3sh331
Messages : 1
Enregistré le : dim. 14 oct. 2018 10:25

Re: Faire dialoguer un Raspberry et un Arduino via nRF24L01

Message par m3sh331 » dim. 14 oct. 2018 10:41

jpdlespace a écrit :
lun. 15 mai 2017 00:17
MERCI MERCI MERCI.... Je suis comme un gosse a qui on a offert KINDER surprise. Ca marche !!! (Je suis quand même reparti de zéro car j'avais réussi cet après-midi à faire planter le RASPBERRY, il redémarrais non-stop...)
Bonjour,
Comment avez-vous résolu le problème de l'installation de la bibliothèque libjson0-dev (impossible de trouver le packet libjson0-dev)?
J'ai essayé avec une autre bibliothèque (qui existe) : libjsoncpp-dev , mais le make (pour sender.cpp) échoue avec de nombreuse erreurs..

Cordialement,

Michel

Répondre

Retourner vers « Tutoriels »