Pages: [1]   Go Down
Author Topic: Utilisation de Virtualwire.h ?  (Read 1966 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 32
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut à tous,

Je souhaite utiliser cette librairie, mais, au regard des exemples trouvés de ci de là sur le net, je me demande si :
1- je peux l'utiliser pour transmettre des valeurs chiffrées (bien que ça ne soit écrit nulle part, visiblement, on ne peut transmettre que des caractères... et donc il faut convertir).
2 -je peux l'utiliser avec des modules APC220 (j'ai fait des essais à différentes vitesses, mais il est fastidieux de configurer à chaque fois les modules...et je ne sais quelle config choisir)

Merci pour toute info

A+
JC
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 44
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello,
J'ai pris exemple sur ce tutorial, très bien fait :
http://www.open.com.au/mikem/arduino/VirtualWire.pdf je pense que tu y trouveras ton bonheur...
++
MadProf
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 32
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je l'ai lu et relu, mais, à part "décliner" les exemples de codes fournis, je reste avec mes interrogations.
Est-on obligé d'envoyer des caractères ou peut-on envoyer des valeurs chiffrées ?

Et, si ça fonctionne avec un "bête" émetteur APASCHER qui transmet le signal depuis RX, pourquoi je n'arrive pas à transmettre quoique ce soit avec mes modules APC220 qui sont dit "transparents" ?

Il doit y avoir un problème, soit dans l'encodage du message dans les modules, soit une désynchronisation entre le signal produit par Virtualwire et le module émetteur.

Bref, je ne vois pas par où chercher...

Sinon, j'ai aussi lu ça:
http://www.glacialwanderer.com/hobbyrobotics/?p=291

ça :
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1268131815/2

ça :
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1268131815/2

et ça :
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1238762339

mais je reste sur ma faim...

En tout cas, si je finis par trouver une solution, je posterai le résultat.

A+
JC
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 44
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello,
Si j'ai bien compris tu veux transmettre des données de type numérique via un emetteur/recepteur APC220.
Première question as tu réussi a réaliser une connexion sans fil toute bête ("hello world") ou bien est ce que ton pb c'est juste d'envoyer des valeurs chiffrées ?
pour les valeurs chiffrée tu peux envoyer un integer, ex trouvé sur ce forum:

Code:
// TRANSMITTER

#include <VirtualWire.h>  // you must download and install the VirtualWire.h to your hardware/libraries folder

int numbers[3]; // Change 3 to number of integers you wish to send.

void setup()
{
 // Initialise the IO and ISR
 vw_set_ptt_inverted(true); // Required for RF Link module
 vw_setup(1000);                 // Bits per sec
 //vw_set_tx_pin(3);                // pin 3 is used as the transmit data out into the TX Link module, change this to suit your needs.

 // Initialize to some sample values
 numbers[0] = 32767;
 numbers[1] = -2;
 numbers[2] = 0;
}

void loop()
{
 vw_send( (uint8_t *)numbers, sizeof(numbers));
 vw_wait_tx();  // Wait for message to finish
 delay(1000);

 numbers[0]--;  // decrement
 numbers[1]++;  // increment
 numbers[2]++;  // increment
}



// RECEIVER

#include <VirtualWire.h>  // you must download and install the VirtualWire.h to your hardware/libraries folder

int numbers[3]; // Change 3 to number of integers you wish to send.

void setup()
{
 Serial.begin(4800);

 // Initialise the IO and ISR
 vw_set_ptt_inverted(true);    // Required for RX Link Module
 vw_setup(1000);                   // Bits per sec
 //vw_set_rx_pin(2);           // We will be receiving on pin 23 (Mega) ie the RX pin from the module connects to this pin.
 vw_rx_start();                      // Start the receiver

 Serial.println("Receiver ready!");
}

void loop()
{
 uint8_t buf[VW_MAX_MESSAGE_LEN];
 uint8_t buflen = VW_MAX_MESSAGE_LEN;

 if (vw_get_message(buf, &buflen)) // check to see if anything has been received
 {
   Serial.print(buflen, DEC);
   Serial.println(" bytes received!");
 
   for (int i = 0; i < buflen; i++)
   {
     Serial.print("buf[");
     Serial.print(i, DEC);     Serial.print("]=");
     Serial.print(buf[i], DEC);
     Serial.print("  ");
   }
   Serial.println();

   //memcpy(buf, numbers, buflen);
   for (int i = 0; i < 3; i++)
   {
     numbers[i] = word(buf[i*2+1], buf[i*2]);
     Serial.print("numbers[");
     Serial.print(i, DEC);     Serial.print("]=");
     Serial.print(numbers[i], DEC);
     Serial.print("  ");
   }
   Serial.println();
 }
 
 delay(50);
}

