servo analog / digital

ludo0404

Senior Member
je pense qu'il faut lire : l'inter du deuxieme servo se ferme ...
oui je me suis melangé les pinceaux !

D'après ce que vient de dire PieM, on peut faire deux mouvements rapides en même temps.
donc, on n'est pas obligé d'attendre que le servo 1 soit à zéro pour démarrer le servo 2.

Sinon, il faut synthétiser les commandes servos et là tout devient possible.
Si les servos peuvent bouger lentement lorsque les signaux d'inter n'entrent pas en interaction avec la course des servos, ca peut convenir
 

BESQUEUT

Senior Member
Ce qu'il faut bien comprendre, c'est qu'il n'est pas possible d'avoir deux routines servo avec ralentissement dans la même boucle.
Pas testé, mais un programme du genre :
Code:
Rota1=1  ' peut aussi être -1 ou zéro
Rota2=-1  ' peut aussi être 1 ou zéro,
position1=2
position2=98

servo C.1,position1
servo C.2,position2

do while Rota1<>0 and Rota2<>0 ' Tant qu'on n'a pas atteint la valeur on continue
   position1=position1 + Rota1
   position2=position2 + Rota2
   pause 10       ' on fais une pause pour ralentir
   servopos C.1,position1
   servopos C.2,position2

  if position1 >99 or position1<1  then   ' On a atteint une des butées
     Rota1=0
  endif

 if position2 > 99 or position2<1 then
     Rota2=0
 endif

if inter1=0 then   '    Changement d'état
   if Position1=0 then
      Rota1=0
   else
      Rota1=-1
   endif
endif

if inter2=0 then
   if Position2=0 then
      Rota2=0
   else
      Rota2=-1
   endif
endif


loop
ne ferait-il pas l'affaire ?
 
Last edited:

dje8269

Senior Member
Ce qu'il faut bien comprendre, c'est qu'il n'est pas possible d'avoir deux routines servo avec ralentissement dans la même boucle.
je suis d'accord , d'ou la ruse de faire une seule routine spéciale par combinaison spéciale .

C'est presque au point PRESQUE !!
 

PieM

Senior Member
Pas testé, mais un programme du genre :

ne ferait-il pas l'affaire ?
Oui mais le problème est que l'on doit sortir de la boucle à tout moment en fonction de l'état des inters pour changer le mouvement .... donc on arrête les deux mouvements.
 

BESQUEUT

Senior Member
Pas testé, plus universel :
Code:
Vitesse1=0  ' peut être 1, -1 ou zéro
Vitesse2=0  ' peut être 1, -1 ou zéro,
position1=50
position2=50


do
   position1=position1 + Vitesse1
   position2=position2 + Vitesse2
   servopos C.1,position1
   servopos C.2,position2
   pause 10       ' on fais une pause pour ralentir


  if position1 >99 or position1<1  then   ' On a atteint une des butées
     Vitesse1=0                                         ' ce test est à priori inutile mais je n'ai pas le temps de valider ce code à fond...
  endif

 if position2 > 99 or position2<1 then
     Vitesse2=0
 endif

if inter1=0 then   '   On revient à la ligne droite
   if Position1=0 then
      Vitesse1=0
   else
      Vitesse1=-1
   endif

Else   ' On va à fond
   if Position1>99 then
      Vitesse1=0
   else
      Vitesse1=1
   endif

endif

if inter2=0 then
   if Position2=0 then
      Vitesse2=0
   else
      Vitesse2=-1
   endif

Else   ' On va à fond
   if Position2>99 then
      Vitesse2=0
   else
      Vitesse2=1
   endif

endif


loop
On peut aussi avoir un servo qui va plus vite que l'autre en utilisant
Vitesse=+/- 2, +/- 3 etc...
Dans ce cas, attention aux tests de butées...
 
Last edited:

BESQUEUT

Senior Member
je suis d'accord , d'ou la ruse de faire une seule routine spéciale par combinaison spéciale .

C'est presque au point PRESQUE !!
Je pense qu'on peut facilement faire deux mouvements lents en même temps et de plus avec un seul sous-programme...
 

dje8269

Senior Member
Bizarre , je me suis mis sur PE6 et grgrgrgrgr

Le programme tourne jusqu'à atteindre un "soupassement de la pile" .

je trouve ca bizarre , je fais exécuter au pas a pas , et je me rends compte , qu'il part dans une sub alors que les conditions ne sont réunis . un truc de fou!!!

j' y suis presque , je voudrais pas poster un programme qui tourne sur trois pattes quand même
 

dje8269

Senior Member
Ça n'est pas interdit... du moment que c'est indiqué clairement !
Lol

je suis certains qu'il y as une bonne explication , mais le programme tourne impeccable sous PE5.5.5 , et pas sur PE6 . ca sent la mauvaise initialisation des variables un truc du genre; Car le bug se produit des le debut . Sous PE6 il part dans une sub sans y etre convié les variables sont toutes a 0 et lui trouve qu'il y y en as une a "1" .

et ces maudis accent sous PE6 qui se transforme en carré ?

bref , allez sous PE5 ca fonctionne , je vérifie encore une fois et je vous montre la bête

C'est quoi ce mot ? quel est le message exact ?
J'ai eu la même réaction , je pense que c'est une erreur de traduction . car c'est le mot exact ! mdr

Il y a une limite au nombre d'appels imbriqués.
oui mais ca c'est avec PE6 qui me fais partir dans des sub , sans avoir reçu de consignes ; sous PE5.5.5 c'est bon

Soit le programme est trop complexe, soit il est récursif...
recursif ????!!!! c'est quoi ce mot lol . Du terme récurent ?

Oui le programme a des sub , mais je pense avoir bien respectés les 8 niveaux de la pile, avec des return a chaque fois
 

BESQUEUT

Senior Member
ca sent la mauvaise initialisation des variables un truc du genre; Car le bug se produit des le debut .
Rien ne dit qu'une variable a une valeur particulière au lancement...
Si ça a une importance, c'est une bonne habitude de fixer cette valeur par programme.
Pour certains compilateurs, l'utilisation d'une variable non initialisée constitue une erreur fatale...
 

