Go Down

Topic: (resolu)programmation module UHF (Read 3 times) previous topic - next topic

caco74

May 09, 2012, 11:46 am Last Edit: May 16, 2012, 12:47 am by caco74 Reason: 1
Bonjour à tous j ai un bout de code capable d'envoyer une chaine de caractere vers un module UHF.

La transmission sans fil vers le deuxieme Arduino fonctionne tres bien.

Maintenant je voudrais transmettre une variable ( temperature ....) à la place du message mais je ne sais pas comment proceder.

voici le code coté emetteur pour la transmission d'une chaine.

Code: [Select]
   #include <VirtualWire.h> // Vous devez télécharger et installer la librairie VirtualWire.h dans votre dossier "/libraries" !

   void setup()
   {
       vw_setup(2000);                // Bits par seconde (vous pouvez le modifier mais cela modifiera la portée). Voir la documentation de la librairie VirtualWire.
       vw_set_tx_pin(3);             // La broche 3 sera utilisée pour transmettre la DATA, vous pouvez changez de broche si vous le désirez.
   }

   void loop()
   {
      const char *msg = " Coucou ";                   // C'est le message à envoyer.
      vw_send((uint8_t *)msg, strlen(msg));
      vw_wait_tx();                                          // On attend que le message complet soit envoyé.
      delay(200);                                              // Très important sinon cela peut brouiller d'autres appareils !
   }


merci du coup de main.

barbudor

Regarde les fonctions de conversion de nombre en chaîne de caractère telle que itoa() ou les fonctions intégrées à la classe String.
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

caco74

en gros tu me suggeres de convertir ma variable en chaine pour la transmission et l'inverse sur le recepteur ?

skizoh

exactement, il n'y a que ça a faire ^^^ou alors tu les traduit en byte ( parfois plusieurs si grosse valeurs), tu m'étonne barbudor, tes occupé ou quoi? une réponse en une ligne sa doit être ton record :p

Skizo !
Un tien vaux mieux que deux tu l'auras !

caco74

je vais me documenter sur cette fonction. Merci.

skizoh

si besoin on est la, bon courage

Skizo =)
Un tien vaux mieux que deux tu l'auras !

barbudor

Tu peux effectivement transmettre en binaire, ca sera plus compact :

Code: [Select]
int toto = 12345;
vw_send( (uint8_t *)&toto, sizeof(toto) );


Lit mon tuto sur l'implémentation d'un protocole de communication (section Tuto du forum).
Je parle des pièges et des dangers et j'explique pourquoi il faut implémenter quelque chose de propre pour garantir un fonctionnement sûr.

Pour l'instant l'exemple est en ASCII, je n'ai pas encore eu le temps de faire la version binaire, mais l'idée est la même. Notamment je décrit le protocole binaire Sirf.
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

skywodd

Bonjour,

J'ai fait un tutoriel au sujet de virtualWire :
http://skyduino.wordpress.com/2011/12/29/tutoriel-arduino-et-emetteurrecepteur-433mhz-virtualwire/

Au passage si tu veut envoyer des données binaire (pas du texte donc) tu peut t'inspirer de mon cast (byte*)&variable comme je le fait pour envoyer des données via un nrf24l01 :
http://skyduino.wordpress.com/2012/01/20/tutoriel-arduino-mirf-v2-nrf24l01/

Pas besoin d'implémenter un protocole, virtualwire en implémente déja un avec checksum, entête et tout ce qui va bien ;)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

barbudor


Pas besoin d'implémenter un protocole, virtualwire en implémente déja un avec checksum, entête et tout ce qui va bien ;)


Je me demandais justement ce qu'apportait VirtualWire.... ;)
Il faut que je lise son f....g code XD
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

caco74

Merci du coup de main mais j ai beau tourner dans tout les sens ca ne fonctionne pas. Je seche honteusement.

