Télécommande via arduino

Parlez nous de vos projets et de vos idées, imaginez des applications

Télécommande via arduino

Message non lude all_exe » Dim 6 Déc 2015 20:59

Bonjour, j'ai un projet de commande à distance de 2 treuils et 2 vérins hydrauliques.
Le but étant qu'avec 1 bouton 3 positions fixes je sélectionne le type de mouvement et qu'avec 2 boutons à rappel au centre je commande le mouvement (monté/descente - droite/gauche)

J'ai réussi à faire le code de l'arduino qui servira de télécommande mais pour le moment je lui fais allumer des led correspondant au mouvement demandé soit 8 mouvements :
- monté vérin gauche
- descente vérin gauche
- monté vérin droite
- descente vérin droite
- monté treuil gauche
- descente treuil gauche
- monté treuil droite
- descente treuil droite

Code: Tout sélectionner
const int L1H = 2;   // Levier 1 haut connecté à la broche 2
const int L1B = 3;   // Levier 1 bas connecté à la broche 3
const int L2H = 4;   // Levier 2 haut connecté à la broche 4
const int L2B = 5;   // Levier 2 bas connecté à la broche 5
const int C3G = A0;  // Commutateur 3 gauche connecté à la broche A0
const int C3D = A1;  // Commutateur 3 droite connecté à la broche A1

const int led1 = 6;  // LED connectée à la broche n°6
const int led2 = 7;  // LED connectée à la broche n°7
const int led3 = 8;  // LED connectée à la broche n°8
const int led4 = 9;  // LED connectée à la broche n°9
const int led5 = 10; // LED connectée à la broche n°10
const int led6 = 11; // LED connectée à la broche n°11
const int led7 = 12; // LED connectée à la broche n°12
const int led8 = 13; // LED connectée à la broche n°13

int val1 = 0;
int val2 = 0;
int val3 = 0;
int val4 = 0;     // variable pour mémoriser la valeur lue
int val5 = 0;
int val6 = 0;
int val0;

void setup()
{
 Serial.begin(9600);
  pinMode(L1H, INPUT_PULLUP);        // configure la broche 2 en ENTREE
  pinMode(L1B, INPUT_PULLUP);        // configure la broche 3 en ENTREE
  pinMode(L2H, INPUT_PULLUP);        // configure la broche 4 en ENTREE
  pinMode(L2B, INPUT_PULLUP);        // configure la broche 5 en ENTREE
  pinMode(C3G, INPUT_PULLUP);        // configure la broche A0 en ENTREE
  pinMode(C3D, INPUT_PULLUP);        // configure la broche A1 en ENTREE

  pinMode(led1, OUTPUT);      // configure la broche 6 en SORTIE
  pinMode(led2, OUTPUT);      // configure la broche 7 en SORTIE
  pinMode(led3, OUTPUT);      // configure la broche 8 en SORTIE
  pinMode(led4, OUTPUT);      // configure la broche 9 en SORTIE
  pinMode(led5, OUTPUT);      // configure la broche 10 en SORTIE
  pinMode(led6, OUTPUT);      // configure la broche 11 en SORTIE
  pinMode(led7, OUTPUT);      // configure la broche 12 en SORTIE
  pinMode(led8, OUTPUT);      // configure la broche 13 en SORTIE
}

