Utilisation Switch / case

Bonjour à tous,

Je suis actuellement en Terminale STI2D SIN et nous avons un projet pour la fin de l'année scolaire.
Je tiens a dire que je ne suis qu'un débutant en programmation, mais ce domaine m’intéresse beaucoup.
Mon projet est de programmer une pince en aluminium possédant 2 servos moteurs ainsi qu'un châssis à chenille.
Le type de carte est une arduino Romeo, reconnu par l'ordinateur sous le nom de Leonardo.
Mon objectif est de, suivant le numéro que j'entre dans le moniteur série du logiciel, que la pince fasse un mouvement spécifique.

Je m'explique :

Si j'entre le numéro 2, le châssis avance pendant 2 secondes , la pince s'ouvre puis se referme en prennant l'objet, le chassis recule pendant 2 secondes.
Si j'entre le numéro 5, le châssis avance pendant 4 secondes, il tourne à gauche, la pince s'ouvre puis se referme en prennant l'objet, le châssis recule à droite puis recule en ligne droite.
Mon problème avec le programme ci dessous, c'est que pour n'importe quel numéro entré, le chassis ne cesse d'avancer.

Voila le programme en cours ( ce n'est qu'un test avec marche arrière / avant ) :

int speed = 100; // Vitesse 
int E1 = 5; 
int E2 = 6;
int M1 = 4; 
int M2 = 7;

void avancer()
{
analogWrite (E2, speed);
digitalWrite(M2,HIGH);
analogWrite (E1, speed);
digitalWrite(M1,HIGH);
}
void reculer()
{
analogWrite (E2, speed);
digitalWrite(M2,LOW);
analogWrite (E1, speed);
digitalWrite(M1,LOW);
}

void setup(void)
{
int i;
for(i=6;i<=9;i++)
pinMode(i, OUTPUT);
Serial.begin(19200); // Configurer le baud
}

void loop()
{
  if (Serial.available() > 0)
  {
char reference = Serial.read();
switch (reference) {
    case 1: //si le message est "1"
        avancer();
        break;
    case 2: //si le message est "2"
        reculer();
        break;
    }
  }
}

Les liens :

La pince : Pince en Aluminium (avec Servomoteurs) Dagu
Le chassis : Kit Robot Rover 5 2WD

Merci à vous.

Bonjour,
Il faut peut être mettre la variable reference = 0 à la sortie du switch si non tu boucles

Salut,

La transmission série se faisant en ASCII par le moniteur Arduino, tu ne reçois pas 1, mais le caractère 1, soit 49 en décimal

De plus ton code ne prévois pas les autres cas. C'est pour celà qu'en général en plus des case que tu souhaites, tu dois définir un default. Au final ça donnerait :

if (Serial.available() > 0)
  {
char reference = Serial.read();
switch (reference) {
    case '1': //si le message est "1" <=> équivalent à "case 49 :"
        avancer();
        break;
    case '2': //si le message est "2" <=> équivalent à "case 50 :"
        reculer();
        break;
  default:
    // code à exécuter si mauvaise commande par exemple:
Serial.print("Commande inconnue !");
  break;
    }
  }

Merci d'avoir répondu si vite. Je test ça plus tard. Je vous tiendrez au courant.

B@tto:
La transmission série se faisant en ASCII par le moniteur Arduino, tu ne reçois pas 1, mais le caractère 1, soit 49 en décimal

d'ailleurs il me semble que le switch case ne peut etre fait que sur des entiers, y'a pas eu un warning de ton compilo ?

juke:

B@tto:
La transmission série se faisant en ASCII par le moniteur Arduino, tu ne reçois pas 1, mais le caractère 1, soit 49 en décimal

juke:
d'ailleurs il me semble que le switch case ne peut etre fait que sur des entiers,

Oui c'est ça

juke:
y'a pas eu un warning de ton compilo ?

Bah non, 1 est un entier :slight_smile:
Sauf qu'ici il le case était 1 alors qu'en réalité ce qui était reçu était 49 donc la condition ne pouvait être validée

B@tto:
Bah non, 1 est un entier :slight_smile:
Sauf qu'ici il le case était 1 alors qu'en réalité ce qui était reçu était 49 donc la condition ne pouvait être validée

ha oui bien vu.

Etant donné que la commande n'était pas reconnu, rien n'aurait du bouger.
Il faudrait peut être se poser des questions sur l'initialisation de la commande des moteurs.
Dans le setup il n'y a rien à ce sujet. Mais peut être n'est-ce qu'une partie du code.

+1

for(i=6;i<=9;i++)
pinMode(i, OUTPUT);

devrait plutôt être

for(i=4;i<=7;i++)
pinMode(i, OUTPUT);

Le programme fonctionne comme il faut, quand je rentre le numéro 1 sur le moniteur série le chassis avance, et recule quand j'entre le numéro 2. Merci beaucoup pour votre aide.
P.S : J'ai donné tout le programme.