Go Down

Topic: Demande d'aide pour ce code (Voiture téléguidée) (Read 876 times) previous topic - next topic

adrien4607

Oct 02, 2012, 05:39 pm Last Edit: Oct 04, 2012, 08:22 pm by adrien4607 Reason: 1
Du nouveau : http://arduino.cc/forum/index.php/topic,125332.msg942532.html#msg942532

Bien le bonjour a vous tous,
Je suis sur un projet qui consiste a faire une voiture téléguider mais j'ais des problème au niveau de mes variable char :s
Voici mon code actuelle
Code: [Select]
/* Voiture Téléguider  0.0.1 */
/* Fonction :
Servo Moteur : direction 1x PIN PWM(PIN 5)
Moteur : Avancer/reculer 2x PIN(PIN 7 & 8) + 1x PIN PWM(PIN 6)
Réception 433 Mhz : 1x PIN(PIN 11) */
/*-----------------------------------------------------------------------------------------*/
#include <VirtualWire.h>//433Mhz
#include <Servo.h>
uint8_t buf[VW_MAX_MESSAGE_LEN]; // Tableau qui va contenir le message recu (de taille maximum VW_MAX_MESSAGE_LEN)
uint8_t buflen = VW_MAX_MESSAGE_LEN; // Taille maximum de notre tableau
int rx_pin = 11;
int av_pin = 7;
int ar_pin = 8;
int servoMot;
int motor;
boolean marche;
char commande = "";
char message;
Servo myServo;

void setup()
{
 //Init 433Mhz Reception
 extern void vw_set_rx_pin(uint8_t rx_pin);
 vw_setup(2000);
 vw_rx_start();
 //Init servo
 myServo.attach(5);
 //Init Pin
 pinMode(av_pin, OUTPUT);
 pinMode(ar_pin, OUTPUT);
 pinMode(5, OUTPUT);
 pinMode(6, OUTPUT);
}
void loop()
{
 message = receiver();
 //Réception des commande
 if(message == "avance")
   commande = "avance";
 else if(message == "recule")
   commande = "recule";
 else if(massage == "turn")
   commande = "turn";
 else
 {
   int val = parseInt(message);
   if(val >= 0 && val <= 255)
   {
     if(commande == "turn")
       myServo.write(val);
     else if(commande == "avance")
     {
       digitalWrite(av_pin, HIGH);
       digitalWrite(ar_pin, LOW);
       analogWrite(6, val);
     }
     else if(commande == "recule")
     {
       digitalWrite(av_pin, LOW);
       digitalWrite(ar_pin, HIGH);
       analogWrite(6, val);
     }
     else
     {
       myServo.write(0);
       digitalWrite(av_pin, LOW);
       digitalWrite(ar_pin, LOW);
       analogWrite(6, 0);
     }
   }
 }
}
char receiver()
{
 char message = "";
 if (vw_wait_rx_max(200)) // Si un message est recu dans les 200ms qui viennent
  {
if (vw_get_message(buf, &buflen)) // On copie le message, qu'il soit corrompu ou non
       {
     for (byte i = 0; i < buflen; i++)
     {
             if(buf[i] != "")
               message += buf[i];
           }
           return message;
  }
  }
}


Merci d'avance

skywodd

#1
Oct 02, 2012, 06:37 pm Last Edit: Oct 02, 2012, 06:39 pm by skywodd Reason: 1
Bonjour,

Tu confond char (= un caractère) et String (= chaine de caractères) ;)

Ps: tu as aussi pas mal de faute sur les noms de tes variables, ex message -> massage.
Et tu as des if inutile, voir même une String inutile.
Utilise "message" ou "commande", mais pas les deux si elles contiennent la même chose.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

adrien4607

#2
Oct 02, 2012, 10:01 pm Last Edit: Oct 02, 2012, 10:28 pm by adrien4607 Reason: 1
Merci skywodd *.*
Effectivement je fait beaucou(trop) de faute orthographique et de faute de frape  :smiley-red: mais j'essaye de m'améliorer :p et il faut que j'apprenne a me relire
Pour ce qui est de mon code il se compile mais a la fin de la compilation j'obtient :
Code: [Select]
Servo\Servo.cpp.o: In function `__vector_11':
C:\Users\Adrien\Desktop\arduino\0023\libraries\Servo/Servo.cpp:103: multiple definition of `__vector_11'
VirtualWire\VirtualWire.cpp.o:C:\Users\Adrien\Desktop\arduino\0023\libraries\VirtualWire/VirtualWire.cpp:416: first defined here

J'imagine que c'est un conflit entre les deux librairie ...
Mon nouveau code
Code: [Select]
/* Voiture Téléguider  0.0.1 */
/* Fonction :
Servo Moteur : direction 1x PIN PWM(PIN 5)
Moteur : Avancer/reculer 2x PIN(PIN 7 & 8) + 1x PIN PWM(PIN 6)
Réception 433 Mhz : 1x PIN(PIN 11) */
/*-----------------------------------------------------------------------------------------*/
#include <VirtualWire.h>//433Mhz
#include <Servo.h>
uint8_t buf[VW_MAX_MESSAGE_LEN]; //Tableau de réception du message
uint8_t buflen = VW_MAX_MESSAGE_LEN; //Longueur maximale dumessage
int rx_pin = 11;//Pin de réception 433Mhz
int av_pin = 7;//PIN pont H
int ar_pin = 8;//PIN pont H
int val;
boolean avance, recule, turn;
Servo myServo ;

void setup()
{
 //Init 433Mhz Reception
 extern void vw_set_rx_pin(uint8_t rx_pin);
 vw_setup(2000);
 vw_rx_start();
 //Init servo
 myServo.attach(5);
 //Init Pin
 pinMode(av_pin, OUTPUT);
 pinMode(ar_pin, OUTPUT);
 pinMode(5, OUTPUT);
 pinMode(6, OUTPUT);
}
void loop()
{
 if (vw_wait_rx_max(200)) // Si un message est recu dans les 200ms qui viennent
  {
if (vw_get_message(buf, &buflen)) // On copie le message, qu'il soit corrompu ou non
       {
           //Réception des commande
           if(strcmp("avance", (char*)buf) == 0)
           {
             avance = true;
             recule = false;
             turn = false;
           }
           else if(strcmp("recule", (char*)buf) == 0)
           {
             avance = false;
             recule = true;
             turn = false;
           }
           else if(strcmp("turn", (char*)buf) == 0)
           {
             avance = false;
             recule = false;
             turn = true;
           }
           else
           {
             for(int i=0; i <= 255; i++)
             {
               if(sscanf((char*)buf, "%d", &i) != 0)
                 val = i;
             }
             if(val >= 0 && val <= 255)
             {
               if(turn)
                 myServo.write(val);
               else if(avance)
               {
                 digitalWrite(av_pin, HIGH);
                 digitalWrite(ar_pin, LOW);
                 analogWrite(6, val); //Vitesse
               }
               else if(recule)
               {
                 digitalWrite(av_pin, LOW);
                 digitalWrite(ar_pin, HIGH);
                 analogWrite(6, val); //Vitesse
               }
               else
               {
                 myServo.write(0);
                 digitalWrite(av_pin, LOW);
                 digitalWrite(ar_pin, LOW);
                 analogWrite(6, 0);//Vitesse
               }
             }
           }
  }
  }
}/* Voiture Téléguider  0.0.1 */
/* Fonction :
Servo Moteur : direction 1x PIN PWM(PIN 5)
Moteur : Avancer/reculer 2x PIN(PIN 7 & 8) + 1x PIN PWM(PIN 6)
Réception 433 Mhz : 1x PIN(PIN 11) */
/*-----------------------------------------------------------------------------------------*/
#include <VirtualWire.h>//433Mhz
#include <Servo.h>
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
int rx_pin = 11;//Pin de réception 433Mhz
int av_pin = 7;//PIN pont H
int ar_pin = 8;//PIN pont H
boolean avance, recule, turn;
Servo myServo ;

void setup()
{
 //Init 433Mhz Reception
 extern void vw_set_rx_pin(uint8_t rx_pin);
 vw_setup(2000);
 vw_rx_start();
 //Init servo
 myServo.attach(5);
 //Init Pin
 pinMode(av_pin, OUTPUT);
 pinMode(ar_pin, OUTPUT);
 pinMode(5, OUTPUT);
 pinMode(6, OUTPUT);
}
void loop()
{
 if (vw_wait_rx_max(200)) // Si un message est recu dans les 200ms qui viennent
  {
if (vw_get_message(buf, &buflen))
       {
           //Réception des commande et traitement de celle-ci
           if(strcmp("avance", (char*)buf) != 0)
           {
             avance = true;
             recule = false;
             turn = false;
           }
           else if(strcmp("recule", (char*)buf) != 0)
           {
             avance = false;
             recule = true;
             turn = false;
           }
           else if(strcmp("turn", (char*)buf) != 0)
           {
             avance = false;
             recule = false;
             turn = true;
           }
           else
           {
             for(int i=0; i <= 255; i++)
             {
               if(sscanf((char*)buf, "%d", &i) != 0)
                 val = i;
             }
             if(val >= 0 && val <= 255)
             {
               if(turn)
                 myServo.write(val);
               else if(avance)
               {
                 digitalWrite(av_pin, HIGH);
                 digitalWrite(ar_pin, LOW);
                 analogWrite(6, val); //Vitesse
               }
               else if(recule)
               {
                 digitalWrite(av_pin, LOW);
                 digitalWrite(ar_pin, HIGH);
                 analogWrite(6, val); //Vitesse
               }
               else
               {
                 myServo.write(0);
                 digitalWrite(av_pin, LOW);
                 digitalWrite(ar_pin, LOW);
                 analogWrite(6, 0);//Vitesse
               }
             }
           }
  }
  }
}


Encore un grand merci :D


EDIT : J'ais changer la ligne 416 du fichier VirtualWire.cpp et j'ais mis "SIGNAL(TIMER2_COMPA_vect)" la compilation se fait correctement, mais est-ce qu'il va fonctionner ?

Go Up