Problème moteur bluetooth varier la vitesse

Bonjour, je réalise un projet que je dois absolument finir cette semaine et j'ai besoin d'aide.
Je veux piloter mon moteur à l'aide de deux boutons on et off physiques et d'un curseur sur une appli en bluetooth pour faire varier la vitesse de ce dernier.

Ici mon problème est que j'ai beau bouger mon curseur, le moteur ne prend pas la valeur demandée. En fait, si je met le curseur sur 0 le moteur s’arrête (logique) mais quand le curseur passe à 1 il accélère d'un coup et toutes les autres valeurs (jusqu’à 255) font tourner le moteur à la même vitesse...

Voici mon code

 #include <LedControlMS.h>


 
byte max_units = 1;
LedControl lc=LedControl(8,10,9,max_units); //Brancher din sur 8, clk 10 cs sur 9


 int Data;
int pinButton = 2; //On déclare le bouton On sur la broche 8
int pinButton2 = 5; //On déclare le bouton Off sur la broche 9
int stateMOT = 0; //On initialise l'etat du moteur à 0
int stateButtonOff = 0; //On initialise l'etat du bouton Off à 0
int stateButtonOn = 0; //On initialise l'etat du bouton On à 0
int pwm_a = 3;  //La vitesse du moteur se controle via la broche 3
int dir_a = 12;  //La direction du moteur se controle via la broche 12
int detectV=A5;  //Fil barrage relié à 8
int LEDV=4; //led relié à 4
int detectR=A0;  //Fil barrage relié à 9
int etatdetectV=0;  //declaration de la variable etatdetectV
int etatdetectR=0;  //declaration de la variable etatdetectR
int detection=0;
unsigned long tempsDebut, tempsFin;
unsigned long delaytime=1;  
  


int distance = 100;//Declaration de la distance separant R1 et R2 en mm


byte A[] = { B00000000,B00000000,B00000000,B11011111,B11011111,B00000000,B00000000,B00000000};
byte B[] = { B00011000,B00100100,B01011010,B01011010,B10000001,B10011001,B10000001,B01111110};


void setup() {
  pinMode(pinButton, INPUT); //Déclare le bouton On comme une entrée
  pinMode(pinButton2, INPUT); //Déclare le bouton Off comme une entrée
  pinMode(pwm_a, OUTPUT);  //Declare la vitesse du moteur comme une sortie
  pinMode(dir_a, OUTPUT);  //Declare la direction du moteur comme une sortie
 pinMode(detectV,INPUT_PULLUP);  //capteur, entrée
  pinMode(LEDV,OUTPUT); //led, sortie
  pinMode(detectR,INPUT_PULLUP);  //capteur, entrée
  Serial.begin(9600);
  Serial.println("En attente de passage...");
  Serial.println("La distance initialisée entre les deux capteurs est de ");
  Serial.print(distance);
  Serial.print(" mm");

}

void Attention() {

  lc.setRow(0,0,A[0]);
 lc.setRow(0,1,A[1]);
 lc.setRow(0,2,A[2]);
 lc.setRow(0,3,A[3]);
 lc.setRow(0,4,A[4]);
 lc.setRow(0,5,A[5]);
 lc.setRow(0,6,A[6]);
 lc.setRow(0,7,A[7]);
 delay(3000);

 
}

 void set_unit(byte number_of_unit){
  lc.shutdown(number_of_unit-1,false);
  lc.setIntensity(number_of_unit-1,1);
  lc.clearDisplay(number_of_unit-1);
  
}


