| 1 | = Communication radio |
| 2 | |
| 3 | == Contexte |
| 4 | |
| 5 | * Vous disposez de deux dispositifs ayant la capacité à communiquer par des ondes radio. |
| 6 | 1. Le module TTGO-Lora32 disposant — entre autres — d'un transceiver Bluetooth low energy (BLE). |
| 7 | 2. Le module Arduino nano connecté à un transceiver NRF24L01+ |
| 8 | * Il semble évident qu'il est préférable d'utiliser la technologie BLE parce qu'elle est présente dans tous les téléphones récents et très adaptée aux IoT. |
| 9 | * Vous pourrez quand même utiliser la technologie NRF24 pour votre culture. |
| 10 | |
| 11 | == Travail demandé |
| 12 | |
| 13 | Comme la semaine dernière pour la partie BLE, vous allez devoir vous mettre en mode projet pour rechercher sur le WEB les documentations de programmation dont vous aurez besoin. |
| 14 | |
| 15 | * Installation de l'application nRF-connect pour smartphone pour lire les composants BLE environnant |
| 16 | * Programmation de l'ESP32 (mode server) pour exposer la mesure de la distance du télémètre ultrason. |
| 17 | * Programmation de l'ESP32 (mode client) pour lires les valeurs des ESP32 en mode server. |
| 18 | * En option, vous pourrez tester NRF24L01. Le but est de lire la valeur envoyée par l'Arduino et de l'afficher sur le terminal de la raspberry. |
| 19 | |
| 20 | Vous devrez écrire un compte rendu des applications réalisées avec des codes très commentés. |
| 21 | |
| 22 | = BLE sur l'ESP32 |
| 23 | |
| 24 | A priori, les bibliothèques téléchargées pour programmer l'ESP32 sur l'IDE Arduino supportent le BLE, il y a plusieurs exemples, et vous n'avez donc rien à télécharger de plus. |
| 25 | Vos programmes vont se baser sur les exemples. |
| 26 | |
| 27 | Ce que je vous propose de faire, c'est de commencer par tester quelques exemples BLE en commençant par BLEscan et de commenter chaque ligne concernant BLE. Vous mettrez ces codes commentés dans votre CR. |
| 28 | Vous pouvez (devez) faire des commentaires sur plusieurs lignes si c'est nécessaire, afin d'être le plus clair possible. |
| 29 | |
| 30 | Ensuite, vous pourrez créer votre serveur pour donner la distance mesurée sur le télémètre. |
| 31 | |
| 32 | = nRF24 sur l'Arduino |
| 33 | |
| 34 | Cette partie est optionnelle. Elle vise à faire communiquer un Arduino et une raspberryPi 1 |
| 35 | |
| 36 | == Récupération de la bibliothèque du NRF24L01 |
| 37 | |
| 38 | 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 a le mérite d'être disponible dans l'environnement !RaspberryPi et !Arduino. C'est-à-dire que lorsque vous aurez compris comment l'utiliser avec la !RaspberryPi, le passage sur Arduino sera facile. |
| 39 | |
| 40 | * Aller sur le site https://github.com/tmrh20/RF24 |
| 41 | * Récupérer le .zip de la branche master (bouton `clone and download -> Download ZIP`) |
| 42 | {{{#!bash |
| 43 | $ unzip RF24-master.zip |
| 44 | $ cd RF24-master |
| 45 | $ mkdir $HOME/rf24 |
| 46 | $ ./configure --prefix=$HOME/rf24 --soc=BCM2835 --c_compiler=bcm2708hardfp-gcc --cxx_compiler=bcm2708hardfp-g++ --driver=SPIDEV --ldconfig='' |
| 47 | $ make |
| 48 | $ make install |
| 49 | }}} |
| 50 | * Vérification que la library est installée. |
| 51 | {{{#!bash |
| 52 | $ ls $HOME/rf24 |
| 53 | include lib |
| 54 | }}} |
| 55 | |
| 56 | Cette même bibliothèque a été installée sur les cartes !RaspberryPi car la bibliothèque est dynamique et non pas statique, donc il faut la bibliothèque sur la !RaspberryPi. |
| 57 | |
| 58 | == Ajout de la library nf24 pour l'Arduino |
| 59 | |
| 60 | Vous devez utiliser la version d'Arduino qui se trouve `/opt/arduino-1.6.8/arduino` (vous pouvez essayer avec la version 1-8.6). |
| 61 | Pour pouvoir compiler un programme sur le NRF24, il faut ajouter la bibliothèque. |
| 62 | * Vous avez téléchargé la bibliothèque (un RF24-master.zip) |
| 63 | * Vous ajoutez la bibliothèque dans l'environnement Arduino (import Library) |
| 64 | * Vous lancez l'IDE Arduino et dans le menu '''file/exemples''' vous avez des exemples de la nouvelle bibliothèque. |
| 65 | |
| 66 | == Documents de référence du module NRF24L01 == |
| 67 | |
| 68 | * [http://www.nordicsemi.com/eng/Products/2.4GHz-RF/nRF24L01P Site Nordic nRF24L01Plus] |
| 69 | * [https://www.sparkfun.com/datasheets/Components/SMD/nRF24L01Pluss_Preliminary_Product_Specification_v1_0.pdf Spéicification nRF24L01plus] |
| 70 | * [https://github.com/TMRh20/RF24 Repository API TMRh20/RF24] |
| 71 | |
| 72 | == Communication entre le capteur et la base == |
| 73 | |
| 74 | La documentation de la bibliothèque est [http://tmrh20.github.io/RF24/classRF24.html ici] dont voici un résumé : |
| 75 | |
| 76 | * ` RF24 (uint8_t _cepin, uint8_t _cspin)`[[BR]] |
| 77 | Configuration du module radio et du SPI, reçoivent les numéros de broche cepin (radio) cspin (SPI Slave Select) |
| 78 | * `bool begin (void)` Démarrage du module radio |
| 79 | * `void startListening (void)` |
| 80 | * `void stopListening (void)` |
| 81 | * `bool available (void)`] |
| 82 | * `void read (void *buf, uint8_t len)` |
| 83 | * `bool write (const void *buf, uint8_t len)` |
| 84 | * `void openWritingPipe (const uint8_t *address)` |
| 85 | * `void openReadingPipe (uint8_t number, const uint8_t *address)` |
| 86 | |
| 87 | - **sensor** (sur l'Arduino) |
| 88 | {{{#!c |
| 89 | #include <SPI.h> |
| 90 | #include "RF24.h" |
| 91 | #include "printf.h" |
| 92 | |
| 93 | RF24 radio(9,10); // radio(CE,CS) |
| 94 | |
| 95 | byte addresses[][6] = {"0Node"}; |
| 96 | |
| 97 | void setup() { |
| 98 | Serial.begin(115200); |
| 99 | printf_begin(); |
| 100 | radio.begin(); |
| 101 | radio.setPALevel(RF24_PA_LOW); |
| 102 | radio.openWritingPipe(addresses[0]); |
| 103 | radio.printDetails(); |
| 104 | delay(1000); |
| 105 | } |
| 106 | |
| 107 | |
| 108 | void loop() { |
| 109 | Serial.println(F("Now sending !")); |
| 110 | |
| 111 | unsigned long start_time = millis(); // Take the time, and send it. This will block until complete |
| 112 | if (!radio.write( &start_time, sizeof(unsigned long) )){ |
| 113 | Serial.println(F("failed!")); |
| 114 | } |
| 115 | |
| 116 | delay(1000); |
| 117 | } |
| 118 | }}} |
| 119 | |
| 120 | |
| 121 | - **baseSensor** (sur la raspberry pi) |
| 122 | {{{#!c |
| 123 | #include <cstdlib> |
| 124 | #include <iostream> |
| 125 | #include <sstream> |
| 126 | #include <string> |
| 127 | #include <unistd.h> |
| 128 | #include <RF24/RF24.h> |
| 129 | |
| 130 | typedef uint8_t byte; |
| 131 | |
| 132 | using namespace std; |
| 133 | |
| 134 | RF24 radio(15,0); |
| 135 | |
| 136 | byte addresses[][6] = {"0Node","1Node","2Node","3Node","4Node","5Node"}; |
| 137 | |
| 138 | void setup() { |
| 139 | radio.begin(); |
| 140 | radio.setRetries(15,15); |
| 141 | radio.setPALevel(RF24_PA_LOW); |
| 142 | radio.openReadingPipe(1,addresses[0]); |
| 143 | radio.printDetails(); |
| 144 | radio.startListening(); |
| 145 | } |
| 146 | |
| 147 | void loop() { |
| 148 | unsigned long got_time; |
| 149 | |
| 150 | if( radio.available()){ |
| 151 | radio.read( &got_time, sizeof(unsigned long) ); // Get the payload |
| 152 | cout << got_time << endl; |
| 153 | } |
| 154 | } |
| 155 | |
| 156 | int main(int argc, char** argv){ |
| 157 | setup(); |
| 158 | while (1) loop(); |
| 159 | return 0; |
| 160 | } |
| 161 | }}} |
| 162 | |
| 163 | - Makefile sur la raspberry pi |
| 164 | {{{#!make |
| 165 | RPI?=20 |
| 166 | SRC=src |
| 167 | APP=NRF24L01_base |
| 168 | DST=lacas/nrf |
| 169 | |
| 170 | CROSSDIR = /users/enseig/franck/peri |
| 171 | CROSS_COMPILE = $(CROSSDIR)/arm-bcm2708hardfp-linux-gnueabi/bin/bcm2708hardfp- |
| 172 | |
| 173 | INC=$(HOME)/rf24/include |
| 174 | LIB=$(HOME)/rf24/lib |
| 175 | CFLAGS=-Wall -Wfatal-errors -O2 -I$(INC) |
| 176 | LDFLAGS=-L$(LIB) -lrf24 |
| 177 | |
| 178 | all: $(APP).x |
| 179 | |
| 180 | $(APP).x: $(APP).cpp |
| 181 | $(CROSS_COMPILE)g++ -o $@ -I$(INC) $< -O2 $(LDFLAGS) |
| 182 | |
| 183 | upload: |
| 184 | scp -P50$(RPI) $(APP).x pi@peri:$(DST) |
| 185 | |
| 186 | clean: |
| 187 | rm -f *.o *.x *~ |
| 188 | }}} |
| 189 | |