Contrôler des moteurs avec un module bluetooth

Bonjour,

J'ai un module bluetooth HC-06, et je voudrais contrôler un moteur à courant continu et un moteur pas à pas avec. Par exemple, quand l'application sur mon téléphone envoie une valeur, par exemple 23(décimale), je veux pouvoir reconnaître cette valeur et tant que cette valeur est envoyée par l'application, le moteur à courant continu. Ceci est une exemple, je n'arrive pas à communiquer entre mon téléphone et mon moniteur série...

Si quelqu'un pouvait m'aider, il me sauverait la vie je dois le faire pour un projet noté au bac.

Voici quand même mon code pour contrôler les moteurs, j'utilise actuellement des boutons poussoirs, mais dans la finalité je veux remplacer ces conditions par les valeurs envoyées par l'application :

#include <Stepper.h>

#define STEPS 400

Stepper stepper(STEPS, 4, 5, 6, 7);

const int bouton_sens_horaire = 13 ;
const int bouton_sens_anti_horaire = 50 ;
const int button_droite = 8 ;
const int button_gauche = 12 ;
const int sens_moteur_droite_dc = 2 ;
const int sens_moteur_gauche_dc = 3 ;
const int vitesse_moteur_dc = 9 ;

int etatbouton_sens_horaire = 0;
int etatbouton_sens_anti_horaire = 0;
int etatbutton_droite = 0 ;
int etatbutton_gauche = 0 ;

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

 pinMode(button_droite,INPUT_PULLUP);
 pinMode(button_gauche,INPUT_PULLUP);
 pinMode(bouton_sens_horaire,INPUT_PULLUP);
 pinMode(bouton_sens_anti_horaire,INPUT_PULLUP);

 pinMode(sens_moteur_droite_dc,OUTPUT);
 pinMode(sens_moteur_gauche_dc,OUTPUT);
 pinMode(vitesse_moteur_dc,OUTPUT);
 
 digitalWrite(vitesse_moteur_dc,LOW);
 digitalWrite(sens_moteur_droite_dc,LOW);
 digitalWrite(sens_moteur_gauche_dc,LOW);

 stepper.setSpeed(15);

}

void loop() {

 etatbutton_droite = digitalRead(button_droite);

 etatbutton_gauche = digitalRead(button_gauche);

 etatbouton_sens_horaire = digitalRead(bouton_sens_horaire);

 etatbouton_sens_anti_horaire = digitalRead(bouton_sens_anti_horaire);

 while (etatbutton_droite == LOW and etatbouton_sens_horaire == HIGH and etatbouton_sens_anti_horaire == HIGH){

   digitalWrite(sens_moteur_droite_dc,HIGH);
   digitalWrite(sens_moteur_gauche_dc,LOW);
   digitalWrite(vitesse_moteur_dc,HIGH);
   etatbutton_droite = digitalRead(button_droite);
   etatbouton_sens_horaire = digitalRead(bouton_sens_horaire);
   etatbouton_sens_anti_horaire = digitalRead(bouton_sens_anti_horaire);  
 }

 while (etatbutton_droite == LOW and etatbouton_sens_horaire == LOW){

   digitalWrite(sens_moteur_droite_dc,HIGH);
   digitalWrite(sens_moteur_gauche_dc,LOW);
   digitalWrite(vitesse_moteur_dc,HIGH);
   stepper.step(1);
   etatbutton_droite = digitalRead(button_droite);
   etatbouton_sens_horaire = digitalRead(bouton_sens_horaire);   
 }

 while (etatbutton_droite == LOW and etatbouton_sens_anti_horaire == LOW){

   digitalWrite(sens_moteur_droite_dc,HIGH);
   digitalWrite(sens_moteur_gauche_dc,LOW);
   digitalWrite(vitesse_moteur_dc,HIGH);
   stepper.step(-1);
   etatbutton_droite = digitalRead(button_droite);
   etatbouton_sens_anti_horaire = digitalRead(bouton_sens_anti_horaire);   
 }

 while (etatbutton_gauche == LOW and etatbouton_sens_horaire == HIGH and etatbouton_sens_anti_horaire == HIGH){

   digitalWrite(sens_moteur_droite_dc,LOW);
   digitalWrite(sens_moteur_gauche_dc,HIGH);
   digitalWrite(vitesse_moteur_dc,HIGH);
   etatbutton_gauche = digitalRead(button_gauche);
   etatbouton_sens_horaire = digitalRead(bouton_sens_horaire);
   etatbouton_sens_anti_horaire = digitalRead(bouton_sens_anti_horaire);    
 }

 while (etatbutton_gauche == LOW and etatbouton_sens_horaire == LOW){

   digitalWrite(sens_moteur_droite_dc,LOW);
   digitalWrite(sens_moteur_gauche_dc,HIGH);
   digitalWrite(vitesse_moteur_dc,HIGH);
   stepper.step(1);
   etatbutton_gauche = digitalRead(button_gauche);
   etatbouton_sens_horaire = digitalRead(bouton_sens_horaire);    
 }

 while (etatbutton_gauche == LOW and etatbouton_sens_anti_horaire == LOW){

   digitalWrite(sens_moteur_droite_dc,LOW);
   digitalWrite(sens_moteur_gauche_dc,HIGH);
   digitalWrite(vitesse_moteur_dc,HIGH);
   stepper.step(-1);
   etatbutton_gauche = digitalRead(button_gauche);
   etatbouton_sens_anti_horaire = digitalRead(bouton_sens_anti_horaire);    
 }

 while (etatbouton_sens_horaire == LOW and etatbutton_droite == HIGH and etatbutton_gauche == HIGH){

   digitalWrite(sens_moteur_droite_dc,LOW);
   digitalWrite(sens_moteur_gauche_dc,LOW);
   digitalWrite(vitesse_moteur_dc,LOW);
   stepper.step(1);
   etatbutton_droite = digitalRead(button_droite);
   etatbutton_gauche = digitalRead(button_gauche);
   etatbouton_sens_horaire = digitalRead(bouton_sens_horaire);
 }

 while (etatbouton_sens_anti_horaire == LOW and etatbutton_droite == HIGH and etatbutton_gauche == HIGH){

   digitalWrite(sens_moteur_droite_dc,LOW);
   digitalWrite(sens_moteur_gauche_dc,LOW);
   digitalWrite(vitesse_moteur_dc,LOW);
   stepper.step(-1);
   etatbutton_droite = digitalRead(button_droite);
   etatbutton_gauche = digitalRead(button_gauche);
   etatbouton_sens_anti_horaire = digitalRead(bouton_sens_anti_horaire);
 }

 digitalWrite(sens_moteur_droite_dc,LOW);
 digitalWrite(sens_moteur_gauche_dc,LOW);
 digitalWrite(vitesse_moteur_dc,LOW);
 

}

