Page 5 sur 8

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

Posté : mar. 14 avr. 2015 18:57
par guillaume9344
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.
@+

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

Posté : mar. 14 avr. 2015 22:35
par lawfix
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

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

Posté : mer. 15 avr. 2015 08:13
par guillaume9344
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.
@+

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

Posté : mer. 15 avr. 2015 10:37
par lawfix
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 !

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

Posté : mer. 15 avr. 2015 18:56
par guillaume9344
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 .
@+

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

Posté : mer. 15 avr. 2015 19:08
par guillaume9344
Avec les pièces jointe c'est mieux........ ;) ;) ;) :D

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

Posté : mer. 15 avr. 2015 22:43
par lawfix
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é.

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

Posté : ven. 17 avr. 2015 10:04
par Jean-Marie
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.

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

Posté : ven. 17 avr. 2015 11:40
par guillaume9344
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 .
@+

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

Posté : ven. 17 avr. 2015 14:07
par Jean-Marie
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: