mercredi 10 juillet 2013

Telecommande radio 433Mhz


Je cherchais un moyen de communiquer sans fil entre deux cartes Arduino. Je n'avais besoin que d'un sens de communication car j'envoie des mesures vers un module maitre.
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