void loop()
{
  val1 = digitalRead(L1H);    // lit l'état de la broche en entrée
  val2 = digitalRead(L1B);    // et met le résultat dans la variable
  val3 = digitalRead(L2H);
  val4 = digitalRead(L2B);
  val5 = digitalRead(C3G);
  val6 = digitalRead(C3D);

// codage fonction
{
   {if(val5 == LOW && val6 ==  HIGH ) // bouton à gauche
    val0 = 1;
   }
   {if(val5 == HIGH && val6 ==  HIGH ) // bouton au milieu
    val0 = 2;
   }
   {if(val5 == HIGH && val6 ==  LOW ) // bouton au milieu
    val0 = 3;
   }
}

  // Fonction Verin

 { if (val0 == 1)
  { digitalWrite(led5,LOW);
    digitalWrite(led6,LOW);
    digitalWrite(led7,LOW);
    digitalWrite(led8,LOW);

//  allongement Verin gauche   
    if(val1 == 1)
    {digitalWrite(led1,LOW);}
    else
    {digitalWrite(led1,HIGH);
    Serial.println("1");}

//  retraction Verin gauche   
    if(val2 == 1)
    {digitalWrite(led2,LOW);}
    else
    {digitalWrite(led2,HIGH);}

//  allongement Verin droite   
    if(val3 == 1)
    {digitalWrite(led3,LOW);}
    else 
    {digitalWrite(led3,HIGH);
    Serial.println("3");}

//  retraction Verin droite   
    if(val4 == 1)
    {digitalWrite(led4,LOW);}
    else
    {digitalWrite(led4,HIGH);} 
   }
  }

     // Fonction treuil

{  if(val0 != 1)
   { digitalWrite(led1,LOW);
     digitalWrite(led2,LOW);
     digitalWrite(led3,LOW);
     digitalWrite(led4,LOW);


   // fonction Treuil endroit
    if(val0 == 2)
 {
//  enroulement treuil gauche
    if(val1 == 1)
    {digitalWrite(led5,LOW);}
    else
    {digitalWrite(led5,HIGH);}

//  déroulement treuil gauche
    if(val2 == 1)
    {digitalWrite(led6,LOW);}
    else
    {digitalWrite(led6,HIGH);}

//  enroulement treuil droite
    if(val3 == 1)
    {digitalWrite(led7,LOW);}
    else
    {digitalWrite(led7,HIGH);}

//  déroulement treuil droite
    if(val4 == 1)
    {digitalWrite(led8,LOW);}
    else
    {digitalWrite(led8,HIGH);}
 }


   // fonction Treuil envers
   else if(val0 == 3)
{
//  enroulement treuil gauche
    if(val1 == 1)
    {digitalWrite(led7,LOW);}
    else
    {digitalWrite(led7,HIGH);}

//  déroulement treuil gauche
    if(val2 == 1)
    {digitalWrite(led8,LOW);}
    else
    {digitalWrite(led8,HIGH);}

//  enroulement treuil droite
    if(val3 == 1)
    {digitalWrite(led5,LOW);}
    else
    {digitalWrite(led5,HIGH);}

//  déroulement treuil droite
    if(val4 == 1)
    {digitalWrite(led6,LOW);}
    else
    {digitalWrite(led6,HIGH);}

}}}}


Le but est d'envoyer les informations sur un deuxième arduino qui commanderait des relais

Mon problème est que je ne comprends pas comment transmettre ces informations et si cela est réalisable.
Mes contraintes sont :
- porté environ 20m
- réactivité environ 1/2 seconde
- la possibilité de commander 2 relais à la fois (droite et gauche)
- que le récepteur réalise que les fonction de ma télécommande

Je dispose de
- 2 arduino uno http://www.ebay.fr/itm/131336753696
- 1 couple émetteur - récepteur 433mhz http://www.ebay.fr/itm/281755480114)
- 2 plaques de prototype http://www.ebay.fr/itm/381374637344
- 1 poignée de câble d'essai http://www.ebay.fr/itm/281486905863
- 6 led et 4 BP http://www.ebay.fr/itm/181563923440

Ce type d'émetteur/récepteur convient il? ceux ci sont ils mieux ? http://www.ebay.fr/itm/170819064718
Les tuto parlent de librairie VirtualWire mais là je suis dépassé, si quelqu'un pouvait faire juste un morceau de programme genre :
- 1 appuis sur bp arduino 1 allume led arduino 2
ce serait vraimant cool!

Dernière petite question :
les broches 0 et 1 de l'arduino (RX et TX) sont elles celles à utiliser avec les émetteur/récepteur?

Merci de vos réponses.
all_exe
 
Messages: 5
Inscription: Dim 6 Déc 2015 19:28

