Voiture Télécommandée avec module 433mHz problème de boucle

Bonjour,

Je suis en classe préparatoire intégrée en école d’ingénieur et ai pour projet de réaliser une voiture téléguider avec des émetteurs/récepteurs 433mHz. Je m’occupe de la partie programmation dans mon groupe et me trouve donc fasse à un problème.

Sur la partie réception (programme de la voiture), je lance mon moteur avec une commande “if” mais une fois le moteur lancé il bloque le reste du programme… Autrement dit je ne reçoit plus de message quand le moteur est en rotation (même sur la boite de dialogue) et ne peux donc contrôler mon servo moteur (pour la direction) en même temps que j’avance. J’ai regardé des articles sur les Timers d’interruptions mais suis complètement largué alors si quelqu’un a un conseil à me donner je suis preneur!!

#include <ServoTimer2.h>                      //Ouvre la librairie du Servo
#include <VirtualWire.h>                      //Ouvre la librairie de l'émetteur/récepteur

byte message[VW_MAX_MESSAGE_LEN];             //Tableau qui va contenir le message reçu (de taille maximum VW_MAX_MESSAGE_LEN)
byte taille_message = VW_MAX_MESSAGE_LEN;     //Taille maximum de notre tableau
ServoTimer2 monServo;                         //Associe la librairie à un Servo en particulier ("monServo")
int PinMoteur1 = 7;                           //Associe la sortie 7 de l'arduino au programme "Motorpin"
int enablepin = 10;                           //Associe la sortie 10 de l'arduino au programme "enablepin"
int PinMoteur2 = 3;                           //Associe la sortie 3 de l'arduino au programme "pinMoteur"
 
void setup()   
{
  pinMode(PinMoteur1,OUTPUT);      //Définit le pin du programme "Motorpin" en sortie sur l'arduino
  pinMode(enablepin,OUTPUT);       //Définit le pin du programme "enablepin" en sortie sur l'arduino
  pinMode(PinMoteur2,OUTPUT);      //Définit le pin du programme "pinMoteur" en sortie sur l'arduino
  pinMode(9,OUTPUT);               //Définit le pin du programme "Servo" en sortie sur l'arduino
  monServo.attach(9);              //Associe la sortie 9 de l'arduino au programme "Servo"
  
  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
  vw_rx_start();                              //Activation de la partie réception de la librairie VirtualWire
  Serial.println("Reception"); 
  
  digitalWrite(enablepin,HIGH);             
}
 
void loop()   
{
monServo.write(1510);                    
vw_wait_rx();                                 //Attends qu'un message soit reçu avant de redonner la main à la suite du programme
vw_get_message(message, &taille_message);     //On copie le message, qu'il soit corrompu ou non
Serial.println((char*) message);              //Affiche le message
 
if (strcmp((char*)message, "3") == 0)
{
  Serial.println("ok avance");
  digitalWrite(PinMoteur2,LOW);
  digitalWrite(PinMoteur1,HIGH);
  delay(500);
  if (strcmp((char*)message, "5") == 0)
  {
    Serial.println("stop");
    digitalWrite(PinMoteur1,LOW);
    digitalWrite(PinMoteur2,LOW);
  }  

  if (strcmp((char*)message, "1") == 0)
  {
    Serial.println("ok gauche");
    monServo.write(1850);         
    delay(1000);
  }
    
  if (strcmp((char*)message, "2") == 0)
  {
    Serial.println("ok droite");
    monServo.write(1170);              
    delay(1000);              
  }
 }

  
if (strcmp((char*)message, "4") == 0)
{
  Serial.println("ok recule");
  digitalWrite(PinMoteur1,LOW);
  digitalWrite(PinMoteur2,HIGH);
  delay(2000);
  digitalWrite(PinMoteur2,LOW);
}
   
}

corrigez votre post ci dessus et changer la quote en utilisant les code tags autour du code: [code][color=blue]// votre code ici[/color][/code].

ça doit ressembler à cela:// votre code ici (faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement)

Une fois votre code indenté proprement vous verrez que vous fermez vos accolades n'importe comment...

void loop()
{
 ...
 if (strcmp((char*)message, "3") == 0) [b][color=red]{[/color][/b]
   ....
[color=orange]    if (strcmp((char*)message, "5") == 0) {.....}
    if (strcmp((char*)message, "1") == 0) {.....}
    if (strcmp((char*)message, "2") == 0) {.....}[/color]
    .....
 [b] [color=red]}[/color][/b]
  if (strcmp((char*)message, "4") == 0) {.....}
   ...
}