void loop() {

 if(stateMOT == 1) { //Si il est pressé

    while(Serial.available()) {
    Data= Serial.read();  
    Serial.print(Data);
    digitalWrite(pwm_a,Data); //On allume le moteur
  }
     
  }
  

   stateButtonOn = digitalRead(pinButton); //Controle l'etat du bouton On
  if(stateButtonOn == HIGH) { //Si il est pressé

 
      digitalWrite(pwm_a,60); //On allume le moteur
      stateMOT = 1; //On change l'etat du moteur à Allumé

    } 
  

   stateButtonOff = digitalRead(pinButton2); //Controle de l'etat du bouton Off
   if(stateButtonOff == HIGH) { //Si il est pressé

      digitalWrite(pwm_a,0); //On eteint le moteur
      stateMOT = 0;//On change l'etat du moteur à Eteint
    
   
     
  }
  
  
  
  etatdetectV = digitalRead(detectV);  //On affecte à la varialble etatdetect la valeur de detectV
etatdetectR = digitalRead(detectR); //On affecte à la varialble etatdetect la valeur de detectR

  
if (etatdetectV == LOW)  //si le détection
{

tempsDebut=millis();
Serial.println(" Top depart");
delay(500);
    }
    else      //sinon
{

}

if (etatdetectR == LOW) //si le détection
{
detection=HIGH;   

tempsFin = millis();
Serial.println(" Top final");

    }
    else      //sinon
{

}
if (detection ==HIGH)
  {


float dt = (float)( (float)tempsFin - (float)tempsDebut) / 1000. ;
float vitesse = (float)distance/(float)dt;
if ((float)vitesse>50){
   Attention();
   for(byte i=1;i<6;i++)
{
  set_unit(i);

  
}
}

float VKMN = 0.0;       // Variable vitesse en N
VKMN = ((float)vitesse * 160.0); 

      Serial.println("La temps est de: ");
      Serial.print((float)dt);
  Serial.print("La vitesse est de:  ");

  
  Serial.print((float)vitesse);
  Serial.println(" mm/s");
  Serial.print("La vitesse à l'echelle N est de: ");
  Serial.print(((float)VKMN)/1000*3.6);
  Serial.println(" km/h");
  
  delay(1000);

  
  detection=LOW;

  }




}

Merci de votre aide

PS: J'ai rajouté la ligne Serial.print(Data); pour vérifier si les valeurs étaient bien reçues correctement et c'est effectivement le cas...

Bonsoir

-finir cette semaine......et travail donné quand ? invoquer l'urgence sur ce forum agace plus qu'autre chose...
-travail scolaire ?
-quel rapport entre le Bluetooth et le code ci-dessus (un module BT sur le port série ?)?
-quelles lignes du programme sont censées faire tourner plus ou moins vite le moteur ?

Bonjour merci de cette réponse
-TPE du lycée

  • Cette semaine car c'est mon objectif avant de passer sur la rédaction de la soutenance
  • La valeur envoyée par le bluetooth est récupérée par la commande Serial.read
  • Pour faire tourner le moteur j'utilise la commande digitalWrite(pwm_a, (vitesse));

J'ai ce code qui fonctionne (démarrer le moteur avec un bouton on et l’éteindre avec un bouton off) mais qui n'a aucune notion de bluetooth

 #include <LedControlMS.h>


 
byte max_units = 1;
LedControl lc=LedControl(8,10,9,max_units); //Brancher din sur 8, clk 10 cs sur 9



int pinButton = 2; //On déclare le bouton On sur la broche 8
int pinButton2 = 5; //On déclare le bouton Off sur la broche 9
int stateMOT = 0; //On initialise l'etat du moteur à 0
int stateButtonOff = 0; //On initialise l'etat du bouton Off à 0
int stateButtonOn = 0; //On initialise l'etat du bouton On à 0
int pwm_a = 3;  //La vitesse du moteur se controle via la broche 3
int dir_a = 12;  //La direction du moteur se controle via la broche 12
int detectV=A5;  //Fil barrage relié à 8
int LEDV=4; //led relié à 4
int detectR=A0;  //Fil barrage relié à 9
int etatdetectV=0;  //declaration de la variable etatdetectV
int etatdetectR=0;  //declaration de la variable etatdetectR
int detection=0;
unsigned long tempsDebut, tempsFin;
unsigned long delaytime=1;  
  


int distance = 100;//Declaration de la distance separant R1 et R2 en mm


byte A[] = { B00000000,B00000000,B00000000,B11011111,B11011111,B00000000,B00000000,B00000000};
byte B[] = { B00011000,B00100100,B01011010,B01011010,B10000001,B10011001,B10000001,B01111110};


