Changes between Initial Version and Version 1 of SujetTP5-2018


Ignore:
Timestamp:
Mar 8, 2018, 8:39:17 PM (7 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SujetTP5-2018

    v1 v1  
     1= Communication sans fil =
     2
     3== Objectif
     4
     5L'objectif de la séance est de lire des capteurs distants sur les !RaspberryPi.
     6Nous allons utiliser les modules de communication NRF24L01 abordés en cours cartes.
     7Chaque !RaspberryPi en a un. Les capteurs sont sur des Arduinos connecté à un module NRF24L01. 
     8
     9Nous n'allons pas aborder aujourd'hui la programmation Arduino. Nous verrons ça la semaine prochaine.
     10
     11{{{#!protected
     12
     13== Préambule : Récupération de la bibliothèque du NRF24L01 ==
     14
     15Si 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.
     16
     17 * Aller sur le site https://github.com/tmrh20/RF24
     18 * Récupérer le .zip de la branche master (bouton `clone and download -> Download ZIP`)
     19{{{#!bash
     20$ unzip RF24-master.zip
     21$ cd RF24-master
     22$ mkdir $HOME/rf24
     23$ ./configure --prefix=$HOME/rf24 --soc=BCM2835 --c_compiler=bcm2708hardfp-gcc --cxx_compiler=bcm2708hardfp-g++ --driver=SPIDEV --ldconfig=''
     24$ make
     25$ make install
     26}}}
     27 * Vérification que la library est installée.
     28{{{#!bash
     29$ ls $HOME/rf24
     30  include  lib
     31}}}
     32
     33La 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.
     34
     35== Documents de référence du module NRF24L01 ==
     36
     37 * [http://www.nordicsemi.com/eng/Products/2.4GHz-RF/nRF24L01P Site Nordic nRF24L01Plus]
     38 * [https://www.sparkfun.com/datasheets/Components/SMD/nRF24L01Pluss_Preliminary_Product_Specification_v1_0.pdf Spéicification nRF24L01plus]
     39 * [https://github.com/TMRh20/RF24 Repository API TMRh20/RF24]
     40
     41
     42== Communication nRF24L01+ : le matériel ==
     43
     44* Vous allez commencer par faire un schéma du noeud.[[BR]]
     45  Les composants nécessaires à un noeud sont :
     46  * un Arduino nano
     47  * deux modules nRF24L01
     48  * une raspberry pi (CE est connecté sur le GPIO15 et CSN sur CE0)
     49
     50  [[Image(htdocs:jpg/nano.jpg, height=200px)]]
     51
     52  [[Image(htdocs:jpg/pinoutNRF24L01.jpg, height=200px)]]
     53 
     54
     55== Communication entre le capteur et la base ==
     56
     57La documentation de la bibliothèque est [http://tmrh20.github.io/RF24/classRF24.html ici] dont voici un résumé :
     58
     59* `     RF24 (uint8_t _cepin, uint8_t _cspin)`[[BR]]
     60  Configuration du module radio et du SPI, reçoit les numéros de broche cepin (radio) cspin (SPI Slave Select)
     61* `bool         begin (void)`  Démarrage du module radio
     62* `void         startListening (void)`
     63* `void         stopListening (void)`
     64* `bool         available (void)`]
     65* `void         read (void *buf, uint8_t len)`
     66* `bool         write (const void *buf, uint8_t len)`
     67* `void         openWritingPipe (const uint8_t *address)`
     68* `void         openReadingPipe (uint8_t number, const uint8_t *address)`
     69
     70- **sensor** (sur l'Arduino)
     71{{{#!c
     72#include <SPI.h>
     73#include "RF24.h"
     74#include "printf.h"
     75
     76RF24 radio(9,10); // radio(CE,CS)
     77
     78byte addresses[][6] = {"0Node"};
     79
     80void setup() {
     81  Serial.begin(115200);
     82  printf_begin();
     83  radio.begin();
     84  radio.setPALevel(RF24_PA_LOW);
     85  radio.openWritingPipe(addresses[0]);
     86  radio.printDetails();
     87  delay(1000);
     88}
     89
     90
     91void loop() {
     92  Serial.println(F("Now sending !"));
     93
     94  unsigned long start_time = millis();                             // Take the time, and send it.  This will block until complete
     95  if (!radio.write( &start_time, sizeof(unsigned long) )){
     96     Serial.println(F("failed!"));
     97  }
     98 
     99  delay(1000);
     100}
     101}}}
     102
     103
     104- **baseSensor** (sur la raspberry pi)
     105{{{#!c
     106#include <cstdlib>
     107#include <iostream>
     108#include <sstream>
     109#include <string>
     110#include <unistd.h>
     111#include <RF24/RF24.h>
     112
     113typedef uint8_t byte;
     114
     115using namespace std;
     116
     117RF24 radio(15,0);
     118
     119byte addresses[][6] = {"0Node","1Node","2Node","3Node","4Node","5Node"};
     120
     121void setup() {
     122  radio.begin();
     123  radio.setRetries(15,15);
     124  radio.setPALevel(RF24_PA_LOW);
     125  radio.openReadingPipe(1,addresses[0]);
     126  radio.printDetails();
     127  radio.startListening();
     128}
     129
     130void loop() {
     131  unsigned long got_time;
     132
     133  if( radio.available()){
     134     radio.read( &got_time, sizeof(unsigned long) );             // Get the payload
     135     cout << got_time << endl;
     136   }
     137}
     138
     139int main(int argc, char** argv){
     140    setup();
     141    while (1) loop();
     142    return 0;
     143}
     144}}}
     145
     146- Makefile sur la raspberry pi
     147{{{#!make
     148RPI?=20
     149SRC=src
     150APP=NRF24L01_base
     151DST=lacas/nrf
     152
     153CROSSDIR        = /users/enseig/franck/peri
     154CROSS_COMPILE   = $(CROSSDIR)/arm-bcm2708hardfp-linux-gnueabi/bin/bcm2708hardfp-
     155
     156INC=$(HOME)/rf24/include
     157LIB=$(HOME)/rf24/lib
     158CFLAGS=-Wall -Wfatal-errors -O2 -I$(INC)
     159LDFLAGS=-L$(LIB) -lrf24
     160
     161all:  $(APP).x
     162
     163$(APP).x: $(APP).cpp
     164    $(CROSS_COMPILE)g++ -o $@ -I$(INC) $<  -O2 $(LDFLAGS)
     165
     166upload:
     167    scp -P50$(RPI) $(APP).x pi@peri:$(DST)
     168
     169clean:
     170    rm -f *.o *.x *~
     171}}}
     172
     173== Travail demandé ==
     174
     175 * Le but initial 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 (l'arduino) et un récepteur (la raspberry).
     176 * Ensuite, l'idée est de faire une communication entre deux raspberry pi. Il va falloir que vous lisiez la documentation du NRF pour comprendre comment numéroter les noeuds. Une raspberry allume la led de sa voisine.
     177 * Comme, il n'y a pas assez de raspberry, nous allons ajouter des arduinos.
     178 * [http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.ReferenceMaxi Langage Arduino]
     179
     180== Programmation des Arduinos ==
     181
     182Vous devez utiliser la dernière version d'arduino qui se trouve `/opt/arduino-1.6.8/arduino`.
     183Vous commencerez par compiler le programme `blink` qui fait clignoter la led 13 présente sur l'arduino.
     184Pour pouvoir compiler un programme sur le NRF24, il faut ajouter la bibliothèque.
     185
     186**L'usage des bibliothèques Arduino**
     187
     188* Ce qu'il y a de bien dans l'écosystème Arduino, c'est la volonté de faire simple.
     189  En effet, pour presque tous les "périphériques" existants il existe un et même
     190  souvent plusieurs bibliothèques de fonctions écrites par des "amateurs" souvent très doués.
     191  En plus, les sources sont ouvertes, et il est donc possible d'adapter ces codes pour des
     192  besoins spécifiques.
     193
     194* Les bibliothèques sont trouvées, en général, en tapant sur un moteur de recherche, la requête
     195  "nom-du-module Arduino". Les projets sont souvent sur github. Pour faire court,
     196   * Vous téléchargez la bibliothèque (un RF24-master.zip)
     197   * Vous ajoutez la bibliothèque dans l'environnement Arduino (import Library)
     198   * Vous lancer l'IDE Arduino et dans le menu '''file/exemples''' vous avez un exemple (souvent plusieurs) de la nouvelle bibliothèque.
     199   * Vous en choisissez un, vous le chargez, vous le compilez, vous l'uploadez, vous le testez :-)
     200
     201L'idée sera d'allumer la led de l'arduino depuis la raspberry pi ou l'inverse.
     202
     203}}}