Aide besoin d'aide pour programmer un switch case

  • Auteur de la discussion zygo4619
  • Date de début
zygo4619
zygo4619
Apprenti
15 Août 2014
79
correze
  • Auteur de la discussion
  • #1
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;

}

}
 
Mcar
Mcar
Compagnon
3 Fev 2018
1 432
54860-Lorraine
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
 
zygo4619
zygo4619
Apprenti
15 Août 2014
79
correze
  • Auteur de la discussion
  • #3
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
25 Juil 2011
203
79
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
15 Oct 2009
2 275
indre et loire
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
 
zygo4619
zygo4619
Apprenti
15 Août 2014
79
correze
  • Auteur de la discussion
  • #6
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 !
 
coredump
coredump
Compagnon
8 Jan 2007
4 535
FR-06
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.
 
zygo4619
zygo4619
Apprenti
15 Août 2014
79
correze
  • Auteur de la discussion
  • #8
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
6 Mar 2012
1 495
Toulouse
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
15 Oct 2009
2 275
indre et loire
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
 
pailpoe
pailpoe
Compagnon
29 Jan 2011
1 122
Haute-Saône
C’est utile pour debugger
 
T
tronix
Compagnon
6 Mar 2012
1 495
Toulouse
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
6 Mar 2012
1 495
Toulouse
Les print, c'est quand on ne peut pas faire mieux...
 
jpbbricole
jpbbricole
Compagnon
26 Mai 2016
2 265
Corsier-sur-Vevey (Vaud)
Bonsoir
Les print, c'est quand on ne peut pas faire mieux...
Je n'ai jamais eu d'outils de debugging, toujours utilisé des print.

Cordialement
jpbbricole
 
coredump
coredump
Compagnon
8 Jan 2007
4 535
FR-06
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
6 Mar 2012
1 495
Toulouse
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.
 
pailpoe
pailpoe
Compagnon
29 Jan 2011
1 122
Haute-Saône
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.
 
zygo4619
zygo4619
Apprenti
15 Août 2014
79
correze
  • Auteur de la discussion
  • #19
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
25 Juil 2011
203
79
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é.
 
zygo4619
zygo4619
Apprenti
15 Août 2014
79
correze
  • Auteur de la discussion
  • #21
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
25 Juil 2011
203
79
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;
 
CNCSERV
CNCSERV
Compagnon
27 Déc 2007
5 963
FR-28360
zygo4619
zygo4619
Apprenti
15 Août 2014
79
correze
  • Auteur de la discussion
  • #25
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 !
 
zygo4619
zygo4619
Apprenti
15 Août 2014
79
correze
  • Auteur de la discussion
  • #26
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
25 Juil 2011
203
79
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 ?
 
zygo4619
zygo4619
Apprenti
15 Août 2014
79
correze
  • Auteur de la discussion
  • #29
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
 
Haut