nRF24L01 et B+ [tuto en fin de topic]

Un lieu pour discuter des composants et de leur utilisation. Un passage obligé si vous devez interfacer votre Raspberry Pi avec le monde extérieur. On y trouvera aussi les cartes type commande de moteur pas à pas, continu, servo...

Modérateurs : Francois, smba38

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

Re: nRF24L01 et B+ [tuto en fin de topic]

Message par guillaume9344 » mar. 14 avr. 2015 18:57

Ha! ça c'est deja une bonne nouvelle, de mon coté j ai bien avancé aussi, j arrive aussi à transmettre du rpi vers mon stm32 et bien sur je récupère bien les données émises.
J' ai du réécrire l’accès au nrf24l01 car je n'ai pas d'arduino.
je joint les fichiers pour le rpi , compilé avec code::blocks mais on peut aussi le faire avec "make" , et les fichiers pour un stm32f103.
le code coté reception (stm32) ne fait rien de spécial, il stocke juste les 32 bytes reçus dans un tableau et reconfigure le nrf24l01 pour la réception suivante.
J'ai essayé de commenter le code le plus possible pour la compréhension et j 'ai utilisé la config par defaut des nrf24l01 en modifiant juste le nécessaire.
Bonne lecture.
@+
Fichiers joints
nrf24l01.rar
(148.08 Kio) Téléchargé 194 fois
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

lawfix
Messages : 66
Enregistré le : mer. 24 sept. 2014 10:02

Re: nRF24L01 et B+ [tuto en fin de topic]

Message par lawfix » mar. 14 avr. 2015 22:35

Alors pour le coup, je vais tenter de voir si ça fonctionne le gettingstarted modifié.

Mais par contre je n'ai pas le même car mon getting started est le suivant :

https://github.com/TMRh20/RF24/blob/mas ... tarted.ino :\

@Guillaume, quand je tente de compiler tes fichiers avec make j'ai l'erreur suivante :

Code : Tout sélectionner

root@raspberrypi:~# cd RF24test/
root@raspberrypi:~/RF24test# make
g++ -Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s -Wall -                                                 
I../ -lrf24-bcm spi.cpp -o spi
spi.cpp: In function ‘int main(int, char**)’:
spi.cpp:44:23: error: too few arguments to function ‘void bcm2835_spi_begin(uint                                                 
8_t)’
/usr/local/include/bcm2835.h:999:17: note: declared here
spi.cpp:40:10: warning: unused variable ‘buffer2’ [-Wunused-variable]
Makefile:32: recipe for target 'spi' failed
make: *** [spi] Error 1
root@raspberrypi:~/RF24test#

PS : j'admire le fait que tu ais les capacités à réécrire la librairie !

Toutefois, je suis parvenu à quelque chose avec ce code :

Code : Tout sélectionner

#include <RF24.h>
#include <RF24_config.h>
#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>

OneWire oneWire(2);

DallasTemperature sensors(&oneWire);

// ce,csn pins
RF24 radio(9,10);

unsigned char data[3] = {
  0};
unsigned long count=0;
void setup(void)
{
  sensors.begin();  
  Serial.begin(57600);
  Serial.println("**************V1 Send Sensor Data***********");
  radio.begin();
  radio.setPALevel(RF24_PA_LOW);
  radio.setChannel(0x4c);

  // open pipe for writing
  radio.openWritingPipe(0xF0F0F0F0E1LL);

  radio.enableDynamicPayloads();
  radio.setAutoAck(true);
  radio.powerUp();
  Serial.println("...Sending");
}

void loop(void)
{
  sensors.requestTemperatures();
  float currentTemp;
  currentTemp = sensors.getTempCByIndex(0);

  //assign 'T' to represent a Temperature reading
  data[0] = 'T';
  data[1] = currentTemp;
  count++;
  // print and increment the counter
  radio.write(data, sizeof(float)+1);
  Serial.print("Temperature sent:  ");
  Serial.println(currentTemp);
  // pause a second
  delay(500);
}
Le code envoi bien les données qui sont reçu via le soft sur le pi RPI hub

Code : Tout sélectionner