Re: Télécommande via arduino

Message non lude Laetitia » Ven 11 Déc 2015 16:34

Bonjour,

Les émetteurs RF433 sont parfaitement adaptés à ce genre d'applications. Le NRF24L01 est aussi utilisable avec Arduino (voir tutoriel), il peut également être utilisé dans des applications domotiques, mais il s'agit d'un produit différent : il n'exploite pas la même gamme de fréquences, il est bidirectionnel, l'antenne est intégrée au PCB...

Le choix dépend de ce que vous comptez en faire. Si vous avez déjà un couple émetteur/récepteur RF433, faites des essais avec, et s'il ne sont pas concluants il sera toujours temps de changer de modèle !

all_exe a écrit:Les tutos parlent de librairie VirtualWire mais là je suis dépassé, si quelqu'un pouvait faire juste un morceau de programme genre
- 1 appui sur bp arduino 1 allume led arduino 2
ce serait vraiment cool!

Je vous invite à suivre cet excellent tutoriel, les sketchs d'exemple contiennent tout ce dont vous avez besoin.

all_exe a écrit:Dernière petite question :
les broches 0 et 1 de l'arduino (RX et TX) sont elles celles à utiliser avec les émetteur/récepteur?

Non ! Il s'agit des RX/TX des données Serial, qui transitent par l'USB. Vous pouvez utiliser n'importe quelle broche pour la transmission radio.
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 294
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse

Re: Télécommande via arduino

Message non lude all_exe » Mer 13 Jan 2016 11:47

Bonjour, alors voilà j'ai bien avancé et surtout passé beaucoup beaucoup de temps sur divers forum...

Je n'ai plus qu'un seul problème :
J'ai besoin de piloter 2 distributeur hydraulique à la fois (celui du mouvement + celui de by-pass)
J'ai donc besoin de piloter 2 sorties à la fois sur mon arduino récepteur
Le problème c'est que la sortie de by-pass ne fonctionne pas, je me suis d'une led pour essai et celle-ci clignote sauf pour la descente vérin 2 qui est la dernière ligne de programme qui commande le by-pass.
Je pense qu'il s'agit de syntaxe ou de structure de programme qui n'est pas bonne mais là je sèche!

Voici mon programme :

Emmeteur :
Code: Tout sélectionner
/*================== EMETTEUR 433MHz  4 VOIES TOUT OU RIEN =======================
                     
  2 leviers et 1 commutateur commandent l’émission de huit bits sur un octet
  les leviers sont des inters 3 positions 2 NO à position fixe au centre
  le connutateur est un inter 3 positions 2 NO à 3 positions fixe
                          BRANCHEMENT
        * Levier 1 haut        --------->   pin 2   --> monter verin N°1 / dérouler treuil 1 ou 2
        * Levier 1 bas         --------->   pin 3   --> descente verin N°1 / enrouler treuil 1 ou 2
        * Levier 2 haut        --------->   pin 4   --> monter verin N°2 / dérouler treuil 1 ou 2
        * Levier 2 bas         --------->   pin 5   --> descente verin N°1 / enrouler treuil 1 ou 2
        * Commutateur 1 gauche --------->   pin 6   --> fonction vérin
        * Commutateur 1 droite --------->   pin 7   --> fonction treui envers  ( au milieu fontion treuil endroit)
        * Emetteur             --------->   pin 12  -->

================================DEBUT DU PROGRAMME ==========================================*/
#include <VirtualWire.h> // inclusion de la librairie VirtualWire

