Arduino Uno (*2) + Module RF

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

Arduino Uno (*2) + Module RF

Message non lude Sarish » Lun 9 Juil 2012 11:07

Bonjour a tous,
En suivant le tuto sur la mise en place d'une communication RF : http://forum.snootlab.com/viewtopic.php?f=38&t=399
J'ai réussi a faire communiquer mes deux arduino ensemble (en même temps le copié collé sa marche bien 8-) ).
Sauf que j'ai maintenant quelques petits soucis, hop hop une petite présentation.

Mon but (final) :
Faire une petite voiture radiocommandé avec caméra embarqué.

Mon but (actuel) :
- Envoyés la valeur analogique de mes deux potar (sur ma carte émettrice faisant office de télécommande) vers la carte réceptrice.
- Différencié mes tensions analogique (pour l'instant je ne travaille qu'avec un seul potar). Je pensais a une trame du style A0000 a A1024 et B0000 a B1024 A et B étant mes deux potar.

Le(s) problème(s) :
- Je n'ai qu'une toute petite notion de programmation
- [résolu] Lorsque j'envoie ma valeur analogique vers ma carte réceptrice je reçoit que des caractères alphabétiques.
- Lorsque j'envoie ma valeur analogique vers ma carte réceptrice je reçoit des caractères numériques mais qui n'ont rien a voir.

Je précise que sur mon code de réception je viens de changer la ligne :
Serial.print(buf[i]); pour Serial.print(buf[i], DEC);
et je ne peut pour l'instant tester le résultat, donc si vous avez des conseils.

Ensuite pour beaucoup plus tard quand la partie voiture radiocommandé sera opérationnel il me faudrait un module de transmission, Est ce que le module 434Mhz serait adapter ? (BP : trop étroite ?) que me conseiller vous ?

En vous remerciant.

Mes codes :

Réception :
Code: Tout sélectionner
#include <VirtualWire.h> // Vous devez télécharger et installer la librairie VirtualWire.h dans votre dossier "/libraries" !

    void setup()
    {
        Serial.begin(9600);    // On initialise "le serial monitor", j'ai laissé 9600 bauds ici car c'est la valeur par défaut mais vous pouvez la modifier. Attention à bien mettre la même valeur dans votre Serial Monitor et dans votre programme.
        vw_setup(500);                 // Bits par seconde (vous pouvez le modifier mais cela modifiera la portée). Voir la documentation de la librairie VirtualWire.
        vw_set_rx_pin(11);             // C'est sur cette broche que l'on reliera les broches DATA du récepteur, vous pouvez changez de broche si vous le désirez.
        vw_rx_start();                    // On démarre le récepteur.
    }

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

        if (vw_get_message(buf, &buflen)) // On test afin de savoir si un message est reçu.
        {
        int i;
         // Un message est reçu.

        for (i = 0; i < buflen; i++)
        {
            Serial.print(buf[i]);  // On affiche le message lettre par lettre. Par exemple buf[4] sera égale à la 5ème lettre du mot envoyé (Snootlab donc "t") car on compte le zéro ici.
            }
        //Serial.println(""); // On saute une ligne afin d'avoir plus de clarté.
         }
    }