--> la partie test   if (strcmp((char*)message, "3") == 0)se ferme en bas du code ce qui fait que les 3 autres if pour "5" "1" ou "2" ne sont pas pris en compte, simplement le "4"

Merci beaucoup pour votre avis. J'ai modifié mon poste pour que les accolades soient plus lisibles bien que je ne vois pas en quoi elles sont fermé n'importe comment... Le problème est que une fois le "3" lancé, je ne peux même pas lancé le "4" (à part si je mets un delay sur le "3") mais dans ce cas je ne peux pas faire 2 actions simultanément ce qui restreint un peu les capacités de ma voiture... Je n'ai pas d'autre choix que de débrancher mon arduino ou re-televerser le programme pour couper le moteur!!

Merci d'avance pour votre aide.

"elles sont fermées n'importe comment" parce que si vous rentrez dans le premier IF pour message == 3 comment voulez vous qu'il soit aussi égal à 5,1 ou 2 puisqu'il vaut 3... les 3 IF imbriqués sont donc inutiles. Si vous ne rentrez pas dans le IF parceque message vaut 5 par exemple, vous ne testerez alors pas 5 et le code ne sera pas exécuté...

bonjour, +1 avec J-M-L ca doit donner un truc comme ca

if (strcmp((char*)message, "3") == 0)
{
  Serial.println("ok avance");
  digitalWrite(PinMoteur2,LOW);
  digitalWrite(PinMoteur1,HIGH);
  delay(500);
}
  if (strcmp((char*)message, "5") == 0)
  {
    Serial.println("stop");
    digitalWrite(PinMoteur1,LOW);
    digitalWrite(PinMoteur2,LOW);
  } 

  if (strcmp((char*)message, "1") == 0)
  {
    Serial.println("ok gauche");
    monServo.write(1850);         
    delay(1000);
  }
   
  if (strcmp((char*)message, "2") == 0)
  {
    Serial.println("ok droite");
    monServo.write(1170);             
    delay(1000);             
  }



if (strcmp((char*)message, "4") == 0)
{
  Serial.println("ok recule");
  digitalWrite(PinMoteur1,LOW);
  digitalWrite(PinMoteur2,HIGH);
  delay(2000);
  digitalWrite(PinMoteur2,LOW);
}

Et Avec des else entre les if et une indentation correcte - c’est encore mieux :slight_smile:

J-M-L: Et Avec des else entre les if et une indentation correcte - c'est encore mieux :)

j'ai repris celle plus haut, donc il le fera lui même ;) oui, mais une grosse flemme de taper 4 lettres de plus :) ca fonctionnera avec ou sans else papa noël c'est que ce week end, donc faut pas pousser non plus

Bonjour,

Je suis surpris que mon poste sollicite autant d'attention :)

Infobarquee: j'ai essayé en plaçant les {} de cette manière mais le problème d'actions simultanées se pose toujours...

J-M-L: j'ai recopié mon programme avec du switch / case qui fonctionne exactement pareil (sans les comparaisons de chaînes de caractère du coup..) mais le même problème se pose!! Je n'ai plus de batterie sur mon PC malheureusement et n'aurai pas accès à mon chargeur avant lundi alors si ne vous dérange pas d'attendre jusque là je pourrais vous poster le programme.

Merci pour votre aide et bonne journée ;)

Que voulez vous dire par actions simultanées ?

J'aimerai qu'une fois rentré dans le "3" je puisse me servir du servo pour tourner et aussi arrêter le moteur sans avoir à retéleverser le programme.. Sinon chaque cas fonctionne indépendamment...

Ce n'est pas "dans le 3" - à chaque tour de boucle Tant que vous n'avez pas de Message ne changez rien aux moteurs

Quand vous avez marche avant vous démarrez le moteur

À la prochaine boucle (une future parce que ça boucle super vite) Quand vous recevrez tourner comme vous ne changez pas les ordres du moteur il continuera à avancer

Bonjour,
Etant novice je ne connais pas bien la fonction char mais est-ce qu il n’y a pas une erreur dans la boucle loop ?

Lors de la demande pour tourner à gauche ou à droite, après avoir exécuté son action le servomoteur est constamment remis en ligne droite au début de la boucle avant de continuer la nouvelle lecture des consignes.

Oui il y a monServo.write(1510); en début de boucle mais des délais dans les if donc voir ce que l'OP veut