PieM

Senior Member
Petit programme à tester en vraie grandeur :

Si un inter est à 1, le servo correspondant va lentement vers son fin de course.
si l'inter repasse à 0, le servo revient lentement vers le neutre, sauf si l'inter opposé est actionné, auquel cas, il revient rapidement pendant que l'autre servo se déplace lentement.

Code:
[color=Navy]#picaxe [/color][color=Black]08M2[/color]

[color=Green]'######'####################    configuration    ################################   [/color]
[color=Blue]symbol [/color][color=Purple]position1 [/color][color=DarkCyan]= [/color][color=Purple]b1[/color]
[color=Blue]symbol [/color][color=Purple]position2 [/color][color=DarkCyan]= [/color][color=Purple]b2[/color]
[color=Blue]symbol [/color][color=Purple]inter1 [/color][color=DarkCyan]= [/color][color=Purple]pinC.4[/color]
[color=Blue]symbol [/color][color=Purple]inter2 [/color][color=DarkCyan]= [/color][color=Purple]PinC.3[/color]

[color=Blue]symbol FC1 [/color][color=DarkCyan]= [/color][color=Navy]175     [/color][color=Green]'fin de course servo1[/color]
[color=Blue]symbol FC2 [/color][color=DarkCyan]= [/color][color=Navy]125     [/color][color=Green]'fin de course servo2[/color]
[color=Blue]symbol RAZ1 [/color][color=DarkCyan]= [/color][color=Navy]150    [/color][color=Green]'neutre servo1[/color]
[color=Blue]symbol RAZ2 [/color][color=DarkCyan]= [/color][color=Navy]150    [/color][color=Green]'neutre servo2[/color]
[color=Blue]symbol tpause [/color][color=DarkCyan]= [/color][color=Navy]10   [/color][color=Green]'temps de pause - vitesse servos

'##########################    Initialisation    ################################[/color]

[color=Blue]servo C.1[/color][color=Black],[/color][color=Blue]RAZ1 [/color][color=Green]'servo1 au neutre[/color]
[color=Blue]servo C.2[/color][color=Black],[/color][color=Blue]RAZ2 [/color][color=Green]'servo2 au neutre[/color]
[color=Blue]pause [/color][color=Navy]100[/color]
[color=Purple]position1 [/color][color=DarkCyan]= [/color][color=Blue]RAZ1 [/color][color=Green]'memorisation position servo[/color]
[color=Purple]position2 [/color][color=DarkCyan]= [/color][color=Blue]RAZ2[/color]

[color=Green]'#################################################################################[/color]
[color=Black]prog_principal:[/color]

[color=Blue]do
   on [/color][color=Purple]inter1 [/color][color=Blue]gosub [/color][color=Black]servo1down, servo1up
   [/color][color=Blue]servopos C.1[/color][color=Black],[/color][color=Purple]position1
   [/color][color=Blue]on [/color][color=Purple]inter2 [/color][color=Blue]gosub [/color][color=Black]servo2down, servo2up
   [/color][color=Blue]servopos C.2[/color][color=Black],[/color][color=Purple]position2
   [/color][color=Blue]pause tpause
loop
 [/color]
[color=Green]'=================================================================[/color]
[color=Black]servo1up: [/color][color=Green]'deplacement vers fin de course
   [/color][color=Purple]position1[/color][color=DarkCyan]= [/color][color=Purple]position1 [/color][color=DarkCyan]+[/color][color=Navy]1 [/color][color=DarkCyan]max [/color][color=Blue]fc1
return         [/color]

[color=Green]'=================================================================[/color]
[color=Black]servo1down: [/color][color=Green]'deplacement vers position neutre[/color]
[color=Blue]if [/color][color=Purple]inter2 [/color][color=DarkCyan]= [/color][color=Navy]1 [/color][color=Blue]then  [/color][color=Green]'si inter2 à 1 alors on revient rapidement
   [/color][color=Purple]position1 [/color][color=DarkCyan]= [/color][color=Blue]raz1
   return
endif
   [/color][color=Purple]position1[/color][color=DarkCyan]= [/color][color=Purple]position1 [/color][color=DarkCyan]-[/color][color=Navy]1 [/color][color=DarkCyan]min [/color][color=Blue]raz1  [/color][color=Green]'sinon on revient lentement[/color]
[color=Blue]return            [/color]

[color=Green]'=================================================================[/color]
[color=Black]servo2up: [/color][color=Green]''deplacement vers fin de course; attention qu'ici on decrement la position !
   [/color][color=Purple]position2[/color][color=DarkCyan]= [/color][color=Purple]position2 [/color][color=DarkCyan]-[/color][color=Navy]1 [/color][color=DarkCyan]min [/color][color=Blue]fc2
return            [/color]

[color=Green]'=================================================================[/color]
[color=Black]servo2down: [/color][color=Green]' et ici on l'incremente ![/color]
[color=Blue]if [/color][color=Purple]inter1 [/color][color=DarkCyan]= [/color][color=Navy]1 [/color][color=Blue]then  [/color][color=Green]'si inter1 à 1 alors on revient rapidement
   [/color][color=Purple]position2 [/color][color=DarkCyan]= [/color][color=Blue]raz2
   return
endif
   [/color][color=Purple]position2[/color][color=DarkCyan]= [/color][color=Purple]position2 [/color][color=DarkCyan]+[/color][color=Navy]1 [/color][color=DarkCyan]max [/color][color=Blue]raz2  [/color][color=Green]'sinon on revient lentement  [/color]
[color=Blue]return         [/color]
 

dje8269

Senior Member
J'y suis presque .............

je comprends pas pourquoi j'ia un message d'erreur , en me disant que j'ai un return sans go sub , alors que je viens d'un go sub .
la fonction fais sortir d'un boucle pas d'une sub ? ou des deux suivants la configurations ?
 

ludo0404

Senior Member
il revient rapidement pendant que l'autre servo se déplace lentement.
Ceci serait dans le cas d'un changement de trajectoire brutale, il faudrait que dans ce cas la le deuxieme servo aille aussi vite à sa position 1 que le premier à revenir à 0....

je comprends pas pourquoi j'ia un message d'erreur , en me disant que j'ai un return sans go sub , alors que je viens d'un go sub .
la fonction fais sortir d'un boucle pas d'une sub ? ou des deux suivants la configurations ?
Alors la je vous laisse entre expert !!! lol
 

PieM

Senior Member
Ceci serait dans le cas d'un changement de trajectoire brutale, il faudrait que dans ce cas la le deuxieme servo aille aussi vite à sa position 1 que le premier à revenir à 0....
Ben ça c'est nouveau !!
en plus qu'est ce qui indique que le changement est brutal ou pas puisqu'on a qu'un contact TOR !?
 

ludo0404

Senior Member
en fait je me suis mal exprimé je pense.... et aussi encore un peu melangé les pinceaux avec tous ces posts !

Si on arrive à faire bouger les deux servos en même temps (chacun dans une position différente) il faut qu'ils aillent doucement tous deux
 

ludo0404

Senior Member
Mais je viens de relire Piem....

ça c'est plus facile .
Ce qu'il faut bien comprendre, c'est qu'il n'est pas possible d'avoir deux routines servo avec ralentissement dans la même boucle.
et comme deux boucles ne peuvent être simultanées sauf avec une tache annexe non compatible avec la commande servo...
 

ludo0404

Senior Member
en fait, ca c'est parfait :

Piem
Si un inter est à 1, le servo correspondant va lentement vers son fin de course.
si l'inter repasse à 0, le servo revient lentement vers le neutre, sauf si l'inter opposé est actionné, auquel cas, il revient rapidement pendant que l'autre servo se déplace lentement.
Désolé d'avoir compris un peu tard mais je bosse sur 3 trucs en même temps !
 

dje8269

Senior Member
En post #175
le top c'est la solution 1)

que le servo 1 revienne en 0 doucement en mm temps que le servo 2 va en position 1 doucement....
Et la ?

en fait, ca c'est parfait :

Piem
Si un inter est à 1, le servo correspondant va lentement vers son fin de course.
si l'inter repasse à 0, le servo revient lentement vers le neutre, sauf si l'inter opposé est actionné, auquel cas, il revient rapidement pendant que l'autre servo se déplace lentement.

J'y comprends plus rien ! ils doivent revenir doucement ou vite !?! dans mon programme il reviennent doucement comme tu me l 'avais demandé
 

ludo0404

Senior Member
Piem a dit en *196 :

Ce qu'il faut bien comprendre, c'est qu'il n'est pas possible d'avoir deux routines servo avec ralentissement dans la même boucle.
Donc ce qu'il propose comme solution peu convenir en dernier recours
 

dje8269

Senior Member
Piem a dit en *196 :

Ce qu'il faut bien comprendre, c'est qu'il n'est pas possible d'avoir deux routines servo avec ralentissement dans la même boucle.
Oui mais c'est sans comptez sur jeremy !.

Normalement ce coup la c'est bon .

Il peut y avoir des simplifications que je n'ai pas faites pour des raisons de compréhension du programme. S'il fonctionne on pourras les faires ( et encore)

par exemple j'ecris ca :
Code:
if virage_droite = 1 then exit	' si on tourne ? droite on arrete le mouvement de revenir au centre
if virage_gauche = 1 then exit	' Si on tourne a gauche on arrete le mouvement de revenir au centre
ca pourrais s'écrire

Code:
if virage_droite = 1 or virage_gauche = 1 then exit
mai pour s'y retrouver j'ai laissé comme ca .

Pour tester, il te suffit de mettre le programme dans le simu . ensuite tu joue en cliquant sur les boutons 3 et 4 pour simuler tes TOR .
Tu regarde les valeurs de tes servos sur b3 et b4 .

J'ai fais pas mal de test, sans bug, mais je pense pas avoir fais toutes les configurations possibles .

Petit point particulier , c'est impossible en vrai mais faisable en simu , mettre les deux inter a 1 en même temps . Si tu veux changer brutalement tu éteins celui qui est allumé , et tu allume l'autre après .

Voila , tiens moi au jus pour les modifs , car je doute que ça fonctionne parfaitement du premier coup ;

Bonne balade
 

dje8269

Senior Member
1er partie

Code:
#PICAXE 08M2

'##########################    configuration des I/O   ################################

Symbol position_phare1 	= b1		' Position du phare droit  0=tout droit / 1=tourn? a droite
Symbol position_phare2 	= b2		' Position du phare gauche 0=tout droit / 1=tourn? a gauche
Symbol position_servo1	= b3		' Valeur de la position pour l'inc ou le dec du servo 1
Symbol position_servo2	= b4		' Valeur de la position pour l'inc ou le dec du servo 2
Symbol ralenti 		= b5		' valeur de la pause pour ralentir le servo
Symbol virage_droite = PinC.4		' interrupteur de position ici on tourne a droite
Symbol virage_gauche = PinC.3		' interrupteur de position ici on tourne a gauche

'##########################    Initialisation    ################################

setfreq m4

position_phare1 = 0
position_phare2 = 0
position_servo1 = 150
position_servo2 = 150

ralenti = 10	' en millisecondes


servo C.1,150	' On place et initialise le servo1
servo C.2,150	' On place et initialise le servo2

pause 100

servo C.1, off	' On eteint le servo1
servo C.2, off	' On eteint le servo2

'#################################################################################
'##########################    Programme Principal    ############################	
'#################################################################################

do
	If virage_droite = 1 and virage_gauche = 0 and position_phare1 = 0 and position_phare2 = 0 then gosub tourne_a_droite		' On tourne a droite et le phare eclaire tout droit donc on le fait tourner
	If virage_droite = 0 and virage_gauche = 0 and position_phare1 = 1 and position_phare2 = 0 then gosub droite_reviens_au_centre	' le phare est tourn? et reviens au centre
	If virage_droite = 0 and virage_gauche = 1 and position_phare1 = 1 and position_phare2 = 0 then gosub reviens_au_centre_plus_gauche
	
	If virage_gauche = 1 and virage_droite = 0 and position_phare2 = 0 and position_phare1 = 0 then gosub tourne_a_gauche			' On tourne a droite et le phare eclaire tout droit donc on le fait tourner
	If virage_gauche = 0 and virage_droite = 0 and position_phare2 = 1 and position_phare1 = 0 then gosub gauche_reviens_au_centre	' le phare est tourn? et reviens au centre
	If virage_gauche = 0 and virage_droite = 1 and position_phare2 = 1 and position_phare1 = 0 then gosub reviens_au_centre_plus_droite
	
	If virage_gauche = 0 and virage_droite = 0 and position_phare1 = 1 and position_phare2 = 1 then gosub deux_aux_centre
	
pulsout C.1, position_servo1
pulsout C.2, position_servo2

loop
 

dje8269

Senior Member
2iéme partie :

Code:
'#################################################################################
'##########################    Programme Secondaire    ###########################	
'#################################################################################

tourne_a_droite:

servo C.1, position_servo1		' On reactive le servo car on l'avais mis sur Off

do 
		if virage_droite = 0  then exit	' si on tourne plus ou si virage sec ? gauche on arrete le mouvement a droite
		
	inc position_servo1 		' On augmente de 1 la position pour atteindre 175
	pause ralenti			' on fais une pause pour ralentir le mouvement du servo
	servopos C.1,position_servo1	' On place le servo ? sa nouvelle place
		
loop while position_servo1 < 175	' Tant qu'on a pas atteint la valeur on continue

servo C.1, off				' une fois en position on eteint le servo
position_phare1 = 1			' On indique qu'il est tourn? a droite ou qu'il a un peu tourn?

return					' On retourne au programme principal

droite_reviens_au_centre:

servo C.1, position_servo1		' On reactive le servo car on l'avais mis sur Off

do 
		if virage_droite = 1 then exit	' si on tourne ? droite on arrete le mouvement de revenir au centre
		if virage_gauche = 1 then exit	' Si on tourne a gauche on arrete le mouvement de revenir au centre
	
	dec position_servo1 			' On diminue de 1 la position pour atteindre 150
	pause ralenti					' on fais une pause pour ralentir le mouvement du servo
	servopos C.1,position_servo1		' On place le servo ? sa nouvelle place
		
loop while position_servo1 > 150		' Tant qu'on a pas atteint la valeur on continue

servo C.1, off					' une fois en position on eteint le servo

position_phare1 = 0				' On indique qu'il est centre ou qu'il a un peu tourn?

if virage_gauche = 1 then 
	position_phare1 = 1	' si on tourne a sec a gauche on doit indiquer que le phare n'est pas encore revenu au centre
end if

return						' On retourne au programme principal

reviens_au_centre_plus_gauche:

servo C.1, position_servo1		' On reactive le servo car on l'avais mis sur Off
servo C.2, position_servo2		' On reactive le servo car on l'avais mis sur Off

do
		if virage_gauche = 0 then exit	' Si on tourne plus a gauche on sort
		if virage_droite = 1 then exit	' si virage sec a droite on sort
	
		if position_servo1 > 150 then		' Si le servo1 n'as pas atteint 150 on decremente
			dec position_servo1
		end if
	
		if position_servo2 > 125 then		' si le servo2 n'as pas atteint 125 on decremente
			dec position_servo2
		end if

	pause ralenti			' pause pour ralentir
	
	servopos C.1,position_servo1	' On place le servo1 ? sa nouvelle place
	servopos C.2,position_servo2	' On place le servo2 ? sa nouvelle place
	
	if position_servo1 > 149 and position_servo2 < 126 then ' tant que les deux servos ne sont arrives on contiue
		exit
	else
		loop				' dès qu'il sont arrivés a leur position on sort
	end if

servo C.1, off
servo C.2, off

position_phare2 = 1
position_phare1 = 0
	
if virage_gauche =0 and virage_droite = 0 then	' si l'interrutpion se fait quand les phares n'ont pas pus atteindre leurs positions
	position_phare1 = 1				' On indique que le phare droite est a droite ou au milieu
	position_phare2 = 1				' on indique que le phare gauche est a gauche ou au milieu
end if
	
	

return

tourne_a_gauche:

servo C.2, position_servo2		' On reactive le servo car on l'avais mis sur Off

do 
		if virage_gauche = 0  then exit	' si on tourne plus ou si virage sec a droite on arrete le mouvement a gauche
		
	dec position_servo2 		' On diminiue de 1 la position pour atteindre 125
	pause ralenti			' on fais une pause pour ralentir le mouvement du servo
	servopos C.2,position_servo2	' On place le servo a sa nouvelle place
		
loop while position_servo2 > 125	' Tant qu'on a pas atteint la valeur on continue

servo C.2, off				' une fois en position on eteint le servo
position_phare2 = 1			' On indique qu'il est tourn? a droite ou qu'il a un peu tourn?

return					' On retourne au programme principal

gauche_reviens_au_centre:

servo C.2, position_servo2		' On reactive le servo2 car on l'avais mis sur Off

do 
		if virage_droite = 1 then exit	' si on tourne a droite on arrete le mouvement de revenir au centre pour faire le mouvement de revenir au centr+ mouvement du phare droit
		if virage_gauche = 1 then exit	' Si on tourne a gauche on arrete le mouvement de revenir au centre pour faire repartir le phare a gauche 
	
	inc position_servo2 			' On incremente de 1 la position pour atteindre 150
	pause ralenti				' on fais une pause pour ralentir le mouvement du servo
	servopos C.2,position_servo2		' On place le servo2 a sa nouvelle place
		
loop while position_servo2 < 150		' Tant qu'on a pas atteint la valeur du point milieu 150 on continue

servo C.2, off					' une fois en position on eteint le servo

position_phare2 = 0				' On indique qu'il est centre ou qu'il a un peu tourné

if virage_droite = 1 then 
	position_phare2 = 1	' si on tourne a sec a gauche on doit indiquer que le phare n'est pas encore revenu au centre pour effectuer un retour aucnetre+aller a droite
end if

return						' On retourne au programme principal

reviens_au_centre_plus_droite:

servo C.1, position_servo1		' On reactive le servo car on l'avais mis sur Off
servo C.2, position_servo2		' On reactive le servo car on l'avais mis sur Off

do
		if virage_droite = 0 then exit	' Si on tourne plus a droite on sort
		if virage_gauche = 1 then exit	' si virage sec a droite on sort
	
		if position_servo1 < 175 then		' Si le servo1 n'as pas atteint la positon a droite on incremente
			inc position_servo1
		end if
	
		if position_servo2 < 150 then		' si le servo2 n'as pas atteint la valeur du centre 150  on incremente
			inc position_servo2
		end if

	pause ralenti		' pause pour ralentir
	
	servopos C.1,position_servo1	' On place le servo1 a sa nouvelle place
	servopos C.2,position_servo2	' On place le servo2 a sa nouvelle place
	
	if position_servo1 > 174 and position_servo2 > 149 then ' tant que les deux servos ne sont arrives on continue
		exit
	else
		loop
	end if

servo C.1, off
servo C.2, off

position_phare1 = 1
position_phare2 = 0

if virage_gauche =0 and virage_droite = 0 then	' si l'interrutpion se fait quand les phares n'ont pas pus atteidnre leur positions
	position_phare1 = 1				' On indique que le phare droite est a droite ou au milieu
	position_phare2 = 1				' on indique que le phare gauche est a gauche ou au milieu
end if
	
	

return
deux_aux_centre:

servo C.1, position_servo1		' On reactive le servo car on l'avais mis sur Off
servo C.2, position_servo2		' On reactive le servo car on l'avais mis sur Off

do
	if virage_droite = 1 then  exit
	if virage_gauche = 1 then  exit
	
		if position_servo1 > 150 then		' Si le servo1 n'as pas atteint 150 on decremente
			dec position_servo1
		end if
	
		if position_servo2 < 150 then		' si le servo2 n'as pas atteint 125 on decremente
			inc position_servo2
		end if

	pause ralenti		' pause pour ralentir
	
	servopos C.1,position_servo1	' On place le servo1 a sa nouvelle place
	servopos C.2,position_servo2	' On place le servo2 a sa nouvelle place
	
	if position_servo1 < 151 and position_servo2 > 149 then	' tant que les deux servos ne sont arriv?s on contiue
		exit
	else 
		loop
	end if


servo C.1, off			' On eteint le servo1
servo C.2, off			' On eteint le servo2

position_phare1 = 0 		' Une fois le phare1 au centre on l'indique
position_phare2 = 0		' Une fois le phare2 au centre on l'indique

	if virage_droite = 1 then
		position_phare1 = 0 
		position_phare2 = 1
	end if
	
	if virage_gauche = 1 then
		position_phare1 = 1
		position_phare2 = 0
	end if

return
 

ludo0404

Senior Member
Ca marche, je test ca ce soir en statique sur le bureau et demain soir sur la route (je récupère une moto demain matin)
 

BESQUEUT

Senior Member
2iéme partie :
Beau morceau de bravoure...
Si ça marche tant mieux, mais sinon, ça ne va pas être facile à débugger...
Je ne pourrai améliorer le code proposé en #206 avant la semaine prochaine (après le pont...),
mais ça serait bien plus simple et en prime on pourrait avoir la vitesse qu'on veut sur chaque servo...
Bon WE
 

PieM

Senior Member
Un petit dernier ...

Code:
[color=Navy]#picaxe [/color][color=Black]08M2[/color]

[color=Green]'######'####################    configuration    ################################   [/color]
[color=Blue]symbol [/color][color=Purple]position1 [/color][color=DarkCyan]= [/color][color=Purple]b1[/color]
[color=Blue]symbol [/color][color=Purple]position2 [/color][color=DarkCyan]= [/color][color=Purple]b2[/color]
[color=Blue]symbol [/color][color=Purple]inter1 [/color][color=DarkCyan]= [/color][color=Purple]pinC.4[/color]
[color=Blue]symbol [/color][color=Purple]inter2 [/color][color=DarkCyan]= [/color][color=Purple]PinC.3[/color]

[color=Blue]symbol FC1 [/color][color=DarkCyan]= [/color][color=Navy]175     [/color][color=Green]'fin de course servo1[/color]
[color=Blue]symbol FC2 [/color][color=DarkCyan]= [/color][color=Navy]125     [/color][color=Green]'fin de course servo2[/color]
[color=Blue]symbol RAZ1 [/color][color=DarkCyan]= [/color][color=Navy]150    [/color][color=Green]'neutre servo1[/color]
[color=Blue]symbol RAZ2 [/color][color=DarkCyan]= [/color][color=Navy]150    [/color][color=Green]'neutre servo2[/color]
[color=Blue]symbol tpause [/color][color=DarkCyan]= [/color][color=Navy]10   [/color][color=Green]'temps de pause - vitesse servos

'##########################    Initialisation    ################################[/color]

[color=Blue]servo C.1[/color][color=Black],[/color][color=Blue]RAZ1 [/color][color=Green]'servo1 au neutre[/color]
[color=Blue]servo C.2[/color][color=Black],[/color][color=Blue]RAZ2 [/color][color=Green]'servo2 au neutre[/color]
[color=Blue]pause [/color][color=Navy]100[/color]
[color=Purple]position1 [/color][color=DarkCyan]= [/color][color=Blue]RAZ1 [/color][color=Green]'memorisation position servo[/color]
[color=Purple]position2 [/color][color=DarkCyan]= [/color][color=Blue]RAZ2[/color]

[color=Green]'#################################################################################[/color]
[color=Black]prog_principal:[/color]

[color=Blue]do
   on [/color][color=Purple]inter1 [/color][color=Blue]gosub [/color][color=Black]servo1down, servo1up
   [/color][color=Blue]servopos C.1[/color][color=Black],[/color][color=Purple]position1
   [/color][color=Blue]on [/color][color=Purple]inter2 [/color][color=Blue]gosub [/color][color=Black]servo2down, servo2up
   [/color][color=Blue]servopos C.2[/color][color=Black],[/color][color=Purple]position2
   [/color][color=Blue]pause tpause
loop
 [/color]
[color=Green]'=================================================================[/color]
[color=Black]servo1up: [/color][color=Green]'deplacement vers fin de course
   [/color][color=Purple]position1[/color][color=DarkCyan]= [/color][color=Purple]position1 [/color][color=DarkCyan]+[/color][color=Navy]1 [/color][color=DarkCyan]max [/color][color=Blue]fc1
return         [/color]

[color=Green]'=================================================================[/color]
[color=Black]servo1down: [/color][color=Green]'deplacement vers fin position neutre
   [/color][color=Purple]position1[/color][color=DarkCyan]= [/color][color=Purple]position1 [/color][color=DarkCyan]-[/color][color=Navy]1 [/color][color=DarkCyan]min [/color][color=Blue]raz1 
return            [/color]

[color=Green]'=================================================================[/color]
[color=Black]servo2up: [/color][color=Green]''deplacement vers fin de course; attention qu'ici on decrement la position !
   [/color][color=Purple]position2[/color][color=DarkCyan]= [/color][color=Purple]position2 [/color][color=DarkCyan]-[/color][color=Navy]1 [/color][color=DarkCyan]min [/color][color=Blue]fc2
return            [/color]

[color=Green]'=================================================================[/color]
[color=Black]servo2down: [/color][color=Green]' et ici on l'incremente !
   [/color][color=Purple]position2[/color][color=DarkCyan]= [/color][color=Purple]position2 [/color][color=DarkCyan]+[/color][color=Navy]1 [/color][color=DarkCyan]max [/color][color=Blue]raz2  
return            [/color]

Et enfin, avec des pulsout pour éviter les servopos:

Code:
[color=Navy]#picaxe [/color][color=Black]08M2[/color]

[color=Green]'######'####################    configuration    ################################   [/color]
[color=Blue]symbol [/color][color=Purple]position1 [/color][color=DarkCyan]= [/color][color=Purple]b1[/color]
[color=Blue]symbol [/color][color=Purple]position2 [/color][color=DarkCyan]= [/color][color=Purple]b2[/color]
[color=Blue]symbol [/color][color=Purple]inter1 [/color][color=DarkCyan]= [/color][color=Purple]pinC.4[/color]
[color=Blue]symbol [/color][color=Purple]inter2 [/color][color=DarkCyan]= [/color][color=Purple]PinC.3[/color]

[color=Blue]symbol FC1 [/color][color=DarkCyan]= [/color][color=Navy]175     [/color][color=Green]'fin de course servo1[/color]
[color=Blue]symbol FC2 [/color][color=DarkCyan]= [/color][color=Navy]125     [/color][color=Green]'fin de course servo2[/color]
[color=Blue]symbol RAZ1 [/color][color=DarkCyan]= [/color][color=Navy]150    [/color][color=Green]'neutre servo1[/color]
[color=Blue]symbol RAZ2 [/color][color=DarkCyan]= [/color][color=Navy]150    [/color][color=Green]'neutre servo2[/color]
[color=Blue]symbol tpause [/color][color=DarkCyan]= [/color][color=Navy]10   [/color][color=Green]'temps de pause - vitesse servos

'##########################    Initialisation    ################################[/color]

[color=Blue]servo C.1[/color][color=Black],[/color][color=Blue]RAZ1 [/color][color=Green]'servo1 au neutre[/color]
[color=Blue]servo C.2[/color][color=Black],[/color][color=Blue]RAZ2 [/color][color=Green]'servo2 au neutre[/color]
[color=Blue]pause [/color][color=Navy]100[/color]
[color=Purple]position1 [/color][color=DarkCyan]= [/color][color=Blue]RAZ1 [/color][color=Green]'memorisation position servo[/color]
[color=Purple]position2 [/color][color=DarkCyan]= [/color][color=Blue]RAZ2[/color]
[color=Blue]servo C.1, OFF[/color]
[color=Blue]servo C.2, OFF[/color]

[color=Green]'#################################################################################[/color]
[color=Black]prog_principal:[/color]

[color=Blue]do
   if [/color][color=Purple]inter1 [/color][color=DarkCyan]= [/color][color=Navy]0 [/color][color=Blue]then 
      [/color][color=Purple]position1[/color][color=DarkCyan]= [/color][color=Purple]position1 [/color][color=DarkCyan]-[/color][color=Navy]1 [/color][color=DarkCyan]min [/color][color=Blue]raz1
   else
      [/color][color=Purple]position1[/color][color=DarkCyan]= [/color][color=Purple]position1 [/color][color=DarkCyan]+[/color][color=Navy]1 [/color][color=DarkCyan]max [/color][color=Blue]fc1
   endif
   pulsout C.1[/color][color=Black],[/color][color=Purple]position1
   [/color][color=Blue]If [/color][color=Purple]inter2 [/color][color=DarkCyan]= [/color][color=Navy]0 [/color][color=Blue]then 
      [/color][color=Purple]position2[/color][color=DarkCyan]= [/color][color=Purple]position2 [/color][color=DarkCyan]+[/color][color=Navy]1 [/color][color=DarkCyan]max [/color][color=Blue]raz2
   else
      [/color][color=Purple]position2[/color][color=DarkCyan]= [/color][color=Purple]position2 [/color][color=DarkCyan]-[/color][color=Navy]1 [/color][color=DarkCyan]min [/color][color=Blue]fc2
   endif
   pulsout C.2[/color][color=Black],[/color][color=Purple]position2
   [/color][color=Blue]pause tpause
loop[/color]
 
Last edited:

BESQUEUT

Senior Member
Un petit dernier ...

Code:
[color=Navy]#picaxe [/color][color=Black]08M2[/color]