je croit que ma temperature n'est pas prete à faire de l'hertzien.

j'y retourne demain pour retenter. J ai un bout de code qui permet une emission d'une valeur analogique lue sur une entrée. Peut etre une direction.

barbudor

En fait on ne sait pas ce qui fonctionne pas.

Est-ce l'émission où la réception ?
Le sais tu ? Si oui pourquoi ?

Peux être nous montrer le code des 2 cotés.
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

caco74

en fait j ai la methode d'emission de mon module mais je ne sais pas comment le lui presenter.
Ma variable tempC est bien là sans moyen de la convertir en binaire.
et pourtant je sais comment convertir n importe quelle nombre en binaire avec les "String" mais là rien il ne se passe rien.
Je suis trop scotché au code d'envoi d'une chaine de caracteres et du coup envoyer autre chose au module me laisse sans voix.

barbudor

Je comprend pas.

Ton code tout en haut qui envoie "coucou" marche ?

Je t'ai donné 2 manière de transmettre une variable :
- en ASCII en utilisant au choix itoa() ou String
- en binaire avec l'exemple de code

Qu'est-ce qui coince ?
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

caco74

Code: [Select]
  int tempC = 12345;
   vw_send( (uint8_t *)&tempC, sizeof(tempC) );
 
       vw_wait_tx();                                          // On attend que le message complet soit envoyé.
       delay(200);             


du coup je me retrouve avec ça. tempC etant ma variable ou est stocké la temperature.
Ne comprenant pas le decoulement de cette analyse je suis planté.

j ai bien compris en revanche : que je peu transmettre ma variable à condition qu'elle soit dans un format dans mon cas Binaire. et grace à String je sait convertir n'importe quel nombre en binaire.

Je ne dispose pas d'un exemple concret que je puisse modifier à volonté afin de faire "tilt" dans ma tête.
Désolé de paraître un brin boulet mais je suis tenace.

barbudor

Une variable est toujours en binaire en mémoire.
Tu as le choix de transmettre soit en binaire (c'est à dire une copie des octets qui forment ta variable) ou de convertir ta variable en suite de caractères intelligibles pour l'humain mais qui n'apporte rien à la transmission (cf mon tuto).

un int (sur Arduino) occupe 2 octets en mémoire
En écrivant :  vw_send( (uint8_t *)&tempC, sizeof(tempC) );
tu dit Envoyer 2 octets depuis l'endroit de la mémoire où stocké tempC

tempC : ta variable, du type "int"
&tempC : adresse en mémoire de ta variable (adresse du 1er octet) : du type "int *" (pointeur sur int)
(uint8_t*) : transtypage (appellé aussi cast) : parce que vw_send() attend un (uint8_t *) (pointeur sur uint8_t) tu lui dit : prend mon "int *" comme un "uint8_t *" sans te plaindre, je sais ce que je fais.
sizeof(tempC) vaut 2 parce que tempC utilise 2 octets en mémoire

Coté réception tu devrais recevoir avec :
Code: [Select]

void loop()
{
    int tempC;
    uint8_t buflen = sizeof(tempC);
    if (vw_get_message((uint8_t*)&tempC, &buflen)) // Non-blocking
    {
int i;
// Message with a good checksum received, dump HEX
Serial.print("Got: ");
    Serial.println(tempC, DEC);
}
Serial.println("");
   }
}



Sinon tu peux utilisé itoa() pour convertir un entier en chaine de caractère. On te l'a dit 2 ou 3 fois.
As tu seulement essayé de trouver la doc de ce qu'on t'indique ?

Coté emission :
Code: [Select]
void loop()
{
    const char chaine[15];
    itoa( tempC, chaine, 10 );
    vw_send((uint8_t *)chaine, strlen(chaine)+1);
    delay(400);
}


Et ca tu peux le recevoir avec le code exemple de VW telquel.

Et finalement désolé mais String n'est pas adapté.
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Go Up