Code programme Picaxe

ludo0404

Senior Member
Pas vraiment,

J'ai essayé plusieurs modifs sans atteindre le résultat escompté.
Je n'arrive pas à comprendre le chemin de retour à 0 du servo et donc n'arrive pas à le ralentir à son retour....

J'ai également essayé d’insérer les lignes pour le deuxième servo en me servant de mon premier code mais sans succès.

Autre chose... mon point 0 est 75 pour l'un et 150 pour l'autre, ne serait-il pas plus judicieux de les mettre à 150 tous les deux (au milieu quoi...)
 

dje8269

Senior Member
mon point 0 est 75 pour l'un et 150 pour l'autre, ne serait-il pas plus judicieux de les mettre à 150 tous les deux (au milieu quoi...)
Ca t'oblige de changer la disposition de tes servos physiquement , mais c'est sur que pour le programme se serait plus simple ; comme ca tu ne fais qu'un seul calcul , que tu apllique au deux servos.

Je n'arrive pas à comprendre le chemin de retour à 0 du servo et donc n'arrive pas à le ralentir à son retour....
C'est exactement la même chose qu' l'aller mais à l'envers . au lieu de augmenter de 1 avec inc ( pour incrementation voir le manuel) tu fais dec ( pour decrementaiton voir manuel) .

Montre moi un bout de code , je regarderais et t'aiguillerais ; Attention je suis loin d'avoir al science infuse . peut être qu'il existe d'autre solution
 

ludo0404

Senior Member
As tu un lien vers ce manuel car je ne dois pas avoir le bon.... J'ai aucune trace des ca dans le mien

Le code que j'utilise actuellement est celui la :

#Picaxe 08M2

low 1,2
pulsout 1,75
pulsout 2,150


do
if pin3=1 then
pulsout 1,100
else
pulsout 1,75
endif


If pin4=1 then
pulsout 2,125
else
pulsout 2,150
endif
pause 18
loop
 

ludo0404

Senior Member
Montre moi un bout de code , je regarderais et t'aiguillerais ; Attention je suis loin d'avoir al science infuse . peut être qu'il existe d'autre solution
En tout cas, le bout de code que tu m'a envoyé fonctionne trés bien (sauf le retour à 0 trop rapide) mais c'est exactement le résultat souhaité...
 

dje8269

Senior Member
Alors pour le manuel c'est par ici

En tout cas, le bout de code que tu m'a envoyé fonctionne trés bien
Ca c'est bon signe lol

(sauf le retour à 0 trop rapide)
Ben c'est fais exprès , pour que tu bosse , Si je te le file tout fait , t un'auras rien appris du tout . regarde déjà la , tu va avoir le manuel . j'ose aussi esperer que tu as compris la difference entre un pulsout et un servopos .

mais c'est exactement le résultat souhaité...
je sais ....


Le code que j'utilise actuellement est celui la :
reprends mon code qui fonctionne , et essaye, pour commencer de faire revenir le servo à 0 doucement . Presque la même chose que pour l'aller mais à l'envers ; et montre moi .

On va avancer pas à pas
 

ludo0404

Senior Member
Comme ca

#Picaxe 08M2


symbol position = b1



position = 75

servo C.1,position


do
if pinC.4=1 then

do
inc position
pause 10
servopos C.1,position

loop while position < 100

do
loop while position > 75
servopos C.1,position
pause 10

dec position
end if

position = 75
servopos C.1, position


loop
Le voila à l'envers.....
 

dje8269

Senior Member
Je ne suis pas à la maison. J'aurais plus de temps ce soir.
Mais tu as confondus inverser des fonctions et des valeurs.
Tu ne dois pas inverser l'ordre des fonctions , mais seulement le calcul. Qui doit descendre au lieu de monter
 

ludo0404

Senior Member
Un autre essai :

#Picaxe 08M2


symbol position = b1



position = 75

servo C.1,position


do
if pinC.4=1 then