const int L1H = 2;   // Levier 1 haut connecté à la broche 2
const int L1B = 3;   // Levier 1 bas connecté à la broche 3
const int L2H = 4;   // Levier 2 haut connecté à la broche 4
const int L2B = 5;   // Levier 2 bas connecté à la broche 5
const int C1G = 6;   // Commutateur 1 gauche connecté à la broche 6
const int C1D = 7;   // Commutateur 1 droite connecté à la broche 7
int etat_L1H = 0;
int etat_L1B = 0;
int etat_L2H = 0;
int etat_L3H = 0;
int etat_C1G = 0;
int etat_C1D = 0;
int val1 = 0;
int val2 = 0;
int val3 = 0;
int val4 = 0;     // variable pour mémoriser la valeur lue
int val5 = 0;
int val6 = 0;
int val0;
int b0 =0;
int b1 =0;
int b2 =0;
int b3 =0;
int b4 =0;
int b5 =0;
int b6 =0;
int b7 =0;
int entree_tx= 12;
char msg[1]; // Tableau qui contient notre message //Chiffres de 0-9 (les caractères ABC... sont transmis en code A=65,...)


void setup()
{
  pinMode(L1H, INPUT_PULLUP);        // configure la broche 2 en ENTREE
  pinMode(L1B, INPUT_PULLUP);        // configure la broche 3 en ENTREE
  pinMode(L2H, INPUT_PULLUP);        // configure la broche 4 en ENTREE
  pinMode(L2B, INPUT_PULLUP);        // configure la broche 5 en ENTREE
  pinMode(C1G, INPUT_PULLUP);        // configure la broche 6 en ENTREE
  pinMode(C1D, INPUT_PULLUP);        // configure la broche 7 en ENTREE
 digitalWrite(L1H, HIGH);
 digitalWrite(L1B, HIGH);
 digitalWrite(L2H, HIGH);
 digitalWrite(L2B, HIGH); 
 digitalWrite(C1G, HIGH);
 digitalWrite(C1D, HIGH);
 bitWrite(msg[0], 0, 0);  //Positionne le bit N°1 de msg[0] a 0
 bitWrite(msg[0], 1, 0);  //Positionne le bit N°1 de msg[0] a 0
 bitWrite(msg[0], 2, 0);  //Positionne le bit N°2 de msg[0] a 0
 bitWrite(msg[0], 3, 0);  //Positionne le bit N°3 de msg[0] a 0
 bitWrite(msg[0], 4, 0);  //Positionne le bit N°4 de msg[0] a 0
 bitWrite(msg[0], 5, 0);  //Positionne le bit N°5 de msg[0] a 0
 bitWrite(msg[0], 6, 0);  //Positionne le bit N°6 de msg[0] a 0
 bitWrite(msg[0], 7, 0);  //Positionne le bit N°1 de msg[0] a 0
 
  vw_setup(2000);     // initialisation de la librairie VirtualWire à 2000 bauds
  vw_set_tx_pin(entree_tx);
}
 
  void loop()
{
{
  vw_send((uint8_t *)msg, 1);      //Emission d'un message d'un seul octet
  vw_wait_tx();                    // On attend la fin de l'envoi
  delay(50);                       // Et on attend pour pas flooder
}   
  val1 = digitalRead(L1H);    // lit l'état de la broche en entrée
  val2 = digitalRead(L1B);    // et met le résultat dans la variable
  val3 = digitalRead(L2H);
  val4 = digitalRead(L2B);
  val5 = digitalRead(C1G);
  val6 = digitalRead(C1D);
 
// codage fonction
{
   {if(val5 == LOW && val6 ==  HIGH ) // bouton à gauche    ---> Vérin
    val0 = 1;
   }
   {if(val5 == HIGH && val6 ==  HIGH ) // bouton au milieu  ---> Treuil endroit
    val0 = 2;
   }
   {if(val5 == HIGH && val6 ==  LOW ) // bouton au milieu   ---> Treuil envers
    val0 = 3;
   }
}
 
     // Fonction Verin

{  if (val0 == 1)
 {

//  allongement Verin gauche   
    if(val1 == 1)
    {bitWrite(msg[0], 0, 0);}
    else
    {bitWrite(msg[0], 0, 1);}

//  retraction Verin gauche   
    if(val2 == 1)
    {bitWrite(msg[0], 1, 0);}
    else
    {bitWrite(msg[0], 1, 1);}

//  allongement Verin droite   
    if(val3 == 1)
    {bitWrite(msg[0], 2, 0);}
    else
    {bitWrite(msg[0], 2, 1);}


//  retraction Verin droite   
    if(val4 == 1)
    {bitWrite(msg[0], 3, 0);}
    else
    {bitWrite(msg[0], 3, 1);}
 
   }
  }

     // Fonction treuil

{  if(val0 != 1)
 {

   // fonction Treuil endroit
    if(val0 == 2)
 {
//  enroulement treuil gauche
    if(val1 == 1)
    {bitWrite(msg[0], 4, 0);}
    else
    {bitWrite(msg[0], 4, 1);}


//  déroulement treuil gauche
    if(val2 == 1)
    {bitWrite(msg[0], 5, 0);}
    else
    {bitWrite(msg[0], 5, 1);}


//  enroulement treuil droite
    if(val3 == 1)
    {bitWrite(msg[0], 6, 0);}
    else
    {bitWrite(msg[0], 6, 1);}


//  déroulement treuil droite
    if(val4 == 1)
    {bitWrite(msg[0], 7, 0);}
    else
    {bitWrite(msg[0], 7, 1);}

 }


   // fonction Treuil envers
   else if(val0 == 3)
{
//  enroulement treuil gauche
    if(val1 == 1)
    {bitWrite(msg[0], 6, 0);}
    else
    {bitWrite(msg[0], 6, 1);}

//  déroulement treuil gauche
    if(val2 == 1)
    {bitWrite(msg[0], 7, 0);}
    else
    {bitWrite(msg[0], 7, 1);}


//  enroulement treuil droite
    if(val3 == 1)
    {bitWrite(msg[0], 4, 0);}
    else
    {bitWrite(msg[0], 4, 1);}


//  déroulement treuil droite
    if(val4 == 1)
    {bitWrite(msg[0], 5, 0);}
    else
    {bitWrite(msg[0], 5, 1);}

}}}
 
}
//======================= FIN DE PROGRAMME ==================================


Récepteur :
Code: Tout sélectionner
/* ====================== RECEPTEUR 433MHZ 4 VOIES TOUT OU RIEN ======================
Commande de 9 relais en fonction de l’état de 2 leviers et 1 commutateur de l’émetteur.
Ce sketch est destiné à un Attiny 85

                         BRANCHEMENT
        * relais 1)  --------->   pin 2   --> monter verin N°1
        * relais 2)  --------->   pin 3   --> monter verin N°1
        * relais 3)  --------->   pin 4   --> descente verin N°2
        * relais 4)  --------->   pin 5   --> descente verin N°2
        * relais 5)  --------->   pin 6   --> dérouler treui N°1
        * relais 6)  --------->   pin 7   --> enrouler treui N°1 
        * relais 7)  --------->   pin 8   --> dérouler treui N°2
        * relais 8)  --------->   pin 9   --> enrouler treui N°2
        * relais 9)  --------->   pin 10  --> by-pass
        * Récepteur ------------------->   pin 11
========================== DEBUT DU PROGRAMME ====================================*/
#include <VirtualWire.h> // inclusion de la librairie VirtualWire

enum {b0=0, b1, b2, b3, b4, b5, b6, b7, }; //B3 vaut donc 3, b7 vaut 7:
const int r1 =  2;
const int r2 =  3;
const int r3 =  4;
const int r4 =  5;
const int r5 =  6;
const int r6 =  7;
const int r7 =  8;
const int r8 =  9;
const int r9 =  10;
int recepteur= 11;
uint8_t buf[VW_MAX_MESSAGE_LEN]; // Tableau qui va contenir le message reçu (de taille maximum VW_MAX_MESSAGE_LEN)
uint8_t buflen = VW_MAX_MESSAGE_LEN; // Taille maximum de notre tableau
//______________________________________________________________________________________________________________
void setup() // Fonction setup()
{ Serial.begin(9600); 
  pinMode(r1, OUTPUT);
  pinMode(r2, OUTPUT);
  pinMode(r3, OUTPUT);
  pinMode(r4, OUTPUT);
  pinMode(r5, OUTPUT);
  pinMode(r6, OUTPUT);
  pinMode(r7, OUTPUT);
  pinMode(r8, OUTPUT);
  pinMode(r9, OUTPUT);
  vw_setup(2000); // initialisation de la librairie VirtualWire à 2000 bauds
  vw_set_rx_pin(recepteur);
  vw_rx_start();  // Activation de la partie réception de la librairie VirtualWire
}
//______________________________________________________________________________________________________________
void loop() // Fonction loop()
{
 
  if (vw_wait_rx_max(200)) // Si un message est reçu dans les 200ms qui viennent
  {
    if (vw_get_message(buf, &buflen)) // On copie le message, qu'il soit corrompu ou non
    {           
      if( bitRead(buf[0], b0) == HIGH)  { digitalWrite(r1, HIGH); digitalWrite(r9, HIGH); }  else { digitalWrite(r1,LOW); digitalWrite(r9,LOW); }
      if( bitRead(buf[0], b1) == HIGH)  { digitalWrite(r2, HIGH); digitalWrite(r9, HIGH); }  else { digitalWrite(r2,LOW); digitalWrite(r9,LOW); }
      if( bitRead(buf[0], b2) == HIGH)  { digitalWrite(r3, HIGH); digitalWrite(r9, HIGH); }  else { digitalWrite(r3,LOW); digitalWrite(r9,LOW); }
      if( bitRead(buf[0], b3) == HIGH)  { digitalWrite(r4, HIGH); digitalWrite(r9, HIGH); }  else { digitalWrite(r4,LOW); digitalWrite(r9,LOW); }
      if( bitRead(buf[0], b4) == HIGH)  { digitalWrite(r5, HIGH); }  else { digitalWrite(r5,LOW); }
      if( bitRead(buf[0], b5) == HIGH)  { digitalWrite(r6, HIGH); }  else { digitalWrite(r6,LOW); }
      if( bitRead(buf[0], b6) == HIGH)  { digitalWrite(r7, HIGH); }  else { digitalWrite(r7,LOW); }
      if( bitRead(buf[0], b7) == HIGH)  { digitalWrite(r8, HIGH); }  else { digitalWrite(r8,LOW); }
    }
  }
}

