====== Atelier : Communication sans fils ======
====Séance 2 : RfDuino====
* [[http://files.rfdigital.com/rfduino.quick.start.guide.pdf|Installer RfDuino (Win & MacOS)]]
* [[http://www.rfduino.com/download-rfduino-library/index.html|Télécharger RfDuino]]
* [[http://pmclab.fr/dokuwiki/doku.php?id=wiki:tutoriels:rfduino-linux|Installer RfDuino sous linux]]
* [[http://files.rfdigital.com/rfduino.ble.programming.reference.pdf|Documentation RfDuino]]
Exemple 1 :
#include
#define led 3
#define button 5
void setup() {
RFduinoBLE.deviceName = "PMClab";
RFduinoBLE.advertisementData = "test";
RFduinoBLE.txPowerLevel = +4;
RFduinoBLE.begin();
pinMode(led, OUTPUT);
pinMode(button, INPUT);
}
void RFduinoBLE_onConnect() {
for (int i=0 ; i<3 ; i++) {
digitalWrite(led, HIGH);
delay(200);
digitalWrite(led, LOW);
delay(200);
}
}
void RFduinoBLE_onDisconnect() {
digitalWrite(led, LOW);
}
void RFduinoBLE_onReceive(char *data, int len) {
if (data[0])
digitalWrite(led, HIGH);
else
digitalWrite(led, LOW);
}
int debounce_time = 10;
int debounce_timeout = 100;
int debounce(int state) {
int start = millis();
int debounce_start = start;
while (millis() - start < debounce_timeout)
if (digitalRead(button) == state) {
if (millis() - debounce_start >= debounce_time)
return 1;
}
else
debounce_start = millis();
return 0;
}
int delay_until_button(int state) {
if (state)
RFduino_pinWake(button, HIGH);
else
RFduino_pinWake(button, LOW);
do
RFduino_ULPDelay(INFINITE);
while (! debounce(state));
if (RFduino_pinWoke(button)) {
RFduino_resetPinWake(button);
}
}
void loop() {
delay_until_button(HIGH);
RFduinoBLE.send(1);
delay_until_button(LOW);
RFduinoBLE.send(0);
}
Exemple 2 :
void setup() {
Serial.begin(9600);
}
void loop() {
RFduino_ULPDelay( SECONDS(1) );
float temp = RFduino_temperature(CELSIUS);
Serial.print("Temperature : ");
Serial.print(temp);
Serial.println(" deg C");
}
GZLL Host :
#define MAX_DEVICES 3
#include
void setup() {
Serial.begin(57600);
RFduinoGZLL.begin(HOST);
}
int rssi_total[MAX_DEVICES];
int rssi_count[MAX_DEVICES];
char closest_device = 0;
int collect_samples = 0;
void RFduinoGZLL_onReceive(device_t device, int rssi, char *data, int len) {
if (device > MAX_DEVICES)
return;
if (collect_samples) {
rssi_total[device] += rssi;
rssi_count[device]++;
}
RFduinoGZLL.sendToDevice(device, closest_device);
}
void loop() {
int i;
for (i = 0; i < MAX_DEVICES; i++) {
rssi_total[i] = 0;
rssi_count[i] = 0;
}
collect_samples = 1;
delay(1000);
collect_samples = 0;
int average[MAX_DEVICES];
for (i = 0; i < MAX_DEVICES; i++) {
if (rssi_count[i] == 0)
average[i] = -128;
else
average[i] = rssi_total[i] / rssi_count[i];
Serial.print("Average RSSI of device ");
Serial.print(i);
Serial.print(" is ");
Serial.println(average[i]);
}
Serial.println();
int closest = 0;
for (i = 1; i < MAX_DEVICES; i++)
if (average[i] > average[closest])
closest = i;
closest_device = closest;
}
GZLL Device :
#include
device_t role = DEVICE0;
int led = 3;
void setup() {
pinMode(led, OUTPUT);
RFduinoGZLL.txPowerLevel = 0;
RFduinoGZLL.begin(role);
}
void loop() {
delay(200);
RFduinoGZLL.sendToHost(NULL, 0);
}
void RFduinoGZLL_onReceive(device_t device, int rssi, char *data, int len) {
if (len > 0) {
device_t closest_device = (device_t)data[0];
digitalWrite(led, (role == closest_device));
}
}
Exercice : Améliorer le [[http://pmclab.fr/dokuwiki/doku.php?id=wiki:projets:pmcbot|PMCbot]] en le rendant contrôlable par l'application [[https://itunes.apple.com/us/app/sbblecontroller/id730642938?mt=8|SBBLEController]]
#include
#define M1_AVANT 2
#define M1_ARRIERE 3
#define M2_AVANT 4
#define M2_ARRIERE 5
int vitesse = 0;
int angle = 0;
void setup() {
pinMode(M1_AVANT, OUTPUT);
pinMode(M1_ARRIERE, OUTPUT);
pinMode(M2_AVANT, OUTPUT);
pinMode(M2_ARRIERE, OUTPUT);
RFduinoBLE.deviceName = "PMCbot";
RFduinoBLE.advertisementData = "v2";
RFduinoBLE.begin();
}
void RFduinoBLE_onDisconnect() {
vitesse = 0;
angle = 0;
}
void RFduinoBLE_onReceive(char *data, int len) {
vitesse = (data[3]-128)/2;
angle = (data[2]-128)/3;
}
void loop() {
int vG = vitesse + angle;
int vD = vitesse - angle;
if (vG>0) {
analogWrite(M1_AVANT, vG);
digitalWrite(M1_ARRIERE, 0);
} else {
digitalWrite(M1_AVANT, 0);
analogWrite(M1_ARRIERE, -vG);
}
if (vD>0) {
analogWrite(M2_AVANT, vD);
digitalWrite(M2_ARRIERE, 0);
} else {
digitalWrite(M2_AVANT, 0);
analogWrite(M2_ARRIERE, -vD);
}
}
Exemples de projets utilisants RfDuino :
* [[http://pmclab.fr/dokuwiki/doku.php?id=wiki:projets:smartphone-geiger|OpenGeiger]]
* [[http://pmclab.fr/dokuwiki/doku.php?id=wiki:projets:pmcbot|PMCbot]]
====Séance 1 : NRF24L01====
* [[http://www.airspayce.com/mikem/arduino/RadioHead/RadioHead-1.39.zip|Library RadioHead]]
* [[https://drive.google.com/?authuser=0#folders/0B86xqpNCRFPEa3FvMFgwQVpTTWM|Ressources]] :
* RFBase.zip : Projet arduino à compléter, contiens la library
* [[http://www.airspayce.com/mikem/arduino/RadioHead/classRH__NRF24.html#a4691264dc9777295211a8a15157e6743|Documentation]]
Câblage :
* NRF24L01 → Arduino
* 1 GND → GND
* 2 VCC → 3.3V
* 3 CE → D8
* 4 CSN → D10
* 5 SCK → D13
* 6 MOSI → D11
* 7 MISO → D12
* 8 IRQ → N/A
== Exercice 1 ==
Host :
//////////////////////////////////////////////////
// Atelier : Communication sans fils - Séance 1 //
//////////////////////////////////////////////////
// Importation de la librarie :
#include
#include "RH_NRF24.h"
// Création d'une instance représentant le module :
RH_NRF24 nrf24;
void setup() {
// Ouverture du port série
Serial.begin(9600);
while (!Serial);
// Initialisation du module
if (!nrf24.init()) {
Serial.println("Impossible d'initialiser le module");
while (true);
}
// Paramétrage du module :
if (!nrf24.setRF(RH_NRF24::DataRate250kbps, RH_NRF24::TransmitPowerm18dBm)) {
Serial.println("Impossible de parametrer le module");
while (true);
}
Serial.println("NRF24L01 Ok");
nrf24.setChannel(42);
nrf24.setModeTx();
}
void loop() {
uint8_t data[] = "Hello World!";
nrf24.send(data, sizeof(data));
nrf24.waitPacketSent();
delay(1000);
}
Device :
//////////////////////////////////////////////////
// Atelier : Communication sans fils - Séance 1 //
//////////////////////////////////////////////////
// Importation de la librarie :
#include
#include "RH_NRF24.h"
// Création d'une instance représentant le module :
RH_NRF24 nrf24;
void setup() {
// Ouverture du port série
Serial.begin(9600);
while (!Serial);
// Initialisation du module
if (!nrf24.init()) {
Serial.println("Impossible d'initialiser le module");
while (true);
}
// Paramétrage du module :
if (!nrf24.setRF(RH_NRF24::DataRate250kbps, RH_NRF24::TransmitPowerm18dBm)) {
Serial.println("Impossible de parametrer le module");
while (true);
}
Serial.println("NRF24L01 Ok");
nrf24.setChannel(42);
nrf24.setModeRx();
}
void loop() {
if (nrf24.available()) {
uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN];
uint8_t len = sizeof(buf);
if (nrf24.recv(buf, &len)) {
Serial.println((char*)buf);
} else {
Serial.println("Recv failed.");
}
}
delay(100);
}
== Exercice 2 : Joystick ==
Host:
//////////////////////////////////////////////////
// Atelier : Communication sans fils - Séance 1 //
//////////////////////////////////////////////////
// Exemple : Une télécommande simple avec un joystick
// Importation de la librarie :
#include
#include "RH_NRF24.h"
// Création d'une instance représentant le module :
RH_NRF24 nrf24;
struct JoystickData {
float x;
float y;
} data;
void setup() {
// Ouverture du port série
Serial.begin(9600);
while (!Serial);
// Initialisation du module
if (!nrf24.init()) {
Serial.println("Impossible d'initialiser le module");
while (true);
}
// Paramétrage du module :
if (!nrf24.setRF(RH_NRF24::DataRate250kbps, RH_NRF24::TransmitPowerm18dBm)) {
Serial.println("Impossible de parametrer le module");
while (true);
}
Serial.println("NRF24L01 Ok");
nrf24.setChannel(42);
nrf24.setModeTx();
}
void loop() {
data.x = analogRead(0);
data.y = analogRead(1);
nrf24.send((const uint8_t*)&data, sizeof(data));
delay(100);
}
Device:
//////////////////////////////////////////////////
// Atelier : Communication sans fils - Séance 1 //
//////////////////////////////////////////////////
// Importation de la librarie :
#include
#include "RH_NRF24.h"
// Création d'une instance représentant le module :
RH_NRF24 nrf24;
struct JoystickData {
float x;
float y;
} data;
void setup() {
// Ouverture du port série
Serial.begin(9600);
while (!Serial);
// Initialisation du module
if (!nrf24.init()) {
Serial.println("Impossible d'initialiser le module");
while (true);
}
// Paramétrage du module :
if (!nrf24.setRF(RH_NRF24::DataRate250kbps, RH_NRF24::TransmitPowerm18dBm)) {
Serial.println("Impossible de parametrer le module");
while (true);
}
Serial.println("NRF24L01 Ok");
nrf24.setChannel(42);
nrf24.setModeRx();
}
void loop() {
if (nrf24.available()>=sizeof(data)) {
uint8_t len = sizeof(data);
nrf24.recv((uint8_t*)&data, &len);
Serial.print("X=");
Serial.println(data.x);
Serial.print("Y=");
Serial.println(data.y);
Serial.println();
}
delay(100);
}
Exemple de projet réalisé avec un NRF24L01 : [[http://pmclab.fr/dokuwiki/doku.php?id=wiki:projets:spectrumanalyserdiy|Analyseur de spectre du pauvre]]