Aide besoin d'aide pour programmer un switch case

  • Auteur de la discussion zygo4619
  • Date de début
Z

zygo4619

Apprenti
Bonjour a tous,

Je me tourne vers vous pour peut etre trouver de l'aide

je me suis lancé dans un projet d'automatisation d'une scie a ruban automatique pour découper un modele de pièce bien particulier,
j'ai eu la possibilité de récupérer une vieille scie automatique, que j'ai modifié, tout fonctionne

j'ai mis dans l'armoire une carte arduino pour piloter la machine
j'ai réussi a programmer le mode manuel (appui sur bp monte, la lame monte, appui bp descend, ca descend, etc...)

En revanche, impossible de faire fonctionner le cycle automatique...... c'est un probleme d'écriture du programme et j'ai beau recommencer sans cesse, ça ne veut pas marcher

bref, si une bonne âme du site pouvait m'aiguiller sur mon programme, voir ce qui cloche, je lui en serait éternellement reconnaissant (ouais, rien que ca :supz:)

je joins mon programme (que la partie automatique, j'ai soigneusement mis a l'ombre la partie jog qui fonctionne), si quelqu'un peut y jeter un oeil et me donner quelques pistes.....

n'hésitez pas si vous avez des questions sur le fonctionnement voulu

voilà, en vous remerciant tous par avance, ci dessous, mon code :

/*Declaration variables systeme*/
const int BP_monte_lame = 13;
const int BP_baisse_lame = 12;
const int BP_rotation_0 = 11;
const int BP_rotation_90 = 10;
const int selecteur_mode_auto = 9;
const int moteur_lame = 8;
const int pompe_hydraulique = 7;
const int voyant_cycle = 6;
const int verin_montee_lame = 5;
const int verin_descente_lame = 4;
const int verin_rotation_0 = 3;
const int rotation_90 = 2;
const int mise_en_pression = 1;
const int selecteur_mode_manu = A0;
const int BP_depart_cycle = A1;
const int capteur_lame_basse = A2;
const int capteur_lame_haute = A3;
const int capteur_bol_90 = A4;
const int capteur_bol_0 = A5;
int etape;
int cycle_en_cours;
int mode_jog;



void setup()
/*Affectation des E/S ARDUINO*/
{
pinMode (BP_monte_lame, INPUT);
pinMode (BP_baisse_lame, INPUT);
pinMode (BP_rotation_0, INPUT);
pinMode (BP_rotation_90, INPUT);
pinMode (selecteur_mode_auto, INPUT);
pinMode (moteur_lame, OUTPUT);
pinMode (pompe_hydraulique, OUTPUT);
pinMode (mise_en_pression, OUTPUT);
pinMode (verin_montee_lame, OUTPUT);
pinMode (verin_descente_lame, OUTPUT);
pinMode (verin_rotation_0, OUTPUT);
pinMode (rotation_90, OUTPUT);
pinMode (voyant_cycle, OUTPUT);
pinMode (selecteur_mode_manu, INPUT);
pinMode (BP_depart_cycle, INPUT);
pinMode (capteur_lame_basse, INPUT);
pinMode (capteur_lame_haute, INPUT);
pinMode (capteur_bol_90, INPUT);
pinMode (capteur_bol_0, INPUT);
}

void loop()
{
/*selecteur en mode automatique*/
if ((digitalRead (selecteur_mode_auto) == HIGH)&&(digitalRead (BP_depart_cycle) == HIGH))
switch (etape)
{
/*-----------ETAPE 1-----------*/

case 0:

digitalWrite(mise_en_pression,HIGH);
digitalWrite(pompe_hydraulique,HIGH);
digitalWrite(verin_montee_lame,HIGH);

if (digitalRead ( capteur_lame_haute)==LOW)
{
etape=1;
}

break;

/*-----------ETAPE 2-----------*/
case 1:

digitalWrite(verin_montee_lame,LOW); /*stop montee lame*/
digitalWrite(verin_rotation_0,HIGH); /*rotation bol a 0*/

if (digitalRead ( capteur_bol_0)==HIGH)
{
etape=2;
}
break;

/*-----------ETAPE 3-----------*/
case 2:

digitalWrite(verin_rotation_0,HIGH); /*rotation 0 maintenue*/
digitalWrite(moteur_lame,HIGH); /*rotation bol a 0*/
digitalWrite (verin_descente_lame,HIGH); /*descente lame*/
if (digitalRead ( capteur_lame_basse)==HIGH)
{
etape=3;
}
break;

/*-----------ETAPE 4-----------*/
case 3:

digitalWrite(verin_rotation_0,HIGH); /*rotation 0 maintenue*/
digitalWrite(moteur_lame,LOW); /*arret lame*/
digitalWrite(verin_descente_lame,LOW); /*arret descente*/
digitalWrite (verin_montee_lame,HIGH); /*montée lame*/
if (digitalRead ( capteur_lame_haute)==HIGH)
{
etape=4;
}
break;

/*-----------ETAPE 5-----------*/
case 4:
digitalWrite(rotation_90,HIGH); /*rotation 90*/
digitalWrite(moteur_lame,LOW); /*arret lame maintenu*/
digitalWrite(verin_descente_lame,LOW); /*arret descente maintenu*/

if (digitalRead ( capteur_bol_90)==HIGH)
{
etape=5;
}
break;

/*-----------ETAPE 6-----------*/
case 5:
digitalWrite(rotation_90,HIGH); /*rotation 90 maintenue*/
digitalWrite(moteur_lame,HIGH); /*demarage lame*/
digitalWrite(verin_descente_lame,HIGH); /*demarage descente*/

if (digitalRead ( capteur_lame_basse)==HIGH) /*lame en bas*/
{
etape=6;
}
break;

/*-----------ETAPE 7-----------*/
case 6:
digitalWrite(rotation_90,HIGH); /*rotation 90 maintenue*/
digitalWrite(moteur_lame,LOW); /*arret lame*/
digitalWrite(verin_descente_lame,LOW); /*arret descente*/
digitalWrite (verin_montee_lame,HIGH); /*montée lame*/
if (digitalRead ( capteur_lame_haute)==HIGH)
{
etape=7;
}
break;

case 7:


{
digitalWrite(mise_en_pression,LOW);
digitalWrite(pompe_hydraulique,LOW);
etape=0;
}
break;

}

}
 
M

Mcar

Compagnon
la fin je l'écrirais ainsi
case 7:
digitalWrite(mise_en_pression,LOW);
digitalWrite(pompe_hydraulique,LOW);
etape=0;
break;
}


mais je suis loin d'être un pro de arduino et le C++
donc à confirmer par les pros
 
Z

zygo4619

Apprenti
Merci pour ta reponse Mcar,

je viens de tester, hélas, ça ne change rien,
j'ai omis de préciser, la compilation fonctionne, il n'y a pas d'erreur d'ecriture (selon le compilateur), simplement, le programme ne fait rien, le cycle ne demarre pas
 
T

topette79200

Apprenti
bonjour
if ((digitalRead (selecteur_mode_auto) == HIGH)&&(digitalRead (BP_depart_cycle) == HIGH))
switch (etape)
etape n'est pas initialise, il est juste declare c'est a dire qu'avec un int il peut avoir une valeur de -32 768 / +32 767
const int capteur_bol_0 = A5;
int etape;
int cycle_en_cours;
essaies avec
int etape = 0; si c'est bien ta valeur de depart
 
S

speedjf37

Compagnon
Bonsoir,

Je confirme les avis précédents !

ou a la fin du setup
etape = 0;

if ((digitalRead (selecteur_mode_auto) == HIGH)&&(digitalRead (BP_depart_cycle) == HIGH))

