Faire varier un rapport cyclique avec un compteur

Je dois faire varier le rapport cyclique d'un moteur a l'ai de boutons de telecommandes (bouton poussoirs)
j'ai fais ce programme mais lorsque j'essaye de voir sur un oscilloscope le rapport cyclique ca ne ressemble a rien et le bouton ne fais rien .pouvez vous m'aider? =(
merci d'avance

const int moteur1 = 9;//broches uilisées
const int moteur2 = 10;
const int  buttonPin = 7;     // crée un identifiant pour la broche utilisée avec le bouton poussoir
// Les variables sont modifiées au cours du programme
int buttonPushCounter = 0;   // variable pour le comptage du nombre d'appuis sur le bouton poussoir
int buttonState = 0;         //Variable pour l'état actuel du bouton poussoir
int lastButtonState = 0;     // Variable pour l'état précédent du bouton poussoir


void setup()
{
  //definition des broches en sortie
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(buttonPin, INPUT);  

}
void loop ()
{
  // lit l'état actuel du bouton poussoir et le mémorise dans la variable
  buttonState = digitalRead(buttonPin);

  // compare l'état actuel du bouton poussoir à l'état précédent mémorisé
  if (buttonState!=lastButtonState)
   { 
   
    // si l'état du bouton poussoir a changé et est HAUT, on incrémente la variable de comptage
    if (buttonState == HIGH) {
      // si l'état actuel du bouton est HAUT
      // il est passé de BAS  à HAUT
      buttonPushCounter++;
    }


    //mémorise l'état courant du bouton poussoir
    //pour les prochains passages dans la boucle loop
    lastButtonState = buttonState;
    
   }
  if(buttonPushCounter < 0) buttonPushCounter =0;
  if(buttonPushCounter > 10) buttonPushCounter =10;
}
void moteur()
{
     if(buttonPushCounter % 1 == 0)
    {
      analogWrite(9, 0);
    }
      if(buttonPushCounter % 1 == 1)
    {
      analogWrite(9, 32.5);
    }
      if(buttonPushCounter % 1 == 2)
    {
      analogWrite(9, 37.5);
    }
      if(buttonPushCounter % 1 == 3)
    {
      analogWrite(9, 47.5);
    }
      if(buttonPushCounter % 1 == 4)
    {
      analogWrite(9, 67.5);
    }
      if(buttonPushCounter % 1 == 5)
    {
      analogWrite(9, 75);
    }
      if(buttonPushCounter % 1 == 6)
    {
      analogWrite(9, 87.5);
    }
      if(buttonPushCounter % 1 == 7)
    {
      analogWrite(9, 95);
    }
      if(buttonPushCounter % 1 == 8)
    {
      analogWrite(9, 122.5);
    }
      if(buttonPushCounter % 1 == 9)
    {
      analogWrite(9, 135);
    }
      if(buttonPushCounter % 1 == 10)
    {
      analogWrite(9, 147.5);
    }
}

Bonjour,

Il ne semble pas y avoir de gestion de l'anti-rebonds du bouton côté logiciel, cette opération est-elle bien réalisée côté matériel ?

darkkrayt:
lorsque j'essaye de voir sur un oscilloscope le rapport cyclique ca ne ressemble a rien

Merci de décrire un petit peu plus précisément « ça ressemble à rien ».

if(buttonPushCounter % 1 == 3) {...}

Qu'est-ce que tu imagines faire avec ces lignes, et en particulier qu'est-ce-qui t'as amené à faire un modulo 1 ? Pour info, le résultat de buttonPushCounter % 1 est toujours zéro, quel que soit la valeur de buttonPushCounter...

J'aurais également plutôt utilisé un "Switch...Case" que des "IF" en cascade...

D'autre part pour moi ce test ne sert pas:

if(buttonPushCounter < 0) buttonPushCounter =0;

Car si j'ai bien compris tu n'as qu'un seul bouton qui incrémente et tu initialise ta variable à 0.

Le moteur 2 sur le pin 10 n'est pas utilisé?

Serial.Print(buttonPushCounter); permeterait de voir ce qui se passe à l'écran :slight_smile:

j'ai revu mon branchement et il y avais un probleme .. donc l'oscillo affiche un signal a 0 meme quand j'appui sur le bouton.
merci pour les %1 je ne savais pas j'ai commencer a programmer il y a 2 semaines ^^'....
le moteur 2 sera utilisé aprés que j'arrive a faire marcher celui la
en theorie je dois avoir deux bouton pour incrémenter et deux autres pour décrementer.(2 pour la frequence de tir et 2 autres pour la vitesse de tir)
ps: c'est un robot qui envoi des balles de ping pong
et un moteur pour la vitesse et l'autre pour la fréquence.
j'ai essayer le switch case mais j'ai remplacé par des if car je croyais que c'etait ca qui bloquait.Mais je pense a peut etre le remmettre cela fais plus propre.

Mon code un peut plus propre en mettant le switch

const int moteur1 = 9;//broches uilisées
const int moteur2 = 10;
const int  buttonPin = 7;     // crée un identifiant pour la broche utilisée avec le bouton poussoir
// Les variables sont modifiées au cours du programme
int buttonPushCounter = 0;   // variable pour le comptage du nombre d'appuis sur le bouton poussoir
int buttonState = 0;         //Variable pour l'état actuel du bouton poussoir
int lastButtonState = 0;     // Variable pour l'état précédent du bouton poussoir


void setup()
{
  //definition des broches en sortie
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(buttonPin, INPUT);  

}
void loop ()
{
  // lit l'état actuel du bouton poussoir et le mémorise dans la variable
  buttonState = digitalRead(buttonPin);

  // compare l'état actuel du bouton poussoir à l'état précédent mémorisé
  if (buttonState!=lastButtonState)
   { 
   
    // si l'état du bouton poussoir a changé et est HAUT, on incrémente la variable de comptage
    if (buttonState == HIGH) {
      // si l'état actuel du bouton est HAUT
      // il est passé de BAS  à HAUT
      buttonPushCounter++;
      delay (20);
      // affiche les messages sur le PC
      Serial.println("APPUI"); 
      Serial.print("nombre d'appuis:  ");
      Serial.println(buttonPushCounter, DEC); // affiche la valeur au format décimal
    }
    else {
      // si le bouton courant est BAS
      // il est passé de HAUT à BAS :
      Serial.println("PAS D'APPUI");
    }


    //mémorise l'état courant du bouton poussoir
    //pour les prochains passages dans la boucle loop
    lastButtonState = buttonState;
    
   }
  if(buttonPushCounter < 0) buttonPushCounter =0;
  if(buttonPushCounter > 10) buttonPushCounter =10;



switch (buttonPushCounter)
{
      case 1:
      analogWrite(9, 32.5);
    
      case 2:
      analogWrite(9, 37.5);
    
      case 3:
      analogWrite(9, 47.5);
  
      case 4:
      analogWrite(9, 67.5);
    
      case 5:
      analogWrite(9, 75);
    
      case 6:
      analogWrite(9, 87.5);
    
      case 7:
      analogWrite(9, 95);
    
      case 8:
      analogWrite(9, 122.5);
    
      case 9:
      analogWrite(9, 135);
      
      case 10:
      analogWrite(9, 147.5);
    
      default:
      analogWrite(9, 0);
      break;
    } 
}

darkkrayt:

switch (buttonPushCounter)

{
     case 1:
     analogWrite(9, 32.5);
   
     case 2:
     analogWrite(9, 37.5);
   
     case 3:
     analogWrite(9, 47.5);
 
     case 4:
     analogWrite(9, 67.5);
   }
}

Il te faut une instruction break; à la fin de chaque « case », sinon tous les blocs situés au-dessous sont exécutés à chaque fois, et donc cela finit toujours par analogWrite(9, 0);

