Bonjours à tous, nous sommes un groupe de terminale S-SI et nous revenons vers le forum, car nous rencontrons un problème avec la programmation de notre aduino uno pour notre porjet de terminale .
Notre projet consiste à commander 2 groupes de 2 moteurs par le moniteur série (liaison direct) dans un premier temps puis par la suite par avec une liaison radio en utlisant toujours le moniteur séries et un émetteur et recepteur 433 Hz.
Cependant, le problème que nous rencontrons actuellement est que nous n'arrivons pas a commander de manière continue les moteurs. L'idée est que nous voulions au départ était: lorsque qu'on reste appuyé sur, par exemple la touche "Z" le robot avance, donc un groupe de moteur tourne "en avant/sens indirect" et puis l'autre groupe symetriqument opposé tourne en "arrière/sens direct" et dès qu'on relache la touche, le moteurs s'arrête.
Mais les moteurs ne fonctionnent que durant un laps de temps puis il s'arrete par la suite. =(
On demande votre aide car nous ne comprenons pas notre problème et nous tournons en rond malheureusment
Bonjour,
Il vaudrait mieux utiliser un contact type bouton poussoir car le clavier ne réalise qu'un envoi momentané.
Tu envois la touche 'Z', le code l’interprète, tu lance ta fonction et ça s'arrête car tu as relâché le clavier.
Sinon il faudrait que tu envoie en boucle le caractère en question pour que le programme puisse valider la condition VRAI à chaque fois.
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (buttonState == HIGH) {
// turn LED on:
digitalWrite(ledPin, HIGH);
}
else {
// turn LED off:
digitalWrite(ledPin, LOW);
}
Il faut mémoriser avec un flag le fait qu'on a appuyé sur la touche pour avancer, et tant qu'on n'a pas appuyé sur autre chose, faire une boucle qui répète l'action sur les moteurs.
Le soucis c'est que nous avons critères des depart et nous voudrons car l'idée de piloter le robot depuis le moniteur série..
Christian_R:
Il faut mémoriser avec un flag le fait qu'on a appuyé sur la touche pour avancer, et tant qu'on n'a pas appuyé sur autre chose, faire une boucle qui répète l'action sur les moteurs.
Nous avons trouvé comment faire un flag.
Mais nous avons toujours le même problème, c'est a dire que lorsque l'on appuie sur une autre touche de "Z" pour avancer par exemple, les moteurs continuent à avancer et on reste dans la boucle qui a mémoriser la valeur de la variable binaire sans pouvoir changer la valeur de la variable binaire (on a une boucle infini :~ )
Je vous remet le code avec la variable:
et nous avons les erreurs suivantes: _2.ino: In function 'void loop()': _2:38: error: case label does not reduce to an integer constant _2:54: error: case label does not reduce to an integer constant
Nous avons essayer de chercher sur internet ce que cela signifiait et on pense que les constantes ne peuvent pas être compiler.
Comment utiliser un switch en disant lorsque l'on appuie sur "Z", les moteurs avancent.. Lorsque on appuies "S", les moteurs reculent..
Faut-il définir toutes les touches de commande comme variables dès le début du programme ?
Veuillez nous excuser d'avance pour toute ces questions qui peuvent surement être idiotes, mais nous somme bloqués et nous aimerions bien avancer tout en apprenant
Bonjour tous le monde, nous avons modifié le code comme vous nous l'avez suggéré.
Le problème c'est qu'avec le switch le programme ne fonctionne plus :~
case Z //puisque Z est la touche correspond a la touche qui permette "d'avancer"
case S // correspond a la touche permettant de "reculer"
et nous avons l'erreur suivante:
_2.ino: In function 'void loop()':
_2:41: error: 'Z' cannot appear in a constant-expression
_2:59: error: 'S' cannot appear in a constant-expression
Nous comprenons pas très bien l'erreur en elle-même seulement nous pensons que la variables Z et S ne peuvent pas être considérées comme une condition ?
Qu'est ce que nous avons loupé pour que notre programme fonctionne s'il vous plait ?