void setup() {
  pinMode(pinButton, INPUT); //Déclare le bouton On comme une entrée
  pinMode(pinButton2, INPUT); //Déclare le bouton Off comme une entrée
  pinMode(pwm_a, OUTPUT);  //Declare la vitesse du moteur comme une sortie
  pinMode(dir_a, OUTPUT);  //Declare la direction du moteur comme une sortie
 pinMode(detectV,INPUT_PULLUP);  //capteur, entrée
  pinMode(LEDV,OUTPUT); //led, sortie
  pinMode(detectR,INPUT_PULLUP);  //capteur, entrée
  Serial.begin(9600);
  Serial.println("En attente de passage...");
  Serial.println("La distance initialisée entre les deux capteurs est de ");
  Serial.print(distance);
  Serial.print(" mm");

}

void Attention() {

  lc.setRow(0,0,A[0]);
 lc.setRow(0,1,A[1]);
 lc.setRow(0,2,A[2]);
 lc.setRow(0,3,A[3]);
 lc.setRow(0,4,A[4]);
 lc.setRow(0,5,A[5]);
 lc.setRow(0,6,A[6]);
 lc.setRow(0,7,A[7]);
 delay(3000);

 
}

 void set_unit(byte number_of_unit){
  lc.shutdown(number_of_unit-1,false);
  lc.setIntensity(number_of_unit-1,1);
  lc.clearDisplay(number_of_unit-1);
  
}


void loop() {

  
 

   stateButtonOn = digitalRead(pinButton); //Controle l'etat du bouton On
  if(stateButtonOn == HIGH) { //Si il est pressé
    if(stateMOT == 1){ //Si le moteur est allumé
      digitalWrite(pwm_a,Data); //On ne change rien

    }
    }
    if(stateMOT == 0){ //Si le moteur est eteint
      digitalWrite(pwm_a,Data); //On allume le moteur
      stateMOT = 1; //On change l'etat du moteur à Allumé

    }
     
  
   if(stateButtonOn == LOW) { //Si il n'est pas pressé (Bouton ON)
    if(stateMOT == 1){ //Si le moteur est allumé
      digitalWrite(pwm_a,Data); //On ne change rien

    }
    if(stateMOT == 0){ //Si le moteur est éteint
      digitalWrite(pwm_a,0); //On ne change rien
    }
     
  }

   stateButtonOff = digitalRead(pinButton2); //Controle de l'etat du bouton Off
   if(stateButtonOff == HIGH) { //Si il est pressé
    if(stateMOT == 1){ //Si le moteur est allumé
      digitalWrite(pwm_a,0); //On eteint le moteur
      stateMOT = 0;//On change l'etat du moteur à Eteint
    }
    if(stateMOT == 0){//Si le moteur est eteint 
      digitalWrite(pwm_a,0);//On ne change rien
    }
     
  }
  if(stateButtonOff == LOW) { //Si il n'est pas pressé (Bouton OFF)
    if(stateMOT == 1){//Si le moteur est allumé 
      digitalWrite(pwm_a,Data);//On ne change rien

    }
    if(stateMOT == 0){//Si le moteur est éteint
      digitalWrite(pwm_a,0);//On ne change rien
    }
     
  }
  
  
  etatdetectV = digitalRead(detectV);  //On affecte à la varialble etatdetect la valeur de detectV
etatdetectR = digitalRead(detectR); //On affecte à la varialble etatdetect la valeur de detectR

  
if (etatdetectV == LOW)  //si le détection
{

tempsDebut=millis();
Serial.println(" Top depart");
delay(500);
    }
    else      //sinon
{

}

if (etatdetectR == LOW) //si le détection
{
detection=HIGH;   

tempsFin = millis();
Serial.println(" Top final");

    }
    else      //sinon
{

}
if (detection ==HIGH)
  {


float dt = (float)( (float)tempsFin - (float)tempsDebut) / 1000. ;
float vitesse = (float)distance/(float)dt;
if ((float)vitesse>50){
   Attention();
   for(byte i=1;i<6;i++)
{
  set_unit(i);

  
}
}

float VKMN = 0.0;       // Variable vitesse en N
VKMN = ((float)vitesse * 160.0); 

      Serial.println("La temps est de: ");
      Serial.print((float)dt);
  Serial.print("La vitesse est de:  ");

  
  Serial.print((float)vitesse);
  Serial.println(" mm/s");
  Serial.print("La vitesse à l'echelle N est de: ");
  Serial.print(((float)VKMN)/1000*3.6);
  Serial.println(" km/h");
  
  delay(1000);

  
  detection=LOW;

  }




}

Maintenant j'aimerai l'enrichir en faisant varier la vitesse via une appli connectée en bluetooth avec un HC-05 connecté aux pins TX RX (0 et 1)

Merci

Excusez moi, mon but n'est vraiment pas d'agacer :slight_smile:

je me suis trompé dans mon précdent message voilà le bon code:

 #include <LedControlMS.h>


 
byte max_units = 1;
LedControl lc=LedControl(8,10,9,max_units); //Brancher din sur 8, clk 10 cs sur 9



int pinButton = 2; //On déclare le bouton On sur la broche 8
int pinButton2 = 5; //On déclare le bouton Off sur la broche 9
int stateMOT = 0; //On initialise l'etat du moteur à 0
int stateButtonOff = 0; //On initialise l'etat du bouton Off à 0
int stateButtonOn = 0; //On initialise l'etat du bouton On à 0
int pwm_a = 3;  //La vitesse du moteur se controle via la broche 3
int dir_a = 12;  //La direction du moteur se controle via la broche 12
int detectV=A5;  //Fil barrage relié à 8
int LEDV=4; //led relié à 4
int detectR=A0;  //Fil barrage relié à 9
int etatdetectV=0;  //declaration de la variable etatdetectV
int etatdetectR=0;  //declaration de la variable etatdetectR
int detection=0;
unsigned long tempsDebut, tempsFin;
unsigned long delaytime=1;  
  


int distance = 100;//Declaration de la distance separant R1 et R2 en mm


byte A[] = { B00000000,B00000000,B00000000,B11011111,B11011111,B00000000,B00000000,B00000000};
byte B[] = { B00011000,B00100100,B01011010,B01011010,B10000001,B10011001,B10000001,B01111110};


void setup() {
  pinMode(pinButton, INPUT); //Déclare le bouton On comme une entrée
  pinMode(pinButton2, INPUT); //Déclare le bouton Off comme une entrée
  pinMode(pwm_a, OUTPUT);  //Declare la vitesse du moteur comme une sortie
  pinMode(dir_a, OUTPUT);  //Declare la direction du moteur comme une sortie
 pinMode(detectV,INPUT_PULLUP);  //capteur, entrée
  pinMode(LEDV,OUTPUT); //led, sortie
  pinMode(detectR,INPUT_PULLUP);  //capteur, entrée
  Serial.begin(9600);
  Serial.println("En attente de passage...");
  Serial.println("La distance initialisée entre les deux capteurs est de ");
  Serial.print(distance);
  Serial.print(" mm");

}

void Attention() {

  lc.setRow(0,0,A[0]);
 lc.setRow(0,1,A[1]);
 lc.setRow(0,2,A[2]);
 lc.setRow(0,3,A[3]);
 lc.setRow(0,4,A[4]);
 lc.setRow(0,5,A[5]);
 lc.setRow(0,6,A[6]);
 lc.setRow(0,7,A[7]);
 delay(3000);

 
}

 void set_unit(byte number_of_unit){
  lc.shutdown(number_of_unit-1,false);
  lc.setIntensity(number_of_unit-1,1);
  lc.clearDisplay(number_of_unit-1);
  
}