Tu as connecté tes module RF sur quels pins ? Quelle partie de ton code pose problème ?

++

MadProf
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 32
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci de l'attention.

Je n'ai pas beaucoup progressé dans l'usage des APC220 car ils sont fastidieux à configurer pour un linuxien (le programme de config ne tourne que sous windows.

Sinon, j'ai testé sans succès ceci :

code approximatif émetteur :
Code:
#include <VirtualWire.h>

#define idlezone 20
#define incmax 5
#define joymid 512
#define panspeed 40

int x=1;
int y=0;
int button_A= 5;
int button_B= 3;
int button_C= 4;
// int LED=13;
int valx = 0;
int valy = 0;
int Clicbouton = 0;
int bouton;

long time = 0;         // the last time the output pin was toggled
long debounce = 500;   // the debounce time, increase if the output flickers



void setup()
{
  int i;
  for(i=3;i<=5;i++)
  pinMode(i, INPUT);
 // pinMode(LED,OUTPUT);
  Serial.begin(9600);
  
  vw_setup(9600);                 // Bits per sec
  vw_set_tx_pin(1);                // pin 1 is used as the transmit data out into the TX Link module, change this to suit your needs.
}


void loop()
{
  int val;
  char msg[4];
  // while(1) {
    // Serial.print(0xff, BYTE);
    //byte init = 0xFF;
    msg[0] = char(48);
    
    // Lecture Joystick Tilt
    val=analogRead(x);
    if (val > joymid + idlezone){
      valx = map(val, joymid + idlezone, 1023, 0, incmax);
    }
    if (val < joymid - idlezone){
      valx = map(val, joymid - idlezone, 0, 0, incmax);
      valx = -valx;
    }
    if (val <= joymid + idlezone && val >= joymid - idlezone){
      valx = 0;
    }
    
    // Conversion Tilt en byte pour emission
    int tilt = 100 + valx;
    msg[1] = char(tilt);  
    // Serial.print(50 + valx, BYTE);
    
    // Lecture Joystick Pan
    val=analogRead(y);
    if (val > joymid + idlezone){
      valy = map(val, joymid + idlezone, 1023, 0, panspeed);
    }
    if (val < joymid - idlezone){
      valy = map(val, joymid + idlezone, 0, 0, panspeed);
      valy = -valy;
    }    
    if (val >= joymid - idlezone && val <= joymid + idlezone){
      valy = 0;
    }
    
    // Conversion Pan en byte pour emission
    int pan = 100 + valy;
    msg[2] = char(pan);  
    // Serial.print(50 + valy, BYTE);
    
    // Lecture bouton 2 / déclenchement
    bouton = digitalRead(button_B);
    if(bouton == 0 && millis() - time > debounce)
     {
         Clicbouton = 10;
         time = millis();
     }
    else Clicbouton = 0;
    msg[3] = char(Clicbouton + 50);
    
    // Envoi des données Tilt, puis Pan, puis bouton
    // Serial.print(0xff, BYTE);
    // Serial.print(tilt);
    // Serial.print(pan);
    // Serial.print(Clicbouton);    
 // }
    
    vw_send((uint8_t *)msg, strlen(msg));
}

code approximatif récepteur :
Code:
#include <ServoTimer2.h>



// #include <Servo.h>
#include <VirtualWire.h>

#define servomin 1000
#define servomax 2000



#define panidle 1500
#define panspeed 20
#define Pan_pin 3
#define Tilt_pin 4
#define Clic_pin 13

int servox = 1500;
// int x=1;
// int y=0;
// int val1;
// int val2;
// int val3;

int panpos = panidle;
// Servo pan_servo;  // le servo PAN
// Servo tilt_servo; //le servo TILT
ServoTimer2 pan_servo;  // le servo PAN
ServoTimer2 tilt_servo; //le servo TILT

//(¯`·.¸¸.-Déclenchement direct de l'APN Ricoh par USB-.¸¸.·´¯)
// Cette routine doit changer si on utilise un gentled ou autre...
void clicricoh(){
  digitalWrite(Clic_pin, HIGH);   // pin APN ON
  delay(30);                     // durée 30ms (half-press et focus)
  digitalWrite(Clic_pin, LOW);    // pin APN OFF
  delay(200);                    // pause
  digitalWrite(Clic_pin, HIGH);   // pin APN ON
  delay(150);                    // durée 150ms (full-press)
  digitalWrite(Clic_pin, LOW);    // pin APN OFF
  delay(100);                    // delai après photo 2s (a régler)
  digitalWrite(Clic_pin, HIGH);   // pin APN ON
  delay(30);                     // durée 30ms (release)
  digitalWrite(Clic_pin, LOW);    // pin APN OFF
  delay(30);                     // durée 30ms
  digitalWrite(Clic_pin, HIGH);   // pin APN ON
  delay(30);                     // durée 30ms
  digitalWrite(Clic_pin, LOW);    // pin APN OFF
}


void setup()
{
  pan_servo.attach(Pan_pin);                          
  tilt_servo.attach(Tilt_pin);                      
  pinMode(Clic_pin, OUTPUT);
  
  Serial.begin(9600);  

   vw_setup(9600);                   // Bits per sec
   vw_set_rx_pin(0);                 // We will be receiving on pin 23 (Mega) ie the RX pin from the module connects to this pin.
   vw_rx_start();                    // Start the receiver  
}



void loop()
{
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  int val;
  
  if (vw_get_message(buf, &buflen)) {
    
    // TILT
    val = int (buf[1]) - 100;
    if (val > 0){  
      if (servox != servomax){
        servox = servox + val;
        if (servox > servomax) servox = servomax;
      }
     }
    if (val < 0){
      if (servox != servomin){
        servox = servox + val;
        if (servox < servomin) servox = servomin;
      }
    }  
    tilt_servo.write(servox);
    
    // PAN
    val = int(buf[2]) - 100;
    if (val != 0){
      panpos = panidle + val;
    }
    else {
      panpos = panidle;
    }
    pan_servo.write(panpos);
  
   // CLIC
   val = int(buf[3]) - 50;
    if (val == 10){
      clicricoh();
      delay (50);
    }
  
  
/*  int val;
  while (Serial.available() >= 4) {
    if (Serial.read() == 0xff) {
       // val1 = Serial.read();
       // val2 = Serial.read();
       // val3 = Serial.read();

      // Serial.flush();

    // val = val1 - 50;
    val = int (Serial.read() - 50);
    if (val > 0){  
      if (servox != servomax){
        servox = servox + val;
        if (servox > servomax) servox = servomax;
      }
     }
    if (val < 0){
      if (servox != servomin){
        servox = servox + val;
        if (servox < servomin) servox = servomin;
      }
    }  
    
    // tilt_servo.writeMicroseconds(servox);
    tilt_servo.write(servox);
    // delay (50);
    
    // val = val2 - 50;
    val = int(Serial.read() - 50);
    if (val != 0){
      panpos = panidle + val;
    }
    else {
      panpos = panidle;
    }
    
    // pan_servo.writeMicroseconds(panpos);
    pan_servo.write(panpos);
    // delay (50);
    
    val = Serial.read();
    if (val == 10){
      clicricoh();
      delay (50);
    }
   }
   Serial.flush(); */
 }
    
}
j'ai eu un autre soucis : la librairie Servo qui est en conflit avec VirtualWire. Du coup j'ai du utiliser une autre librairie (ServoTimer2), mais je me demande si tout ceci peut fonctionner...

Ce qui est rageant c'est de voir des vidéo sur Youtube de robot (avec des servos) contrôlés par RF via VirtualWire... Mais je n'ai pas de code "exemple" à décortiquer.

Je n'ai pas testé le simple hello world et du coup je reprends tout "from scratch" depuis une communication serial/UART classique jusqu'à la communication avec VirtualWire.

Par contre, si quelqu'un a un bout de code, je suis preneur.

Encore merci

A+
JC
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 44
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut J_C,

j'ai réalisé exactement ce que tu veux faire (un petit rover commandé par RF 315Mhz utilisant le motor shield adafruit, et une télécommande perso avec un LCD shield) et je me suis heurté aux mêmes problèmes.
D'abord j'ai galéré pour le link RF, puis pour changer la librairie servo en conflit par servoTimer2 qui est plus chiant.

Aujourd'hui tout marche correctement. lorsque j'ai eu ces problèmes, la première chose a été de tester la communication RF en commençant par le classique exemple "hello" de la librairie virtualWire, et ensuite rajouter progressivement mes fonctions.
Du cote émetteur par exemple, si je met "Serial.begin(9600);" ca marche plus.
Je te conseille de faire le test avec les pins par défaut et sans le motor shield. Puis de changer les pins avec vw_set_tx_pin(X) pour tester, etc. Petit a petit tu peux plus facilement voir ce qui pose problème.
Je suis au boulot mais si j'oublie pas ce soir je te posterai mon code et le schéma.

Dernière chose, sans antenne la portée est très faible, quelques dizaines de cm... avec un simple câble de 20cm la distance de réception est plus que correcte.

Peux tu poster une photo de ton montage ?

++

MadProf
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 32
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pas de montage pour le moment, juste des tests et avancées dans les capacités de la transmission RF entre 2 arduinos dont l'un pilote 2 servos test (un servo classique et un servo modifié pour une rotation continue 360°).

J'ai testé le "Hello World" en transmission RX/TX classique avec succès, il faut que je revoie avec VirtualWire.

A+
JC
Logged

Pages: [1]   Go Up
Jump to: