Web-Rel

 Arduino philie  Commentaires fermés sur Web-Rel
Mai 142014
 

Web-Rel

 

Sous ce nom barbare, on trouve un projet que j’ai « sous-traité » et qui signifie « commande de relais par Web ».

Mon besoin était de pouvoir mettre sous tension mon imprimante, située au 1er étage, alors que mon ordinateur se situe au sous-sol, tout simplement pour éviter un aller et retour sur 2 étages 🙁 .

Fainéantise, sans doute un peu 🙂 , intérêt technique, surement beaucoup.

Un collègue, Fred pour les intimes, m’a proposé de réaliser cela avec un Arduino et c’est d’ailleurs là, le point de départ de mes propres « bricolages » avec ces micro-contrôleurs.

Vous trouverez le détail de la réalisation sur son blog http://bigbidouilles.wordpress.com/2014/04/16/arduino-projet-de-commande-de-relais-par-internet/.

Arduino et prises commandées (4 – les essais)

 Arduino philie  Commentaires fermés sur Arduino et prises commandées (4 – les essais)
Mai 112014
 

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 SPI

Mirf.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éception

Mirf.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 module

pinMode(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 SPI

Mirf.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éception

Mirf.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 recu

if (!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…