Emission :
Code: Tout sélectionner
#include <VirtualWire.h> // Vous devez télécharger et installer la librairie VirtualWire.h dans votre dossier "/libraries" !
   
    int sensorPin = A0;
    int sensorValue = 0;
    void setup()
    {
     //   Serial.begin(9600);
        vw_setup(500);                // 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()
    {
       sensorValue = analogRead(sensorPin);
       //char *msg = "az";                   // C'est le message à envoyer.
       // Serial.println(sensorValue);
       vw_send((uint8_t *)sensorValue, 4);
       vw_wait_tx();                                          // On attend que le message complet soit envoyé.
       delay(200);                                              // Très important sinon cela peut brouiller d'autres appareils !
    }
Dernière édition par Sarish le Jeu 30 Aoû 2012 13:37, édité 1 fois.
Sarish
 
Messages: 33
Inscription: Lun 9 Juil 2012 10:22

Re: Arduino Uno (*2) + Module RF

Message non lude Lionel » Lun 30 Juil 2012 15:48

Bonjour,

ceci devrait fonctionner pour votre application
la valeur du potentiomètre est mappée (changement d'échelle) avant envoi de 0 à 1024 vers 0 à 255
deux avantages :
- on envoie la valeur sur un octet
- la valeur est prête a être utilisée en PWM

au niveau récepteur, on affiche la valeur reçue en héxadécimal

récepteur :

Code: Tout sélectionner
#include <VirtualWire.h>

const int led_pin = 6;
const int receive_pin = 11;

void setup()
{
    delay(1000);
    Serial.begin(9600);   // Debugging only
    Serial.println("setup");

    // Initialise the IO and ISR
    vw_set_rx_pin(receive_pin);
    vw_setup(2000);    // Bits per sec
    vw_rx_start();       // Start the receiver PLL running
}

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

    if (vw_get_message(buf, &buflen)) // Non-blocking
    {
   int i;

        digitalWrite(led_pin, HIGH); // Flash a light to show received good message
   // Message with a good checksum received, print it.
   Serial.print("Got: ");
   
   for (i = 0; i < buflen; i++)
   {
       Serial.print(buf[i], HEX);
       Serial.print(' ');
   }
   Serial.println();
        digitalWrite(led_pin, LOW);
    }
}


émetteur :
Code: Tout sélectionner
#include <VirtualWire.h>

const int led_pin = 11;
const int transmit_pin = 12;
unsigned int POT_A_PIN =0;
unsigned int POT_B_PIN =1;
unsigned int POT_A_VAL = 0;
unsigned int POT_B_VAL = 0;
byte count_A = 0;
byte count_B = 0;

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

  // Initialise the IO and ISR
  vw_set_tx_pin(transmit_pin);
  vw_setup(2000);    // Bits per sec
}


void loop()
{
  char msg[2] = {'#','#'};
  POT_A_VAL = analogRead(POT_A_PIN); // read value from potentiometer
  count_A = map(POT_A_VAL, 0, 1023, 0, 255); // map the value so that it can be used for PWM signal
  POT_B_VAL = analogRead(POT_B_PIN); // read value from potentiometer
  count_B = map(POT_B_VAL, 0, 1023, 0, 255); // map the value so tha
  msg[0] = count_A;
  msg[1]=count_B;
 
  Serial.print("A ");
  Serial.println(count_A,DEC);
  Serial.print("B ");
  Serial.println(count_B,DEC);

  digitalWrite(led_pin, HIGH); // Flash a light to show transmitting
  vw_send((uint8_t *)msg, 2);
  vw_wait_tx(); // Wait until the whole message is gone
  digitalWrite(led_pin, LOW);
  delay(250);
//  count = count + 1;
}

Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: Arduino Uno (*2) + Module RF

Message non lude Sarish » Ven 3 Aoû 2012 13:58

Merci bien Lionel pour ton aide (je testerais ça dimanche ou lundi car je ne suis pas chez moi ce WE)

Donc maintenant j'ai quelques soucis en plus, je vous met un récapitulatif :
_______________________________________________________________________________________________________________

Projet Arduino :

Voiture radio-commandé avec camera embarqué

Matériels :

Arduino uno rev3 * 2
Recepteur RF 434Mhz
Emetteur RF 434Mhz
Potentiomètre 10Kohm *2
Servo moteur 4.8V-6V
Moteur Pas à Pas 12V DC
Web cam USB (du commerce)
Photo résistance (1Kohm – 10Kohm)
Led (BIG 10mm) Ultra bright 3.4VDC Forward
Pile 9V (PP3)
Capteur ultrasonic (juste les capteurs pas le shields)

But :
Réaliser une voiture radio-commandé avec camera embarqué et visualisation de la vidéo sur ordinateur ou lcd embarqué sur la « télécommande ».

Image




La partie mécanique comme vous pouvez le voir est déjà réaliser (il y a eu quelques modifications par rapport a la photo mais rien de bien différent)


Lionel m'a déjà bien aider sur la partie RF du projet (transmission entre la télécommande et la voiture)

Les problèmes qui se pose ensuite sont :