//========================= FIN DE PROGRAMME ===========================
all_exe
 
Messages: 5
Inscription: Dim 6 Déc 2015 19:28

Re: Télécommande via arduino

Message non lude all_exe » Mer 13 Jan 2016 11:50

la seul solution que j'ai trouvé pour le moment est de passer par des diodes pour commander le relais de by-pass via les 4 sorties 2, 3, 4 et 5
Mais si quelqu'un peut trouver la solution par programmation, je préfère...
all_exe
 
Messages: 5
Inscription: Dim 6 Déc 2015 19:28

Re: Télécommande via arduino

Message non lude all_exe » Mer 13 Jan 2016 23:03

J'ai modifié le programme du récepteur et maintenant ça fonctionne

Code: Tout sélectionner
/* ====================== RECEPTEUR 433MHZ 4 VOIES TOUT OU RIEN ======================
Commande de 9 relais en fonction de l’état de 2 leviers et 1 commutateur de l’émetteur.
Ce sketch est destiné à un Attiny 85

                         BRANCHEMENT
        * relais 1)  --------->   pin 2   --> monter verin N°1
        * relais 2)  --------->   pin 3   --> monter verin N°1
        * relais 3)  --------->   pin 4   --> descente verin N°2
        * relais 4)  --------->   pin 5   --> descente verin N°2
        * relais 5)  --------->   pin 6   --> dérouler treui N°1
        * relais 6)  --------->   pin 7   --> enrouler treui N°1 
        * relais 7)  --------->   pin 8   --> dérouler treui N°2
        * relais 8)  --------->   pin 9   --> enrouler treui N°2
        * relais 9)  --------->   pin 10  --> by-pass
        * Récepteur ------------------->   pin 11
========================== DEBUT DU PROGRAMME ====================================*/
#include <VirtualWire.h> // inclusion de la librairie VirtualWire

