Go Down

Topic: ATtiny & virtual wire pour telecommande (Read 5292 times) previous topic - next topic

messkid

Bonjour tout le monde !!

J'ai grace a vos conseil pu me debrouiller pour trouver ce dont j'avais besoin dans la jungle arduino, tout est dans une belle petite boite, mais pour mettre en oeuvre je suis bloqué.

J'aimerais faire une telecommande RF a l'aide d'un ATtiny et un emmeteur RF qui envoie un ordre a mon aduino qui recois l'ordre et qui actione un mecanisme. Pour cela j'ai la librairire virtual wire.

comment donner des ordres différents ? (mis a part afficher je ne comprend pas comment allummer tel ou tel pin grace a une commande RF)

Voila, si il y a une bouée pour me sauver de cette noyade de codes, merci !!!

skywodd

Bonjour,

En moyen simple mais pas franchement optimisé est d'utiliser strcmp() et d'envoyer les ordres sous forme de texte.
Exemple : http://skyduino.wordpress.com/2011/12/29/tutoriel-arduino-et-emetteurrecepteur-433mhz-virtualwire/#comment-1004
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

messkid

Merci skyduino, tu me sauve la vie =) et par rapport a ton tutoriel sur le RF, si je veux juste déclencher un type d'action j'utilise la commande vw_wait_rx ca marche ? j'attend que le recepteur recoive un message (peut importe lequel) et j'active mon mecanisme apres ? ca marcherais ? sinon le buf c'est comme une variable ? le programme peut il lire dedans et en fonction du mot dedans il deroule mon mecanisme ? parce que j'auris bien fait un truc du genre telecommande somfy, on appraire la telecommande et roule ma poule !

skywodd


j'attend que le recepteur recoive un message (peut importe lequel) et j'active mon mecanisme apres ? ca marcherais ?

Si tu as qu'une seule et unique commande et que tu veut pas vérifier sa validité ça marcherait oui.


sinon le buf c'est comme une variable ? le programme peut il lire dedans et en fonction du mot dedans il deroule mon mecanisme ? parce que j'auris bien fait un truc du genre telecommande somfy, on appraire la telecommande et roule ma poule !

C'est un tableau d'octets (byte), à toi de faire rentrer dedans ce que tu veut (des char, des int, des struct, ...).
Regarde dans les commentaires de mon article tu as des exemples de commande par texte.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

messkid

Donc en gros si ma telecommande envoie "active" je peux dire a l'arduino d'activer le mecanisme uniquement si il recois le mot "active" ! C'est nickel ca merci beaucoup !


lexzod

En parlant de transmission radio, que pensez-vous des composants ht12d et ht12e et du cta88 ?

skywodd


Donc en gros si ma telecommande envoie "active" je peux dire a l'arduino d'activer le mecanisme uniquement si il recois le mot "active" ! C'est nickel ca merci beaucoup !

C'est le principe d'une télécommande ;)


et ce composant est compatible virtual wire ? http://arduino.cc/en/uploads/Hacking/Atmega168PinMap2.png

Oui, ATmega168 (Arduino decim...) = ATmega328 (Arduino UNO) avec deux fois moins de mémoire.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

messkid

Nickel, par contre je n'arrive pas a lire les info sans avoir le COM, puis-je envoyer le message recu dans une variable afin de le comparer ou pas ?

messkid

Enfin j'aimerais comparer le message recu sans utiliser le serial, et ca ne marche pas ..

skywodd

Avec un code pour comprendre d'où vient ton erreur ce serait mieux ;)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

messkid

#11
Nov 13, 2013, 08:41 am Last Edit: Nov 13, 2013, 09:28 am by messkid Reason: 1
Suis-je bete ..

Donc voila j'ai un ATtiny 85 en emission et j'aimerais juste un ATmega en reception. Pour l'instant les essais se font avec 2 arduino UNO.

J'aimerais recevoir le mot (rotation) , et le mettre dans une variable afin de le comparer et lancer la fonction associée (c'est surtout pour eviter les parasites car a terme j'en aimerais plusieurs qui fonctionnent indépendement).

