wiki:SujetTP5-2017

Version 4 (modified by franck, 8 years ago) (diff)

--

Communication sans fil

Préambule : Récupération de la bibliothèque du NRF24L01 =

Si nous voulons continuer à cross compiler, il faut installer la librairie qui va permettre de contrôler le module NRF24L01. Il existe plusieurs librairies. Celle choisie à le mérite d'être disponible dans l'environnement raspberry et arduino. C'est-à-dire que lorsque vous aurez compris comment l'utiliser avec la raspberry pi, le passage sur Arduino sera facile.

  • Aller sur le site https://github.com/tmrh20/RF24
  • Récupérer le .zip de la branche master (bouton clone and download -> Download ZIP)
    $ unzip RF24-master.zip
    $ cd RF24-master
    $ mkdir $HOME/rf24
    $ ./configure --prefix=$HOME/rf24 --soc=BCM2835 --c_compiler=bcm2708hardfp-gcc --cxx_compiler=bcm2708hardfp-g++ --driver=SPIDEV --ldconfig=''
    $ make
    $ make install
    
  • Vérification que la library est installée.
    $ ls $HOME/rf24
      include  lib
    

La bibliothèque a été installée sur les cartes raspberry pi car la bibliothèque est dynamique et non pas statique, donc il faut la bibliothèque sur la raspberry pi.

Documents de référence du module NRF24L01

Communication nRF24L01+ : le matériel

  • Vous allez commencer par faire un schéma du noeud.
    Les composants nécessaires à un noeud sont :
    • un Arduino nano
    • deux modules nRF24L01
    • une raspberry pi (CE est connecté sur le GPIO15 et CSN sur CE0)

nano.jpg

pinoutNRF24L01.jpg

Communication entre le capteur et la base

La documentation de la bibliothèque est ici dont voici un résumé :

  • RF24 (uint8_t _cepin, uint8_t _cspin)
    Configuration du module radio et du SPI, reçoit les numéros de broche cepin (radio) cspin (SPI Slave Select)
  • bool begin (void) Démarrage du module radio
  • void startListening (void)
  • void stopListening (void)
  • bool available (void)]
  • void read (void *buf, uint8_t len)
  • bool write (const void *buf, uint8_t len)
  • void openWritingPipe (const uint8_t *address)
  • void openReadingPipe (uint8_t number, const uint8_t *address)
  • sensor (sur l'Arduino)
    #include <SPI.h>
    #include "RF24.h"
    #include "printf.h"
    
    RF24 radio(9,10); // radio(CE,CS)
    
    byte addresses[][6] = {"0Node"};
    
    void setup() {
      Serial.begin(115200);
      printf_begin();
      radio.begin();
      radio.setPALevel(RF24_PA_LOW);
      radio.openWritingPipe(addresses[0]);
      radio.printDetails();
      delay(1000);
    }
    
    
    void loop() {
      Serial.println(F("Now sending !"));
    
      unsigned long start_time = millis();                             // Take the time, and send it.  This will block until complete
      if (!radio.write( &start_time, sizeof(unsigned long) )){
         Serial.println(F("failed!"));
      }
      
      delay(1000);
    }
    
  • baseSensor (sur la raspberry pi)
    #include <cstdlib>
    #include <iostream>
    #include <sstream>
    #include <string>
    #include <unistd.h>
    #include <RF24/RF24.h>
    
    typedef uint8_t byte;
    
    using namespace std;
    
    RF24 radio(15,0);
    
    byte addresses[][6] = {"0Node","1Node","2Node","3Node","4Node","5Node"};
    
    void setup() {
      radio.begin();
      radio.setRetries(15,15);
      radio.setPALevel(RF24_PA_LOW);
      radio.openReadingPipe(1,addresses[0]);
      radio.printDetails();
      radio.startListening();
    }
    
    void loop() {
      unsigned long got_time;
    
      if( radio.available()){
         radio.read( &got_time, sizeof(unsigned long) );             // Get the payload
         cout << got_time << endl;
       }
    }
    
    int main(int argc, char** argv){
        setup();
        while (1) loop();
        return 0;
    }
    
  • Makefile sur la raspberry pi
    RPI?=20
    SRC=src
    APP=NRF24L01_base
    DST=lacas/nrf
    
    CROSSDIR        = /users/enseig/franck/peri
    CROSS_COMPILE   = $(CROSSDIR)/arm-bcm2708hardfp-linux-gnueabi/bin/bcm2708hardfp-
    
    INC=$(HOME)/rf24/include
    LIB=$(HOME)/rf24/lib
    CFLAGS=-Wall -Wfatal-errors -O2 -I$(INC)
    LDFLAGS=-L$(LIB) -lrf24
    
    all:  $(APP).x
    
    $(APP).x: $(APP).cpp
        $(CROSS_COMPILE)g++ -o $@ -I$(INC) $<  -O2 $(LDFLAGS)
    
    upload: 
        scp -P50$(RPI) $(APP).x pi@peri:$(DST)
    
    clean:
        rm -f *.o *.x *~
    

Travail demandé

Le but inital est de lire la valeur envoyée par l'Arduino et de l'afficher sur le terminal de la raspberry. Il y a donc au moins 2 noeuds, un émetteur et un récepteur.

...