void loop() {

  
 

  stateButtonOn = digitalRead(pinButton); //Controle l'etat du bouton On
  if(stateButtonOn == HIGH) { //Si il est pressé
    if(stateMOT == 1){ //Si le moteur est allumé
      digitalWrite(pwm_a,85); //On ne change rien
    }
    if(stateMOT == 0){ //Si le moteur est eteint
      digitalWrite(pwm_a,85); //On allume le moteur
      stateMOT = 1; //On change l'etat du moteur à Allumé
    }
     
  }
   if(stateButtonOn == LOW) { //Si il n'est pas pressé (Bouton ON)
    if(stateMOT == 1){ //Si le moteur est allumé
      digitalWrite(pwm_a,85); //On ne change rien
    }
    if(stateMOT == 0){ //Si le moteur est éteint
      digitalWrite(pwm_a,0); //On ne change rien
    }
     
  }

   stateButtonOff = digitalRead(pinButton2); //Controle de l'etat du bouton Off
   if(stateButtonOff == HIGH) { //Si il est pressé
    if(stateMOT == 1){ //Si le moteur est allumé
      digitalWrite(pwm_a,0); //On eteint le moteur
      stateMOT = 0;//On change l'etat du moteur à Eteint
    }
    if(stateMOT == 0){//Si le moteur est eteint 
      digitalWrite(pwm_a,0);//On ne change rien
    }
     
  }
  if(stateButtonOff == LOW) { //Si il n'est pas pressé (Bouton OFF)
    if(stateMOT == 1){//Si le moteur est allumé 
      digitalWrite(pwm_a,85);//On ne change rien
    }
    if(stateMOT == 0){//Si le moteur est éteint
      digitalWrite(pwm_a,0);//On ne change rien
    }
     
  }
  
  
  etatdetectV = digitalRead(detectV);  //On affecte à la varialble etatdetect la valeur de detectV
etatdetectR = digitalRead(detectR); //On affecte à la varialble etatdetect la valeur de detectR

  
if (etatdetectV == LOW)  //si le détection
{

tempsDebut=millis();
Serial.println(" Top depart");
delay(500);
    }
    else      //sinon
{

}

if (etatdetectR == LOW) //si le détection
{
detection=HIGH;   

tempsFin = millis();
Serial.println(" Top final");

    }
    else      //sinon
{

}
if (detection ==HIGH)
  {


float dt = (float)( (float)tempsFin - (float)tempsDebut) / 1000. ;
float vitesse = (float)distance/(float)dt;
if ((float)vitesse>50){
   Attention();
   for(byte i=1;i<6;i++)
{
  set_unit(i);

  
}
}

float VKMN = 0.0;       // Variable vitesse en N
VKMN = ((float)vitesse * 160.0); 

      Serial.println("La temps est de: ");
      Serial.print((float)dt);
  Serial.print("La vitesse est de:  ");

  
  Serial.print((float)vitesse);
  Serial.println(" mm/s");
  Serial.print("La vitesse à l'echelle N est de: ");
  Serial.print(((float)VKMN)/1000*3.6);
  Serial.println(" km/h");
  
  delay(1000);

  
  detection=LOW;

  }




}

Il est demandé sur ce forum d'annoncer la couleur pour un travail scolaire (voir les messages épinglés en tête de forum, dont celui-çi

Pour faire tourner le moteur j'utilise la commande digitalWrite(pwm_a, (vitesse));

Voir la syntaxe de digitalWrite, cela explique le tout ou rien , l'absence de modulation de la vitesse du moteur

Ok je suis désole je ne savais pas...

J'ai compris le digitalWrite ne donne qu'une valeur logique e,n gros (0 ou 1), quelle fonction dois je utiliser pour pouvoir donner d'autres valeurs?

Si cela peut vous aider mon moteur est un Tetrix DC GEar motor

Les messages épinglées en tête de forum , qu'il faut consulter même quand on est pressé, recommandent certains tutoriels.

Celui-ci qui présente l'utilisation des moteurs ... dont la variation de vitesse vers la fin de la page ('Bref rappel sur les PWM')

Merci du lien il m'a été assez utile d'un côté théorique, maintenant je n'arrive pas à l'appliquer correctement...

J'ai testé ce code:

 #include <LedControlMS.h>


 
byte max_units = 1;
LedControl lc=LedControl(8,10,9,max_units); //Brancher din sur 8, clk 10 cs sur 9


 int Data;