Donc voila mes codes (c'est pas ecore bien organisé) et plagiés de ton site =)

Pour les essais je met juste un petit interrupteur au niveau de la broche DATA , et j'appuis quand je veux envoyer (+ simple).

RECEPTION :

#include <VirtualWire.h> // inclusion de la librairie VirtualWire

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); // Initialisation du port série pour avoir un retour sur le serial monitor

   vw_setup(2000);   // initialisation de la librairie VirtualWire à 2000 bauds (note: je n'utilise pas la broche PTT)
   vw_rx_start();  // Activation de la partie réception de la librairie VirtualWire
   Serial.println("debut de la reception"); // Petit message de bienvenue

}

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
      {
         Serial.print("RX : ");
         for (byte i = 0; i < buflen; i++) // Si il n'est pas corrompu on l'affiche via Serial
            Serial.write(buf);
         Serial.println("");
  if(strcmp("rotation", (char*)buf) == 0)
{
  vw_rx_stop;
  digitalWrite(2, LOW);
delay (1000);
digitalWrite (2, HIGH);
vw_rx_start;
}
 
}}}


-------------------------------------------------------------

EMISSION :

#include <VirtualWire.h> // inclusion de la librairie VirtualWire

const char *msg = "rotation"; // Tableau qui contient notre message

void setup() // Fonction setup()
{
   vw_setup(2000);      // initialisation de la librairie VirtualWire à 2000 bauds (note: je n'utilise pas la broche PTT)
}

void loop() // Fonction loop()
{
   vw_send((uint8_t *)msg, strlen(msg)); // On envoie le message
   vw_wait_tx(); // On attend la fin de l'envoi
   delay(1000); // Et on attend 1s pour pas flooder
}

skywodd

Met tes codes entre balises code (icône #), le forum a bouffé une partie des parenthèses ;)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

messkid

Code: [Select]

#include <VirtualWire.h> // inclusion de la librairie VirtualWire

const char *msg = "rotation"; // Tableau qui contient notre message
const int bouton = 2; // Definition de la broche du bouton
int etatbouton; // Creation de la variable etat du bouton

void setup() // Fonction setup()
{
 Serial.begin(9600); // Initialisation du port série pour avoir un retour sur le serial monitor
 pinMode (bouton, INPUT); // Le bouton est une entrée
 vw_setup(2000); // initialisation de la librairie VirtualWire à 2000 bauds (note: je n'utilise pas la broche PTT)
}

void loop() // Fonction loop()
{
 etatbouton = digitalRead(bouton);// Lecture de l'etat du bouton
     if (etatbouton == LOW)// si le bouton est enfoncé :
     {  
       vw_send((uint8_t *)msg, strlen(msg)); // On envoie le message
       vw_wait_tx(); // On attend la fin de l'envoi
       Serial.println("message envoye");
     }
}


et pour la reception :

Code: [Select]
#include <VirtualWire.h> // inclusion de la librairie VirtualWire

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); // Initialisation du port série pour avoir un retour sur le serial monitor

   vw_setup(2000); // initialisation de la librairie VirtualWire à 2000 bauds (note: je n'utilise pas la broche PTT)
   vw_rx_start();  // Activation de la partie réception de la librairie VirtualWire
   Serial.println("debut de la reception"); // Petit message de bienvenue

}

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
{
Serial.print("RX : ");
for (byte i = 0; i < buflen; i++) // Si il n'est pas corrompu on l'affiche via Serial
Serial.write(buf[i]);
Serial.println("");
  if(strcmp("rotation", (char*)buf) == 0)
{
  vw_rx_stop;
  digitalWrite(2, LOW);
delay (1000);
digitalWrite (2, HIGH);
vw_rx_start;
}
 
}}}


J'ai essayé de virer les serial mais apres le programme ne marche plus. (encore desolé)

skywodd

Je crois savoir où est l'erreur ;)
Tu envois strlen(msg) octets, mais ton message fait en mémoire strlen(msg) + 1 octets.
Il ne faut pas oublier le \0 à la fin de la chaine de caractère (pas \0 = pas de fin = bug).

Sinon c'est quoi c'est deux lignes :
Code: [Select]
vw_rx_stop; // Parenthèses oubliées ?
   digitalWrite(2, LOW);
delay (1000);
digitalWrite (2, HIGH);
vw_rx_start; // Parenthèses oubliées  ?
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Go Up