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);
}
}
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'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.
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;
}
}
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...
Petit up
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;
}
}