int pinButton = 2; //On déclare le bouton On sur la broche 8
int pinButton2 = 5; //On déclare le bouton Off sur la broche 9
int stateMOT = 0; //On initialise l'etat du moteur à 0
int stateButtonOff = 0; //On initialise l'etat du bouton Off à 0
int stateButtonOn = 0; //On initialise l'etat du bouton On à 0
int pwm_a = 3;  //La vitesse du moteur se controle via la broche 3
int dir_a = 12;  //La direction du moteur se controle via la broche 12
int detectV=A5;  //Fil barrage relié à 8
int LEDV=4; //led relié à 4
int detectR=A0;  //Fil barrage relié à 9
int etatdetectV=0;  //declaration de la variable etatdetectV
int etatdetectR=0;  //declaration de la variable etatdetectR
int detection=0;
unsigned long tempsDebut, tempsFin;
unsigned long delaytime=1;  
  


int distance = 100;//Declaration de la distance separant R1 et R2 en mm


byte A[] = { B00000000,B00000000,B00000000,B11011111,B11011111,B00000000,B00000000,B00000000};
byte B[] = { B00011000,B00100100,B01011010,B01011010,B10000001,B10011001,B10000001,B01111110};


void setup() {
  pinMode(pinButton, INPUT); //Déclare le bouton On comme une entrée
  pinMode(pinButton2, INPUT); //Déclare le bouton Off comme une entrée
  pinMode(pwm_a, OUTPUT);  //Declare la vitesse du moteur comme une sortie
  pinMode(dir_a, OUTPUT);  //Declare la direction du moteur comme une sortie
 pinMode(detectV,INPUT_PULLUP);  //capteur, entrée
  pinMode(LEDV,OUTPUT); //led, sortie
  pinMode(detectR,INPUT_PULLUP);  //capteur, entrée
  Serial.begin(9600);
  Serial.println("En attente de passage...");
  Serial.println("La distance initialisée entre les deux capteurs est de ");
  Serial.print(distance);
  Serial.print(" mm");

}

void Attention() {

  lc.setRow(0,0,A[0]);
 lc.setRow(0,1,A[1]);
 lc.setRow(0,2,A[2]);
 lc.setRow(0,3,A[3]);
 lc.setRow(0,4,A[4]);
 lc.setRow(0,5,A[5]);
 lc.setRow(0,6,A[6]);
 lc.setRow(0,7,A[7]);
 delay(3000);

 
}

 void set_unit(byte number_of_unit){
  lc.shutdown(number_of_unit-1,false);
  lc.setIntensity(number_of_unit-1,1);
  lc.clearDisplay(number_of_unit-1);
  
}


void loop() {

  
       
   stateButtonOn = digitalRead(pinButton); //Controle l'etat du bouton On
  if(stateButtonOn == HIGH) { //Si il est pressé
    if(stateMOT == 1){ //Si le moteur est allumé
      if (Serial.available()) {
    Data = Serial.read();   
    analogWrite(pwm_a,Data);
   
       }

       analogWrite(pwm_a,Data); //On ne change rien

    }
    }
    if(stateMOT == 0){ //Si le moteur est eteint
      if (Serial.available()) {
    Data = Serial.read();   
    analogWrite(pwm_a,Data);
   
       }

       analogWrite(pwm_a,Data); //On allume le moteur
      stateMOT = 1; //On change l'etat du moteur à Allumé

    }
     
  
   if(stateButtonOn == LOW) { //Si il n'est pas pressé (Bouton ON)
    if(stateMOT == 1){ //Si le moteur est allumé
      if (Serial.available()) {
    Data = Serial.read();   
    analogWrite(pwm_a,Data);
   
       }

       analogWrite(pwm_a,Data); //On ne change rien

    }
    if(stateMOT == 0){ //Si le moteur est éteint
       analogWrite(pwm_a,0); //On ne change rien
    }
     
  }

   stateButtonOff = digitalRead(pinButton2); //Controle de l'etat du bouton Off
   if(stateButtonOff == HIGH) { //Si il est pressé
    if(stateMOT == 1){ //Si le moteur est allumé
       analogWrite(pwm_a,0); //On eteint le moteur
      stateMOT = 0;//On change l'etat du moteur à Eteint
    }
    if(stateMOT == 0){//Si le moteur est eteint 
       analogWrite(pwm_a,0);//On ne change rien
    }
     
  }
  if(stateButtonOff == LOW) { //Si il n'est pas pressé (Bouton OFF)
    if(stateMOT == 1){//Si le moteur est allumé 
      if (Serial.available()) {
    Data = Serial.read();   
    analogWrite(pwm_a,Data);
   
       }

      analogWrite(pwm_a,Data);//On ne change rien

    }
    if(stateMOT == 0){//Si le moteur est éteint
       analogWrite(pwm_a,0);//On ne change rien
    }
     
  }
  
  
  etatdetectV = digitalRead(detectV);  //On affecte à la varialble etatdetect la valeur de detectV
etatdetectR = digitalRead(detectR); //On affecte à la varialble etatdetect la valeur de detectR

  
if (etatdetectV == LOW)  //si le détection
{

tempsDebut=millis();
Serial.println(" Top depart");
delay(500);
    }
    else      //sinon
{

}

if (etatdetectR == LOW) //si le détection
{
detection=HIGH;   

tempsFin = millis();
Serial.println(" Top final");

    }
    else      //sinon
{

}
if (detection ==HIGH)
  {


float dt = (float)( (float)tempsFin - (float)tempsDebut) / 1000. ;
float vitesse = (float)distance/(float)dt;
if ((float)vitesse>50){
   Attention();
   for(byte i=1;i<6;i++)
{
  set_unit(i);

  
}
}

float VKMN = 0.0;       // Variable vitesse en N
VKMN = ((float)vitesse * 160.0); 

      Serial.println("La temps est de: ");
      Serial.print((float)dt);
  Serial.print("La vitesse est de:  ");

  
  Serial.print((float)vitesse);
  Serial.println(" mm/s");
  Serial.print("La vitesse à l'echelle N est de: ");
  Serial.print(((float)VKMN)/1000*3.6);
  Serial.println(" km/h");
  
  delay(1000);

  
  detection=LOW;

  }




}

Seulement, quand je modifie la valeur sur mon téléphone le moteur fait de plus en plus de bruit mais ne tourne pas comme si quelque chose le bloquait. De plus, le bouton off ne fonctionne que quand on reste appuyé et je voudrais que si le bouton ON n'est pas enclenché les valeurs données par l'appli ne s'affectent pas au moteur

J'essaye en vain depuis cette après-midi mais je n'y arrive pas...

Merci bcp de votre patience

quand je modifie la valeur sur mon téléphone le moteur fait de plus en plus de bruit

Le déplacement du curseur a donc maintenant un effet...ça avance

Les messages épinglés en tête de forum....encore eux.....précisent que pour avoir de l'aide il faut décrire complètement son montage (hard et soft)
¨
Pour l'instant c'est le 'blackout' sur l'interfaçage entre carte Arduino et moteur et aussi pour ce qui concerne l'alimentation du moteur.

La notice du moteur, téléchargeable sur le site TETRIX (l'avez vous consultée ?) indique entre autres : la tension d'alimentation , le courant à vide et le courant maxi. Votre montage répond-il aux besoins du moteur?

moteur.jpg

Alors,

Mon montage comporte
-deux paires de capteurs IR (reliés à A5 et à A0) pour mesurer une vitesse d'un objet fixé sur une courroie entrainée par le moteur
-Une matrice pour afficher un "!" si la vitesse est trop rapide (reliée à 8,9,10)
-Le moteur fixée sur une carte sparkfun (utilise les pins 12 pour la direction et 3 pour la vitesse) qui supporte une alim 12V apportée par un générateur externe

  • Deux boutons poussoirs (1 ON, 1 OFF) aux pins 2 et 5

Et donc un recepteur bluetooth HC-05 relié en 3.5V et aux pins 0 et 1 (TX et RX)

L'appli ,elle, se perésente sous cette forme:

Merci

Quelle carte Sparkfun !!

Les alimentations de laboratoire du type de celle utilisée sont dotées d'un réglage du courant maxi ?
ce réglage permet-il d'atteindre 1 ou 2A ? (au moment de la prise de vue le courant est nul, le moteur était peut être à l'arrêt)