enum {b0=0, b1, b2, b3, b4, b5, b6, b7, }; //B3 vaut donc 3, b7 vaut 7:
const int r1 =  2;
const int r2 =  3;
const int r3 =  4;
const int r4 =  5;
const int r5 =  6;
const int r6 =  7;
const int r7 =  8;
const int r8 =  9;
const int r9 =  10;
int recepteur= 11;
uint8_t buf[VW_MAX_MESSAGE_LEN]; // Tableau qui va contenir le message reçu (de taille maximum VW_MAX_MESSAGE_LEN)
uint8_t buflen = VW_MAX_MESSAGE_LEN; // Taille maximum de notre tableau
//______________________________________________________________________________________________________________
void setup() // Fonction setup()
{ Serial.begin(9600); 
  pinMode(r1, OUTPUT);
  pinMode(r2, OUTPUT);
  pinMode(r3, OUTPUT);
  pinMode(r4, OUTPUT);
  pinMode(r5, OUTPUT);
  pinMode(r6, OUTPUT);
  pinMode(r7, OUTPUT);
  pinMode(r8, OUTPUT);
  pinMode(r9, OUTPUT);
  vw_setup(2000); // initialisation de la librairie VirtualWire à 2000 bauds
  vw_set_rx_pin(recepteur);
  vw_rx_start();  // Activation de la partie réception de la librairie VirtualWire
}
//______________________________________________________________________________________________________________
void loop() // Fonction loop()
{
 
  if (vw_wait_rx_max(200)) // Si un message est reçu dans les 200ms qui viennent
  {
    if (vw_get_message(buf, &buflen)) // On copie le message, qu'il soit corrompu ou non
    {           
      if( bitRead(buf[0], b0) == HIGH)  { digitalWrite(r1, HIGH); }  else { digitalWrite(r1,LOW); }
      if( bitRead(buf[0], b1) == HIGH)  { digitalWrite(r2, HIGH); }  else { digitalWrite(r2,LOW); }
      if( bitRead(buf[0], b2) == HIGH)  { digitalWrite(r3, HIGH); }  else { digitalWrite(r3,LOW); }
      if( bitRead(buf[0], b3) == HIGH)  { digitalWrite(r4, HIGH); }  else { digitalWrite(r4,LOW); }
      if( bitRead(buf[0], b4) == HIGH)  { digitalWrite(r5, HIGH); }  else { digitalWrite(r5,LOW); }
      if( bitRead(buf[0], b5) == HIGH)  { digitalWrite(r6, HIGH); }  else { digitalWrite(r6,LOW); }
      if( bitRead(buf[0], b6) == HIGH)  { digitalWrite(r7, HIGH); }  else { digitalWrite(r7,LOW); }
      if( bitRead(buf[0], b7) == HIGH)  { digitalWrite(r8, HIGH); }  else { digitalWrite(r8,LOW); }
      if( bitRead(buf[0], b0) == HIGH || bitRead(buf[0], b1) == HIGH|| bitRead(buf[0], b2) == HIGH|| bitRead(buf[0], b3) == HIGH)  { digitalWrite(r9, HIGH); }
      else { digitalWrite(r9,LOW); }
    }
  }
}

//========================= FIN DE PROGRAMME ===========================
all_exe
 
Messages: 5
Inscription: Dim 6 Déc 2015 19:28

Re: Télécommande via arduino

Message non lude Laetitia » Jeu 14 Jan 2016 16:49

Bonjour,

Juste une petite remarque sur le code de l'émetteur : l'activation des résistances de tirage peut se faire de deux manières :
Code: Tout sélectionner
pinMode(2, INPUT_PULLUP);

ou :

Code: Tout sélectionner
pinMode(2, INPUT);
digitalWrite(2, HIGH);

À moins que vous ne teniez absolument au combo ceinture + bretelles, il y a une redondance dans votre setup().
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 294
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse

Re: Télécommande via arduino

Message non lude all_exe » Mar 9 Fév 2016 08:33

Bonjour, en effet je ne maîtrise pas bien ce langage de programmation, j'étais habitué auparavant de par ma profession à programmer en ladder sur automate Schneider, donc évidement rien à voir...
Je m'inspire beaucoup de ce que je peux trouver ici et là donc possible qu'il y ai des erreurs grotesques.
Pouvez vous m’expliquer du coup en quoi il y a redondance?

D'ailleurs, même si mon programme fonctionne bien, je ne comprends pas bien comment se passe la transmission d'information.
J'aimerai pouvoir envoyer et décoder plus de 8 bits pour pouvoir sécuriser un peu plus et surtout pouvoir faire fonctionner plusieurs télécommandes et récepteurs associés dans un même périmètre.
Pouvoir dire dans le message qu'il est destiné à la télécommande N°x
Pouvez vous m'aiguiller sur se sujet?
all_exe
 
Messages: 5
Inscription: Dim 6 Déc 2015 19:28

Re: Télécommande via arduino

Message non lude Laetitia » Mar 9 Fév 2016 14:36

Bonjour,

all_exe a écrit:Bonjour, en effet je ne maîtrise pas bien ce langage de programmation, j'étais habitué auparavant de par ma profession à programmer en ladder sur automate Schneider, donc évidemment rien à voir...

N'hésitez pas à consulter les ressources utiles si vous avez besoin de revoir les bases du langage ou de l'électronique.

all_exe a écrit:Pouvez-vous m’expliquer du coup en quoi il y a redondance?

Lorsque l'on configure une pin de l'Arduino, on peut la définir en tant qu'entrée ou sortie. Lorsqu'une pin est configurée en entrée, il est possible d'activer une résistance de tirage interne à l'ATmega, qui permet de garantir un état haut "par défaut" sur la broche en question. Cela peut se faire de deux manières, que j'ai présentées dans mon précédent message. Dans votre code émetteur, il y a :

Code: Tout sélectionner
pinMode(pin, INPUT_PULLUP);
digitalWrite(pin, HIGH);

Ce qui revient à activer deux fois la résistance de tirage... ceinture + bretelles, donc ! Voir cette page de la référence Arduino pour des explications plus complètes sur la configuration des broches.

all_exe a écrit:D'ailleurs, même si mon programme fonctionne bien, je ne comprends pas bien comment se passe la transmission d'information.

La documentation de la librairie VirtualWire détaille le format et les paramètres des messages envoyés.

all_exe a écrit:J'aimerais pouvoir envoyer et décoder plus de 8 bits pour pouvoir sécuriser un peu plus et surtout pouvoir faire fonctionner plusieurs télécommandes et récepteurs associés dans un même périmètre.

Elle précise également (page 4) que la taille maximale d'un message envoyé est de 27 octets, soit 216 bits.

all_exe a écrit:Pouvoir dire dans le message qu'il est destiné à la télécommande N°x

L'un des tutoriels cités plus haut indique :

Skyduino a écrit:La librairie VirtualWire permet d’envoyer des messages binaires (du texte ou des données brutes (structures, variables, …)) à la manière d’un paquet UDP sur un réseau Ethernet, c’est à dire sans adressage (pas d’envoi vers l’Arduino n spécifiquement, c’est du « broadcasting »), sans retransmission en cas d’erreur (si le message est corrompu, il est ignoré) et sans ACK (Acknowledge) (il serait donc intéressant de prévoir un mini système de question/réponse entre les deux Arduinos dans le cadre d’une application sérieuse).

Mais il est tout à fait possible de programmer les récepteurs pour n'exécuter une action que lorsque le message reçu comporte un certain code, il y a certaines structures algorithmiques qui peuvent simplifier le travail à ce niveau-là (et peut-être vous aider à rendre le code plus lisible), jetez un coup d'oeil au switch/case (exemple ici).
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 294
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse


Retourner vers Vos projets, vos idées

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités