Aujourd'hui, je travaille sur un projet de lanceur de balles de ping pong automatique. Pour cela, j'ai 3 capteurs (Gauche, Milieu et Droite). Les trois capteurs sont branchés sur l'arduino aux ports respectifs A0,A1 et A2. Une LED d'alarme est sur le port 13.Le servo au port 9.
J'ai donc fait le code suivant :
//Les libraries
#include <Servo.h>;
//Les variables
unsigned cap_g = A0;
unsigned cap_m = A1;
unsigned cap_d = A2;
Servo servo_y;
int port_servo=9;
int valcap_g=230;
int valcap_m=0;
int valcap_d=230;
int pos_choisie=0;
int led=13;
int pos_servo=0;
//Boucle setup
void setup (){
servo_y.attach(9);
servo_y.write(15);
Serial.begin(9600);
}
void loop () {
//CAPTEURS
valcap_g=analogRead(cap_g);
valcap_m=analogRead(cap_m);
valcap_d=analogRead(cap_d);
if (valcap_g<550 && valcap_g>190){ //Cap G allmué
if (valcap_m<550 && valcap_m>190){ //Cap M allumé
if (valcap_d<550 && valcap_d>190){ //Cap D allumé
digitalWrite(led,HIGH); //BUG
}
else{
pos_choisie = 3; //Cap D éteint
}
}
else { //LIGNE 34
if (valcap_d<550 && valcap_d>190){
pos_choisie=2; //Cap M éteint
}
else {
pos_choisie=random(2,4);
}
}
}
else{
if (valcap_m<550 && valcap_m>190){ //Cap M allumé
if (valcap_d<550 && valcap_d>190){ //Cap D allumé
pos_choisie=1;
}
else{
pos_choisie=random(1,4);
while (pos_choisie==2){
pos_choisie=random(1,4);
}
}
}
else {
if (valcap_d<550 && valcap_d>190){
pos_choisie=random(1,3);
}
}
}
//DEPLACEMENT PAR LE SERVO
if (pos_choisie=1){
servo_y.write(0);
}
if (pos_choisie=2){
servo_y.write(15);
}
if (pos_choisie=3){
servo_y.write(30);
}
//DEBEUGUAGE
Serial.println(valcap_g);
Serial.println(valcap_m);
Serial.println(valcap_d);
Serial.println(pos_choisie);
//REMISE A ZERO
pos_choisie=0;
//DELAI
delay(2000);
}
Ici se pose le problème: le code renvoie toujours "3" pour pos_choisie, même en faisant varier manuellement les valeurs des capteurs...
bah il fait exactement ce que tu lui dis de faire.
essaie déjà de faire les choses en 2 fonctions distinctes, à savoir des fonctions que tu vas coder à part, et appeler proprement dans la boucle loop: capture, bougerServo.
donc tu auras au moins une fonction "capture", qui te retournera une position, sous une forme qui te plait. (perso j'aurais pris un int, ou un byte, et j'aurais mis 1 c'est gauche, 2 c'est milieu, 3 c'est droite, et tout le reste génère une erreur dans une fonction plus loin, et tout à la fin de la boucle je le réinitialiserais à 0). et j'essaierai à tout prix, vu le nombre de capteurs, de bricoler un truc pour avoir des if simples, voire un switch.
pour la fonction qui fait tourner le servo, pareil, une donnée en entrée, et un switch en fonction de cette donnée, c'est plus propre que des if then else empilés.
question peut-être idiote, c'est quoi tes 3 capteurs? non parce que si ça se trouve y'a encore moyen de rendre encore plus facile le code, donc je pose les questions, tu m'en veux pas, hein?
Oui, je sais que cela a un sens (je m'en sert d'ailleurs de temps en temps)
Mais tel que son code est actuellement, le compilateur devrait au moins générer un warning : warning: suggest parentheses around assignment used as truth value
Et avec l'option -Werror, il devrait même refuser de compiler en générant une erreur.
dans le doute, j'ai testé, pour voir, et effectivement, le compilateur intégré à l'IDE arduino ne génère pas de warning (et encore moins d'erreur) pour ça, et le niveau de warning-error n'est pas réglable.
Merci à vous. Les erreurs ont été corrigées, le code fonctionne à peu près normalement sauf que maintenant, il s'agit de traiter le déplacement du servo.
Le code est maintenant le suivant:
//Les libraries
#include <Servo.h>;
//Les variables
unsigned cap_g = A0;
unsigned cap_m = A1;
unsigned cap_d = A2;
Servo servo_y;
int port_servo=9;
int valcap_g=230;
int valcap_m=0;
int valcap_d=230;
int pos_choisie=0;
int led=13;
int pos_servo=0;
int pos=0;
//Boucle setup
void setup (){
servo_y.attach(9);
servo_y.write(15);
Serial.begin(9600);
}
void loop () {
/*
//CAPTEURS
//valcap_g=analogRead(cap_g);
//valcap_m=analogRead(cap_m);
//valcap_d=analogRead(cap_d);
if (valcap_g<550 && valcap_g>190 && valcap_m<550 && valcap_m>190 && valcap_d<550 && valcap_d>190){
digitalWrite(led,HIGH);
}
else if (valcap_g<550 && valcap_g>190 && valcap_m<550 && valcap_m>190){
pos_choisie=3;
}
else if (valcap_g<550 && valcap_g>190 && valcap_d<550 && valcap_d>190){
pos_choisie=2;
}
else if (valcap_m<550 && valcap_m>190 && valcap_d<550 && valcap_d>190){
pos_choisie=8;
}
else if (valcap_d<550 && valcap_d>190){
pos_choisie=4;
}
else if (valcap_g<550 && valcap_g>190){
pos_choisie=5;
}
else if (valcap_m<550 && valcap_m>190){
pos_choisie=6;
//while (pos_choisie==2){
// pos_choisie=random(1,4);
//}
}*/
pos_choisie=random(1,4);
//CONVERSION DES VARIABLES
if (pos_choisie==1){
pos=1;
}
else if (pos_choisie==2){
pos=15;
}
else if (pos_choisie==3){
pos=30;
}
//DEPLACEMENT DU SERVO
while (pos_servo < pos){
pos_servo+=1;
servo_y.write(pos_servo);
delay(15);
}
while (pos_servo > pos){
pos_servo-=1;
servo_y.write(pos_servo);
delay(15);
}
pos_servo=pos;
//DEBEUGAGE
//Serial.println(valcap_g);
//Serial.println(valcap_m);
//Serial.println(valcap_d);
//Serial.println(pos_choisie);
//Serial.println(pos);
//Serial.println(pos_servo);
//DELAI
delay(2000);
//REMISE A ZERO
pos_choisie=0;
}
Le servo se décale de quelques degrés (une dizaine) lorsqu'on passe de la position 3 à 2 ou de 2 à 3. Le problème, c'est qu'on a aucun mouvement lorsque la position 1 est choisie (s'il est sur la 3 et qu'il choisit 1, il se mets sur la 2), et on aimerait qu'il se décale de 15°. Problème résolu.
Cependant, un autre problème se présente... Lorsque tout est branché sur la carte Arduino (les capteurs et le servo), les capteurs donnent des valeurs complètement abérantes, et le servo ne bouge pas. Je suis sûr que les capteurs marchent ainsi que le servo. Cela peut-il venir du fait qu'on ait pas une alimentaion assez puissante ?
Cependant, un autre problème se présente... Lorsque tout est branché sur la carte Arduino (les capteurs et le servo), les capteurs donnent des valeurs complètement abérantes, et le servo ne bouge pas. Je suis sûr que les capteurs marchent ainsi que le servo. Cela peut-il venir du fait qu'on ait pas une alimentaion assez puissante ?
Une alimentation insuffisante peut effectivement provoquer ce genre d'anomalie. Le mieux serait de mesurer la tension pour voir si ça baisse. Il faut aussi examiner les raccordements, qui peuvent aussi introduire des tensions parasites si ce n'est pas bien fait. Un petit schéma fidèle à la réalisation peut permettre de voir si tout semble monté correctement.
- Edité par clgbzh 14 mars 2015 à 10:11:48
[Arduino] Le programme renvoie toujours pareil...
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
oui. non. enfin je regarde et je te dis.
oui. non. enfin je regarde et je te dis.
oui. non. enfin je regarde et je te dis.
oui. non. enfin je regarde et je te dis.