Cette solution a quelques contraintes par rapport au Xbee mais est nettement moins cher.
Quelques inconvénients
1) Dialogue a sens unique
2) pas de possibilité de programmer des ES sur le module (les Xbee possèdent quelques entrées sorties ce qui les rends plus autonomes)
3) Bruit de fond possible ce qui peut générer des erreurs de codes (cela ne m'est jamais arrivé)
4) consommation importante de l'émetteur 20 a 30mA ce qui peut être gênant pour un fonctionnement sur piles ou accus.
Bande passante plafonne à 2400 bps pour des petites applications. La portée peut aller jusqu’à 150m suivant la tension d'alimentation de l'émetteur qui peut aller de 3 a 12Volts
L'émetteur
Matériel
1 ATMEGA 328 a trouver ici http://www.ebay.fr/itm/ATMEGA328P-PU-ARDUINO
1 Module émetteur et récépteur a trouver ici http://www.ebay.fr/itm/433Mhz-RF-transmitter-and-receiver
Le schéma
Je ne suis pas parti d'un module arduino tout fait, j'ai utilisé et programmé un ATM 328 que j'ai acheté avec le bootoader arduino. Je vous montrerai comment faire cette programmation dans une autre page.
Le schéma avec une carte Uno
Le code émetteur
//Emetteur de telecommande
// By Jojo Bricolo
// mon-arduino.blogspot.com
// 09/07/2013
#include <VirtualWire.h>
void setup()
{
Serial.begin(9600);
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_set_tx_pin(12);
pinMode(2, INPUT);
pinMode(3, INPUT);
pinMode(4, INPUT);
pinMode(5, INPUT);
pinMode(6, INPUT);
pinMode(7, INPUT);
pinMode(8, INPUT);
pinMode(9, INPUT);
pinMode(10, INPUT);
pinMode(11, INPUT);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
}
void loop()
{
char *msg;
if(digitalRead(2) == LOW){
char *msg = "1";
digitalWrite(13, true);
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();
digitalWrite(13, false);
}
if(digitalRead(3) == LOW)
{
char *msg = "2";
digitalWrite(13, true);
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();
digitalWrite(13, false);
}
if(digitalRead(4) == LOW)
{
char *msg = "3";
digitalWrite(13, true);
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();
digitalWrite(13, false);
}
if(digitalRead(5) == LOW)
{
char *msg = "4";
digitalWrite(13, true);
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();
digitalWrite(13, false);
}
if(digitalRead(6) == LOW)
{
char *msg = "5";
digitalWrite(13, true);
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();
digitalWrite(13, false);
}
if(digitalRead(7) == LOW)
{
char *msg = "6";
digitalWrite(13, true);
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();
digitalWrite(13, false);
}
if(digitalRead(8) == LOW)
{
char *msg = "7";
digitalWrite(13, true);
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();
digitalWrite(13, false);
}
if(digitalRead(9) == LOW)
{
char *msg = "8";
digitalWrite(13, true);
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();
digitalWrite(13, false);
}
if(digitalRead(10) == LOW)
{
char *msg = "9";
digitalWrite(13, true);
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();
digitalWrite(13, false);
}
if(digitalRead(11) == LOW)
{
char *msg = "10";
digitalWrite(13, true);
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx();
digitalWrite(13, false);
}
}
La librairie virtualWire est a télécharger
https://github.com/m0/Updated-Arduino-VirtualWire-Library
Sur la page a droite il y a un bouton Download zip, celui-ci vous permet de télécharger le dossier complet.
Cette librairie servira également au récepteur.
Le typon
L'implantation
J'ai utilisé des résistances et des condensateurs CMS 1206 pour gagner de la place
L’émetteur
Le module comporte 4 broches :
+ 5V, GND et 2 data (qui sont en parallèle.).
Le schéma
Le code
---------------------------------------------------------------------------------------
//Recepteur de telecommande
// By Jojo Bricolo
// mon-arduino.blogspot.com
// 09/07/2013
#include <VirtualWire.h>
void setup()
{
Serial.begin(9600);
vw_set_ptt_inverted(true);
vw_setup(2000);
vw_set_rx_pin(12);
vw_rx_start();
pinMode(2, OUTPUT);
digitalWrite (2,LOW);
pinMode(3, OUTPUT);
digitalWrite (3,LOW);
pinMode(4, OUTPUT);
digitalWrite (4,LOW);
pinMode(5, OUTPUT);
digitalWrite (5,LOW);
pinMode(6, OUTPUT);
digitalWrite (6,LOW);
pinMode(7, OUTPUT);
digitalWrite (7,LOW);
pinMode(8, OUTPUT);
digitalWrite (8,LOW);
pinMode(9, OUTPUT);
digitalWrite (9,LOW);
pinMode(10, OUTPUT);
digitalWrite (10,LOW);
pinMode(11, OUTPUT);
digitalWrite (11,LOW);
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen))
{
int i;
digitalWrite(13, true);
for (i = 0; i < buflen; i++)
{
if(buf[i] == '1')
{
digitalWrite(2, HIGH);
delay(10);
}
else
{}
if(buf[i] == '2')
{
digitalWrite(3, HIGH);
delay(10);
}
else
{} if(buf[i] == '3')
{
digitalWrite(4, HIGH);
delay(10);
}
else
{} if(buf[i] == '4')
{
digitalWrite(5, HIGH);
delay(10);
}
else
{} if(buf[i] == '5')
{
digitalWrite(6, HIGH);
delay(10);
}
else
{} if(buf[i] == '6')
{
digitalWrite(7, HIGH);
delay(10);
}
else
{} if(buf[i] == '7')
{
digitalWrite(8, HIGH);
delay(10);
}
else
{} if(buf[i] == '8')
{
digitalWrite(9, HIGH);
delay(10);
}
else
{} if(buf[i] == '9')
{
digitalWrite(10, HIGH);
delay(10);
}
else
{} if(buf[i] == '10')
{
digitalWrite(11, HIGH);
delay(10);
}
else
{} }
digitalWrite(13, false);
}
}
---------------------------------------------------------------------------------
Le typon
L'implantation
* Dans ces sketch, les sorties sont actives durant 10 millisecondes
pour avoir des sorties fixes, il faut supprimer toutes les lignes
delay(10); dans le code récepteur.
Une fois sélectionnées, les sorties resteront actives, il faudra donc affecter des boutons et rajouter des lignes d’extinction.
La sortie 13 permet de mettre une leds qui clignote lors de l'émission du signal
Il ne faut pas oublier de mettre une antenne sur les bornes prévues a cet effet. Celle-ci peut être un simple bout de fil d'environ 25cm.
J'ai testé le code a environ 50m et ça fonctionne très bien. Il est facilement modifiable afin de rajouter des commandes.
Pour un dialogue dans les deux sens, il faut deux émetteurs et deux récepteurs mais cela coûtera encore moins cher que des Xbee a environ 30Euros pièce.
Aucun commentaire:
Enregistrer un commentaire