Par contre on ne rentre dans le switch que si l'on appuie sur le bouton BP_depart_cycle
il faudrait peut être initialiser etape = -1;
if ((digitalRead (selecteur_mode_auto) == HIGH)&&((digitalRead (BP_depart_cycle) == HIGH)||(etape !=-1) )
// demarrer puis continuer le cycle

case 7:
digitalWrite(mise_en_pression,LOW);
digitalWrite(pompe_hydraulique,LOW);

etape=0; // si nouveau cycle
etape=-1; // si fin cycle
break;
JF
 
Z

zygo4619

Apprenti
Bonjour a tous !

merci pour vos messages, je vais regarder ca aujourd'hui si je trouve du temps pour aller sur la machine, je vous tiens au courant

Merci et bonne journée a tous !
 
C

coredump

Compagnon
Ce que tu veux faire s'appelle une machine d'état.
La première chose c'est de faire un diagramme états-transitions qui liste les états et les transitions entre eux.
De la tu as ton Switch case qui se déroule tout seul.
Un conseil: faire une fonction pour chaque transition, ça permets un code plus clair et facile à modifier. Pareil pour lire les états, ça permets d'ajouter du code de gestion des rebonds sans avoir à changer la machine d'état.
 
Z

zygo4619

Apprenti
Ce que tu veux faire s'appelle une machine d'état.
La première chose c'est de faire un diagramme états-transitions qui liste les états et les transitions entre eux.
De la tu as ton Switch case qui se déroule tout seul.
Un conseil: faire une fonction pour chaque transition, ça permets un code plus clair et facile à modifier. Pareil pour lire les états, ça permets d'ajouter du code de gestion des rebonds sans avoir à changer la machine d'état.

en effet, en lisant pas mal de choses a droite a gauche, j'ai vu que c'est ce que je cherchais a créer, malheureusement, les exemples me parlent peu.... :lol:

je n'ai pas encore eu le temps de retourner sur cette machine, certainement en fin de semaine, je vous tiens au courant des évolutions du schimimili... shimilimili... schmilblik !
 
T

tronix

Compagnon
Quelques remarques :
- l'indentation est très importante pour la lisibilité d'un programme (bon, la copie sur le site peut être responsable du pb...)
- dans un switch(case), il devrait toujours y avoir le cas default, qui permet en particulier de remettre la machine dans l'état initial si état imprévu, erreur ailleurs, ou même pour simplifier l'écriture.
- les commentaires sont utiles, mais écrire "ETAPE1", "ETAPE2"... ne sert strictement à rien ! On le voit à la lecture. Il faut plutôt écrire à quoi correspond l'état.
- pour mettre au point un programme, il faut un debugger permettant de mettre des point d'arrêt, de regarder les variables, la mémoire... Sinon, à part pour faire clignoter une led, cela devient aléatoire et très long. Tout le monde fait des erreurs, et plus elles sont grosses et évidentes, et moins on les trouve en général. Sans moyen de debug, point de salut.
 
S

speedjf37

Compagnon
pour mettre au point un programme, il faut un debugger permettant de mettre des point d'arrêt, de regarder les variables, la mémoire.
Bonjour,

Belle théorie !

@tronix
Quel outil permet tout ça en mode Arduino ?

Cordialement JF
 
T

tronix

Compagnon
Ce n'est pas la théorie, c'est juste indispensable !

Je ne connais pas l'Arduino, il y a plusieurs IDE et il y a forcément des cartes qui permettent le debug.
 
T

tronix

Compagnon
Les print, c'est quand on ne peut pas faire mieux...
 
C

coredump

Compagnon
En fait la plupart des AVR ont un port de debug, mais arduino n'est pas orienté programmation avancée.
Il y a des cas ou on ne peut pas utiliser de débuggeur, voir même d'uart, du coup on utilise des gpios.
 
T

tronix

Compagnon
Je n'ai jamais eu d'outils de debugging, toujours utilisé des print.

Heureusement qu'il y a des moyens plus efficaces pour des programmes et des soft un peu complexes !

Bon, si on utilise déjà beaucoup des librairies écrites, cela facilite un peu les choses, mais le print reste une méthode terriblement lente.
 
P

pailpoe

Compagnon
C’est mieux que rien !
au boulot, on utilise des outils de debug un peu plus évolué, c’est sur. Mais la, pour 100 lignes de code :-D.
 
Z

zygo4619

Apprenti
Merci a tous ceux qui ont pris le temps de regarder mon souci,
j'ai fait les différents tests que vous preconisiez, j'ai pas mal avancé,
la fonction print est en effet très utile !

du coup, j'ai écrit de nouveaux trucs, ça fonctionne mieux, mais je reste bloqué a l'étape 0....
on dirait que les entrées ne sont jamais lues, malgré le fait que j'applique bien 5V sur les pins concernés, ça ne veut rien entendre.....

ci dessous le code, si parmi vous il y a encore de bonne ames pour continuer a m'aiguiller, j'en serais ravi :

/*Declaration variables systeme*/
const int BP_monte_lame = 13;
const int BP_baisse_lame = 12;
const int BP_rotation_0 = 11;
const int BP_rotation_90 = 10;
const int selecteur_mode_auto = 9;
const int moteur_lame = 8;
const int pompe_hydraulique = 7;
const int voyant_cycle = 6;
const int verin_montee_lame = 5;
const int verin_descente_lame = 4;
const int verin_rotation_0 = 3;
const int rotation_90 = 2;
const int mise_en_pression = 1;
const int selecteur_mode_manu = A0;
const int BP_depart_cycle = A1;
const int capteur_lame_basse = A2;
const int capteur_lame_haute = A3;
const int capteur_bol_90 = A4;
const int capteur_bol_0 = A5;
int etape=0;
int cycle_en_cours;
int mode_jog;



void setup()
/*Affectation des E/S ARDUINO*/
{
pinMode (BP_monte_lame, INPUT);
pinMode (BP_baisse_lame, INPUT);
pinMode (BP_rotation_0, INPUT);
pinMode (BP_rotation_90, INPUT);
pinMode (selecteur_mode_auto, INPUT);
pinMode (moteur_lame, OUTPUT);
pinMode (pompe_hydraulique, OUTPUT);
pinMode (mise_en_pression, OUTPUT);
pinMode (verin_montee_lame, OUTPUT);
pinMode (verin_descente_lame, OUTPUT);
pinMode (verin_rotation_0, OUTPUT);
pinMode (rotation_90, OUTPUT);
pinMode (voyant_cycle, OUTPUT);
pinMode (selecteur_mode_manu, INPUT);
pinMode (BP_depart_cycle, INPUT);
pinMode (capteur_lame_basse, INPUT);
pinMode (capteur_lame_haute, INPUT);
pinMode (capteur_bol_90, INPUT);
pinMode (capteur_bol_0, INPUT);
etape=0;
Serial.begin(9600);
}

void loop()
{
/*selecteur en mode automatique*/
if ((digitalRead (selecteur_mode_auto) == 1)&&(digitalRead (BP_depart_cycle) == 1))
Serial.print("lancement cycle");
etape=0;
{
switch (etape)

/*-----------ETAPE 0-----------*/
{
case 0:
digitalWrite(mise_en_pression,HIGH);
digitalWrite(pompe_hydraulique,HIGH);
digitalWrite(verin_montee_lame,HIGH);
Serial.print("etape_0");
etape=1;
delay (5000);
break;


/*-----------ETAPE 1-----------*/

case 1:
if (digitalRead ( capteur_lame_haute)==1)
digitalWrite(verin_montee_lame,LOW); /*stop montee lame*/
digitalWrite(verin_rotation_0,HIGH); /*rotation bol a 0*/
Serial.print("etape_1");
delay (5000);
etape=2;
break;


/*-----------ETAPE 2-----------*/
case 2:
if (digitalRead ( capteur_bol_0)==1)

digitalWrite(verin_rotation_0,HIGH); /*rotation 0 maintenue*/
digitalWrite(moteur_lame,HIGH); /*rotation bol a 0*/
digitalWrite (verin_descente_lame,HIGH); /*descente lame*/
Serial.print("etape_2");
delay (5000);
etape=3;
break;


/*-----------ETAPE 3-----------*/
case 3:
if (digitalRead ( capteur_lame_basse)==1)

digitalWrite(verin_rotation_0,HIGH); /*rotation 0 maintenue*/
digitalWrite(moteur_lame,LOW); /*arret lame*/
digitalWrite(verin_descente_lame,LOW); /*arret descente*/
digitalWrite (verin_montee_lame,HIGH); /*montée lame*/
Serial.print("etape_3");
delay (5000);
etape=4;
break;


/*-----------ETAPE 4-----------*/
case 4:
if (digitalRead ( capteur_lame_haute)==1)

digitalWrite(rotation_90,HIGH); /*rotation 90*/
digitalWrite(moteur_lame,LOW); /*arret lame maintenu*/
digitalWrite(verin_descente_lame,LOW); /*arret descente maintenu*/
Serial.print("etape_4");
delay (5000);
etape=5;
break;


/*-----------ETAPE 5-----------*/
case 5:
if (digitalRead ( capteur_bol_90)==1)

digitalWrite(rotation_90,HIGH); /*rotation 90 maintenue*/
digitalWrite(moteur_lame,HIGH); /*demarage lame*/
digitalWrite(verin_descente_lame,HIGH); /*demarage descente*/
Serial.print("etape_5");
delay (5000);
etape=6;
break;


/*-----------ETAPE 6-----------*/
case 6:
if (digitalRead ( capteur_lame_basse)==1) /*lame en bas*/

digitalWrite(rotation_90,HIGH); /*rotation 90 maintenue*/
digitalWrite(moteur_lame,LOW); /*arret lame*/
digitalWrite(verin_descente_lame,LOW); /*arret descente*/
digitalWrite (verin_montee_lame,HIGH); /*montée lame*/
if (digitalRead ( capteur_lame_haute)==HIGH);
Serial.print("etape_6");
delay (5000);
etape=7;
break;


/*-----------ETAPE 7-----------*/
case 7:

digitalWrite(mise_en_pression,LOW);
digitalWrite(pompe_hydraulique,LOW);
Serial.print("etape_7");
delay (5000);
etape=0;
break;
}

}

}
 
T

topette79200

Apprenti
bonjour
quand tu appuies sur le bouton (selecteur_mode_auto) et (BP_depart_cycle) as tu l affichage "lancement cycle"
if ((digitalRead (selecteur_mode_auto) == 1)&&(digitalRead (BP_depart_cycle) == 1))
Serial.print("lancement cycle");
pourrais tu nous mettre un schéma du branchement physique des boutons et sortie sur la carte arduino. cela serait très utile. car suivant tes branchement tu pourrais bien être en " logique inverse".le code est fonction des branchement que tu as effectué.
 
Z

zygo4619

Apprenti
oui, je l'ai eu avant de poster ce message, quand j'avais digitalread==HIGH au lieu de ==1, la je passe directement en etape 0
je te joins le schéma electrique, je l'ai refait vite fait, je m'excuse pour la qualité, il est juste et correspond a mon branchement sur la machine

tu verras que les capteurs lame en bas et en haut sont NC, j'ai ecris le programme en conséquence bien entendu (le programme posté est celui sur mon banc de test a la maison, les contacts sont bien NO sur celui ci)

j'ai des résistances de rappel sur toutes les entrées (non représentées sur le schéma)
pour considérer un entrée ==HIGH, j'applique la tension de 5v dessus, pour ==LOW, 0V

je crois que tu as toutes les infos là :-D
IMG_20201031_162052.jpg
 
T

topette79200

Apprenti
donc tu coup ça te fait bien cette étape et affiche "etape_0"
case 0:
digitalWrite(mise_en_pression,HIGH);
digitalWrite(pompe_hydraulique,HIGH);
digitalWrite(verin_montee_lame,HIGH);
Serial.print("etape_0");
etape=1;
delay (5000);
break;
 
V

vres

Compagnon
Z

zygo4619

Apprenti
le mieux est de coller en te servant de la balise CODE, ça devient plus visible.
j'ai refait un formatage automatique
Bonjour cnc serv !

je m'excuse pour la publi indigeste, c'est vrai, je n'avais pas trouvé la balise code et pensais qu'il n'y en avais pas sur ce forum
j'ai une marge de progression enorme sur la discipline on dirait.....

je vais regarder et tester ton code de suite !
 
Z

zygo4619

Apprenti
le mieux est de coller en te servant de la balise CODE, ça devient plus visible.
j'ai refait un formatage automatique
CNCserv,

je viens de charger ton code, alors, y a du nouveau, il doit y avoir une meute de loups dans loop :mrgreen:
bon, le grafcet evolue bien d'étape en étape, sauf qu'il ne prend effectivement pas du tout en compte l'état de mes entrées, il se déroule de l'étape 0 a l'étape 7, sans jamais prendre en compte l'état des capteurs

voila qui devient interessant (mais aussi étrange)
comment donc peut il faire fi du controle de l'entrée ?
 
T

topette79200

Apprenti
je ne sais pas l enchainement que tu attends mais dans toutes les conditions IF , vu qu' il n'y a pas d'accolade ,seule la première ligne après le IF sera executée en fonction du IF.
ici seul "digitalWrite(verin_montee_lame, LOW);" sera effectuée en fonction du IF
case 1: if (digitalRead(capteur_lame_haute) == 1) digitalWrite(verin_montee_lame, LOW); /* stop montee lame */ digitalWrite(verin_rotation_0, HIGH); /* rotation bol a 0 */

et "digitalWrite(verin_rotation_0, HIGH); /* rotation bol a 0 */" sera toujours executé

tu as mis des resistances de rappel : elles sont bien mise au GND ?
 
Z

zygo4619

Apprenti
je ne sais pas l enchainement que tu attends mais dans toutes les conditions IF , vu qu' il n'y a pas d'accolade ,seule la première ligne après le IF sera executée en fonction du IF.
ici seul "digitalWrite(verin_montee_lame, LOW);" sera effectuée en fonction du IF


et "digitalWrite(verin_rotation_0, HIGH); /* rotation bol a 0 */" sera toujours executé

tu as mis des resistances de rappel : elles sont bien mise au GND ?

Merci Topette,
oui, les resistances sont au GND
je me permet de joindre un grafcet que je viens de gribouiller, ça t'aidera ac omprendre le cycle que je cherche a obtenir :wink:

c'est normal, tu as du mal avec les apostrophes

CNC serv, oui, j'ai du mal avec ces maudites apostrophes, je l'avoue, elles sont mon cauchemard depuis quelques semaines , j'ai beau essayer toutes les logiques, aucune ne semble fonctionner....:mrgreen:

ton avis semble rejoindre celui de topette a ce sujet
je vais essayer ton code pour voir ce que ca dit
 

Sujets similaires

V
Réponses
3
Affichages
1 043
vibram
V
F
Réponses
6
Affichages
25 673
fraiddy
F
G
Réponses
123
Affichages
19 224
gaston83
G
G
Réponses
0
Affichages
609
gaston83
G
V
Réponses
62
Affichages
5 381
vibram
V
M
Réponses
30
Affichages
25 919
wika58
wika58
U
Réponses
85
Affichages
7 262
Hubert86
H
shodan47
Réponses
7
Affichages
9 719
shodan47
shodan47
M1M1HRC10
Réponses
7
Affichages
38 039
M1M1HRC10
M1M1HRC10
M
Réponses
185
Affichages
24 881
wika58
wika58
01power
Réponses
3
Affichages
13 862
01power
01power
V
Réponses
62
Affichages
39 374
Dardar88
Dardar88
V
Réponses
7
Affichages
1 988
vibram
V
S
Réponses
112
Affichages
21 916
manum01
M
Haut