Ex:

switch (buttonPushCounter)
{
      case 1:
        analogWrite(9, 32.5);
        break;    
      case 2:
        analogWrite(9, 37.5);
        break;    
      case 3:
        analogWrite(9, 47.5);
        break;    
      case 4:
      analogWrite(9, 67.5);
        break;    
    } 
}

merci beaucoup j'ai enfin mon rapport cyclique ! mais j'ai des rebons quand je relache le bouton.. j'ai mis un delay de 100 ms apres l'incrementation pour ne pas avoir de rebond a l'appui mais pour le relachement je ne voit pas...

buttonPushCounter++;
      delay (100);

Ben faut changer de doigts, je vois pas d'autre solution :grin:

http://fr.openclassrooms.com/sciences/cours/arduino-pour-bien-commencer-en-electronique-et-en-programmation/qu-est-ce-qu-un-bouton

Petit up :smiley:
j'ai enfin reussi a faire marche le programme mais je n'arrive pas a mettre une decrementation en meme temps....
j'ai fais ca pour le moment :

const int moteurV = 9;//broches uilisées
const int moteurF = 10;
const int buttonPinVplus = 7; 
const int buttonPinVmoin = 8;// crée un identifiant pour la broche utilisée avec le bouton poussoir
// Les variables sont modifiées au cours du programme
int buttonPushCounterV = 0;   // variable pour le comptage du nombre d'appuis sur le bouton poussoir
int buttonStateVplus = 0;         //Variable pour l'état actuel du bouton poussoir
int lastButtonStateVplus = 0;     // Variable pour l'état précédent du bouton poussoir
int buttonStateVmoin = 0;
int lastButtonStateVmoin = 0;
void setup()
{
  //definition des broches en sortie
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(buttonPinVplus, INPUT);
  pinMode(buttonPinVmoin, INPUT);  

}
void loop ()
{
  // lit l'état actuel du bouton poussoir et le mémorise dans la variable
  buttonStateVplus = digitalRead(buttonPinVplus);
  buttonStateVmoin = digitalRead(buttonPinVmoin);
  
  if(buttonStateVmoin!=lastButtonStateVmoin)
  {
    if (buttonStateVmoin ==HIGH)
    { buttonPushCounterV--;
    delay(100);
    lastButtonStateVmoin = buttonStateVmoin;
    }
  // compare l'état actuel du bouton poussoir à l'état précédent mémorisé
  if (buttonStateVplus!=lastButtonStateVplus)
   { 
   
    // si l'état du bouton poussoir a changé et est HAUT, on incrémente la variable de comptage
    if (buttonStateVplus == HIGH) {
      // si l'état actuel du bouton est HAUT
      // il est passé de BAS  à HAUT
      buttonPushCounterV++;
      delay (100);
  
    //mémorise l'état courant du bouton poussoir
    //pour les prochains passages dans la boucle loop
    lastButtonStateVplus = buttonStateVplus;
   
   }
   }
   }
  if(buttonPushCounterV < 0) buttonPushCounterV =0;
  if(buttonPushCounterV > 10) buttonPushCounterV =10;
  

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
switch (buttonPushCounterV)
{
      case 1:
      analogWrite(9, 33);
      break;
    
      case 2:
      analogWrite(9, 38);
      break;
    
      case 3:
      analogWrite(9, 48);
      break;
  
      case 4:
      analogWrite(9, 68);
    
      case 5:
      analogWrite(9, 75);
      break;
    
      case 6:
      analogWrite(9, 88);
    
      case 7:
      analogWrite(9, 95);
      break;
    
      case 8:
      analogWrite(9, 123);
      break;
    
      case 9:
      analogWrite(9, 135);
      break;
      
      case 10:
      analogWrite(9, 148);
      break;
    
      default:
      analogWrite(9, 0);
      break;
    } 
}