do
inc position
pause 10
servopos C.1,position

loop while position < 100

do
dec position
pause 10
servopos C.1,position

loop while position < 75

loop while pinC.4 = 1
end if

position = 75
servopos C.1, position


loop
 

dje8269

Senior Member
salut ludo ,

Bon désolé hier soir j'étais naze !

Il faut mettre ton programme dans une balise code :
Code:
 programme [C0DE/]

Ensuite il faut que tu mette des commentaires , ca t'aideras pour la compréhension de ton propre programme , tu verras tu trouveras des erreurs tout seul . Et aussi pour que les autres puisse bien le comprendre en le lisant . Si apres quelques mois tu veux faire une modif , ca t'aideras bien aussi .

Afin de ne pas se mélanger les pinceaux essaye de nommé tes broches , variables etc .... ainsi c'est beaucoup plus claur dans le programme.

Je te donne ces petits conseils à la va vite hein .... ; mais c'est quand même important .

Voila j'ai commenté ton programme pour essayé de bien décortiquer tes problémes ;

J'allais oublié , merci de mettre un programme qui fonctionne à minima en simulation . Ce n'est pas le cas en #93 .

[code]
#Picaxe 08M2
 

symbol position = b1
 


position = 75
 
servo C.1,position
 

do
 if pinC.4=1 then			' donc ici tu regarde si ton inter est appuyé ou non .
 					' Si il est appuyé tu execute les instructions de dessous
 					
 					
	do 				' tu ouvre une boucle pour faire bouger ton servo doucement
		inc position 	
		pause 10
		servopos C.1,position
		
	loop while position < 100	' Quand tu as atteint la valeur tu sort de la boucle .


'La deja ca coince car tu va rentré dans une nouvelle boucle à la suite de l'autre .

	 do 				' Donc dans la foulée du fais redecndre ton servo doucement
	 				' a ce moment précis la valeur de position = 100
		dec position 	' tu enleve 1 à 100 donc postion = 99
		pause 10		
	 	servopos C.1,position	'tu place ton servo à la position 99
	
	 loop while position < 75	' Mais la tu fais une boucle si position INFERIEUR à 75 ???? 
	 					' mais position = 100 quand tu sort de la boucle du dessus, donc tu ne fais pas la boucle 

 'loop while pinC.4 = 1	' Ca je sais pas ce que ca fou la
 end if 			

position = 75		' 
 servopos C.1, position 'la tu utilise servopos alors que l'on doit l'utilisé seulement pour avancer doucement après il faut du Pulsout
 

loop

Sinon voila le code qui devrais t'intéresser :
il y a certainement mieux a faire, mais la je laisse la main aux experts:

Il as fallu compliquer encore un peu , car tu dois aller doucement une seule fois quand l'interrupteur est basculé , j'ai donc créer un flag , pour detecter le premier front montant au descendant.

dis moi si ca marche , on passeras à la suite

Code:
#Picaxe 08M2
 
'##########################    configuration    ################################	
symbol position = b1
symbol inter1 = pinC.4
symbol EN1 = b11 


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

setfreq m4

EN1 = 0		' Au démarrage on met le flag à 0
position = 75	' On rentre la position d'origine
 
servo C.1,position' On place le servo
 


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

 if inter1 = 1 and EN1 = 0 then gosub servo1up		' Si l'inter est à 1 et que le flag à 0 cela signifie que c'est la premiere fois qu'on bascile l'inter
 if inter1 = 0 and EN1 = 1 then détecter servo1down	' Si l'inter est à 0 et que le flag à 1 cela signifie que c'est la premiere fois qu'on bascile l'inter
 
pulsout C.1, position 						' on positionne le servo avec pulssout pour la stabilité

pause 10	' pour ralentir la Mise à Jour

loop

 
'#################################################################################
'##########################    Programme Secondaire    ###########################	
'#################################################################################
servo1up:

do 
	inc position 		' On augmente de 1 la position
	pause 10			' on fais une pause pour ralentir
	servopos C.1,position	' On place le servo a sa nouvelle place
		