La transmission entre le moteur et l'axe des roues (Moteur pas assez puissant et trop rapide) pour l'instant j'utilisé un vulgaire moteur 5Vdc je vais testé le pas à pas. (edit : après calcul de couple et de Vrotation le pas à pas pourrait suffire sans moto réducteur)

La transmission entre la camera et la « télécommande » (Quel module (RF 434, Wifi) , comment cablé l'ensemble et/ou comment réutilisé la webcam ? Portée ?)

Quels écran pourrait-je utilisé ?

Je n'arrive pas a trouvé les schéma du shield capteur ultrasonique, les auriez vous ? (edit : Tuto finalement trouvé... j'ai juste pas pensé a regarder dans l'onglet composant tiers du forum, :oops: honte à moi...)

Si certain ont déja réaliser un projet similaire je suis preneur de toutes les infos que vous pourriez avoir.

edit : Pour la partie vidéo je me suis un peu plus renseigné et je pense que cela va être assez complexe, je pense qu'il me faudra un système qui fasse tampon entre l’écran et la caméra, l'adaptation de la sortie "conversion" entre usb et I2c (si c'est possible) ou vers du parallèle enfin pour l'instant aucune idée, j'ai regardé cette ecran : https://www.sparkfun.com/products/8335 qui m'a l'air pas trop mal mais pour la gestion je sent que je vais m'amuser.
Sur ceux, je vous abandonne pour l'instant, je retourne dans mon cablâge.

edit2: si possible, pouvez vous (Messieurs les admins) déplacer le sujet dans la partie projet car je viens de me rendre compte que cela n'a rien à faire la ^^, d'avance merci.
Sarish
 
Messages: 33
Inscription: Lun 9 Juil 2012 10:22

Re: Arduino Uno (*2) + Module RF

Message non lude djawadd » Sam 6 Oct 2012 19:41

Bonjour tout le monde..

votre projet m'interesse trop, vu que je cherche a realiser un robot le plus simple du monde avec deux roues en utilisant 2 servomoteur qui tourne en continu

mais tout les tuto du rf 434mhz ne font que d'envoyer un message d'une arduino a l'autre, mais pas l'activation d'un moteur
pouvez-vous me guider sur le principe de branchement et le principe de fonctionnement ?

merci infiniment
djawadd
 
Messages: 1
Inscription: Sam 6 Oct 2012 19:37

Re: Arduino Uno (*2) + Module RF

Message non lude Sarish » Lun 8 Oct 2012 12:41

(n'étant pas chez moi je n'ai pas les codes du programme sous la main donc je vais repondre de mémoire)
Alors pour les branchements le tuto de snootlab vous permet de voir les branchements : ici
Image

Image

pour les moteurs, plusieurs option :
1 - Petit moteur, pas besoin de puissance (très peu probable pour faire avancer le robot) il suffit de lui envoyer une pwm en fonction de la valeur analogique reçues.
2 - Servo moteur, /!\ ATTENTION /!\ la librairie servo par défaut ne fonctionnera pas du faite que la librairie pour les modules RF et pour les servo utilise le même timer, et je ne me souviens plus de la librairie qu'il faut prendre. (j'editerais se soir)
3 - Gros moteur, (pour faire avancer le robot) il faudrat un etage de puissance soit un simple transistor, soit un pont si vous souhaitez faire marche avant/arrière.
Image
4 - Moteur pas à pas (se que je vais utiliser), ou il faut aussi un etage de puissance mais se coup ci il faut 2 pont en h (vu que le pas à pas est réaliser avec deux enroulements, enfin celui que j'ai en tous cas : bipolaire)

Pour le code, celui qu'a posté lionel convient parfaitement, peut être juste je vais détaillez quelques points important

pour l'émetteur les points important :

Code: Tout sélectionner
 
char msg[2] = {'#','#'}; //initialise un tableau de 2 octet ex : char msg[3] = {'#','#','#'}; ce coup ci c'est trois octet

POT_A_VAL = analogRead(POT_A_PIN); //Lecture du premier potar (pour moi le joystick axe x)

count_A = map(POT_A_VAL, 0, 1023, 0, 255); // Réduit ta valeur pour quelle "loge" dans 1 octet (de 0 à 255 en décimal) c'est le mappage

POT_B_VAL = analogRead(POT_B_PIN); //Lecture du premier potar (pour moi le joystick axe y)

count_B = map(POT_B_VAL, 0, 1023, 0, 255); // Réduit ta valeur pour quelle "loge" dans 1 octet (de 0 à 255 en décimal) c'est le mappage

msg[0] = count_A; // premier octet de msg = la valeur de l'axe x de ton potar mapper

msg[1]=count_B; // deuxieme octet de msg = la valeur de l'axe y de ton potar mapper

vw_send((uint8_t *)msg, 2);
/*envoie sur deux octet, la variable msg donc c'est comme si tu faisais
vw_send((uint8_t *)msg[0], 1); envoie du premier octet de msg
vw_send((uint8_t *)msg[1], 1); envoie du deuxieme octet de msg
*/


maintenant pour la réception :
il n'y a pas vraiment de point a expliquer car je pense que c'est déja très clair, les valeurs reçues sont sotcker dans la variable buf, dans buf[0] tu auras le premier octet dans buf[1] le deuxieme etc...

ensuite je ne connais pas ton niveau en programmation donc j'espere que mes explications ne sont pas trop compliqués en espérant t'avoir aidés et si tu a d'autre question j'essaierai d'etre le plus présent possible.
Sarish
 
Messages: 33
Inscription: Lun 9 Juil 2012 10:22

Re: Arduino Uno (*2) + Module RF

Message non lude EricDuino » Lun 8 Oct 2012 23:14

Bonjour,

J'ai aussi un projet qui ressemble au tien il s'agit d'un "Curiosity" terrestre full Arduino et OpenUse :geek: .

Sans dévoiler totalement le projet (c'est pas qu'il est secret mais il est non finalisé, donc soumis à modifications) pour lequel l'interface radio entre les UNO*2 doit être bidirectionnelle, j'ai réglé le problème de vidéo en utilisant une camera ip/wifi à laquelle j'ai remplacé le transfo par un régulateur et une batterie ;)

@+
Avatar de l’utilisateur
EricDuino
 
Messages: 233
Inscription: Sam 5 Mai 2012 10:10
Localisation: Toulouse

Re: Arduino Uno (*2) + Module RF

Message non lude Sarish » Mar 9 Oct 2012 15:51

EricDuino a écrit:l'interface radio entre les UNO*2 doit être bidirectionnelle


La je ne comprend pas pourquoi, personnellement sur mon projet j'ai un emetteur et un recepteur et j'ai aucun probleme.
Ensuite il est vrai que les echanges que je fait ne nécéssite que ce type de communication (envoie des valeurs de vitesse et de direction uniquement). Le hack de la caméra wifi pas bête du tout, j'avoue que je n'y aurais pas pensé, merci bien pour l'info.

Donc j'avoue que par curiosity ;) j'aimerais savoir pourquoi tu utilise des modules rf bidirectionnel et au passage comment tu les gères a tu un mode veilles (économies de batteries), ensuite pour la caméra wifi tu récupere sur ton pc ou tu a un ecran déporté ? la porté que tu a avec.
Sarish
 
Messages: 33
Inscription: Lun 9 Juil 2012 10:22

Re: Arduino Uno (*2) + Module RF

Message non lude EricDuino » Mar 9 Oct 2012 21:52

Moi, pour mon projet, j'ai besoin de donner des ordres au robot et recevoir de sa part des informations en provenance des ses capteurs. Pour l'instant j'utilise "rien" car c'est un projet "pipo". Heu...."virtuel", " A l'étude" je veux dire.

Comme module RF, je regarde coté http://arduino.cc/en/Main/ArduinoWiFiShield. Eh oui le Wifi c'est du RF.

Oui la vidéo de la cam je la regarde sur un pc, une tablette, qqchose avec un browser Web, dans la limite de portée de la couverture Wifi de la cam à mon point d’accès, pour la consultation de n'importe où sur Terre avec un accès Internet 8-) .
Avatar de l’utilisateur
EricDuino
 
Messages: 233
Inscription: Sam 5 Mai 2012 10:10
Localisation: Toulouse


Retourner vers Vos projets, vos idées

Qui est en ligne

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

cron