Arduino
Commande de prises électriques, éclairages…
par transmission 2.4GHz
Premiers essais
Les premiers essais ont été menés pour vérifier la portée de la transmission. Deux modules Arduino UNO et deux modules nRF24L01 de base (modèle avec antenne en L) ont été mis en œuvre; après chargement, le premier modules, alimenté par une pile 9V. m’a accompagné, tandis que le second module restait connecté sur le port USB de l’ordinateur.
Le premier module est connecté à un bouton poussoir; on émet l’état du bouton vers le second module; ce dernier reçoit la transmission, lit l’information et la réémet aussitôt vers le premier; le premier module reçoit la transmission et commande une led. Cela permet de tester la transmission dans les deux sens à la fois.
Il y a également les « print » qui vont bien pour suivre le fonctionnement sur la console.
Les 2 programmes à charger :
// L’émetteur……………………..
// Essai de transmission 2.4 GHz avril 2014
// Philippe Redoutey sur bases issues d’internet
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>const int buttonPin = 2; // le N° de l’entrée digitale qui reçoit le bouton
const int ledPin = 3; // le N° de la sortie numérique qui commande la led
int buttonState = 0; // variable pour mémoriser l’état du bouton
byte valeur_octet[1]; // contient la valeur découpée en octet pour l’envoi (pour le test = 1 octet
byte Etatrecu = 0;void setup(){
Serial.begin(9600);Mirf.cePin = 8; // CE sur D8
Mirf.csnPin = 7; // CSN sur D7
Mirf.spi = &MirfHardwareSpi; // On veut utiliser le port SPI hardware
Mirf.init(); // Initialisation du SPIMirf.channel = 0; // On va utiliser le canal 0 pour communiquer (128 canaux disponible, de 0 à 127)
Mirf.payload = sizeof(unsigned byte); // = 1, ici il faut déclarer la taille du « payload » soit du message qu’on va transmettre, au max 32 octets// RF_SETUP=0000abcd : a=1–>2Mb/s, a=0–>1Mb/s;
// puissance émission bc=00–>-18 dBm, bc=01–>-12dBm, bc=10–>-6dBm, bc=11–>0dBm;
// d=0 pas de gain sur le bruit en réceptionMirf.configRegister(RF_SETUP, 0x06); // 1 Mb/s et 0 dBm (puissance maximum)
Mirf.config(); // Tout est bon ? Ok let’s go !
Mirf.setTADDR((byte *) »nrf02″); // Le 1er module va envoyer ses info au 2eme module
Mirf.setRADDR((byte *) »nrf01″); // On définit ici l’adresse du 1er modulepinMode(ledPin, OUTPUT); // Initialisation de la sortie digitale pour la led
pinMode(buttonPin, INPUT); // Initialisation de l’ebtrée digitale pour le bouton
digitalWrite(buttonPin, HIGH); // met la résistance de tirage au +Serial.println(« Go ! »);
}void loop(){
buttonState = digitalRead(buttonPin); // lecture de l’état du bouton
valeur_octet[0] = buttonState;unsigned long time = millis(); // On stocque le temps actuelle retourné par millis() dans time
// Mirf.send((byte *)&time); // On envoi time en utilisant l’astuce du cast de pointeur sur adresse
Mirf.send(valeur_octet); // On envoie les octets, 1 octet pour le test
while(Mirf.isSending()); // On boucle (attend) tant que le message n’as pas était envoyé
Serial.print(« Octet envoye « ); // impression pour le contrôle du fonctionnement
Serial.print(valeur_octet[0]);
Serial.print( » « );
delay(10);while(!Mirf.dataReady()){ // On attend de recevoir quelque chose
if ( ( millis() – time ) > 1000 ) { // Si on attend depuis plus d’une seconde
Serial.println(« =(« ); // C’est le drame …
return; // ce cas ne devrait pas se produire !!!
}
}// Mirf.getData((byte *) &time); // On récupére le message recu
if (!Mirf.isSending() && Mirf.dataReady()){ // Si un message a été recu et qu’un autre n’est pas en cours d’emission
Mirf.getData(valeur_octet); // on récupére le méssage
Serial.print(« Recu : « );
Serial.println(valeur_octet[0]);
}
Etatrecu = valeur_octet[0]; // on récupère l’octet reçu
digitalWrite(ledPin, Etatrecu); // et on commande la led en conséquence
delay(100);
}
Serial.print(« Octet envoye « ); // impression pour le contrôle du fonctionnement
Serial.print(valeur_octet[0]);
Serial.print( » « );
delay(10);while(!Mirf.dataReady()){ // On attend de recevoir quelque chose
if ( ( millis() – time ) > 1000 ) { // Si on attend depuis plus d’une seconde
Serial.println(« =(« ); // C’est le drame …
return; // ce cas ne devrait pas se produire !!!
}
}// Mirf.getData((byte *) &time); // On récupère le message reçu
if(!Mirf.isSending() && Mirf.dataReady()){ // Si un message a été reçu et qu’un autre n’est pas en cours d’emission
Mirf.getData(valeur_octet); // on récupère le message
Serial.print(« Recu : « );
Serial.println(valeur_octet[0]);
}
Etatrecu = valeur_octet[0]; // on récupère l’octet reçu
digitalWrite(ledPin, Etatrecu); // et on commande la led en conséquence
delay(100);
}
// Le récepteur 2.4 GHz
// Essai de transmission avril 2014
// Philippe Redoutey sur bases issues d’internet#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>void setup(){
Serial.begin(9600);Mirf.cePin = 8; // CE sur D8
Mirf.csnPin = 7; // CSN sur D7
Mirf.spi = &MirfHardwareSpi; // On veut utiliser le port SPI hardware
Mirf.init(); // on initialise le SPIMirf.channel = 0; // On va utiliser le canal 0 pour communiquer (128 canaux disponible, de 0 à 127)
Mirf.payload = sizeof(unsigned byte); // = 1, ici il faut déclarer la taille du « payload » soit du message qu’on va transmettre, au max 32 octets
Mirf.config(); // Tout est bon ? Ok let’s go !Mirf.setTADDR((byte *) »nrf01″); // Le 2eme module va envoyer ses info au 1er module
Mirf.setRADDR((byte *) »nrf02″); // On définit ici l’adresse du 2eme module// RF_SETUP=0000abcd : a=1–>2Mb/s, a=0–>1Mb/s;
// puissance émission bc=00–>-18 dBm, bc=01–>-12dBm, bc=10–>-6dBm, bc=11–>0dBm;
// d=0 pas de gain sur le bruit en réceptionMirf.configRegister(RF_SETUP, 0x06); // 1 Mb/s et 0 dBm (puissance maximum)
Serial.println(« Go ! »);
}void loop(){
byte data[Mirf.payload]; // Tableau de byte qui va stocker le message recuif (!Mirf.isSending() && Mirf.dataReady()){ // Si un message a été reçu et qu’un autre n’est pas en cours d’émission
Serial.println(« Recu… « );
Mirf.getData(data); // on récupère le message
Mirf.send(data); // et on le renvoit tel quel
Serial.println(« Et renvoye! »);
delay(10);
}
}
Les résultats sont moyennement concluants; si la transmission fonctionne dès le premier essai, la portée n’est pas très importante : le second module étant au sous-sol, la transmission s’arrête quand je suis entre le rez-de-chaussée et le premier étage avec le premier modules (maison en pierres pour le sous-sol et briques au dessus); quand je sors de la maison, la transmission s’arrête à quelques mètres.
Seconds essais
Les essais suivants sont destinés d’une part, à améliorer la portée (en utilisant un autre modèle de carte nRF24L01) et d’autre part, à optimiser le code pour fiabiliser les transmissions.
==> suivre…
Sorry, the comment form is closed at this time.