loop while position < 100	' Tant qu'on a pas atteint la valeur on continue

EN1 = 1				' Une fois le servo à sa position On met le flag a 1
return				' On retourne au programme principal

'--------------------------
servo1down:
do 
	dec position 		' On descend de 1 la position
	pause 10			' on fais une pause pour ralentir
	servopos C.1,position	' On place le servo a sa nouvelle place
	
loop while position > 75	' Tant qu'on a pas atteint la valeur on continue

EN1 = 0				' Une fois le servo à sa position On met le flag a 0
return				' On retourne au programme principal
 

PieM

Senior Member
Bonjour,

Il me semble qu'il y a deux servo à actionner.
le problème avec des boucles do loop est que tout pendant qu'un servo n'est pas en fin de course, on ne peut rien faire, même pas inverser son sens si le capteur change d'état.
Donc pendant qu'un servo revient à 0, l'autre ne peut pas bouger ce qui peut être gênant ..
de même que s'il y a un contact fugitif, on engage la course complète du servo avant de revenir !

je propose un autre programme qui permet de commander les 2 servos simultanément, avec inversion du sens d'action immédiat si les infos d'entrée changent.
Pas testé en réalité.

Code:
#Picaxe 08M2

'Entrées Sorties ------------------------
symbol servo1 = C.1
symbol servo2 = C.2
symbol capteur1 = pinC.3
symbol capteur2 = pinC.4
'Variables ------------------------------
symbol position1 = b1
symbol position2 = b2
symbol fdc1 = b3
symbol fdc2 = b4

'initialisation--------------------------
symbol delai = 10
position1 = 90
position2 = 140
servo C.1,position1 'init servo 1 vers milieu de sa course
servo C.2,position2 'init servo 2 vers milieu de sa course

main:
'SERVO 1 ========= pos0 = 75 --> 100 ==================
	if capteur1=1 then
		fdc1=100  'fin de course à atteindre
		if position1 < fdc1 then  'si position pas atteinte
				inc position1 		'on incremente	
				pause delai			'on attend
				servopos servo1,position1 'nouveau positionnement du servo
		else						' quand le servo est en position fin de course, 
				 pulsout servo1,fdc1 	' on passe en pulsout		
		endif
	
	else 
		fdc1 = 75  'fin de course à atteindre
		if position1 > fdc1 then
				dec position1 
				pause delai
				servopos servo1,position1
		else
				pulsout servo1,fdc1 ' quand le servo est en position fin de course, 		
		endif 
	endif
	
	
	
'SERVO 2 ============ pos0 = 150 --> 125  ===============
	if capteur2 =1 then
		fdc2=125  'fin de course à atteindre
		if position2 > fdc2 then
				dec position2 
				pause delai
				servopos servo2,position2
		else 
				pulsout servo2,fdc2 ' quand le servo est en position fin de course, 
		endif 
	
	else 
		fdc2 = 150  'fin de course à atteindre
		if position2 < fdc2 then
				inc position2 
				pause delai
				servopos servo2,position2
		else
				pulsout servo2,fdc2 ' quand le servo est en position fin de course, 						
		endif 
	endif

goto main
 

ludo0404

Senior Member
retour test :

Quand les tor sont à 0 les servos font des acouts.....

Quelle serait la valeur à modifier pour que les servo soient un peut plus rapide ?
 

dje8269

Senior Member
Avec le code de PieM ou le mien ?

Pour accelerer la vitesse reduit le temps de pause, sur mon prog , et le delai sur celui de piem au tout debut .
 

ludo0404

Senior Member
je voyais plus un pour la course vers la position 1 et un autre delay pour le retour... Mais je suppose que ca marche aussi...

Et pour ces acouts, ca peut venir d'où à votre avis ?
 

dje8269