root@raspberrypi:~/rf24libs/RF24/examples_RPi/extra# ./rpi-hub
================ SPI Configuration ================
CSN Pin          = CE0 (PI Hardware Driven)
CE Pin           = Custom GPIO22
Clock Speed      = 8 Mhz
================ NRF Configuration ================
STATUS           = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1     = 0xf0f0f0f0d2 0xf0f0f0f0e1
RX_ADDR_P2-5     = 0xe2 0xe3 0xf1 0xf2
TX_ADDR          = 0xf0f0f0f0d2
RX_PW_P0-6       = 0x20 0x20 0x20 0x20 0x20 0x20
EN_AA            = 0x3f
EN_RXADDR        = 0x3e
RF_CH            = 0x4c
RF_SETUP         = 0x07
CONFIG           = 0x0f
DYNPD/FEATURE    = 0x3f 0x04
Data Rate        = 1MBPS
Model            = nRF24L01+
CRC Length       = 16 bits
PA Power         = PA_MAX
Output below :
Recv: size=5 payload=T pipe=1    Send: size=5 payload=T pipe:1
Recv: size=5 payload=T pipe=1    Send: size=5 payload=T pipe:1
Recv: size=5 payload=T pipe=1    Send: size=5 payload=T pipe:1
Recv: size=5 payload=T pipe=1    Send: size=5 payload=T pipe:1
Recv: size=5 payload=T pipe=1    Send: size=5 payload=T pipe:1
Recv: size=5 payload=T pipe=1    Send: size=5 payload=T pipe:1
Recv: size=5 payload=T pipe=1    Send: size=5 payload=T pipe:1
Recv: size=5 payload=T pipe=1    Send: size=5 payload=T pipe:1
Recv: size=5 payload=T pipe=1    Send: size=5 payload=T pipe:1
Recv: size=5 payload=T pipe=1    Send: size=5 payload=T pipe:1
Recv: size=5 payload=T pipe=1    Send: size=5 payload=T pipe:1
Recv: size=5 payload=T pipe=1    Send: size=5 payload=T pipe:1
Il me reste donc à approfondir la manière de faire de ce code pour optimiser le miens.

Après je passerais côté réception côté pi pour avoir enfin quelque chose de correct !

Edit :

Toujours dans l'esprit, voici le code du Rpi hub modifié :

Code : Tout sélectionner


void setup(void)
{
    // init radio for reading
    radio.begin();
    radio.enableDynamicPayloads();
    radio.setAutoAck(1);
    radio.setRetries(15,15);
    radio.setDataRate(RF24_1MBPS);
    radio.setPALevel(RF24_PA_MAX);
    radio.setChannel(76);
    radio.setCRCLength(RF24_CRC_16);
    radio.openReadingPipe(1,0xF0F0F0F0E1LL);
    radio.startListening();
}

void loop(void)
{
    // 32 byte character array is max payload
    char receivePayload[32];
    time_t t = time(0);   // get time now
    struct tm * now = localtime( & t ); // Get curret Time.

    while (radio.available())
    {
         // read from radio until payload size is reached
        uint8_t len = radio.getDynamicPayloadSize();
        radio.read(receivePayload, len);

        // display payload
        cout << (now->tm_year + 1900) << '-' 
        << (now->tm_mon + 1) << '-'
        <<  now->tm_mday << ' '
        << now->tm_hour << ':'
        << now->tm_min << ' '
        << receivePayload << endl;
    }
}

int main(int argc, char** argv) 
{
    setup();
    while(1)
        loop();

    return 0;
}

Cette fois ci, je reçois bien les infos sauf que je n'ai que le bout de l'info ^^ un T

Image

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

Re: nRF24L01 et B+ [tuto en fin de topic]

Message par guillaume9344 » mer. 15 avr. 2015 08:13

Bon ba ca avance.
une petite erreure dans le fichier d envoi:
data[] est defini comme un tableau de char: char data[3];
lors de l envoi tu charge data[0]avec t qui est bien un char mais apres tu charge data[1] avec
un float , du coup on ne sais pas ce qui est chargé ( mon compilateur m interdit carement ca)
Essai de charger data[1]='a' ca devrai afficher "ta " a la reception. Apres il faudra comvertir le float
en chaine de caracteres dans datq et tu pourra les transmettres.
@+
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

lawfix
Messages : 66
Enregistré le : mer. 24 sept. 2014 10:02

Re: nRF24L01 et B+ [tuto en fin de topic]

Message par lawfix » mer. 15 avr. 2015 10:37

Hello,

Merci pour l'explication, j'ai bien compris le principe, mais à savoir si j'arriverai à mettre en oeuvre tes conseils c'est autre chose.

Tu as un ouvrage sur lequel je pourrais approfondir ces connaissances ? tu as l'air extrêmement calé dans la matière !

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

Re: nRF24L01 et B+ [tuto en fin de topic]

Message par guillaume9344 » mer. 15 avr. 2015 18:56

Bonsoir, pour les exemples je suis parti de ce site: http://tmrh20.github.io/RF24/
je joins aussi trois pdf pour les bases du langage C , il y en a un orienté pour la programmation des µc PIC mais les principes et le fonctionnement sont applicables sur tous les autre plateforme (c'est le but du C)
Les deux autre sont plus complet mais plus indigestes, ces pdf sont restés longtemps en raccourci sur mon bureau, aprés pour plus compliqué , GOOGLE est ton ami (ou parfois pas :D )
bonne lecture .
@+
Modifié en dernier par guillaume9344 le jeu. 16 avr. 2015 06:08, modifié 1 fois.
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

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

Re: nRF24L01 et B+ [tuto en fin de topic]

Message par guillaume9344 » mer. 15 avr. 2015 19:08

Avec les pièces jointe c'est mieux........ ;) ;) ;) :D
Fichiers joints
cours C.7z
(822.98 Kio) Téléchargé 192 fois
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

lawfix
Messages : 66
Enregistré le : mer. 24 sept. 2014 10:02

Re: nRF24L01 et B+ [tuto en fin de topic]

Message par lawfix » mer. 15 avr. 2015 22:43

Hello,

Je te remercie beaucoup ! Je vais tester ta solution et te donner les retours :)

Pour les exemples j'ai la même librairie que toi !

ET pour autant, je n'arrive pas aussi facilement à les détourner ^^

Edit : Tu as tout à fait raison en modifiant le data 1 avec un 'a' à la réception j'ai Ta

Il faut donc que je modifie les variables.

Je suis en train tout simplement d'essayer de convertir la valeur reçue de température pour l'envoyer au format text et ainsi éviter les conversions de données !

Dès que je parviens à faire cela, je devrais recevoir la température en brut de l'autre côté.

Avatar du membre
Jean-Marie
Raspinaute
Messages : 240
Enregistré le : sam. 24 janv. 2015 18:01
Localisation : Arlon, Belgique
Contact :

Re: nRF24L01 et B+ [tuto en fin de topic]

Message par Jean-Marie » ven. 17 avr. 2015 10:04

Hello les amis,

Il y a probablement des choses intéressantes à trouver dans cet article expliquant l'envoi par NRF24L01 des données d'une sonde pilotée par Arduino, le tout alimenté par un capteur solaire et un super-condensateur. L'article est très bien écrit (en anglais), avec plein de détails et les programmes.

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

Re: nRF24L01 et B+ [tuto en fin de topic]

Message par guillaume9344 » ven. 17 avr. 2015 11:40

Merci Jean Marie , j 'ai vue le lien dans les poste sur les modules ESP.
De mon cotés grande avancée :D :D :D :D j 'allume et eteinds une led à distance , je sais ca parais pas mirobolant comme ca .
@+
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

Avatar du membre
Jean-Marie
Raspinaute
Messages : 240
Enregistré le : sam. 24 janv. 2015 18:01
Localisation : Arlon, Belgique
Contact :

Re: nRF24L01 et B+ [tuto en fin de topic]

Message par Jean-Marie » ven. 17 avr. 2015 14:07

Guillaume a écrit :De mon cotés grande avancée :D :D :D :D j 'allume et eteinds une led à distance , je sais ca parais pas mirobolant comme ca .
Mais si, c'est le principal ! Le plus difficile est de transmettre correctement l'ordre à distance. Après, iI n'y a pas une grande différence entre allumer une LED et allumer une centrale nucléaire. Bon, j'arrête là car je n'ai pas envie d'être mis sous surveillance anti-terroriste. :lol:

Répondre

Retourner vers « L'électronique et le Raspberry Pi »