[color=Green]'######'####################    configuration    ################################   [/color]
[color=Blue]symbol [/color][color=Purple]position1 [/color][color=DarkCyan]= [/color][color=Purple]b1[/color]
[color=Blue]symbol [/color][color=Purple]position2 [/color][color=DarkCyan]= [/color][color=Purple]b2[/color]
[color=Blue]symbol [/color][color=Purple]inter1 [/color][color=DarkCyan]= [/color][color=Purple]pinC.4[/color]
[color=Blue]symbol [/color][color=Purple]inter2 [/color][color=DarkCyan]= [/color][color=Purple]PinC.3[/color]

[color=Blue]symbol FC1 [/color][color=DarkCyan]= [/color][color=Navy]175     [/color][color=Green]'fin de course servo1[/color]
[color=Blue]symbol FC2 [/color][color=DarkCyan]= [/color][color=Navy]125     [/color][color=Green]'fin de course servo2[/color]
[color=Blue]symbol RAZ1 [/color][color=DarkCyan]= [/color][color=Navy]150    [/color][color=Green]'neutre servo1[/color]
[color=Blue]symbol RAZ2 [/color][color=DarkCyan]= [/color][color=Navy]150    [/color][color=Green]'neutre servo2[/color]
[color=Blue]symbol tpause [/color][color=DarkCyan]= [/color][color=Navy]10   [/color][color=Green]'temps de pause - vitesse servos

'##########################    Initialisation    ################################[/color]

[color=Blue]servo C.1[/color][color=Black],[/color][color=Blue]RAZ1 [/color][color=Green]'servo1 au neutre[/color]
[color=Blue]servo C.2[/color][color=Black],[/color][color=Blue]RAZ2 [/color][color=Green]'servo2 au neutre[/color]
[color=Blue]pause [/color][color=Navy]100[/color]
[color=Purple]position1 [/color][color=DarkCyan]= [/color][color=Blue]RAZ1 [/color][color=Green]'memorisation position servo[/color]
[color=Purple]position2 [/color][color=DarkCyan]= [/color][color=Blue]RAZ2[/color]

[color=Green]'#################################################################################[/color]
[color=Black]prog_principal:[/color]

[color=Blue]do
   on [/color][color=Purple]inter1 [/color][color=Blue]gosub [/color][color=Black]servo1down, servo1up
   [/color][color=Blue]servopos C.1[/color][color=Black],[/color][color=Purple]position1
   [/color][color=Blue]on [/color][color=Purple]inter2 [/color][color=Blue]gosub [/color][color=Black]servo2down, servo2up
   [/color][color=Blue]servopos C.2[/color][color=Black],[/color][color=Purple]position2
   [/color][color=Blue]pause tpause
loop
 [/color]
[color=Green]'=================================================================[/color]
[color=Black]servo1up: [/color][color=Green]'deplacement vers fin de course
   [/color][color=Purple]position1[/color][color=DarkCyan]= [/color][color=Purple]position1 [/color][color=DarkCyan]+[/color][color=Navy]1 [/color][color=DarkCyan]max [/color][color=Blue]fc1
return         [/color]

[color=Green]'=================================================================[/color]
[color=Black]servo1down: [/color][color=Green]'deplacement vers fin position neutre
   [/color][color=Purple]position1[/color][color=DarkCyan]= [/color][color=Purple]position1 [/color][color=DarkCyan]-[/color][color=Navy]1 [/color][color=DarkCyan]min [/color][color=Blue]raz1 
return            [/color]

[color=Green]'=================================================================[/color]
[color=Black]servo2up: [/color][color=Green]''deplacement vers fin de course; attention qu'ici on decrement la position !
   [/color][color=Purple]position2[/color][color=DarkCyan]= [/color][color=Purple]position2 [/color][color=DarkCyan]-[/color][color=Navy]1 [/color][color=DarkCyan]min [/color][color=Blue]fc2
return            [/color]

[color=Green]'=================================================================[/color]
[color=Black]servo2down: [/color][color=Green]' et ici on l'incremente !
   [/color][color=Purple]position2[/color][color=DarkCyan]= [/color][color=Purple]position2 [/color][color=DarkCyan]+[/color][color=Navy]1 [/color][color=DarkCyan]max [/color][color=Blue]raz2  
return            [/color]

Et enfin, avec des pulsout pour éviter les servopos:

Code:
[color=Navy]#picaxe [/color][color=Black]08M2[/color]

[color=Green]'######'####################    configuration    ################################   [/color]
[color=Blue]symbol [/color][color=Purple]position1 [/color][color=DarkCyan]= [/color][color=Purple]b1[/color]
[color=Blue]symbol [/color][color=Purple]position2 [/color][color=DarkCyan]= [/color][color=Purple]b2[/color]
[color=Blue]symbol [/color][color=Purple]inter1 [/color][color=DarkCyan]= [/color][color=Purple]pinC.4[/color]
[color=Blue]symbol [/color][color=Purple]inter2 [/color][color=DarkCyan]= [/color][color=Purple]PinC.3[/color]

[color=Blue]symbol FC1 [/color][color=DarkCyan]= [/color][color=Navy]175     [/color][color=Green]'fin de course servo1[/color]
[color=Blue]symbol FC2 [/color][color=DarkCyan]= [/color][color=Navy]125     [/color][color=Green]'fin de course servo2[/color]
[color=Blue]symbol RAZ1 [/color][color=DarkCyan]= [/color][color=Navy]150    [/color][color=Green]'neutre servo1[/color]
[color=Blue]symbol RAZ2 [/color][color=DarkCyan]= [/color][color=Navy]150    [/color][color=Green]'neutre servo2[/color]
[color=Blue]symbol tpause [/color][color=DarkCyan]= [/color][color=Navy]10   [/color][color=Green]'temps de pause - vitesse servos

'##########################    Initialisation    ################################[/color]

[color=Blue]servo C.1[/color][color=Black],[/color][color=Blue]RAZ1 [/color][color=Green]'servo1 au neutre[/color]
[color=Blue]servo C.2[/color][color=Black],[/color][color=Blue]RAZ2 [/color][color=Green]'servo2 au neutre[/color]
[color=Blue]pause [/color][color=Navy]100[/color]
[color=Purple]position1 [/color][color=DarkCyan]= [/color][color=Blue]RAZ1 [/color][color=Green]'memorisation position servo[/color]
[color=Purple]position2 [/color][color=DarkCyan]= [/color][color=Blue]RAZ2[/color]

