positionnement avec un moteur pas à pas

zeltron

Senior Member
nous sommes encore sur la même longueur d'onde c'est comme ça que j'aurai procédé moi aussi
c'est la fameuse méthode du lapin blanc enfin "la patte de lapin blanc":D
je la pratique souvent moi aussi
et la j'ai trouvé la bonne valeur en 3 coups!
alors comme j'avais du temps de libre j'ai testé +1 pas, +2pas
je te montre ça en photo
à 32200 (c'est la seule voie pour l'instant d'installée et encore avec du scotch)
c'est la voie d'entrée elle est tres proche du o référence

32201

32202

la resistance 1/4w montre l'echelle....
le pilotage est la méca sont top je trouve car avec + 2 pas d'erreur, les wagons et locos passent trés bien!!!
j'ai fait la manip plusieurs fois y'a pas de soucis!
donc la bonne valeur à prendre est 32200
y'a t'il besoin de rentrer ça dans une memoire ou le programme suffit???
 

dje8269

Senior Member
Lol tu es allé plus vite que moi .

La valeur 32200 , je pense on devrait l'enregistrer dans l'eeprom pour la garder quand l'alim est coupé .

Par contre du coup essaye mon programme , une fois le pont initialisé , tu avance un peu avec l'interrupteur , et tu compléte en manuel, pour que la valeur des pas arrive a 32200 .

ca servira de test grandeur nature

PS: non ce n'est pas la méthode du lapin blanc, mais celle des mecs comme nous qui préférons galérer manuellement en avançant un peu , que galérer intellectuellement sans que rien ne marche . lol
 

PapyJP

Senior Member
#442 :
... que galérer intellectuellement sans que rien ne marche . lol...
Merci pour tous ceux qui vous suivent et galèrent pour vous donner des conseils !
Votre devise vous ressemble: cogitez un peu, vous apprendrez beaucoup plus vite ... et mieux.
 
Last edited:

dje8269

Senior Member
Merci pour tous ceux qui vous suivent
Il y a erreur sur l'interprétation . Je parle des personnes comme moi et zeltron.
Même en cogitant longtemps des fois je ne suis arrivé à rien.

Le dernier exemple en date sur le HEAD tracker, J’AI lu un paquet de fois la DS, j'ai traduis des phrases , j'ai fais millions de test en cogitant et rien. Je voulais juste dire par là , que je sens bien plus à l'aise en manuel , qu en pur réflexion.

Loin de moi l'idée de vous insulter , de quelques sortes que ce soit.

Et oui ma devise me ressemble , elle est de moi . Je préfère apprendre par les tests, c'est ma façon de faire. Oui je fais plein d'erreur et oui je fais plein de typon. Du moment que ça ne gêne personne .
 

zeltron

Senior Member
idem pour moi c'st de l'autoderision quand je parle de patte de lapin le pif c'est pas scientifique mais ça marche aussi parfois
surtout que la ce n'est pas pour un satellite! ;)

dje ton programme marche super c'est parfait yavait juste quelque copier coller à rectifier sur la déclaration des symboles et sur le sens de rotation ccw, cw
je vais séparer ça pour avoir l'initialisation 0 et l'étalonnage
je ne peux pas te faire de vidéo pour l'instant mon fils est partie avec la go pro
les valeurs peuvent être approchées avec comme calcule 800 pas pour 30 °
avec ton prog j'ai pu constater que la tolerance avec ce pilotage 1/8 de pas, permet +-15 pas maximum avant de dérailler
ça s'explique aussi par le profile des roues est conique pour rattraper ce genre de jeu
d'autre part j'ai compris pourquoi le moteur gueule c'est quand il se trouve en arret sur un pas qui n'est pas entier
j'ai bien fait de ne pas poser les voies autour du pont
je vais pouvoir maintenant le faire en posant les voies sur ces pas entier!
sauf que si un jour je démonte la poulie ça va être difficile de retrouver des pas entier pour ces même voies
merci super!
reste plus qu'a ajouter la possibilité de rentrer les pas en memoire
 
Last edited:

dje8269

Senior Member
reste plus qu'a ajouter la possibilité de rentrer les pas en memoire
Ben c'est pas ce qu'il y a de plus dur . La commande pour enregistrer la valeur en Eeprom est "write" voir manuel . ainsi une fois trouvée par exemple 32200 ; on la stock dans la case memoire 1 parexemple comme il s'agit de la première voie .

ca donnera ; write 1,32200

ensuite pour lire cette valeur il suffit de faire "read" et de choisir ou stocker cette valeur . par exemple read 1, b1 . donc la valeur qui se trouve dans la case mémoire 1 , va être mis dans la variable b1 par exemple ;je crois que b1 est utilisé déjà donc faudrait changé .

Peut tu reposter ton programme avec tes modif de symbols et variable ? je vais regarder pour enregistrer la valeur si tu veux !

je vais séparer ça pour avoir l'initialisation 0 et l'étalonnage
C'est a dire ?

d'autre part j'ai compris pourquoi le moteur gueule c'est quand il se trouve en arret sur un pas qui n'est pas entier
Alors peut être qu'il est préférable d'avancer 1 pas par un pas ? c'était quoi la raison d'être précis au 1/8 de PAs ?
 

zeltron

Senior Member
32199 ça tombe sur un pas entier

"C'est a dire ?"
pour l'instant dans le menu si tu vas dans le menu recherche 0 tu tombes dans le menu étalonnage
mais ça c'est rien ce n'est plus que de la mise en forme des menus
ayant la structure ça me permettra de cogiter un peu sans trop de douleurs névralgiques!:D

le 1/8 pas c'est pour plus de précision dans le positionnement je préfere le garder
Code:
#picaxe 40X2

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

'entrees ------------------------------
symbol FC_opto =  pinB.4   'Fin de course opto
symbol Stop_rota =  pinB.3   'arret moteur pas ? pas
'sorties ------------------------------
symbol dir     =  pinB.5   'sortie direction
symbol pas     =  B.6      'sortie pas


'*********** variables **************************
symbol touche        = b2
Symbol nombre        = b3
Symbol compteur      = b4
SYMBOL LeMenu	   = b5 ' Le Menu actuellement affich?
Symbol LaVoie	   = b6 ' La Voie actuellement s?lectionn?e
Symbol L_Aiguille      = b7  ' L'aiguille actuellement choisie

symbol Nb_de_pas     = w23 'nombre de pas ? realiser
symbol Pos_cible       = w24 'position cible
symbol Pos_actuelle   = w25 'position courante
symbol var_temp       = w26 'variable temporaire
Symbol addition         = w27

'*********** 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

SYMBOL Menu_INIT=0    ;defini un symbole menu_init pour la const 0  
SYMBOL Menu_ETAL=1   ;idem pour 1 etc
SYMBOL Menu_EXPL=2
SYMBOL Menu_PONT=3
SYMBOL Menu_AIGU=4
SYMBOL Menu_REGL=5
SYMBOL Menu_ROTO=6

'reserve bits = b0
symbol Sens = bit0

'*********** 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

'************  initialisation   *******************
setfreq m16             'frequence 16MHz interne

SerOut B.7, N2400, ( 254, %00000001 ) ' efface l'ecran
pause 100
serout B.7,N2400_16,(254,128,"INITIALISATION..")
serout B.7,N2400_16,(254,192,"       3       ")
pause 2000
serout B.7,N2400_16,(254,192,"       2       ")
pause 2000
serout B.7,N2400_16,(254,192,"       1       ")
pause 2000

LeMenu=Menu_INIT; Charge la variable b5(le menu)valeur 0
LaVoie=1
L_Aiguille=1

'############## Programme principal #################

do
	
	serout B.7,N2400_16,(254,128,"1:PONT  2:AIGUIL")
	serout B.7,N2400_16,(254,192,"3:REGL  Choix:__")

	gosub clavier	' On attend un choix de menu

	select case nombre
		case = 0
			'on fais rien
		case = 1
			gosub pont
		case = 2
			gosub aiguil
		case = 3
			gosub reglage
		else
			gosub erreur
	endselect

loop

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

     	do	' On attends que la touche soit rel?ch?e
 		readadc a.0 ,compteur
  	loop while compteur < 250    

	select case touche
		case = 12		' si un appui sur la touche est detect?
			return	' Alors on enregsitre le nombre et on sort
			
		case = 11     	'correction dernier chiffre
			select case nombre
				case = 0
					return' Si on appui sur correction on fais un retour
				case < 10
					nombre = 0
					serout B.7,N2400_16,(254,206,"__")
				else
				nombre = nombre/10 
				serout B.7,N2400_16,(254,206,"_",#nombre)
			end select
			
	else
		
		if nombre > 9 then	' Verifie si c'est un troisieme chiffre qu'on rentre
			nombre = touche	' Si c'est le cas on repart a zero
			serout B.7,N2400_16,(254,206,"_",#nombre)
		else
    			nombre = nombre*10 + touche 'ajout du chiffre
			if nombre > 9 then
				serout B.7,N2400_16,(254,206,#nombre)
			else
				serout B.7,N2400_16,(254,206,"_",#nombre)
			end if
		end if					
	endselect
	
loop 

'#####################################################################################################
'##############################           Programme secondaire           #############################
'#####################################################################################################

pont:

do
	serout B.7,N2400_16,(254,128,"Voie en cours: ",#LaVoie)
	serout B.7,N2400_16,(254,192,"Voie choisie: __")

	gosub clavier

	select case nombre
		case = 0
			return
		case = 1
			' on effectue la tache pour amener a la voie 1
			' GOSUB changement de voie
			exit
		case = 2 
			'vers la voie 2 Etc ......
			exit
		else
			' si la saisie est differente d'un chiffre attendu on affiche une erreur de saisie
			gosub erreur
	endselect
loop

return

Aiguil:
do
	serout B.7,N2400_16,(254,128,"Aiguil ",#L_Aiguille," Etat=_")
	serout B.7,N2400_16,(254,192,"Cor ou  choix:__")

	gosub clavier

	select case nombre
		case = 0
			return
		case = 1
			' on effectue la tache corrspondante
			exit
		case = 2 
			'on effectue la tache corrspondante Etc ......
			exit
		else
			' si la saisie est differente d'un chiffre attendu on affiche une erreur de saisie
			gosub erreur
	endselect
loop

return

reglage:

do
	serout B.7,N2400_16,(254,128,"1:PONT  2:AIGUIL")	
	serout B.7,N2400_16,(254,192,"3:ROTO  Choix:__")

	gosub clavier

	select case nombre
		case = 0
			return
		case = 1
			' on effectue le reglage du pont
			serout B.7,N2400_16,(254,128,"RECHERCHE du 0  ")	
			serout B.7,N2400_16,(254,192,"Attendre svp... ")	   	
			gosub	Init_PaP
			serout B.7,N2400_16,(254,128,"Pont en position")	
			serout B.7,N2400_16,(254,192,"                ")
			pause 4000			
			serout B.7,N2400_16,(254,128,"valeur pas:",#Pos_actuelle)	
			serout B.7,N2400_16,(254,192,"Ajout de pas:  ")
			
			dir = ccw	' on tourne dans un sens
			do loop while Stop_rota = 0	' On attend qu'on bascule l'inter
			do while Stop_rota = 1		'tout pendant que l'inter est actif
			      pulsout pas,1		'on tourne en grande vitesse sens cw
				inc Pos_actuelle
				serout B.7,N2400_16,(254,139,#Pos_actuelle)
			      pause Vit_rapide
			loop
		   	serout B.7,N2400_16,(254,206,"_?")
			do
				gosub clavier		' on va lire le clavier
				select case nombre
					case = 0
						dir = cw	' on tourne dans l'autre sens
							for var_temp = 1 to 99
								pulsout pas,1
								dec Pos_actuelle
								serout B.7,N2400_16,(254,139,#Pos_actuelle)	
							next
					case = 99
						return
					else
						dir = ccw	' on tourne dans l'autre sens
							for var_temp = 1 to nombre
								pulsout pas,1
								inc Pos_actuelle
								serout B.7,N2400_16,(254,139,#Pos_actuelle)	
							next
					end select
				
			loop
			exit
			
		case = 2 
			'on effectue le reglage des aiguilles
			serout B.7,N2400_16,(254,128,"INIT AIGUILLAGE ")	
			serout B.7,N2400_16,(254,192,"Attendre svp    ")
			pause 4000
			exit
		case = 3
			' on effectue le ROTO ( je sais pas ce que c'est lol)
			serout B.7,N2400_16,(254,128,"Etalon__ Voie ",#LaVoie)
			serout B.7,N2400_16,(254,192,"Cor:EXP Choix:__")
			gosub clavier
			exit
		else
			' si la saisie est differente d'un chiffre attendu on affiche une erreur de saisie
			gosub erreur
	endselect
loop

return

'#####################################################

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

   dir = cw
   do while FC_opto = 1 'tout pendant que l'opto est ocult
      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 arriere
   Do while FC_opto = 1    'en vitesse tres lente jusqu'a detection du bord de fente.
      pulsout pas,1
      pause Vit_lente
   loop
   
   Pos_actuelle = 32000    'la detection faite, on initialise le compteur de pas ? 32000
return   

erreur:
serout B.7,N2400_16,(254,128,"    ERREUR    ")
serout B.7,N2400_16,(254,192,"  DE SAISIE   ")
pause 2000
return
il faut prévoir un menu pour l'enregistrement des pas/positions en memoire
si l'enregistrement est fait avec le soft un jour il n'y aura peut être plus de compatibilité avec l'usb, picaxe editor ou autre truc imprévisible...
 

dje8269

Senior Member
alors voila ,

A la fin du reglage d'une voie il y a un message pour enregister ou non la valeur . si on tape sur oui , alors il demande le numero de la voie a enregistrer , et la place d'un dans l'Eeprom .
Si on appelle une voie il va chercher dans l'Eeprom la valeur correspondante .

Je n'ai pas teste en simu, j'espere que ca va le faire ;

Bon test :

Code:
#picaxe 40X2

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

'entrees ------------------------------
symbol FC_opto =  pinB.4   'Fin de course opto
symbol Stop_rota =  pinB.3   'arret moteur pas ? pas
'sorties ------------------------------
symbol dir     =  pinB.5   'sortie direction
symbol pas     =  B.6      'sortie pas


'*********** variables **************************
symbol touche        = b2
Symbol nombre        = b3
Symbol compteur      = b4
SYMBOL LeMenu	   = b5 ' Le Menu actuellement affich?
Symbol LaVoie	   = b6 ' La Voie actuellement s?lectionn?e
Symbol L_Aiguille      = b7  ' L'aiguille actuellement choisie

symbol Nb_de_pas     = w23 'nombre de pas ? realiser
symbol Pos_cible       = w24 'position cible
symbol Pos_actuelle   = w25 'position courante
symbol var_temp       = w26 'variable temporaire
Symbol addition         = w27

'*********** 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

'reserve bits = b0
symbol Sens = bit0

'*********** 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

'************  initialisation   *******************
setfreq m16             'frequence 16MHz interne

SerOut B.7, N2400, ( 254, %00000001 ) ' efface l'ecran
pause 100
serout B.7,N2400_16,(254,128,"INITIALISATION..")
serout B.7,N2400_16,(254,192,"       3")
pause 2000
serout B.7,N2400_16,(254,192,"       2")
pause 2000
serout B.7,N2400_16,(254,192,"       1")
pause 2000

LeMenu=Menu_INIT; Charge la variable b5(le menu)valeur 0
LaVoie=1
L_Aiguille=1

'############## Programme principal #################

do
	serout B.7,N2400_16,(254,128,"1:PONT  2:AIGUIL")
	serout B.7,N2400_16,(254,192,"3:REGL  Choix:__")

	gosub clavier	' On attend un choix de menu

	select case nombre
		case = 0
			'on fais rien
		case = 1
			gosub pont
		case = 2
			gosub aiguil
		case = 3
			gosub reglage
		else
			gosub erreur
	endselect

loop

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

     	do	' On attends que la touche soit rel?ch?e
 		readadc a.0 ,compteur
  	loop while compteur < 250    

	select case touche
		case = 12		' si un appui sur la touche est detect?
			return	' Alors on enregsitre le nombre et on sort
			
		case = 11     	'correction dernier chiffre
			select case nombre
				case = 0
					return' Si on appui sur correction on fais un retour
				case < 10
					nombre = 0
					serout B.7,N2400_16,(254,206,"__")
				else
				nombre = nombre/10 
				serout B.7,N2400_16,(254,206,"_",#nombre)
			end select
			
	else
		
		if nombre > 9 then	' Verifie si c'est un troisieme chiffre qu'on rentre
			nombre = touche	' Si c'est le cas on repart a zero
			serout B.7,N2400_16,(254,206,"_",#nombre)
		else
    			nombre = nombre*10 + touche 'ajout du chiffre
			if nombre > 9 then
				serout B.7,N2400_16,(254,206,#nombre)
			else
				serout B.7,N2400_16,(254,206,"_",#nombre)
			end if
		end if					
	endselect
	
loop 

'#####################################################################################################
'##############################           Programme secondaire           #############################
'#####################################################################################################

pont:

do
	serout B.7,N2400_16,(254,128,"Voie en cours: ",#LaVoie)
	serout B.7,N2400_16,(254,192,"Voie choisie: __")

	gosub clavier

	select case nombre
		case = 0
			return
		case = 1
			read 1,pos_cible
			gosub Mise_en_position
			exit
		case = 2 
			'vers la voie 2 Etc ......
			exit
		else
			' si la saisie est differente d'un chiffre attendu on affiche une erreur de saisie
			gosub erreur
	endselect
loop

return

Aiguil:
do
	serout B.7,N2400_16,(254,128,"Aiguil ",#L_Aiguille," Etat=_")
	serout B.7,N2400_16,(254,192,"Cor ou  choix:__")

	gosub clavier

	select case nombre
		case = 0
			return
		case = 1
			' on effectue la tache corrspondante
			exit
		case = 2 
			'on effectue la tache corrspondante Etc ......
			exit
		else
			' si la saisie est differente d'un chiffre attendu on affiche une erreur de saisie
			gosub erreur
	endselect
loop

return

reglage:

do
	serout B.7,N2400_16,(254,128,"1:PONT  2:AIGUIL")	
	serout B.7,N2400_16,(254,192,"3:ROTO  Choix:__")

	gosub clavier

	select case nombre
		case = 0
			return
		case = 1
			' on effectue le reglage du pont
			serout B.7,N2400_16,(254,128,"RECHERCHE du 0  ")	
			serout B.7,N2400_16,(254,192,"Attendre svp... ")	   	
			gosub	Init_PaP
			serout B.7,N2400_16,(254,128,"Pont en position")	
			serout B.7,N2400_16,(254,192,"                ")
			pause 4000			
			serout B.7,N2400_16,(254,128,"valeur pas:",#Pos_actuelle)	
			serout B.7,N2400_16,(254,192,"Reglage rapide  ")
			
			dir = ccw	' on tourne dans un sens
			do loop while Stop_rota = 0	' On attend qu'on bascule l'inter
			do while Stop_rota = 1		'tout pendant que l'inter est actif
			      pulsout pas,1		'on tourne en grande vitesse sens cw
				inc Pos_actuelle
				serout B.7,N2400_16,(254,139,#Pos_actuelle)
			      pause Vit_rapide
			loop
					serout B.7,N2400_16,(254,192,"Ajout de pas: _?")

		   	do
				gosub clavier		' on va lire le clavier
				select case nombre
					case = 0
						dir = cw	' on tourne dans l'autre sens
							for var_temp = 1 to 99
								pulsout pas,1
								dec Pos_actuelle
								serout B.7,N2400_16,(254,139,#Pos_actuelle)	
							next
					case = 99
						serout B.7,N2400_16,(254,128,"Enreg la valeur?")	
						serout B.7,N2400_16,(254,192,"Oui(1)  Non(2)  ")
						Gosub clavier
						Select case nombre
							case = 1
								serout B.7,N2400_16,(254,192,"Numero voie:   ?")
								Gosub clavier
									write nombre,Pos_actuelle
									return
							case = 2
								return
							else
								gosub erreur
							endselect
					else
						dir = ccw	' on tourne dans l'autre sens
							for var_temp = 1 to nombre
								pulsout pas,1
								inc Pos_actuelle
								serout B.7,N2400_16,(254,139,#Pos_actuelle)	
							next
					end select
				
			loop
			exit
			
		case = 2 
			'on effectue le reglage des aiguilles
			serout B.7,N2400_16,(254,128,"INIT AIGUILLAGE ")	
			serout B.7,N2400_16,(254,192,"Attendre svp    ")
			pause 4000
			exit
		case = 3
			' on effectue le ROTO ( je sais pas ce que c'est lol)
			serout B.7,N2400_16,(254,128,"Etalon__ Voie ",#LaVoie)
			serout B.7,N2400_16,(254,192,"Cor:EXP Choix:__")
			gosub clavier
			exit
		else
			' si la saisie est differente d'un chiffre attendu on affiche une erreur de saisie
			gosub erreur
	endselect
loop

return

'#####################################################

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

   dir = cw
   do while FC_opto = 1 'tout pendant que l'opto est ocult
      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 arriere
   Do while FC_opto = 1    'en vitesse tres lente jusqu'a detection du bord de fente.
      pulsout pas,1
      pause Vit_lente
   loop
   
   Pos_actuelle = 32000    'la detection 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
erreur:
serout B.7,N2400_16,(254,128,"    ERREUR    ")
serout B.7,N2400_16,(254,192,"  DE SAISIE   ")
pause 2000
return
 

zeltron

Senior Member
pff tu es une bête de travail!
je test ça demain si ça marche le positionnement du pont et résolu
je ne vois pas ce qui pourrait bloquer ensuite
je lis la doc picaxe les membres du forum ont fait un super travail de traduction
mais je trouve cette doc assez sec pour un débutant
heureusement que ce forum existe
et que vous êtes la!
 

PieM

Senior Member
zeltron said:
d'autre part j'ai compris pourquoi le moteur gueule c'est quand il se trouve en arret sur un pas qui n'est pas entier
j'ai bien fait de ne pas poser les voies autour du pont
je vais pouvoir maintenant le faire en posant les voies sur ces pas entier!
ça ne vous choque pas d'écrire ça ?
Autrement dit, on peut commander un moteur pas à pas en 1/8 de pas mais il faut impérativement l'arrêter sur un pas entier! Faut m'expliquer l'intérêt...
Non désolé un moteur PaP ne "gueule" pas quand il est arrêté même entre deux pas. C'est induire en erreur les utilisateurs de ce type de moteur.
Commencez à vérifier que le réglage en courant de votre driver est correct, votre câblage, et même votre programme.

le 1/8 pas c'est pour plus de précision dans le positionnement je préfere le garder
pas très cohérent !
 

zeltron

Senior Member
à l'arret sur 32200 le moteur fait du bruit
à 31199 il n'en fait pas... le câblage n'a pas changé entre ces 2 pas, ni le courant...
apres pour le soft la je ne peux pas vous dire....
 
Last edited:

dje8269

Senior Member
Hum.... Je ne vous serais pas d'une grande utilité la dessus , je ne connais pas ce type moteur encore .

Niveau logiciel si vous avez fait la méthode barbare en rentrant directement la velur par programme , alors cela ne peut pas venir de la , il me semble . Que ce passe -t-il pour lmes valeurs 31199 à 31192 et de 32200 à 32208 . Il faudrait trouvé ce qui cloche ;
 

zeltron

Senior Member
dsl dje j'ai testé ton prog doit y'avoir un chti bug
la valeur de la position est bien enregistré mais quand on demande d'aller sur sur la voie
le moteur ne s'arrete pas...
vais voir pourquoi

concernant la remarque de Piem apres ma calote derriere la tête
j'ai continué à investiguer
le moteur n'est plus bruyant tous les 4 pas!
l'amplitude du bruit ressemble à une sinus en fonction du pas
pas +1 un peu de bruit
+2 encore plus de bruit
+3 un peu moins de bruit
+4 plus de bruit du tout...

j'ai ajusté la résistance de limitation courant sans résultat le bruit évolu mais sans baisser
 
Last edited:

zeltron

Senior Member
@ dje je ne pense pas que c'est possible d'enregistrer une si grosse valeur dans 1
il faut passer par les variables w13 etc
mais pour 20 à 25 voies y'en as pas assez
doit y avoir une autre astuce,,,,
peut être pour ça que Piem avez fait un tableau
mais j'ai pas trouvé d'infos sur un truc idem

pour le bruit ce n'est pas grave il est surement amplifié par la raisonance du support
si ça m'enerve plus que ça, je couperai l'alimentation de la puissance carte easy driver
par une sortie uc quand le pont sera inutilisé et ça pourra aussi servir d'arret d'urgence par un switch en serie
 
Last edited:

PieM

Senior Member
@ dje je ne pense pas que c'est possible d'enregistrer une si grosse valeur dans 1
C'est pour ça que j'avais dit (il y a longtemps) de nommer les voies rien qu'avec des nombres pairs.(ou impairs)
écrire en EEprom une variable word demande deux adresses: donc write 0, word xxxxx puis write 2, word yyyy
le numéro de la voie correspond ainsi à à l'adresse mémoire. (read 0, word xxxx etc ...)

si ça m'enerve plus que ça, je couperai l'alimentation de la puissance carte easy driver
dernière chose à faire car vous perdez la position !

Si le moteur fait du bruit, c'est qu'il a un problème d'alimentation.
quelle est sa tension d'alimentation ?
quelles caractéristiques avez vous sur ce moteur: courant par bobinage, résistance bobinage etc ....?
ses références ?

Un moteur en micropas est alimenté par un courant qui se rapproche d'un courant sinusoidal, d'autant plus que nombre de micropas est important entre pas entiers.
C'est pour cela que pour un pas entier le courant est maxi sur un bobinage. Mais sur les pas intermédaires il est réparti différemment sur deux bobinages. Sauf à 4/8 pas ou il y a symétrie, puisque qu'on est sur un demi pas.
d'où votre observation sur le bruit.
 

BESQUEUT

Senior Member
alors voila ,

A la fin du reglage d'une voie il y a un message pour enregister ou non la valeur . si on tape sur oui , alors il demande le numero de la voie a enregistrer , et la place d'un dans l'Eeprom .
Si on appelle une voie il va chercher dans l'Eeprom la valeur correspondante .
Je n'ai pas teste en simu, j'espere que ca va le faire ;
La logique n'est pas bonne :
- il faut d'abord demander le numéro de voie,
- puis lire dan l'EEPROM la dernière valeur enregistrée,
- positionner la voie,
- attendre un réglage éventuel,
- l'idéal est de lire en même temps l'inter de réglage (ou le potar) et le clavier : comme ça on à trois choses possibles à faire :
==> soit on fait un réglage
==> soit on appuie sur la touche de validation (touche *)
==> soit on annule (touche #)
- enregistrer le nouveau réglage si nécessaire.

Prévoir une variable auxiliaire (Disons : Temp) (Ca sert souvent dans un programme; durée de vie limitée, donc on réutilise quand on veut)
Temp=Lavoie*2-1
write Temp,Pos_actuelle
 
Last edited:

zeltron

Senior Member
je ne comprends pas "Temp=Lavoie*2-1"
Pouvez vous développer s'il vous plait?
c'est pour transformer des numeros de voies paire en impaire c'est ça??
 
Last edited:

dje8269

Senior Member
A testé !

je ne comprends pas "Temp=Lavoie*2-1"
Avec cette formule on avance en nombre impair, je l'ai utilisé dans le programme tu comprendras mieux

dje je ne pense pas que c'est possible d'enregistrer une si grosse valeur dans 1
C'est exact , bien vu a toi !



Code:
#picaxe 40X2

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

'entrees ------------------------------
symbol FC_opto =  pinB.4   'Fin de course opto
symbol Stop_rota =  pinB.3   'arret moteur pas ? pas
'sorties ------------------------------
symbol dir     =  pinB.5   'sortie direction
symbol pas     =  B.6      'sortie pas


'*********** variables **************************
symbol touche        = b2
Symbol nombre        = b3
Symbol compteur      = b4
SYMBOL LeMenu	   = b5 ' Le Menu actuellement affich?
Symbol LaVoie	   = b6 ' La Voie actuellement s?lectionn?e
Symbol L_Aiguille      = b7  ' L'aiguille actuellement choisie

symbol Nb_de_pas     = w23 'nombre de pas ? realiser
symbol Pos_cible       = w24 'position cible
symbol Pos_actuelle   = w25 'position courante
symbol var_temp       = w26 'variable temporaire
Symbol addition         = w27

'*********** 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

SYMBOL Menu_INIT=0    ;defini un symbole menu_init pour la const 0  
SYMBOL Menu_ETAL=1   ;idem pour 1 etc
SYMBOL Menu_EXPL=2
SYMBOL Menu_PONT=3
SYMBOL Menu_AIGU=4
SYMBOL Menu_REGL=5
SYMBOL Menu_ROTO=6

'reserve bits = b0
symbol Sens = bit0

'*********** 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

'************  initialisation   *******************
setfreq m16             'frequence 16MHz interne

SerOut B.7, N2400, ( 254, %00000001 ) ' efface l'ecran
pause 100
serout B.7,N2400_16,(254,128,"INITIALISATION..")
serout B.7,N2400_16,(254,192,"       3       ")
pause 2000
serout B.7,N2400_16,(254,192,"       2       ")
pause 2000
serout B.7,N2400_16,(254,192,"       1       ")
pause 2000

LeMenu=Menu_INIT; Charge la variable b5(le menu)valeur 0
LaVoie=1
L_Aiguille=1

'############## Programme principal #################

do
	
	serout B.7,N2400_16,(254,128,"1:PONT  2:AIGUIL")
	serout B.7,N2400_16,(254,192,"3:REGL  Choix:__")

	gosub clavier	' On attend un choix de menu

	select case nombre
		case = 0
			'on fais rien
		case = 1
			gosub pont
		case = 2
			gosub aiguil
		case = 3
			gosub reglage
		else
			gosub erreur
	endselect

loop

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

     	do	' On attends que la touche soit rel?ch?e
 		readadc a.0 ,compteur
  	loop while compteur < 250    

	select case touche
		case = 12		' si un appui sur la touche est detect?
			return	' Alors on enregsitre le nombre et on sort
			
		case = 11     	'correction dernier chiffre
			select case nombre
				case = 0
					return' Si on appui sur correction on fais un retour
				case < 10
					nombre = 0
					serout B.7,N2400_16,(254,206,"__")
				else
				nombre = nombre/10 
				serout B.7,N2400_16,(254,206,"_",#nombre)
			end select
			
		else
		
			if nombre > 9 then	' Verifie si c'est un troisieme chiffre qu'on rentre
				nombre = touche	' Si c'est le cas on repart a zero
				serout B.7,N2400_16,(254,206,"_",#nombre)
			else
	    			nombre = nombre*10 + touche 'ajout du chiffre
				if nombre > 9 then
					serout B.7,N2400_16,(254,206,#nombre)
				else
					serout B.7,N2400_16,(254,206,"_",#nombre)
				end if
			end if					
	endselect
	
loop 

'#####################################################################################################
'##############################           Programme secondaire           #############################
'#####################################################################################################

pont:

do
	serout B.7,N2400_16,(254,128,"Voie en cours: ",#LaVoie)
	serout B.7,N2400_16,(254,192,"Voie choisie: __")

	gosub clavier
	
	select case nombre
		case = 0
			return	' On sort de ce menu
		case > 20 ' si le nombre de voie maximum a rentrer on affiche erreur
			gosub erreur
		else 
			nombre = nombre * 2 - 1	' pour avancer en nombre impaire
			read nombre,Pos_cible	' On lit la valeur a atteindre
			gosub Mise_en_position
			LaVoie = Pos_Actuelle ' MAJ de la voie en cours
			return
	endselect
loop

return

Aiguil:
do
	serout B.7,N2400_16,(254,128,"Aiguil ",#L_Aiguille," Etat=_")
	serout B.7,N2400_16,(254,192,"Cor ou  choix:__")

	gosub clavier

	select case nombre
		case = 0
			return
		case = 1
			' on effectue la tache corrspondante
			exit
		case = 2 
			'on effectue la tache corrspondante Etc ......
			exit
		else
			' si la saisie est differente d'un chiffre attendu on affiche une erreur de saisie
			gosub erreur
	endselect
loop

return
 

dje8269

Senior Member
Le programme est trop long pour rentrer dans un seul message , il faut donc a partir de maintenant le faire en deux fois . il suffit de coller la deuxieme partie a la suite .

Code:
reglage:

do
	serout B.7,N2400_16,(254,128,"1:PONT  2:AIGUIL")	
	serout B.7,N2400_16,(254,192,"3:ROTO  Choix:__")

	gosub clavier

	select case nombre
		case = 0
			return
		case = 1
			' on effectue le reglage du pont
			serout B.7,N2400_16,(254,128,"RECHERCHE du 0  ")	
			serout B.7,N2400_16,(254,192,"Attendre svp... ")	   	
			gosub	Init_PaP
			serout B.7,N2400_16,(254,128,"Pont en position")	
			serout B.7,N2400_16,(254,192,"                ")
			pause 4000			
			serout B.7,N2400_16,(254,128,"valeur pas:",#Pos_actuelle)	
			serout B.7,N2400_16,(254,192,"Reglage rapide  ")
			
			dir = ccw	' on tourne dans un sens
			do loop while Stop_rota = 0	' On attend qu'on bascule l'inter
			do while Stop_rota = 1		'tout pendant que l'inter est actif
			      pulsout pas,1		'on tourne en grande vitesse sens cw
				inc Pos_actuelle
				serout B.7,N2400_16,(254,139,#Pos_actuelle)
			      pause Vit_rapide
			loop
					serout B.7,N2400_16,(254,192,"Ajout de pas: _?")

		   	do
				gosub clavier		' on va lire le clavier
				select case nombre
					case = 0
						dir = cw	' on tourne dans l'autre sens
							for var_temp = 1 to 99
								pulsout pas,1
								dec Pos_actuelle
								serout B.7,N2400_16,(254,139,#Pos_actuelle)	
							next
					case = 99
						serout B.7,N2400_16,(254,128,"Enreg la valeur?")	
						serout B.7,N2400_16,(254,192,"Oui Non")
						Gosub clavier
						Select case nombre
							case = 1
								serout B.7,N2400_16,(254,192,"Numero voie:   ?")
								Gosub clavier
								gosub enreg_voie
								return
							case = 2
								return
							else
								gosub erreur
						endselect
								
					else
						dir = ccw	' on tourne dans l'autre sens
							for var_temp = 1 to nombre
								pulsout pas,1
								inc Pos_actuelle
								serout B.7,N2400_16,(254,139,#Pos_actuelle)	
							next
				end select
				
			loop
			exit
			
		case = 2 
			'on effectue le reglage des aiguilles
			serout B.7,N2400_16,(254,128,"INIT AIGUILLAGE ")	
			serout B.7,N2400_16,(254,192,"Attendre svp    ")
			pause 4000
			exit
		case = 3
			' on effectue le ROTO ( je sais pas ce que c'est lol)
			serout B.7,N2400_16,(254,128,"Etalon__ Voie ",#LaVoie)
			serout B.7,N2400_16,(254,192,"Cor:EXP Choix:__")
			gosub clavier
			exit
		else
			' si la saisie est differente d'un chiffre attendu on affiche une erreur de saisie
			gosub erreur
	endselect
loop

return

'#####################################################

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

   dir = cw
   do while FC_opto = 1 'tout pendant que l'opto est ocult
      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 arriere
   Do while FC_opto = 1    'en vitesse tres lente jusqu'a detection du bord de fente.
      pulsout pas,1
      pause Vit_lente
   loop
   
   Pos_actuelle = 32000    'la detection 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

erreur:
serout B.7,N2400_16,(254,128,"    ERREUR    ")
serout B.7,N2400_16,(254,192,"  DE SAISIE   ")
pause 2000
return

enreg_voie:

select case nombre
	case = 0 
		gosub erreur
	case > 20	
		gosub erreur
	else
		nombre = nombre * 2 - 1	' pour avancer en nombre impaire
		
end select 

Write nombre,Pos_actuelle
creation d'un s/prog , pour enregistrer au bon endroit la variable word . ( merci besqueut pour la formule).
Quand on choisie une voie, on va lire al valeur qui a ete enregistrée, et on stocke la variable lue dans l'Eeprom dans la variable pos cible pour l'atteindre .
 

zeltron

Senior Member
;)
je suis entrain moi aussi de travailler suivant le remarque de besqueut
voila ce que ça donne je n'ai pas testé encore
View attachment roto.txt
vais tester le tiens en 1er nulle doute qu'il marchera mieux que le miens
 
Last edited:

dje8269

Senior Member
Oups j'a i oublié d'indiquer qu'il s'agit d'un word lours de l'enregistrement et de la lecture .

Code:
pont:

do
	serout B.7,N2400_16,(254,128,"Voie en cours: ",#LaVoie)
	serout B.7,N2400_16,(254,192,"Voie choisie: __")

	gosub clavier
	
	select case nombre
		case = 0
			return	' On sort de ce menu
		case > 20 ' si le nombre de voie maximum a rentrer on affiche erreur
			gosub erreur
		else 
			nombre = nombre * 2 - 1	' pour avancer en nombre impaire
			[COLOR="#FF0000"]read nombre,word Pos_cible	' On lit la valeur a atteindre[/COLOR]			gosub Mise_en_position
			LaVoie = Pos_Actuelle ' MAJ de la voie en cours
			return
	endselect
loop

return
et ici aussi

Code:
enreg_voie:

select case nombre
	case = 0 
		gosub erreur
	case > 20	
		gosub erreur
	else
		nombre = nombre * 2 - 1	' pour avancer en nombre impaire
		
end select 

[COLOR="#FF0000"]Write nombre,word Pos_actuelle[/COLOR]
J'avoue qu'il est difficile de teste en simu le programme car il commence a devenir long .
 

zeltron

Senior Member
vi effectivement il ne marche pas
c'est vrai c'est chaud cette longueur mais moi j'ai l'avantage d'avoir l'engin
et maintenant je suis bien habitué a la structure du programme
je suis obligé de partir je testerai le second en fin de soiré
et pour l'histoire du bruit je testerai l'easy driver sur une alim de labo
 
Last edited:

zeltron

Senior Member
non avant!
apres un enregistrement theorique de la voie et arret de l'alimentation
cette voie n'est pas retrouvé
à ce soir peut être!
 

dje8269

Senior Member
A ce soir, je verifie mon programme , tu en auras un nouveau ce soir !

Question : A l'allumage du circuit, faut il initialisé le pont a chaque fois ?

Par exemple . le pont est sur la voie 1 . tu coupe le circuit . tu revins deux jours apres , et tu allume . que faut il faire ? initialisé le pont a la recherche du zero ou rester comme ca ? mais si le pont a bougé il y auras des erreurs ?

je demande ca car sinon il faut enregistrer en Eeprom la position actuelle du pont, pour au démarrage savoir ou est le pont .

Je propose d'enregistrer la memoire actuelle du pont en Eeprom ,quand même ,et au démarrage , le pont s'initialise avec une recherche du 0 et ensuite il rejoins la position sur lequels il etait ? Comment voit ut les choses de ton point de vue ?
 

dje8269

Senior Member
Alors voila j'espére que ca ira !

amélioration du fonctionnement; et correction des bugs d'affichages. j'espere que l'enregistrement en Eeprom fonctionnera


Code:
#picaxe 40X2

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

'entrees ------------------------------
symbol FC_opto =  pinB.4   'Fin de course opto
symbol Stop_rota =  pinB.3   'arret moteur pas ? pas
'sorties ------------------------------
symbol dir     =  pinB.5   'sortie direction
symbol pas     =  B.6      'sortie pas


'*********** variables **************************
symbol touche        = b2
Symbol nombre        = b3
Symbol compteur      = b4
Symbol LaVoie	   = b6 ' La Voie actuellement s?lectionn?e
Symbol L_Aiguille    = b7  ' L'aiguille actuellement choisie

symbol Nb_de_pas     = w23 'nombre de pas ? fonctionnement
symbol Pos_cible     = w24 'position cible
symbol Pos_actuelle  = w25 'position courante
symbol var_temp      = w26 'variable temporaire
Symbol addition      = w27

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

'reserve bits = b0
symbol Sens = bit0

'*********** 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
}

'************  initialisation   *******************
setfreq m16             'frequence 16MHz interne

SerOut B.7, N2400, ( 254, %00000001 ) ' efface l'ecran
pause 100
serout B.7,N2400_16,(254,128,"INITIALISATION..")
serout B.7,N2400_16,(254,192,"       3       ")
pause 2000
serout B.7,N2400_16,(254,192,"       2       ")
pause 2000
serout B.7,N2400_16,(254,192,"       1       ")
pause 2000

LaVoie=1
L_Aiguille=1
gosub reglage
'#####################################################################################################
'##############################           Programme principal           #############################
'#####################################################################################################

do		' Ici on est dans le menu principal d'ou vont decouler tous les autres menus
	
	serout B.7,N2400_16,(254,128,"1:PONT  2:AIGUIL")
	serout B.7,N2400_16,(254,192,"3:REGL  Choix:__")

	gosub clavier	' On attend un choix de menu

	select case nombre
		case = 0
			'on fais rien
		case = 1
			gosub pont
		case = 2
			gosub aiguil
		case = 3
			gosub reglage
		else
			gosub erreur
	endselect

loop


'#####################################################################################################
'##############################           Programme secondaire           #############################
'#####################################################################################################
{
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		' On fait la moyenne
	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

     	do					' On attends que la touche soit relachee
 		readadc a.0 ,compteur
  	loop while compteur < 250    

	select case touche
		case = 12		' si un appui sur la touche VALIDATION est detecte
			return	' Alors on enregsitre le nombre et on sort pour valider le nombre
			
		case = 11     	'correction dernier chiffre
			select case nombre
				case = 0
					return' Si on appui sur correction on fais un retour
				case < 10
					nombre = 0
					serout B.7,N2400_16,(254,206,"__")
				else
					nombre = nombre/10 
					serout B.7,N2400_16,(254,206,"_",#nombre)
			end select
			
		else
		
			if nombre > 9 then	' Verifie si c'est un troisieme chiffre qu'on rentre
				nombre = touche	' Si c'est le cas on repart a zero
				serout B.7,N2400_16,(254,206,"_",#nombre)
			else
	    			nombre = nombre*10 + touche 'ajout du chiffre
				if nombre > 9 then
					serout B.7,N2400_16,(254,206,#nombre)
				else
					serout B.7,N2400_16,(254,206,"_",#nombre)
				end if
			end if					
	endselect
	
loop }

'###########################    Gestion du pont deplacement vers une voie #####################################
{
pont:

do
	serout B.7,N2400_16,(254,128,"Voie en cours: ",#LaVoie)
	serout B.7,N2400_16,(254,192,"Voie choisie: __")

	gosub clavier
	
	select case nombre
		case = 0			' Appui sur correction quand le nombre est a zero , ca remonte dans le menu
			return		' On sort de ce menu
		case > 20 			' si le nombre de voie rentre est superieur au max de voie on affiche erreur
			gosub erreur
		else 
			LaVoie = nombre 			' MAJ de la voie en cours
			nombre = nombre * 2 - 1		' pour avancer en nombre impair
			read nombre,word Pos_cible	' On lit la valeur a atteindre et on la place dans valeur cible
			serout B.7,N2400_16,(254,128," Positionnement ")
			serout B.7,N2400_16,(254,192,"    du pont...  ")
			gosub Mise_en_position		' On va mettre en position
			serout B.7,N2400_16,(254,128,"Pont en position")
			serout B.7,N2400_16,(254,192,"  a la voie N:",#LaVoie)
			write 0,LaVoie			' On enregistre la voie en Eeprom pour le demarrage
			pause 4000
			return
	endselect
loop

return}

'####################################    Gestion des aiguillages   #####################################
{
Aiguil:
do
	serout B.7,N2400_16,(254,128,"Aiguil ",#L_Aiguille," Etat=_")
	serout B.7,N2400_16,(254,192,"Cor ou  choix:__")

	gosub clavier

	select case nombre
		case = 0
			return
		case = 1
			' on effectue la tache corrspondante
			exit
		case = 2 
			'on effectue la tache corrspondante Etc ......
			exit
		else
			' si la saisie est differente d'un chiffre attendu on affiche une erreur de saisie
			gosub erreur
	endselect
loop

return}
 

dje8269

Senior Member
2ieme partie

Code:
'####################################      Reglage des voies       #####################################
{
reglage:

do
	serout B.7,N2400_16,(254,128,"1:PONT  2:AIGUIL")	
	serout B.7,N2400_16,(254,192,"3:ROTO  Choix:__")

	gosub clavier

	select case nombre
		case = 0
			return
		case = 1
			' on effectue le reglage du pont
			serout B.7,N2400_16,(254,128,"RECHERCHE du 0  ")	
			serout B.7,N2400_16,(254,192,"Attendre svp... ")	   	
			gosub	Init_PaP
			serout B.7,N2400_16,(254,128,"Pont en position")	
			serout B.7,N2400_16,(254,192,"                ")
			pause 4000			
			serout B.7,N2400_16,(254,128,"valeur pas:",#Pos_actuelle)	
			serout B.7,N2400_16,(254,192,"Reglage rapide  ")
			
			dir = ccw	' on tourne dans un sens
			do loop while Stop_rota = 0	' On attend qu'on bascule l'inter
			do while Stop_rota = 1		'tout pendant que l'inter est actif
			      pulsout pas,1		'on tourne en grande vitesse sens cw
				inc Pos_actuelle
				serout B.7,N2400_16,(254,139,#Pos_actuelle)
			      pause Vit_rapide
			loop
					serout B.7,N2400_16,(254,192,"Ajout de pas: _?")

		   	do
				gosub clavier		' on va lire le clavier
				select case nombre
					case = 0
						dir = cw	' on tourne dans l'autre sens
							for var_temp = 1 to 99
								pulsout pas,1
								dec Pos_actuelle
								serout B.7,N2400_16,(254,139,#Pos_actuelle)	
							next
					case = 99
						serout B.7,N2400_16,(254,128,"Enreg la valeur?")	
						serout B.7,N2400_16,(254,192," Oui(1)  Non(2) ")
						Gosub clavier
						Select case nombre
							case = 1
								serout B.7,N2400_16,(254,192,"Numero voie:   ?")
								gosub enreg_voie
								return
							case = 2
								return
							else
								gosub erreur
						endselect
								
					else
						dir = ccw	' on tourne dans l'autre sens
							for var_temp = 1 to nombre
								pulsout pas,1
								inc Pos_actuelle
								serout B.7,N2400_16,(254,139,#Pos_actuelle)	
							next
				end select
				
			loop
			exit
			
		case = 2 
			'on effectue le reglage des aiguilles
			serout B.7,N2400_16,(254,128,"INIT AIGUILLAGE ")	
			serout B.7,N2400_16,(254,192,"Attendre svp    ")
			pause 4000
			exit
		case = 3
			' on effectue le ROTO ( je sais pas ce que c'est lol)
			serout B.7,N2400_16,(254,128,"Etalon__ Voie ",#LaVoie)
			serout B.7,N2400_16,(254,192,"Cor:EXP Choix:__")
			gosub clavier
			exit
		else
			' si la saisie est differente d'un chiffre attendu on affiche une erreur de saisie
			gosub erreur
	endselect
loop

return}

'####################################     recherche du Zero        #####################################
{
Init_PaP:

   dir = cw
   do while FC_opto = 1 'tout pendant que l'opto est ocult
      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 arriere
   Do while FC_opto = 1    'en vitesse tres lente jusqu'a detection du bord de fente.
      pulsout pas,1
      pause Vit_lente
   loop
   
   Pos_actuelle = 32000    'la detection faite, on initialise le compteur de pas ? 32000

return }

'#####################################   Met le pont en position   #####################################
{
Mise_en_position:   

   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}

'#####################################   Affiche message d'erreur  #####################################
{
erreur:
serout B.7,N2400_16,(254,128,"    ERREUR    ")
serout B.7,N2400_16,(254,192,"  DE SAISIE   ")
pause 2000
return}

'#####################################   Enregistrement des voies  #####################################
{
enreg_voie:

Gosub clavier

select case nombre
	case = 0 
		gosub erreur
	case > 20			' Si nombre superieur au nombre de voie total
		gosub erreur
	else
		nombre = nombre * 2 - 1	' pour avancer en nombre impair
end select 

Write nombre,word Pos_actuelle	' Enregistre la valeur en Eeprom
return}
 

zeltron

Senior Member
dsl Dje ton programme ne marche pas
apres enregistrement de la voie et coupure de l'alimentation la voie n'est pas retrouvée
vais rechercher pourquoi
en attendant j'ai pas mal débugué le programme il faut que tu travailles à partir de la version que je te joins en texte
View attachment roto1.txt
tu vas voir que j'ai modifié la structure du menu
car pour répondre à tes questions ci dessus
il faut pouvoir initialiser le pont (recherche de la fente optique) à tout moment
a l'aide du menu réglage pont et cela sans aller dans le menu étalonnage des voies (ROTOnde)
par contre pour l'étalonnage des voies et leurs memo il faut avant faire l'init du pont et normalement ce menu ne servira plus
sauf si démontage de la poulie....
ça c'est fait;
d'autre part j'adore la boucle que tu as ajouté pour déplacer le pont pas à pas en avant c'est tres préci et facile à ajuster même avec le clavier
et finalement si une boucle de ce genre pouvait être completée pour des pas -1( inverse rot) et 2 autres de + 1000 pas
-1000 pas il n'y aurait pas besoin de l'inter stop rota qui n'est pas vraiment tip top à l'utilisation
mais ça c'est la cerise sur le gateau

@Piem

j'ai branché mon alim de labo et c'est parfait à n'importe quel tension et courant

l'autre était une alim d'un petit boitier scellé comme il en existe des milliers...
il va falloir que je trouve une bonne alim....
 
Last edited:

dje8269

Senior Member
apres enregistrement de la voie et coupure de l'alimentation la voie n'est pas retrouvé
Quelles sont les conditions de test . car au démarrage , il n'y as pas de mouvement de pont ? Donc il ne peut rien retrouvé ? que fait tu exactement as tu enregistrer plusieurs voies ?

vais rechercher pourquoi
Un bon début de piste , il faut lire dans l'Eeprom la valeur qu'on a enregistrée apres un changement de voie . Mais ca ne fera pas tourné le pont pour autant

en rouge
Code:
'************  initialisation   *******************
setfreq m16             'frequence 16MHz interne

SerOut B.7, N2400, ( 254, %00000001 ) ' efface l'ecran
pause 100
serout B.7,N2400_16,(254,128,"INITIALISATION..")
serout B.7,N2400_16,(254,192,"       3        ")
pause 2000
serout B.7,N2400_16,(254,192,"       2        ")
pause 2000
serout B.7,N2400_16,(254,192,"       1        ")
pause 2000

[COLOR="#FF0000"]read 0,Lavoie			' On lit la valeur de la voie enregistree au demarrage
nombre = Lavoie * 2 - 1		' pour avancer en nombre impair
read nombre,word Pos_actuelle	' Lire la valeur correspondante a la voie du nombre de pas[/COLOR]
L_Aiguille=1
il faut que tu travailles à partir de la version que je te joins en texte
Ok ca roule

d'autre part j'adore la boucle que tu as ajouté pour déplacer le pont pas à pas en avant c'est tres préci et facile à ajuster même avec le clavier
et finalement si une boucle de ce genre pouvait être completé pour des pas -1( inverse rot) et 2 autres de + 1000 pas
-1000 pas il n'y aurait pas besoin de l'inter stop rota qui n'est pas vraiment tip top à l'utilisation
Pas de soucis je peux faire ca ; mais il faiut que tu me donne comment tu veux que ca fasse . car tu n'as pas assez de bouton pour faire ce que tu demande !
on pourrais envisager
1= -1
2= 1
3 =10
4=-10
5=10
6=100
7= -1000
8=1000

Un truc du genre .
j'ai branché mon alim de labo et c'est parfait à n'importe quel tension et courant
Nickel un probléme de moins !
 

zeltron

Senior Member
Quelles sont les conditions de test . car au démarrage , il n'y as pas de mouvement de pont ? Donc il ne peut rien retrouvé ? que fait tu exactement as tu enregistrer plusieurs voies ?
et bien initialisation du pont,
positionnement en face de la voie et enregistrement théorique en memoire position voie 1
coupure de l'alim
initialisation du pont
demande de déplacement en face de la voie 1
le pont se déplace mais il passe la position sans s'arreter
partons sur
1= +1
2= -1
3 =10
4=-10
5=+100
6=-100
7= +1000
8=+10000

Un truc du genre .
de toute façon je changerai las valeurs si l'utilisation n'est pas top
et puis normalement ça ne doit pas servir souvent

Nickel un probléme de moins ![/QUOTE]
 

dje8269

Senior Member
Voici une nouvelle version mais je suis pas certain .

A testé

View attachment Zeltron.txt


Aprés une initialisation du pont , la valeur de la voie j'ai mis 0 , et la valeur actuelle est de 32000.

Donc apres on change de voie, il va lire la valeur dans l'Eeprom , et positionne le pont ; il faudrait connaitre la valuer qui est ecrit dans l'Eeprom pour etre sur que je m'ai pas gouré .

Si ca fonctionne pas avec celui la ; je ferais un debug pour voir ou est l'errreur
 

zeltron

Senior Member
dje ! de padawan tu es devenu un jedi!
ça marche super!
pour l'instant je n'ai qu'une voie de posée autour du pont
je n'en essais pas d'autre car j'ai un doute sur le fonctionnement de cette memoire
j'ai lu quelque part que les données sont enregistrées a la suite
alors je me demande ce qui va se passer au cas ou je me trompe ou j'enregistre une voie que je vais déplacer par la suite dans la construction
comment je vais pouvoir effacer cette voie ou l'écraser sans tout désétaloner??
en tout cas un grand merci!
 

dje8269

Senior Member
Ne te fais pas de soucis et ai confiance en cette mémoire .

C'est tout simple. Quand tu fais un réglage , au moment où on te demande le numéro de voie cela écrasé l'ancienne valeur .La seule erreur possible c'est une erreur humaine dans le numéro de la voie . Par exemple, si tu marque voie 5 au lieu de voie 6.

Pour t'en persuadé fait des marques au crayon de bois pour essayer plutôt que de coller un rail.

Si tu veuX déplacer la voie par exemple , rien de plus simple , tu rentre et règle ta nouvelle voie au 1/8 de pas et tu l'enregistre en voie 1

D'après ce que j'ai compris l&#8217;étalonnage est fais grâce à la recherche du 0. Ensuite au compte seulement le nombre de pas. Rien ne peut se dérégler.

si j'ai le temps demain je fais le réglage comme tu le souhaite.
 

zeltron

Senior Member
finalement suis bête y'a plus simple
plutôt que de faire tous ça
1= +1
2= -1
3 =10
4=-10
5=+100
6=-100
7= +1000
8=+10000
autant se servir du clavier à fond
de déverouiller cette boucle ci dessous limité à 99
pour rentrer des nombres possibles de
9999
et de faire la même pour -9999
donc de pouvoir modifier par menu cw ou ccw
ou alors décremente la position actuel
et le tour est joué et c'est plus simple ça reduit la programmation et c'est plus souple à l'utilisation non? ça doit être possible de sortir du menu par 0 non?
else
dir = ccw ' on tourne dans l'autre sens
for var_temp = 1 to nombre
pulsout pas,1
inc Pos_actuelle
serout B.7,N2400_16,(254,139,#Pos_actuelle)
next
vais essayer de faire ça demain, enfin ce matin:D
 
Last edited:
Top