Senior Member
je pense qu'il faut ralentir de programme de PieM . Car quand les tor sont à 0 , on fait seulement 4 comparaisons, donc ca va trés trés vite , et le servo recoit certainement trop de mise à jour

Essaye en rajoutant une petite pause de 10ms en fin de programme avant le re-bouclage

@PieM : pourquoi a l'initialisation du met les servo à 90 et 140 plutot que 75 et 150 ?
 

jojojo

Senior Member
et le servo recoit certainement trop de mise à jour
Nein ! Un servo jitte si il ne rçoit PAS assez de mises à jour, ou si ses mises à jours sont mal fichues (Cas bien connu des picaxes, et certains servos le supportent mieux que d'autres. Pour info, les Futabas vont très bien, les Models Craft beaucoup moins bien).

D'oû, selon l'appli, le choix entre servopos, et pulsout.
Avec un Pulsout, bien rafraichi, TOUS les servos fonctionnent.

Eviter aussi les positions extrèmes. C'est souvent là, oû c'est le moins stable.
 

ludo0404

Senior Member
les servo pour le modèle final, seront des feetech...

Mais vu la réaction des servos actuel, je pense qu'il y a quand même un truc à modifier dans le programme non ?
 

PieM

Senior Member
les servo pour le modèle final, seront des feetech...

Mais vu la réaction des servos actuel, je pense qu'il y a quand même un truc à modifier dans le programme non ?
je ne vois pas pourquoi le phénomène se produirait uniquement quand les servos sont dans cette position car les instructions sont les mêmes pour les deux extrêmes.
C'est certain que le signal capteur = 0 est fiable ?
 

ludo0404

Senior Member
Après d'autres tests, cela se produit aussi avec le contacteur en c1 fermé... Le signal ne peut pas etre plus fiable puisque pour l'instant, c'est un fil volant que je colle au 5V pour simuler la fermeture du tor.....

Maispas avec le C2...
 
Last edited:

dje8269

Senior Member
C'est bon pour moi .

Avant ça le faisait ou pas ?

tu as essayé en mettant une pause de 10ms avec le rebouclage , que je l'avais dis ?

ca donne quoi avec mon programme ?
 

dje8269

Senior Member
Avec ton code pas de probleme, juste le retour trop rapide...
L'autre code , celui pour un seul servo , tiens:

Code:
#Picaxe 08M2
 
'##########################    configuration    ################################	
symbol position = b1
symbol inter1 = pinC.4
symbol EN1 = b11 


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

setfreq m4

EN1 = 0		' Au démarrage on met le flag à 0
position = 75	' On rentre la position d'origine
 
servo C.1,position' On place le servo
 


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

 if inter1 = 1 and EN1 = 0 then gosub servo1up		' Si l'inter est à 1 et que le flag à 0 cela signifie que c'est la premiere fois qu'on bascile l'inter
 if inter1 = 0 and EN1 = 1 then détecter servo1down	' Si l'inter est à 0 et que le flag à 1 cela signifie que c'est la premiere fois qu'on bascile l'inter
 
pulsout C.1, position 						' on positionne le servo avec pulssout pour la stabilité

pause 10	' pour ralentir la Mise à Jour

loop

 
'#################################################################################
'##########################    Programme Secondaire    ###########################	
'#################################################################################
servo1up:

do 
	inc position 		' On augmente de 1 la position
	pause 10			' on fais une pause pour ralentir
	servopos C.1,position	' On place le servo a sa nouvelle place
		
loop while position < 100	' Tant qu'on a pas atteint la valeur on continue

EN1 = 1				' Une fois le servo à sa position On met le flag a 1
return				' On retourne au programme principal

'--------------------------
servo1down:
do 
	dec position 		' On descend de 1 la position
	pause 10			' on fais une pause pour ralentir
	servopos C.1,position	' On place le servo a sa nouvelle place
	
loop while position > 75	' Tant qu'on a pas atteint la valeur on continue

EN1 = 0				' Une fois le servo à sa position On met le flag a 0
return				' On retourne au programme principal
 
Top