[color=Green]'#################################################################################[/color]
[color=Black]prog_principal:[/color]

[color=Blue]do
   if [/color][color=Purple]inter1 [/color][color=DarkCyan]= [/color][color=Navy]0 [/color][color=Blue]then 
      [/color][color=Purple]position1[/color][color=DarkCyan]= [/color][color=Purple]position1 [/color][color=DarkCyan]-[/color][color=Navy]1 [/color][color=DarkCyan]min [/color][color=Blue]raz1
   else
      [/color][color=Purple]position1[/color][color=DarkCyan]= [/color][color=Purple]position1 [/color][color=DarkCyan]+[/color][color=Navy]1 [/color][color=DarkCyan]max [/color][color=Blue]fc1
   endif
   pulsout C.1[/color][color=Black],[/color][color=Purple]position1
   [/color][color=Blue]If [/color][color=Purple]inter2 [/color][color=DarkCyan]= [/color][color=Navy]0 [/color][color=Blue]then 
      [/color][color=Purple]position2[/color][color=DarkCyan]= [/color][color=Purple]position2 [/color][color=DarkCyan]+[/color][color=Navy]1 [/color][color=DarkCyan]max [/color][color=Blue]raz2
   else
      [/color][color=Purple]position2[/color][color=DarkCyan]= [/color][color=Purple]position2 [/color][color=DarkCyan]-[/color][color=Navy]1 [/color][color=DarkCyan]min [/color][color=Blue]fc2
   endif
   pulsout C.2[/color][color=Black],[/color][color=Purple]position2
   [/color][color=Blue]pause tpause
loop[/color]
Très joli, et si je ne me trompe pas, on a bien des mouvements simultanés y compris lents.
Sur cette base, on peut facilement faire des mouvements plus rapides sur un des servos (ou sur les 2) si on sait clairement dans quel cas il faut le faire.
J'aurais tendance à énoncer la règle suivante (à confirmer par le pilote...) :
- à tout moment, il est urgent qu'un des phares éclaire droit devant.
Si validé, ça devrait donner de bonnes pistes pour détecter les cas de rotation urgente. A priori, ça tombe chaque fois qu'on change d'orientation alors que le précédent mouvement n'est pas encore en butée.
On peut alors se trouver dans une situation ou le phare de gauche éclaire à gauche, l'autre à droite et plus rien au milieu...
 

ludo0404

Senior Member
Jerem :

ton code fonctionne mis à part quelques petites secousse des servo de temps en temps pendant la course... Mais en tout cas l'effet recherché est la !

Je test ceux de Piem maintenant....
 

PieM

Senior Member
Très joli, et si je ne me trompe pas, on a bien des mouvements simultanés y compris lents.
Sur cette base, on peut facilement faire des mouvements plus rapides sur un des servos (ou sur les 2) si on sait clairement dans quel cas il faut le faire.
J'aurais tendance à énoncer la règle suivante (à confirmer par le pilote...) :
- à tout moment, il est urgent qu'un des phares éclaire droit devant.
Si validé, ça devrait donner de bonnes pistes pour détecter les cas de rotation urgente. A priori, ça tombe chaque fois qu'on change d'orientation alors que le précédent mouvement n'est pas encore en butée.
Oui, c'était l'objet de mon premier programme en #214 ...
 

PieM

Senior Member
@ ludo:

il faut rajouter à l'initialisation
servo C.1, off
servo C.2, off
dans le prog avec les pulsout.
 

ludo0404

Senior Member
Oula !

Piem
Ce code la, les servos n'aime pas trop ! (pas du tout même !)

A la mise sous tension, ils font droite gauche trés rapide à en trembler et quand on ferme un inter idem sur le servo correspondant....

J'ai bien rajouté au bon endroit les servo off ?

Code:
#picaxe 08M2

'######'####################    configuration    ################################   
symbol position1 = b1
symbol position2 = b2
symbol inter1 = pinC.4
symbol inter2 = PinC.3

symbol FC1 = 175     'fin de course servo1
symbol FC2 = 125     'fin de course servo2
symbol RAZ1 = 150    'neutre servo1
symbol RAZ2 = 150    'neutre servo2
symbol tpause = 10   'temps de pause - vitesse servos

'##########################    Initialisation    ################################

servo C.1, off
servo C.2, off
servo C.1,RAZ1 'servo1 au neutre
servo C.2,RAZ2 'servo2 au neutre
pause 100
position1 = RAZ1 'memorisation position servo
position2 = RAZ2

'#################################################################################
prog_principal:

do
   if inter1 = 0 then 
      position1= position1 -1 min raz1
   else
      position1= position1 +1 max fc1
   endif
   pulsout C.1,position1
   If inter2 = 0 then 
      position2= position2 +1 max raz2
   else
      position2= position2 -1 min fc2
   endif
   pulsout C.2,position2
   pause tpause
loop
 

ludo0404

Senior Member
Jerem :

Tu vois quelque chose dans ton code qui pourrait expliquer ces secousses de temps en temps ?

Je suis impressionné par le temps que tu as du passer sur ce code vua sa taille !
 

PieM

Senior Member
Oula !

Piem
Ce code la, les servos n'aime pas trop ! (pas du tout même !)

A la mise sous tension, ils font droite gauche trés rapide à en trembler et quand on ferme un inter idem sur le servo correspondant....

J'ai bien rajouté au bon endroit les servo off ?

Non, regarde j'ai corrigé mon code la haut: il faut mettre servo OFF APRES les commandes servo !

Code:
servo C.1,RAZ1 'servo1 au neutre
servo C.2,RAZ2 'servo2 au neutre
pause 100
position1 = RAZ1 'memorisation position servo
position2 = RAZ2
servo C.1, OFF
servo C.2, OFF
 
Top