positionnement avec un moteur pas à pas

zeltron

Senior Member
sauf que pour vous j'ai l'impression que n'importe quel sujet (le plus tordu si possible) vous fait kiffer
moi c'est plutôt l'application qui cré mon besoin de picaxe et que je kiffe le reste m'en fou
sauf que j'ai mis les mains dans la boite de pandore ...
 

zeltron

Senior Member
Suite...
comment débuter

1ere fonction à assurer:
Initialiser le pont à une position de référence, à la demande

nous avons déjà un programme qui détecte bien le zero référence
je pourrais commencer par créer un menu qui appelle le sous programme Init_PaP à l'aide de mon super clavier de compet ;)
ou j'ai faux?
 

PieM

Senior Member
Suite...
comment débuter

1ere fonction à assurer:
Initialiser le pont à une position de référence, à la demande

nous avons déjà un programme qui détecte bien le zero référence
je pourrais commencer par créer un menu qui appelle le sous programme Init_PaP à l'aide de mon super clavier de compet ;)
ou j'ai faux?
Oui c'est la première phase mais penser à créer un menu qui va évoluer au fil des fonctions.
conseil aussi: garder la première ligne pour afficher la fonction en cours, la seconde affichant les paramètres éventuels.
Autre chose:
cette manip peut être appelée à tout moment par l'opérateur, après avoir vérifié qu'elle est possible.
Donc après la mise sous tension de l'ensemble , envoyer un message disant de faire cette initialisation.
 
Last edited:

BESQUEUT

Senior Member
comment débuter ?
Préparer une série de grilles avec les 2x16 cases de votre afficheur.
Renseigner la grille de départ.
Indiquer les actions possibles (clavier, bouton, potar, encodeur,...)
Renseigner ce que l'on voit sur l'écran
Indiquer les actions possibles...
etc...
Ca parait stupide, mais c'est souvent une bonne façon de décrire l'IHM, et on gagne ensuite un temps considérable en programmation.
Accessoirement, le manuel d'utilisation est écrit avant de commencer le développement !
 

zeltron

Senior Member
J'ai fusionné les 2 programmes pas à pas/clavier
ça marchote... mais c'est pas terrible...
l'architecture ne doit pas être bonne...
comment eviter que picaxe editor charge toutes les versions des programmes crées, en même temps?
 
Last edited:

dje8269

Senior Member
Hello,
Je pense qu'il faut que tu nous montre. Quand tu dis "fusionner" , tu veux dire mis à la suite ? Tu veux commander ton pont avec le clavier ?
 

zeltron

Senior Member
oui lire le post 282
je pense mettre le programme dans un fichier texte car ça ne passe pas à cause de la limitation du nb de caracteres...
mais avant je vais encore y travailler
par contre comment virer le texte qui s'affiche toujours sur le diplay
picaxe.com il faut reprogrammer le picaxe display j'imagine?
et pourquoi j'ai toujours besoin de reseter pour lancer mon programme apres un allumage de l'alim?
 
Last edited:

dje8269

Senior Member
Il faut le mettre en deux fois !!!

Si comme je le pense c'est avec PE6 , le mieux est de ne pas mettre les couleurs qui prennent tout les caracteres . donc faire "copier" et pas "copier pour le forum" , et coller le texte entre les balise
Code:
ton code ici[/CODE ] ( sans l'espace apres le deuxieme code)
 

PieM

Senior Member
J'ai fusionné les 2 programmes pas à pas/clavier
ça marchote... mais c'est pas terrible...
l'architecture ne doit pas être bonne...
Dans l'industrie, on ne mélange pas tout, les automates et la supervision ...
Maintenant si c'est pour faire fonctionner les deux ensembles sur le même µC simple coeur, je ne sais pas faire. Attendre le lapin blanc ...

comment éviter que picaxe editor charge toutes les versions des programmes crées, en même temps?
Aller dans Options > Editeur
décocher Ajouter automatiquement les fichiers ouverts ...
 

dje8269

Senior Member
Hummm , effectivement la structure n'est pas bonne ; Je pourrais le corriger, pour le faire fonctionner, mais seulement pour l'initialissation . ce serait contre productif, car le but n'ai pas de coteriser une jambe de bois .

Ton sous programme clavier dois seulement enregistrer des valeurs et ne pas les traiter a l'interieur . Tu ne devrais pas repartir dans un sous programme a partir du sous programme clavier .
J'aurais envie de proposer d'enregister la variable oui ou non, dans une variable dedié a la question de l'initialisation , et en revenant au programme principal, on regarde cette variable et on agit ;

Mais je pense pas que ce soit le top du top . Comme le dis PieM il faudrait essayer de voir dans l'ensemble sinon ca va trés vite coincé .
 

dje8269

Senior Member
A testé :

Code:
#rem
###########################################
#  Programme de gestion de pont tournant  #  
#  Moteur PaP 200pas - driver EasyDriver  #
#  Date 20151901 revision 3               #
###########################################
#ENDREM

#picaxe 40X2
'************  initialisation   *******************
setfreq m16             'frequence 16MHz interne

'*********** E/S ********************************
dirsB = %11100000       ' positionne B.5 et B.6 b7 en sorties

'entrees ------------------------------
symbol FC_opto =  pinB.4   'Fin de course opto

'sorties ------------------------------
symbol dir     =  pinB.5   'sortie direction
symbol pas     =  B.6      'sortie pas

'*********** variables **************************
symbol var_temp      = w13 'variable temporaire
symbol Pos_actuelle  = w12 'position courante
symbol Pos_cible     = w11 'position cible
symbol Nb_de_pas     = w10 'nombre de pas ? realiser
Symbol nombre        = b3
Symbol touche        = b2
Symbol compteur      = b4
Symbol addition      = w27

'reserve bits = b0
symbol Sens = bit0

'*********** constantes **************************
symbol CW = 1              'sens horaire
symbol CCW = 0             'sens anti horaire (arbitraire)
symbol Vit_lente  =  100   'predefini vitesse lente
symbol Vit_rapide =  20    'et vitesse rapide

'*********** memorisation en EEPROM **************
'*****Table des positions des voies m?morisees ***
eeprom  0,(0,125,256,125,0,126,128,162)

'*********** Macros ******************************
'definition macro avec parametres; Nb de pas, sens, periode entre pas.
#MACRO PaP(Nb,Sens,Per)
   dir = Sens        'affecte 1 ou 0 ? dir donc ? B.5
   for var_temp = 0 to Nb  'envoie Nb pulses au circuit
      pulsout pas,1        'driver
      pause Per   ' pause en X fois 5?s
   next
   Pos_actuelle = sens * 2 * Nb + Pos_actuelle - Nb 'actualisation position du pont
   'si sens =1 on ajoute Nb pas ? Pos_actuelle sinon on lui retranche Nb pas ;-)
#ENDMACRO
'##############   Programme principal   ############################
Prog_princ:
init:pause 500
SerOut B.7, N2400, ( 254, %00000001 ) ' efface l'ecran
pause 100

gosub init_pont
   
do
   pos_cible = 32800
   gosub Mise_en_position

loop
'#####################################################################

Init_PaP:   's/Programmes initialisation du moteur pas a pas

   dir = cw
   do while FC_opto = 1    'tout pendant que l'opto est oculte
      pulsout pas,1        'on tourne en grande vitesse sens cw
      pause Vit_rapide
   loop

   PaP(100,cw,Vit_rapide)  'la fente detectee, on passe au-dela - normalement 26 pas suffisent pour 1mm

   dir = ccw               'puis on revient en arri?re
   Do while FC_opto = 1    'en vitesse tr?s lente jusqu'a detection du bord de fente.
      pulsout pas,1
      pause Vit_lente
   loop
   Pos_actuelle = 32000    'la d?tection faite, on initialise le compteur de pas ? 32000
return   
'#####################################################################

Mise_en_position:  's/Programme calcul du nombre de pas a faire et commande du moteur. 

   If pos_cible > pos_actuelle then          'si la future position est dans le sens positif
      Nb_de_pas = pos_cible - pos_actuelle   'calcul du nombre de pas
      sens = cw                              'et du sens
   else
      Nb_de_pas = pos_actuelle -  pos_cible  'sinon , on fait l'inverse
      sens = ccw
   endif
   'optimisation du sens
   if Nb_de_pas > 4800 then            'Si on depasse 1/2 tour
         Nb_de_pas = 9600 - Nb_de_pas  'on prends le complement 
         sens = sens + 1               'et on inverse le sens 
   endif
   PaP(Nb_de_pas,sens,vit_lente)       'Action du moteur
   serout B.7,N2400_16,(254,128,"Nb:",#Nb_de_pas," sens:",#sens," ")
return

's/programma saisie clavier ===========================
clavier:
nombre = 0
do
	do 
		readadc a.0 , touche    ' On detecte un appui
	loop while touche > 250 
	
	pause 100
	
	for compteur = 0 to 19 		' on mesure 20 fois
		readadc a.0 , touche    	' On lit la touche appuyee
		addition = addition + touche	' on fait la somme
	next

	touche = addition / 20
	addition = 0
	
select case touche  'on reaffecte aux touches leurs vraies valeurs sauf # et *
   case > 133 : touche = 1
   case > 128 : touche = 2
   case > 122 : touche = 3
   case > 111 : touche = 4
   case > 105 : touche = 5
   case > 98 : touche = 6
   case > 81 : touche = 7    
   case > 71 : touche = 8
   case > 60 : touche = 9
   case > 35 : touche = 11 'correction
   case > 20 : touche = 0
   case > 0 : touche = 12 'validation
   
endselect

select case touche
	
   case = 12
	pause 100
	return     		'fin de la saisie clavier
   case = 11               'correction dernier chiffre
      nombre = nombre/10   
   case < 240              'un chiffre valide est rentre
      nombre = nombre*10 + touche 'ajout du chiffre
	
endselect
 '  serout B.7,N2400_16,(254,135,#nombre," ")
'puis on attend que les touches soient relachees pour eviter les repetitions
   do
   readadc a.0 , touche 
   loop while touche < 250    
   pause 200
loop


init_pont:

'Text sur display
serout B.7,N2400_16,(254,128,"init 0 pont?"," ")
serout B.7,N2400_16,(254,192,"NON=0 OUI=1","     ")
gosub clavier
if touche = 0 then : return : end if
if touche = 1 then : gosub clavier : end if

return
 

BESQUEUT

Senior Member
Dans l'industrie, on ne mélange pas tout, les automates et la supervision ...
Maintenant si c'est pour faire fonctionner les deux ensembles sur le même µC simple coeur, je ne sais pas faire. Attendre le lapin blanc ...
Tout à fait. Et comme déjà dit à de nombreuses reprises, on ne commence pas le code tant que l'on ne sait pas ce qu'il va faire.
En effet, il existe des techniques de programmation très différentes (plus ou moins facile à mettre en &#339;uvre) et qui répondent à des besoins différents.
Quels sont les différents écrans à afficher ? Quelles actions sont possibles dans chaque cas de figure ?
L'initialisation est indépendante. A part un arrêt d'urgence, on peut supposer qu'il n'y a rien d'autre à prendre en compte pendant cette phase.
On peut supposer le nombre de voies défini par défaut et initialisé par défaut disons tous les 10°.
Il faut pouvoir étalonner chaque voie. Quelle ergonomie ? On suppose également qu'il n'y a rien d'autre à prendre en compte pendant cette phase.
Puis on passe en exploitation.
Le module devra-t-il gérer le déplacement de la loco, ou est-ce manuel ? Ou bien un autre Module gère cette fonction ?
On choisi une voie et on valide. Le pont va se mettre en place...
Faut-il prendre en compte pendant ce déplacement d'autres informations ? Arrêt d'urgence ? Mise sous tension de la voie ? Déplacement de la loco ? Action sur le clavier ou autre périphérique de saisie ? Réception d'un message en provenance d'un autre module ?
Faut-il pendant le mouvement renvoyer de l'information ? Allumage de Leds ? Envoi de message à un autre module ? Afficheur ?

PS : on n'a pas attendu les processeurs multi c&#339;urs pour faire du multitâches, au moins en mode collaboratif. Mais effectivement, ce n'est plus de la programmation linéaire. Comme déjà dit et répété, on peut aussi avoir une approche multiprocesseurs. Dans ce cas, il fait savoir ce qui doit être synchronisé ou pas entre chaque puce.
Donc, il faut savoir ce que l'on veut AVANT de définir une architecture et une méthode de programmation.
Voir #284.
 
Last edited:

PieM

Senior Member
Je crois qu'on est parti pour un peu tout mélanger.

Il y a un interface opérateur qui permet de sélectionner dans un menu une opération que l'on souhaite réaliser, parmi d'autres, via un afficheur, et un clavier pour l'instant. Ceci est une constante dans toute la vie du système.
Donc la première chose à faire est un menu qui permet de sélectionner un item parmi X.
et dans le principe, le menu fait appel au clavier qui renvoie la ou les touches frappées. Ce n'est qu'à ce moment qu'il envoie l'ordre au système qui doit réaliser l'action, et qu'en retour il peut recevoir éventuellement l'info de feed back.
Ce peut être localement sur le même µC (à terme peu probable) ou sur un µC distant.

Donc un menu va comporter plusieurs lignes, chaque ligne correspondant à une fonction à réaliser, voire un sous menu,
on passe d'une ligne à l'autre en tapant par exemple sur la touche correction ou on valide avec la touche validation.
Si vous aviez un terminal type minitel de PapyJP, vous auriez un écran avec plusieurs choix validés par la frappe d'un chiffre.

Il faut bien comprendre qu'on ne peut décider d'envoyer une action à partir du programme clavier.
Sinon si vous décrétez que 1 provoque l'initialisation du pont, le jour ou vous aurez besoin du clavier pour entrer un numéro de voie, il vous renverra systématiquement vers une initialisation dès que la voie sera >9!

les (sous) programmes initialisation, mise en position etc ... sont pour l'instant des programme indépendants qui vont se trouver sur un µC qui gère le PaP du pont.
C'est pour l'instant le même que celui qui gère afficheur et clavier mais ce n'est certainement pas la solution d'avenir quand le programme va se compliquer.

Mais je ne suis pas certain que toutes les fonctionnalités aient été bien vues encore...
 

zeltron

Senior Member
post 292 ok merci beaucoup!! je vais tester ça et vous dire

c'est trop difficile pour moi de répondre au post 293 n'ayant pas d'experience dans la programmation et donc leurs limites....
c'est pour ça que je préfere m'adapter à vos solutions et adapter le hard, et mon besoin d'utilisation en consequence....
je le répete ce n'est pas un projet pro le cahier des charges peux s'adapter et s'acommoder...

le post 294 est bien résumé
apres ce petit essais d'assembler les 2 programmes je comprend qu'un clavier n'est pas vraiment adapté


le clavier pourrait être utiliser juste pour sélection des voies de garage autour du pont?
mais dans ce cas la il y aurait déjà une impossibilité d'utiliser ce clavier aussi pour la commande en manu des aiguillages?

pour remplacer ce clavier par un potentiometre et 3 bps ou plus aucun probleme...si c'est plus facile!
franchement ce n'est pas le temps que ça prend et j'ai pas mal de fonds de tiroirs!
 
Last edited:

BESQUEUT

Senior Member
c'est trop difficile pour moi de répondre au post 293 n'ayant pas d'experience dans la programmation et donc leurs limites....
Voir post #284.
Ne vous demandez pas comment on le fera pour le moment.
Prenez votre crayon ou votre Word.
Imaginez-vous devant votre circuit tout neuf. Mettez le sous tension.
Qu'est ce qui s'affiche ? Que faites-vous ? Qu'est ce qui se passe ?
Commencez par le pont si vous voulez puisque c'est votre sujet de départ.
Mais vous avez évoqué aussi la man&#339;uvre des aiguilles et la conduite de 2 trains en simultané.
Essayez d'imaginer vos actions successives dans l'idéal, en commande manuelle dans un premier temps.
Compte-tenu de votre difficulté à établir un CDC, on verra plus tard pour les automatismes.
 
Last edited:

PieM

Senior Member
post 292 ok merci beaucoup!! je vais tester ça et vous dire
Je ne pense pas que ça aille dans le bon sens ....
on a pas à décider d'emblée dans un programme principal d'aller d'emblée sur une action comme l'initialisation du pont.

apres ce petit essais d'assembler les 2 programmes je comprend qu'un clavier n'est pas vraiment adapté
Relisez ce qui est dit : Il ne faut pas utiliser le sous/programme clavier pour lancer une commande !
le sous programme clavier renvoie au programme principal, l'info de ce qui a été tapé, et c'est le programme principal qui, en fonction du menu sélectionné dit ce qu'il faut faire.
Vous aviez affecté à titre définitif une touche à l'action d'initialiser le pont.

le clavier pourrait être utiliser juste pour sélection des voies de garage autour du pont?
mais dans ce cas la il y aurait déjà une impossibilité d'utiliser ce clavier aussi pour la commande en manu des aiguillages?
Comprends pas ! le clavier vous renvoie une info en fonction du menu qui l'appelle. Donc ça peut être à tout moment pour n'importe quoi.
 

zeltron

Senior Member
non dsl le programme ci dessus ne fonctionne pas
apres avoir appuyé sur 0 ou 1 il se passe la même chose
le moteur tourne dans le sens antihoraire alors et ne rentre donc pas dans le sous programme
init_pap
 

zeltron

Senior Member
Vous aviez affecté à titre définitif une touche à l'action d'initialiser le pont.

ok je viens de comprendre cette phrase et la façon de l'utiliser comme ça ->

le clavier vous renvoie une info en fonction du menu qui l'appelle. Donc ça peut être à tout moment pour n'importe quoi.

grace au programme ci dessus, même s'il ne marche pas

par contre je ne comprends pas cette phrase
on a pas à décider d'emblée dans un programme principal d'aller d'emblée sur une action comme l'initialisation du pont.
pourquoi puisque c'est la 1er action à faire?
 

dje8269

Senior Member
pourquoi puisque c'est la 1er action à faire?

Alors on le place dans une initialisation avant le programme principal :

J'ai confondu touche et nombre . avec celui ci ca devrait le faire ! Mais comme le signale PieM, ce n'est pas optimum comme programme, mais bien pour la comprehension

Code:
#rem
###########################################
#  Programme de gestion de pont tournant  #  
#  Moteur PaP 200pas - driver EasyDriver  #
#  Date 20151901 revision 3               #
###########################################
#ENDREM

#picaxe 40X2
'************  initialisation   *******************
setfreq m16             'frequence 16MHz interne

'*********** E/S ********************************
dirsB = %11100000       ' positionne B.5 et B.6 b7 en sorties

'entrees ------------------------------
symbol FC_opto =  pinB.4   'Fin de course opto

'sorties ------------------------------
symbol dir     =  pinB.5   'sortie direction
symbol pas     =  B.6      'sortie pas

'*********** variables **************************
symbol var_temp      = w13 'variable temporaire
symbol Pos_actuelle  = w12 'position courante
symbol Pos_cible     = w11 'position cible
symbol Nb_de_pas     = w10 'nombre de pas ? realiser
Symbol nombre        = b3
Symbol touche        = b2
Symbol compteur      = b4
Symbol addition      = w27

'reserve bits = b0
symbol Sens = bit0

'*********** constantes **************************
symbol CW = 1              'sens horaire
symbol CCW = 0             'sens anti horaire (arbitraire)
symbol Vit_lente  =  100   'predefini vitesse lente
symbol Vit_rapide =  20    'et vitesse rapide

'*********** memorisation en EEPROM **************
'*****Table des positions des voies m?morisees ***
eeprom  0,(0,125,256,125,0,126,128,162)

'*********** Macros ******************************
'definition macro avec parametres; Nb de pas, sens, periode entre pas.
#MACRO PaP(Nb,Sens,Per)
   dir = Sens        'affecte 1 ou 0 ? dir donc ? B.5
   for var_temp = 0 to Nb  'envoie Nb pulses au circuit
      pulsout pas,1        'driver
      pause Per   ' pause en X fois 5?s
   next
   Pos_actuelle = sens * 2 * Nb + Pos_actuelle - Nb 'actualisation position du pont
   'si sens =1 on ajoute Nb pas ? Pos_actuelle sinon on lui retranche Nb pas ;-)
#ENDMACRO
'##############   Programme principal   ############################

init:pause 500
SerOut B.7, N2400, ( 254, %00000001 ) ' efface l'ecran
pause 100

gosub init_pont

Prog_princ:  
do
   pos_cible = 32800
   gosub Mise_en_position

loop
'#####################################################################

Init_PaP:   's/Programmes initialisation du moteur pas a pas

   dir = cw
   do while FC_opto = 1    'tout pendant que l'opto est oculte
      pulsout pas,1        'on tourne en grande vitesse sens cw
      pause Vit_rapide
   loop

   PaP(100,cw,Vit_rapide)  'la fente detectee, on passe au-dela - normalement 26 pas suffisent pour 1mm

   dir = ccw               'puis on revient en arri?re
   Do while FC_opto = 1    'en vitesse tr?s lente jusqu'a detection du bord de fente.
      pulsout pas,1
      pause Vit_lente
   loop
   Pos_actuelle = 32000    'la d?tection faite, on initialise le compteur de pas ? 32000
return   
'#####################################################################

Mise_en_position:  's/Programme calcul du nombre de pas a faire et commande du moteur. 

   If pos_cible > pos_actuelle then          'si la future position est dans le sens positif
      Nb_de_pas = pos_cible - pos_actuelle   'calcul du nombre de pas
      sens = cw                              'et du sens
   else
      Nb_de_pas = pos_actuelle -  pos_cible  'sinon , on fait l'inverse
      sens = ccw
   endif
   'optimisation du sens
   if Nb_de_pas > 4800 then            'Si on depasse 1/2 tour
         Nb_de_pas = 9600 - Nb_de_pas  'on prends le complement 
         sens = sens + 1               'et on inverse le sens 
   endif
   PaP(Nb_de_pas,sens,vit_lente)       'Action du moteur
   serout B.7,N2400_16,(254,128,"Nb:",#Nb_de_pas," sens:",#sens," ")
return

's/programma saisi clavier ===========================
clavier:
nombre = 0
do
	do 
		readadc a.0 , touche    ' On detecte un appui
	loop while touche > 250 
	
	pause 100
	
	for compteur = 0 to 19 		' on mesure 20 fois
		readadc a.0 , touche    	' On lit la touche appuyee
		addition = addition + touche	' on fait la somme
	next

	touche = addition / 20
	addition = 0
	
select case touche  'on reaffecte aux touches leurs vraies valeurs sauf # et *
   case > 133 : touche = 1
   case > 128 : touche = 2
   case > 122 : touche = 3
   case > 111 : touche = 4
   case > 105 : touche = 5
   case > 98 : touche = 6
   case > 81 : touche = 7    
   case > 71 : touche = 8
   case > 60 : touche = 9
   case > 35 : touche = 11 'correction
   case > 20 : touche = 0
   case > 0 : touche = 12 'validation
   
endselect

select case touche
	
   case = 12
	pause 100
	return     		'fin de la saisie clavier
   case = 11               'correction dernier chiffre
      nombre = nombre/10   
   case < 240              'un chiffre valide est rentre
      nombre = nombre*10 + touche 'ajout du chiffre
	
endselect
 '  serout B.7,N2400_16,(254,135,#nombre," ")
'puis on attend que les touches soient relachees pour eviter les repetitions
   do
   readadc a.0 , touche 
   loop while touche < 250    
   pause 200
loop


init_pont:

'Text sur display
serout B.7,N2400_16,(254,128,"init du pont?"," ")
serout B.7,N2400_16,(254,192,"NON=0 OUI=1","     ")
gosub clavier
if nombre = 0 then : return : end if
if nombre = 1 then : gosub clavier : end if

return
 

zeltron

Senior Member
non physiquement il n'y a pas de différence par rapport à la 1er version
:(
il faut revenir à init_pap juste avant le dernier return
et la ça marche.
merci
 
Last edited:

PieM

Senior Member
par contre je ne comprends pas cette phrase
on a pas à décider d'emblée dans un programme principal d'aller d'emblée sur une action comme l'initialisation du pont.
pourquoi puisque c'est la 1er action à faire?
Non, je suis désolé, c'est l'opérateur qui décide via un menu !
Aucune action à risque ne doit être lancée sans une intervention manuelle lors du démarrage d'un programme.
en plus cette action, on l'a dit doit pouvoir être lancée quand on veut.
supposez que quelqu'un touche au pont et le décale, ou qu'il soit coincé suite à un déraillement. Vous perdez sa position donc il faut réinitialiser.

Comme déjà dit plus haut prenez un papier, un crayon et essayez d'imaginer les actions que vous souhaitez faire et comment vous allez les lancer, et de quelles infos vous avez besoin.
 

dje8269

Senior Member
Decidemment je les accumule . A lieu d'aller a init_PaP , j'allais a gocub clavier . ( vous auriez pus le trouver lol) .

Un dernier cette fosi en esperant que c'est la bonne :

Code:
#rem
###########################################
#  Programme de gestion de pont tournant  #  
#  Moteur PaP 200pas - driver EasyDriver  #
#  Date 20151901 revision 3               #
###########################################
#ENDREM

#picaxe 40X2
'************  initialisation   *******************
setfreq m16             'frequence 16MHz interne

'*********** E/S ********************************
dirsB = %11100000       ' positionne B.5 et B.6 b7 en sorties

'entrees ------------------------------
symbol FC_opto =  pinB.4   'Fin de course opto

'sorties ------------------------------
symbol dir     =  pinB.5   'sortie direction
symbol pas     =  B.6      'sortie pas

'*********** variables **************************
symbol var_temp      = w13 'variable temporaire
symbol Pos_actuelle  = w12 'position courante
symbol Pos_cible     = w11 'position cible
symbol Nb_de_pas     = w10 'nombre de pas ? realiser
Symbol nombre        = b3
Symbol touche        = b2
Symbol compteur      = b4
Symbol addition      = w27

'reserve bits = b0
symbol Sens = bit0

'*********** constantes **************************
symbol CW = 1              'sens horaire
symbol CCW = 0             'sens anti horaire (arbitraire)
symbol Vit_lente  =  100   'predefini vitesse lente
symbol Vit_rapide =  20    'et vitesse rapide

'*********** memorisation en EEPROM **************
'*****Table des positions des voies m?morisees ***
eeprom  0,(0,125,256,125,0,126,128,162)

'*********** Macros ******************************
'definition macro avec parametres; Nb de pas, sens, periode entre pas.
#MACRO PaP(Nb,Sens,Per)
   dir = Sens        'affecte 1 ou 0 ? dir donc ? B.5
   for var_temp = 0 to Nb  'envoie Nb pulses au circuit
      pulsout pas,1        'driver
      pause Per   ' pause en X fois 5?s
   next
   Pos_actuelle = sens * 2 * Nb + Pos_actuelle - Nb 'actualisation position du pont
   'si sens =1 on ajoute Nb pas ? Pos_actuelle sinon on lui retranche Nb pas ;-)
#ENDMACRO
'##############   Programme principal   ############################

init:pause 500
SerOut B.7, N2400, ( 254, %00000001 ) ' efface l'ecran
pause 100

gosub init_pont

Prog_princ:  
do
   pos_cible = 32800
   gosub Mise_en_position

loop
'#####################################################################

Init_PaP:   's/Programmes initialisation du moteur pas a pas

   dir = cw
   do while FC_opto = 1    'tout pendant que l'opto est oculte
      pulsout pas,1        'on tourne en grande vitesse sens cw
      pause Vit_rapide
   loop

   PaP(100,cw,Vit_rapide)  'la fente detectee, on passe au-dela - normalement 26 pas suffisent pour 1mm

   dir = ccw               'puis on revient en arri?re
   Do while FC_opto = 1    'en vitesse tr?s lente jusqu'a detection du bord de fente.
      pulsout pas,1
      pause Vit_lente
   loop
   Pos_actuelle = 32000    'la d?tection faite, on initialise le compteur de pas ? 32000
return   
'#####################################################################

Mise_en_position:  's/Programme calcul du nombre de pas a faire et commande du moteur. 

   If pos_cible > pos_actuelle then          'si la future position est dans le sens positif
      Nb_de_pas = pos_cible - pos_actuelle   'calcul du nombre de pas
      sens = cw                              'et du sens
   else
      Nb_de_pas = pos_actuelle -  pos_cible  'sinon , on fait l'inverse
      sens = ccw
   endif
   'optimisation du sens
   if Nb_de_pas > 4800 then            'Si on depasse 1/2 tour
         Nb_de_pas = 9600 - Nb_de_pas  'on prends le complement 
         sens = sens + 1               'et on inverse le sens 
   endif
   PaP(Nb_de_pas,sens,vit_lente)       'Action du moteur
   serout B.7,N2400_16,(254,128,"Nb:",#Nb_de_pas," sens:",#sens," ")
return

's/programma saisi clavier ===========================
clavier:
nombre = 0
do
	do 
		readadc a.0 , touche    ' On detecte un appui
	loop while touche > 250 
	
	pause 100
	
	for compteur = 0 to 19 		' on mesure 20 fois
		readadc a.0 , touche    	' On lit la touche appuyee
		addition = addition + touche	' on fait la somme
	next

	touche = addition / 20
	addition = 0
	
select case touche  'on reaffecte aux touches leurs vraies valeurs sauf # et *
   case > 133 : touche = 1
   case > 128 : touche = 2
   case > 122 : touche = 3
   case > 111 : touche = 4
   case > 105 : touche = 5
   case > 98 : touche = 6
   case > 81 : touche = 7    
   case > 71 : touche = 8
   case > 60 : touche = 9
   case > 35 : touche = 11 'correction
   case > 20 : touche = 0
   case > 0 : touche = 12 'validation
   
endselect

select case touche
	
   case = 12
	pause 100
	return     		'fin de la saisie clavier
   case = 11               'correction dernier chiffre
      nombre = nombre/10   
   case < 240              'un chiffre valide est rentre
      nombre = nombre*10 + touche 'ajout du chiffre
	
endselect
 '  serout B.7,N2400_16,(254,135,#nombre," ")
'puis on attend que les touches soient relachees pour eviter les repetitions
   do
   readadc a.0 , touche 
   loop while touche < 250    
   pause 200
loop


init_pont:

'Text sur display
serout B.7,N2400_16,(254,128,"init du pont?"," ")
serout B.7,N2400_16,(254,192,"NON=0 OUI=1","     ")
gosub clavier
if nombre = 0 then : return : end if
if nombre = 1 then : gosub Init_PaP: : end if

return
 

PieM

Senior Member
Decidemment je les accumule . A lieu d'aller a init_PaP , j'allais a gocub clavier . ( vous auriez pus le trouver lol) .

Un dernier cette fosi en esperant que c'est la bonne :
Merci de lire ce qui a été dit concernant l'approche à avoir .
Ce programme est l'exemple même de ce qu'on dit de ne pas faire! c'est un peu irritant !
 

zeltron

Senior Member
Decidemment je les accumule . A lieu d'aller a init_PaP , j'allais a gocub clavier . ( vous auriez pus le trouver lol) .

hé! mais je l'ai trouvé puisque que je te le dis! en 301!:mad:;) (certe apres une correction de mon 1er message)
et j'ai déjà changé cette phrase et ça marche


Comme déjà dit plus haut prenez un papier, un crayon et essayez d'imaginer les actions que vous souhaitez faire et comment vous allez les lancer, et de quelles infos vous avez besoin.

oui bé c"est plus facile à dire qu'à faire quand on sait pas comme moi ou je vais et comment y aller ;);)
 

BESQUEUT

Senior Member
oui bé c"est plus facile à dire qu'à faire quand on sait pas comme moi ou je vais et comment y aller ;);)
Soyez persuadé que tenter d'écrire un programme sans savoir ce qu'il va faire est encore plus chronophage...
Sincèrement, tentez l'exercice : une petite grille, de 1 à 3 choix possibles à chaque fois :
Ecran N°1 :
1:INIT 2:Etalon
Votre choix :__

==> Je tape 1 et je valide.

Ecran N°2:
INIT en cours
Validation=ARRET

Quand c'est fini on revient à Ecran N°1
==> Je tape 2 et je valide.

Ecran N°3 :
ETALON en cours
Numéro Voie =__

Je choisi la voie N°1
Le pont se positionne à la dernière valeur enregistrée pour la voie N°1
Au premier lancement, c'est la position enregistrée par défaut.

Ecran N°4 :
Voie01 vitesse=8
4<>6 8<>2


Chaque appui sur la touche 4 provoque une rotation d'un pas entier.
Idem pour 6 dans l'autre sens.
Les appuis sur 8 et 2 permettent de multiplier ou de diviser la vitesse par 2 (entre 1 et 64)
La touche Effacement (faudrait lui donner un nom?) passe à écran N°5 sans sauvegarder.
La touche Validation sauvegarde et passe à écran N°5

Ecran N°5 :
1:INIT 2:Etalon
3:Exploit Chx:__

Je choisis : 3

Ecran N°6
Voie actuelle : 01
Votre choix : __

Je choisis la voie N°2 et je valide.
le pont se positionne sur la dernière position enregistrée pour la voie N°2, puis revient à écran N°6
Pour sortir, tapez la voie N°99 qui renvoie à écran N°5
 
Last edited:

dje8269

Senior Member
Ce programme est l'exemple même de ce qu'on dit de ne pas faire! c'est un peu irritant !
Loin de moi l'idée de vouloir t'irriter, crois le bien .

Ce petit programme était juste a titre "pédagogique" on va dire ; Car je comprends tout a fait ce que ressent Zeltron . il y a un an j'étais exactement dans le même cas de figure . Il c'est ce qu'il voudrait, mais il peut pas le mettre le sur papier car, il ne sait pas ce qu'il est possible de faire ;

Il est difficile de dire ou on veut aller , quand on ne sait pas comment y aller . Le petit programme fournis, était juste pour montrer comment faire, et j'ai bien signaler que c'était inutile de coteriserune jambe de bois . mais peut etre, que ca lui a permis d'entre voir les problèmes a venir ; et en plus cela donne envie de continuer quand on voit que ca fonctionne un peu !

@ Zeltron : quand tu cite une phrase de quelqu'un ajoute les balises
ici ta citation[/QUOTE ] pour bien les differencier de tes dires, ce sera plus agréable pour nous de te lire.
 

BESQUEUT

Senior Member
Je verrais bien un "arrêt d'urgence" câblé sur une entrée (d'interruption ?) du Picaxe.
Utilisable via un bouton rouge dédié à ça.
Mais aussi potentiellement par un autre module pour demander la main afin d'imposer un choix externe.
Ca éviterai d'avoir à gérer en permanence une option de menu et la touche du clavier.
Et si communication entre modules, scruter en permanence un port série...

En fait, je ne vois pour le moment qu'un seul autre module dédié au pilotage des aiguilles.
Pour le choix des aiguilles, le clavier c'est pas mal. Le plus simple, c'est d'ajouter un LCD.

Reste à choisir les 2 positions et les visualiser. Par exemple
Ecran N°xx
Aiguille N°12 Etat=G
Corr:Etat Valid:Exit

L'appui sur Correction fait changer l'état de Gauche à Droite
La composition d'un numéro change directement le numéro d'aiguille.
L'appui sur Valid renvoie au menu principal.

Mais j'avais aussi proposé un encodeur et 2 Leds à coté de chaque aiguille, plus un poussoir pour changer d'état.
Dans ce cas, l'encodeur fait éclairer 1 des 2 leds à coté de chaque aiguille, et le poussoir fait passer de l'une à l'autre.

Pour la vitesse et le sens des locos, on pourrait aussi avoir 2 potars pour la vitesse de chaque loco, et 2 inters pour le sens.
Si on veut un retour visuel, là encore on a le choix entre un LCD, 2 bargraph, un OLED,...
Si aucune autre interaction, on peut utiliser un Picaxe dédié.

Mais s'il faut coordonner la vitesse des locos avec des capteurs et des aiguilles, il y a le choix entre faire beaucoup sur un seul Picaxe et gérer le multitâches, ou gérer les communications entre n modules. Pour ça, il faudrait connaitre la nature des interactions possibles.

Idem s'il faut partager clavier/écran entre différents modules.
 
Last edited:

BESQUEUT

Senior Member
Il est difficile de dire ou on veut aller , quand on ne sait pas comment y aller .
Ah ?
J'aimerais bien aller à Paris. J'ai plusieurs options : en train, en avion ou en voiture.
Mais si je ne sais pas que je veux aller à Paris, comment je calcule le prix de chaque option et le délai de parcours porte à porte ?

Je fais appel à un ami : il me dit de regarder aussi le co-voiturage : sur cet itinéraire, il y a plein de propositions.
Si c'est pour un trajet Babeau-Bouldoux <=> La Monnerie-Le Montel, nettement moins... (et donc le conseil n'est pas pertinent...)
 

BESQUEUT

Senior Member
Ah au fait, j'ai oublié de vous dire : je vais à Paris pour prendre l'avion pour aller à Malé.
Du con : tu pouvais pas le dire plus tôt...
Dans ce cas, c'est un vol en correspondance au départ de Montpellier...
Mais tu auras un meilleur prix en passant par Amsterdam...
 

zeltron

Senior Member
dje 8269 tu as bien résumé ce que je ressent!

mais avec vos conseils je comprends mieux et me lance en proposant ça

la 1er ligne display affiche "menu principal"
la seconde ligne c'est 4 lignes de menu qui défilent suivant le déplacement d'un potar/ou touche +/- enter
-init pont
-étalon voie
- entrée garage
- sortie garage

une des 4 lignes est validé par un bouton (clavier ou bp independant??)

une fois la ligne choisie elle passe en 1er ligne
pour - init pont nous avons en seconde ligne
ok 1 retour2

pour étalon voie (normalement ce menu est peu utilisé car je ne pense pas ajouter de voies apres construction)
nous avons en seconde lignes
ok 1 retour 2
ensuite s'affiche en 1er ligne
memo position
la 3 boutons poussoirs independants du clavier pour validation des choix
+ (sens horaire) - (antihoraire) m (pour mise en memoire) si on lache + le moteur s'arrete
apres m une ligne apparait pour memorise le numero de la voie correspondant a l'aide du clavier
il est peut être possible d'ajouter un autre menu ici de reprogrammation automatique des voies
si l'on a touché à la poulie comme en à parlé piem mais ça doit être chaud a faire ça...

entrée garage
ok 1 retour2
si ok choix voie 1 ou 2 (il y a 2 acces entreé au pont)
loco sur pont?
ok1 sinon attente
voie de garage?
saisie du n de la voie de garage à positionner avec le clavier
loco garré ?
ok1 retour sinon message attente

sortie garage
ok1 retour2
choix de voie à sortir
saisie n au clavier et ok1
loco sur pont?
ok 1 sinon attente
et ensuite mise en face sur l'unique voie de sortie
loco sortie pont
ok1 retour sinon message attente
 
Last edited:

PapyJP

Senior Member
Soyez persuadé que tenter d'écrire un programme sans savoir ce qu'il va faire est encore plus chronophage...
Sincèrement, tentez l'exercice : une petite grille, de 1 à 3 choix possibles à chaque fois :
Ecran N°1 :
1:INIT 2:Etalon
Votre choix :__

==> Je tape 1 et je valide.

Ecran N°2:
INIT en cours
Validation=ARRET

Quand c'est fini on revient à Ecran N°1
==> Je tape 2 et je valide.

Ecran N°3 :
ETALON en cours
Numéro Voie =__

Je choisi la voie N°1
Le pont se positionne à la dernière valeur enregistrée pour la voie N°1
Au premier lancement, c'est la position enregistrée par défaut.

Ecran N°4 :
Voie01 vitesse=8
4<>6 8<>2


Chaque appui sur la touche 4 provoque une rotation d'un pas entier.
Idem pour 6 dans l'autre sens.
Les appuis sur 8 et 2 permettent de multiplier ou de diviser la vitesse par 2 (entre 1 et 64)
La touche Effacement (faudrait lui donner un nom?) passe à écran N°5 sans sauvegarder.
La touche Validation sauvegarde et passe à écran N°5

Ecran N°5 :
1:INIT 2:Etalon
3:Exploit Chx:__

Je choisis : 3

Ecran N°6
Voie actuelle : 01
Votre choix : __

Je choisis la voie N°2 et je valide.
le pont se positionne sur la dernière position enregistrée pour la voie N°2, puis revient à écran N°6
Pour sortir, tapez la voie N°99 qui renvoie à écran N°5
Ah que cet IHM serait facile à écrire avec un terminal Minitel ( ou similaire, mais je n' en connais pas ).
>>> Pour l' histoire, j' avais conçu le ' poste de commande ' du circuit de mon pote autour de trois Minitel. Aucun bouton, potar, leds, ... Seulement un câble Din 5 broches les reliant chacun à une boîte contenant les Picaxes. Très propre, façon tour de contrôle.
De mémoire, chaque terminal avait sa fonction ( les modules de Besqueut ? ): Aiguillages / Mise sous tension des sections, conduite des convois / All purpose ( allumage des divers, ...( et pourqoui pas pont tournant )).
>>> Ca parait un peu ringuard ( vintage dirait-on aujourd'hui ) mais c' est une solution pas chère, facile à programmer, très efficace.
Seuls bémols: pas de graphisme, pas de couleurs. Si besoin, remplacer les Minitel par des note-books. Mais là, bonjour la programmation et les interfaces ! Sans parler du prix ...
 

dje8269

Senior Member
Et pourquoi pas une tablette pas cher ! Des petites sous marques son abordables et la c'est la grande classe! De quoi en mettre plein les yeux. Graphisme sans limites simulation du pont etc.....

Et pas forcément super compliqué , des modules tout fait existe , et ya même une discussion qui en parle en ce moment.
 

zeltron

Senior Member
ah oui pourquoi pas parceque franchement j'ai jamais kifer le minitel
et malgré que je ne manque pas trop de place la pour coup le minitel est bien trop gros c'est de l'ech z!
(on pourraient mettre un réseau dans ce minitel!)
et avec un minitel mes futurs petits enfants se fouteront de ma gueule !;)

dje as tu des raccourcis vers ce genre de tablette pas cher et adaptées? et sur les modules interfaces
 

dje8269

Senior Member
Yes !

Ben n'importe quel tablette travaillant sous android pourrait faire l'affaire . je ne connais pas l'etat de tes finances . genre ca : tablette

et il y as cette discussion en cours . Je ne m'etendrais pas trop la dessus , car je ne connais pas encore ( mais ca m'interresse fortement) . Il faudrait voir la difficulté que demanderait cela avec un expert qu ias deja travailler la dessus .
 

BESQUEUT

Senior Member
Il faudrait voir la difficulté que demanderait cela avec un expert qu ias deja travailler la dessus .
Dites les gars...
On n'arrive déjà pas à savoir ce que l'on veut faire...
Vous avez déjà écrit une application sous Androïd ou IOS ? Merci de ne pas compliquer la sauce.

Le post #311 introduit les notions d'entrée et sortie garage. Merci de donner des précisions :
- comment on détecte que la loco est sur le pont (ou à cheval entre le pont et le plateau...)
- un petit crobar avec les voies d'entrées et de sortie serait le bienvenu
- Faut-il commander l'alimentation des voies ou est-ce géré séparément ?
==> Si géré en même temps que le pont, préciser à quel moment on met quoi sous tension ? à quelle vitesse ? dans quel sens ?
 

PieM

Senior Member
Et pas forcément super compliqué , des modules tout fait existe , et ya même une discussion qui en parle en ce moment.
Ben tiens donc !

Bon je crois qu'il est urgent d'attendre que l'on sache l'objectif à atteindre , avec quoi, parce que pour l'instant c'est assez confus!
Si on a déjà du mal à faire un petit programme basic qui se tienne, c'est mal parti pour un développement sous androïd.
Mais si dje dit que ce n'est pas compliqué !
 

dje8269

Senior Member
Lol , j'ai juste soumis cette idée ; Je suis d'accord avec le fait que d'abord le faire fonctionner et savoir ce qu'il faut faire . la gestion par tablette doit venir bien après.
 

BESQUEUT

Senior Member
Ah que cet IHM serait facile à écrire avec un terminal Minitel ( ou similaire, mais je n' en connais pas ).
On pourrait faire un équivalent avec un écran LCD afficheur-serie et un clavier de PC en ps2.
Mais pour la stricte gestion d'un seul module, un LCD 2x16 avec un clavier 12 ou 16 touches, et quelques accessoires (poussoirs, inters, encodeur, potar, LEDs ) peut suffire.
Si c'est pour gérer tout le plateau, je prendrais un portable apacher, programmable en basic, et un convertisseur ftdi USB/4 ports série capable de piloter 4 ou 8 modules genre Picaxe.
Si vous êtes à l'aise sous Eclipse, le monde d'Androïd vous ouvre ses portes...
 
Last edited:

zeltron

Senior Member
ouinnn moi qui pensait avoir répondu à vos questions!
effectivement j'ai survolé le post c'est trés interessants mais déjà que je vous fais peter un câble nous allons oublier pour le moment la tablette

pour l'instant la loco n'est pas détectée sur le pont car je vais commander l'alimentation des voies en manu
et nous pouvons en rester la!

c'est pour cela que j'ouvre un dialogue sur la présence loco pont oui ou non avant de déplacer le pont
car par la suite comme j'ai déjà dit je ne veux pas mettre de nouveaux contatcs sur le pont
une solution optocoupleur me semble impossibles vue que la loco tourne et qu'un truc placé au dessus du pont c'est moche
en dessous impossible l'axe de rotation est plein
reste un composant dans mon tiroir que je ne connais pas trop et pas de data sheet
c'est un hw11nc3 c'est une visée laser elle doit déliver une tension proportionnelle à la distance détectée
(cette engin était capable de mesurer la planéîté d'un plateau tournant avec une tres grande précision)
voici un truc qui lui ressemble
http://www.dipac-fr.com/cellule-coudee-90°-npn-nonc-sortie-connecteur-m12-p-2112.html
mais il faudrait placer ça au dessus du pont c'est moche

ne pas perdre de vue qu'aprés le déplacement du pont ce qui m'interresse le plus c'est les alims pwm non pas l'automatisation complete du réseaux
ces alims pourront être indépendante commandées en manu par potar/inter pour vitesse/sens

sur le pont il n'y a que du séquentiel
une fois le pont en face de la voie je pense que le picaxe pourrait commuter l'alimentation de cette voie
il n'y a qu'une seule voie d'alimentée à la fois aussi bien en entrée que sortie
et l'opérateur n'a plus qu'a démarrer l'alim pwm vitesse et l'inverseur sens
 
Last edited:
Top