= 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`) {{{#!bash $ 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. {{{#!bash $ 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 == * [http://www.nordicsemi.com/eng/Products/2.4GHz-RF/nRF24L01P Site Nordic nRF24L01Plus] * [https://www.sparkfun.com/datasheets/Components/SMD/nRF24L01Pluss_Preliminary_Product_Specification_v1_0.pdf Spéicification nRF24L01plus] * [https://github.com/TMRh20/RF24 Repository API TMRh20/RF24] * [http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.ReferenceMaxi Langage Arduino] == Communication nRF24L01+ : le matériel == * Vous allez commencer par faire un schéma du noeud.[[BR]] 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) [[Image(htdocs:jpg/nano.jpg, height=200px)]] [[Image(htdocs:jpg/pinoutNRF24L01.jpg, height=200px)]] == Communication entre le capteur et la base == La documentation de la bibliothèque est [http://tmrh20.github.io/RF24/classRF24.html ici] dont voici un résumé : * ` RF24 (uint8_t _cepin, uint8_t _cspin)`[[BR]] 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) {{{#!c #include #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) {{{#!c #include #include #include #include #include #include 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 {{{#!make 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. ...