hello
si tu veux des réponses, tu as intéret à être très précis et à nous donner un maximum de renseignements.
c'est plus facile pour t'aider et cela évite des échanges de posts et donc une grosse perte de temps pour toi.

par exemple: qu'à tu fais avec ton HC06?
quand tu dis:
je n'arrive pas à communiquer entre mon téléphone et mon moniteur série

tu dois déjà savoir que ton téléphone communique avec le HC 06 et pas avec le moniteur
question suivante: ton téléphone voit il ton HC06?
question suivante: comment est raccordé ton HC06?

commences par corriger ton post : voir ICI

Désolé je vais essayer d'être plus précis.

J'ai fait des recherches sur Internet et j'ai trouvé un code sur le blog d'Eskimon me permettant de faire un "écho" entre la voie série liée à mon PC et celle liée au module bluetooth. A chaque fois que des caractères sont reçus sur la voie série de l'un, ils sont renvoyés sur la voie série de l'autre. J'ai utilisé l'application "Bluetooth Terminal HC-05", mon téléphone arrive à s'appairer au module et à communiquer avec, c'est-à-dire que quand j'envoie un caractère de puis mon application, des caractères s'écrivent bien sur le moniteur série, mais ce ne sont que des "x" et des "?", donc incompréhensibles alors que j'envoie des 1 et des 0. Mon problème est ici, c'est que je voudrais que les caractères que j'envoie s'affichent correctement et je ne comprend pas pourquoi ce n'est pas le cas..

Mon HC-06 a le RX branché au pin 11, le TX branché au 10, et le key est à la masse.

Pour le moment, je voudrais que quand j'envoie une valeur précise avec mon appli, comme un 1, il s'écrive sur le moniteur "bien reçu", mais pour l'instant je n'arrive même pas à lire ces valeurs..

Mon code bluetooth :

#include <SoftwareSerial.h>

SoftwareSerial mavoieserie(11, 10); // (RX, TX) (pin Rx BT, pin Tx BT)

void setup()
{
   // Ouvre la voie série avec l'ordinateur
   Serial.begin(9600);
   // Ouvre la voie série avec le module BT
   mavoieserie.begin(9600);
}

void loop() // run over and over
{
   if (mavoieserie.available()) {
       Serial.write(mavoieserie.read());
   }
   if (Serial.available()) {
       mavoieserie.write(Serial.read());
   }
}

hello
ton moniteur est il réglé à la même vitesse que celle que tu lui déclares dans ton code?
si ce n'est pas le cas, tu liras du charabia ou rien
en principe :
le HC06 s'alimente en 5 V mais nécessite un pont diviseur entre la sortie TX de ton UNO et l'entrée RX du module Blue Tooth

Oh je ne sais pas qui vous êtes mais merci beaucoup vraiment c'était réglé sur 38400 bauds et non 9600 j'ai refait le test et maintenant ça marche !

Ah ! J'avoue que je ne sais pas exactement comment en faire un mais je sais qu'il faudrait des résistances d'après mes recherches mais je n'en ai pas sur moi..

Mais alors j'aurais une dernière question si ce n'est pas abuser de votre gentillesse : Comment faire tourner mon moteur DC, en fonction d'une valeur que je reçois par l'application ? Par exemple, je veux que si l'application m'envoie un 1, alors le moteur tourne pendant dix secondes.

if (){

  digitalWrite(PWM,HIGH);
  delay(10000);
}

Je ne vois pas ce que je pourrais mettre en condition..

en ce moment je suis sur une application similaire
test ce code ou inspire t'en

void lecture_bluetooth()
{
if (mavoieserie.available())
   {
    messageRecu="";
    while ( mavoieserie.available())
        {
          delay(3);
          char c = mavoieserie.read();
          messageRecu += c;
        }
        
        if (messageRecu.length() >0)
        {
          //Serial.println(messageRecu);
          if (messageRecu == "1")     
           {Serial.println(messageRecu);choix_BT=1;}
          if (messageRecu == "2")
           {Serial.println(messageRecu);choix_BT=2;}
          if (messageRecu == "3")     
           {Serial.println(messageRecu);choix_BT=3;}
          if (messageRecu == "4")     
           {Serial.println(messageRecu);choix_BT=4;}
          if (messageRecu == "5")
           {Serial.println(messageRecu);choix_BT=5;}
          if (messageRecu == "6")     
           {Serial.println(messageRecu);choix_BT=6;}
          if (messageRecu == "10")                        //10 start
           {Serial.println(messageRecu);choix_BT=10;top_depart = true;}
          if (messageRecu == "20")                        //20 stop
           {Serial.println(messageRecu);choix_BT=20;} 
          if (messageRecu == "30")                        //30 valide selection du script
            {Serial.println(messageRecu);choix_BT=30;}
          messageRecu="";
        }
   }
}

Merci beaucoup je vais regarder ça !

attention
moteur en continu = ne se commande pas en direct avec la sortie arduino,il faut un relais ou un transistor de puissance

tu utilises digitalWrite(PWM,HIGH);

avec PWM, pour rester cohérent, ce serait plutôt une valeur entre 0 et 255 qu'un "HIGH"

Oui j'utilise deux drivers TB6612 pour contrôler mes deux moteurs mais la raison du PWM c'était pour qu'on comprenne que je parle de la vitesse, même si je suis d'accord qu'un 255 aurait été plus juste.

Au sujet de votre code, je rencontre un problème concernant la variable messageRecu, car Arduino, lors de la compilation, me demande de déclarer la variable mais je ne connaît pas son type.

String messageRecu;

Merci j'avais essayé de mettre string vu que le length laissait penser à un string.length mais je ne savais pas qu'il fallait mettre une majuscule je suis encore débutant. :smiley:

il y a des conventions, je ne sais pas si elle est respectée dans ce cas, l'essentiel étant de lui donner la même orthographe que lors de son utilisation

Oui ce sont les joies du code. J'ai tout arrangé pour que le code marche, tout ça pour recevoir comme message d'erreur de compilation : "Erreur de compilation pour la carte Arduino/Genuino Uno". :cry:

la fonction de lecture du bluetooth que je t'ai passé est ok, intégrée dans mon programme, elle compile sans problème et fonctionne sans problème.

si chez toi, ça ne va pas, cherche chez toi.

de plus, le fait de dire ça ne compile pas, sans nous donner l'erreur affichée et le code que tu tentes de compiler, ne nous fait pas avancer.

nous perdons notre temps à te demander des indications que tu devrais nous donner d'office.

Et bien le problème venait de void lecture_bluetooth(), j'ai remplacé par void loop() et ça a marché. Désolé fausse alerte donc merci quand même pour le temps que vous m'avez consacré et l'aide que vous m'avez fourni.