La carte sparkfun :

Oui elles le permettent. Je ne pense pas que le problème vienne de l'alimentation car quand je televerse mon programme de base sans BT tout marche le moteur la matrice les boutons le calcul de la vitesse etc....

. Je ne pense pas que le problème vienne de l'alimentation car quand je televerse mon programme de base sans BT tout marche le moteur la matrice les boutons le calcul de la vitesse etc....

C'est important à préciser !!

Il. faut donc voir de plus près les valeurs de consigne de vitesse reçues via le BT
insérez un affichage de la variable Data entre ces deux lignes .... Data n'a peut être pas la valeur souhaitée....

    Data = Serial.read();   
    analogWrite(pwm_a,Data);

Etudiez aussi la syntaxe d' analogWrite() pour voir la plage de réglage.

Bon travail ! pour ma part je vais décrocher ce soir....

Oui c'est un code qui marche parfaitement mais sur lequel je ne peux pas modifier la vitesse à part en modifiant la tension delivrée par le générateur

al1fch:
C'est important à préciser !!
Il. faut donc voir de près les valeurs de consigne de vitesse reçues via le BT

Bon travail ! pour ma part je vais décrocher ce soir....

Ok pas de problème, serez vous dispo demain ?
merci de votre patience.

PS: J'avais deja essayer d'afficher cette valeur de Data et elle prend bien la valeur voulue :confused:

J'avais deja essayer d'afficher cette valeur de Data et elle prend bien la valeur voulue :

Quelle est la plus grande valeur possible dans l'application actuelle du smartphone , curseur à fond ?

Si cette valeur maxi est bien réceptionnée en BT quel sera la conséquence sur le moteur ?
Pour cela il faut évaluer, curseur à fond, le rapport cyclique du signal sortant en broche 3 et la tension moyenne aux bornes du moteur dans ce cas (curseur à fond).
Le moteur peut-il tourner ?

La lecture de cette page peut aider a comprendre plus à fond la PWM

Bonjour,

la valeur maximale sur l'appli est 255.

on se retrouve donc avec une consigne du style analogWrite(pwm_a, 2255);

Cela peut il marcher?

Un affichage de 'Data' entre les deux lignes suivantes confirme-t-il la réception de la valeur 255 ?

Data = Serial.read();   
    analogWrite(pwm_a,Data);

Si Data , reçu du BT et utilisée en paramètre dans analogWrite() vaut réellement 255 et si la carte d'interface moteur est bien utilisée et fonctionne bien le moteur doit alors avoir à ses bornes, une tension de 12V, est-ce bien le cas ?
Un multimètre est-il disponible pour s'en assurer ?

Je n'ai pas de multimetre mais je suis quasiment sur que la tension est bien 12V

j'ai essayé de faire fonctionner ce code :

int Data;
int SortiePWM=3;
int dir_a = 12;  //La direction du moteur se controle via la broche 12
 
void setup() {
  Serial.begin(9600);
  pinMode(SortiePWM, OUTPUT);
  pinMode(dir_a, OUTPUT);  //Declare la direction du moteur comme une sortie
}
 
void loop() {
  if (Serial.available()) {
    Data= Serial.read();   
    Serial.println(Data);
    analogWrite(SortiePWM,Data);
    
  }
}

pour voir d'où venait le problème.

Quand j’exécute ce code, lorsque Data = 0 le moteur ne fait aucun bruit il est arrêté et tant que 0 > data < 100 un bruit apparaît et devient de plus en plus aigu comme hier. Ici par contre, le moteur commence à tourner à partir de Data = 100 et accélère jusqu'à 255 comme voulu....

Parfait !!

Donc avec ce code de test :

curseur à fond -> liaison BT -> signal PWM -> carte moteur -> vitesse moteur, tout est OK ?

c'est bien ça ?