Code programme Picaxe

ludo0404

Senior Member
Bonjour,

Je suis à la recherche d'une personne qui accepterait de me fournir un code pour un picaxe (avec programing picaxe)

Le matériel :

picaxe 08m2
2servo
2 capteurs tor


Je souhaite :

lorsque le TOR sur PIN4 est fermé (donc 5V dans PIN4), le servo en PIN2 se deplace de 30° à gauche et ce tout le temps que le tor est fermé. Retour en position 0 lorsque le TOR s'ouvre.
Et lorsque le TOR sur PIN3 est fermé, le servo en PIN1 se déplace de 30° à droite, et retour en point 0 lorsque le TOR s'ouvre....

Je serais en mesure de modifier moi même les données par la suite pour obtenir pile poile se que je veux !

J'espere que quelqu'un pourra m'aider

Par avance merci
Ludo
 

alainav1

Senior Member
faut il que le servo moteur se coupe apres la mise en position ou qu'il reste sous tension
une mise hors tension permet de ne pas consommer de courant mais on perd du couple
c'est quoi l'application ?
cordialement
Alain
 

alainav1

Senior Member
voici un petit programme avec arret (pas pour la consommation mais pour lusure des servo )
il te reste les numero de patte a changer ,il faut bien que tu bosses un peu :)
#picaxe 08M2 'C.6 toujours en entrée

dirsc=%000000111


symbol commande1 = pinb.3
symbol commande2 = pinb.4

symbol position0 = b1
symbol positiondroit = b2
symbol positiongauche = b3

symbol etat1 =b4 'eta=0 milieu etat=1 devié
symbol etat2 =b5


position0=150
positiondroit = 100
positiongauche = 200
'intitialisation servo entre 75 et 225
'soit 750µs et 2250µs milieu 1500µs




'initialisation

gosub servo1milieu
pause 100
gosub servo2milieu
pause100
debut:
'commande des servos uniquement
'si il ne sont pas deja en position

if commande1=0 then
if etat1=1 then
gosub servo1milieu
endif
endif
if commande1=1 then
if etat1=0 then
gosub servo1droit
endif
endif
if commande2=0 then
if etat2=1 then
gosub servo2milieu
endif
endif
if commande2=1 then
if etat2=0 then
gosub servo2gauche
endif
endif
goto debut
end

'sous programmes
servo1milieu:
servopos b.0, positiondroit
servo b.0,positiondroit
pause 200
servo b.0 ,off
etat1=0
return
servo1droit:
servopos b.0, positiondroit
servo b.0,positiondroit
pause 200
servo b.0 ,off
etat1=1
return
servo2milieu:
servopos b.1, positiondroit
servo b.1,positiondroit
pause 200
servo b.1 ,off
etat2=0
return

servo2gauche:
servopos b.1, positiondroit
servo b.1,positiondroit
pause 200
servo b.1 ,off
etat2=1
return
 

dje8269

Senior Member
Voilou ,

A tester !
J'ai fais au plus simple, aucune formule, aucun nom de variable , aucun raccourci etc ... c'est brut de décoffrage , mais si ca te conviens, c'est cool !!!
Code:
#PICAXE 08M2

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

dirsC = %0001100 'declare Les broches C.2 et C.3 en entrée


servo C.2,150	'Initialise les servo au point milieu
servo C.1,150

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

do

if PinC.4 = 1 then	'Tant qu'on appui le servo reste en position
Servopos C.2,130		'130 à changer pour varier l'angle ( entre 100 et 200)
else 
servopos C.2,150		' Si pas d'appui position milieu
end if

If PinC.3 = 1 then
Servopos C.1, 170
else 
servopos C.1,150
end if

loop
 

jojojo

Senior Member
Remarque :
Si la commande de position se fait via un inverseur à deux positions, tout va bien.

Si c'est deux boutons poussoirs ... Prévoir l'appui simultané (qui ne se produira peut-être qu'une fois sur dix, mais ...)
 

ludo0404

Senior Member
Le systeme prevoit que lorsqu'un capteur est ouvert, l'autre est forcement fermé... J'y avais pensé !
Je test les codes ce soir et vous tiendrai informé !
 
Last edited:

dje8269

Senior Member
Le systeme prevoit que lorsqu'un capteur est ouvert, l'autre est forcement fermé
Voila une autre info intéressante, je pense qu'on peut améliorer le programme . Mais est ce qu'un capteur est forcement a l'etat haut ? ou le deux peuvent etre a l'etat bas en même temps ?

Je me rends compte maintenant la signification d'un cahier des charges précis ! lol
 

PieM

Senior Member
Pour moi, le post #1 était clair ...
Deux servos chacun prenant une position 0 ou x en fonction de l'état de son capteur TOR.

Inutile donc d'aller chercher des complications. Le programme de dje me semble tout à fait approprié.


@alainav1

la commande servopos suivie d'une commande servo n'a pas de sens. Servopos ne peut fonctionner puisque un servo xx, OFF oblige à réinitialiser la commande par la commande servo et non servopos.
 

dje8269

Senior Member
ou le deux peuvent etre a l'etat bas en même temps ?
?
Car si ils ne peuvent pas etre a l'etat bas en même temps non plus ; il suffirait d'inverser si un bouton est appuyé ;
 

alainav1

Senior Member
Bonjour
pour pieM
servopos suivie d'une commande servo n'a pas de sens
effectivement j'ai inversé les 2 commandes
comme je coupe la commande du servo apres chaque action afin de ne pas le laisser continuellement sous tension
je pense qu'il faut une commande servo pour reinitialiser et une commande servopos pour agir (c'est ce que j'ai cru comprendre sur des post precedents )
je ne suis pas un grand specialiste des picaxe (mais vous m'aidez à progresser )
pour info je suis en cours de developpement de commandes d'aiguillage pour un circuit de train et je ne souhaite pas que les servo restent sous tension continuellement je ne souhaite pas non plus commander l'aiguillage si il est deja dans la position .
j'ai reecrit ce petit programme ci dessus de tête car je ne suis pas chez moi (d'ou l'inversion de serv et servopos ) mais mon programme marche pour mon circuit de train .
quand il sera completement fini je vous en ferai part (les commandes ne sont pas des boutons poussoir mais un TSOP associé a une telecommande infrarouge .
voila voila !
mais vos conseils et remarques sont toujours les biens venus
si vous pensez que ma commande de servo peut etre améliorée je suis a votre ecoute
cordialement
Alain
 

jojojo

Senior Member
comme je coupe la commande du servo apres chaque action afin de ne pas le laisser continuellement sous tension
Pourquoi ?
Moteur à l'arrêt, l'électronique de commande du servo consomme moins de 5mA.
Donc ...
 

PieM

Senior Member
je pense qu'il faut une commande servo pour reinitialiser et une commande servopos pour agir
Concernant la commande servo le double emploi ne sert à rien; la commande servo fait la même chose que la commande servopos, sauf qu'en plus, elle réinitialise le timer qui a été désactivé par servo OFF.
Donc si on utilise servo OFF la commande servopos envoyée après ne sert à rien.

Comme le signale jojojo, à partir ou le servo a atteint sa position de consigne, par principe le circuit de puissance (moteur) n'est plus sous tension.
Il est bien entendu qu'ici on parle de servo type modélisme.
 

ludo0404

Senior Member
Bon j'ai un peu tardé aprés un petit déboire mécanique !
Alors aucun des deux codes ne fonctionnent, j'ai essayé de modifier les entrées et sorties du code 1 mais j'ai du me planter.... Comme je suis sur que vous ne le devinerez pas, je vous le dit je suis "trés" débutant dans ce domaine.

Sur le premier proto, j'avais utilisé un "circuit" avec une 08m2 pour chaque servo avec les codes qui suivent.
(nb : le nouveau proto fonctionne avec ces deux codes separement....)

servo 1

#PICAXE 08m2

bit0=0
servo 1,150
do
bit1=pin3
if bit1<>bit0 then
if bit1=0 then
servo 1,150
else
servo 1,85
endif
bit0=bit1
endif
loop


servo 2

#PICAXE 08m2

bit0=0
servo 1,75
do
bit1=pin3
if bit1<>bit0 then
if bit1=0 then
servo 1,75
else
servo 1,125
endif
bit0=bit1
endif
loop
 

alainav1

Senior Member
bonjour,
pour repondre à
"Moteur à l'arrêt, l'électronique de commande du servo consomme moins de 5mA."

si j'envoie une commande au servo celui ci se met en position et la garde . dans mon cas le bras se met donc en position pousse sur l'aiguillage pour le positionner il y a donc un effort mecanique a vaincre cela se traduit par une consommation non negligeable .
donc tout le temps que l'on fait pas un servo off le moteur consomme proportionnel a l'effort demandé
il suffit pour s 'en convaincre de mettre un amperemetre dans l'alimentation
programmer le servo et s'opposer legerement au mouvement avec le doigt pour voir l'intensité monter tout le temps qu'on le sollicite .
la commande servo off va couper la commande du servo let le servo ne consommera bien sur plus rein (un effort mecanique important sur le bras du servo le fera bien sur bouger puisque aucun courant ne circuie dans le moteur )
pour resumer
la commande du servo (intensite dans le fil de commande )est negligeable
mais le moteur du servo (intensite dans l'alimentation )consomme en fonction de l'effort mecanique auquel il est soumis
c'est comme ça que je vois les chose mais si vous pensez que je me trompe et si avez une autre explication je suis preneur
cordialement
Alain
 

dje8269

Senior Member
mais le moteur du servo (intensite dans l'alimentation )consomme en fonction de l'effort mecanique auquel il est soumis
Oui tu as raison , tant qu'il force ou bouge c'est pareil , il consomme .

mais une fois ton aiguillage en place, le servo a finis son travail et a pris sa position , donc le moteur est arreté et ne consomme plus rien ! car aucune force ne lui ai demadé ni de mouvement . a part si le ressort de l'aiguillage tente de le ramener en position d'origine, mais dans ce cas, l'exctintion du servo le referais aussi revenir a sa position d'origine.

Pour résumé , une fois le servo dans sa position , s'il ne bouge plus , il ne consomme plus !!

@ludo

comment ca mon programme ne fonctionne pas !!!! je plaisante .
Je te le refais maitenant que l'on as plus d'infos ( récupéré dans ton ancien programme) .

Laisse moi 5 minutes ou 10 . ou une heure lol
 

dje8269

Senior Member
J'ai associé tes deux programmes et les ai simplifié , j'ai garder tes termes ;

PS : utilise la balise
Code:
[/CODE ] pour mettre ton programme c'est plus lisible


Tu peux essayer ca ! Mais attention les deux TOR peuvent être a l'état haut en même temps . il faut donc gérer ca en amont car le logiciel ne le fais pas ( mais il pourrait le faire).


[code]
#Picaxe 08M2


servo 1,150
servo 2,75


do

if pin3=1 then		' Le TOR en C.3  est à 1

		servo 1,85
	else
		servo 1,150
endif


If pin4=1 then		' Le TOR en C.4 est à 1

	servo 2,75
else
	servo 2,125
endif

loop
 

ludo0404

Senior Member
J'ai associé tes deux programmes et les ai simplifié , j'ai garder tes termes ;

PS : utilise la balise
Code:
[/CODE ] pour mettre ton programme c'est plus lisible


Tu peux essayer ca ! Mais attention les deux TOR peuvent être a l'état haut en même temps . il faut donc gérer ca en amont car le logiciel ne le fais pas ( mais il pourrait le faire).


[code]
#Picaxe 08M2


servo 1,150
servo 2,75


do

if pin3=1 then		' Le TOR en C.3  est à 1

		servo 1,85
	else
		servo 1,150
endif


If pin4=1 then		' Le TOR en C.4 est à 1

	servo 2,75
else
	servo 2,125
endif

loop
Parfait le code fonctionne ! je modifie quelques données pour avoir pile ce qu'il me faut et le tour et joué !

Encore merci beaucoup.

Je reviens vers vous en cas de doute
 

dje8269

Senior Member
Parfait le code fonctionne
Ca me fais plaisir ca . depuis le temps qu'on m'aide, a mon tour aidé quelqu'un c'est cool !.

sache que le programme pourrais geré beaucoup plus au niveau des conditions et des test . Comme on ne sait toujours pas a quoi ca sert !

par exemple tu pourrais avoir un seul TOR pour faire bougé les deux servos en même temps .
 

alainav1

Senior Member
bonjour,
pour repondre a la question
a part si le ressort de l'aiguillage tente de le ramener en position d'origine, mais dans ce cas, l'exctintion du servo le referais aussi revenir a sa position d'origine.

je commande l'aiguillage via une tige metallique

lorsque le courant est coupé le bras fait une legere marche arriere mais ne deplace pas l'aiguillage
voici une petite video prise pendant la mise au point
http://www.youtube.com/watch?v=GTkG-Obn65A
cordialement
Alain
 

ludo0404

Senior Member
Y'a t-il un moyen d'arreter ces petits accoups lorsque le servo est en position 1 ou 2 ?
 
Last edited:

jojojo

Senior Member
Oui.

Ne PAS utiliser la fonction servopos, mais la commande pulsout.

Ne me demande pas pourquoi, mais j'ai validé ça un paquet de fois ! Même sans utiliser par ailleurs de PWM, ou d'autres instructions utilisant le timer, servopos reste "susceptible". Les meilleurs découplages alim n'y changent rien.
Piem a peut-être une réponse ...
 

dje8269

Senior Member
Les meilleurs découplages alim n'y changent rien.
encore faut-il qu'il y en ai deja un !

As tu decouplé l'alimentation de tes servos ? ( mis en place d'un condensateur au plus prêt de l'alimentation de ceux ci ?

@Alain:

effectivement une vidéo, on se rend mieux compte ; Perso j'aurais utilisé les 2 bras plus court du servo moteur , pour ainsi le rapprocher des rails, reduire la tige mettalique, et ainsi il n'y aurais plus cet effet ressort de la tige , et le servo forcement moi car il as plus de force pret du moteur qu'au bout des pales !

En tout cas c'est sympa tu le commande comment l'aiguillage ?
 
Last edited:

ludo0404

Senior Member
encore faut-il qu'il y en ai deja un !

As tu decouplé l'alimentation de tes servos ? ( mis en place d'un condensateur au plus prêt de l'alimentation de ceux ci ?
Les servos sont bien alimentés en 6V sur un circuit separé et la 08m2 avec du 5V sur une autre....
Pas de condensateurs....
Il n'y en a qu'un seul des deux qui fait des accoups....
 

dje8269

Senior Member
Pas de condensateurs....
Il te faut découplé l'alimentation de tes servos ! Sous peine de les voir vibroté . perso sur mon projet j'ai mis un condensateur de 1000µF au plus prêt et je pense en rajouter un plus petit . J'ai egalement une diode rapide qui va du moins au plus.

V3.0 vue de face.jpg
 

alainav1

Senior Member
bonjour,
pour info le bras(en croix ) du servo moteur commande en plus un petit contacteur pour alimenter le coeur d'aiguillage j'ai aussi ameliore la "douceur " de la commande avec un boucle for next pour que le sevo se deplace lentement vers sa position .
principe
for pos = 150 to 200 step 10
servo 1, pos
pause 100
next pos
je vous ferai part de tout ça quand tout cela sera finalisé
l'alimentation du servo se fait en 5V j'ai une capa de 1000µF car si le servo est sous contraite l'alimentation s'ffondre et ça met le Bord....et bien sur un decouplage de 100nf au plus proche du picaxe
je ne souhaite pas que le servo soit proche de l'aiguillage se tenir a distance apporte plus de douceur je peux jouer sur l'elasticité de la core a piano
cordialement
Alain
 

dje8269

Senior Member
Pas mal le coup de la "douceur" . Mais je comprends pas un truc . ton servo obtiens donc une position comprise entre 150 et 500, mais en général les servos vont de 100 à 200 grossomodo , pourquoi allez jusqu'a 500 ? surtout que "pos" doit être une variable word ? tu pourrais faire un step de 1 alllant de 150 a 230 ! ( 80 paliers) comme de 100 à 500 par pas de 5 ( 80 paliers) et ainsi travailler avec une byte plutot qu'un word
 

alainav1

Senior Member
bonjour,
le code n'est pas le vrai mais un exemple (je ne suis pas chez moi donc j'ai pas le code ) les positions c'est plus proche de 150 du genre 120 et 170.
je choisi une position au debut du programme et je la memorise (apres chaque action ) afin de repartir de la position precedente .
je vous passerai le code
cordialement
Alain
 

dje8269

Senior Member
Ah d'accord je comprends mieux . lol . je me disais bien aussi qu'il y avait un pépin , et je voyais vraiment pas commencer cela pouvait focntionné

bon ben j'ai rien dis alors !! :D
 

PieM

Senior Member
Oui.

Ne PAS utiliser la fonction servopos, mais la commande pulsout.

Ne me demande pas pourquoi, mais j'ai validé ça un paquet de fois ! Même sans utiliser par ailleurs de PWM, ou d'autres instructions utilisant le timer, servopos reste "susceptible". Les meilleurs découplages alim n'y changent rien.
Piem a peut-être une réponse ...
Les galères avec la commande servo sont effectivement légions !
beaucoup de choses peuvent être en cause, dont la qualité des servo. J'ai eu des pb avec des servos bon marché, qui ont disparus avec des Hytec.
Si on veut être tranquille le meilleurs moyen est effectivement d'utiliser pulsout, ou bien un pwm.
Pour ce dernier , pour être à 50 Hz il faut passer à une fréquence de 2 MHz avec un setfreq m2 et utiliser un pwmout :
pwmdiv64, xx, 155, duty avec un duty de 25 à 65 environ. (à vérifier, me souviens plus)
 

dje8269

Senior Member
@Alain ,

J'ai regarder vite fait ton programme en page 1 . J'ai bien essayer de comprendre mais c'est galère car pas trop de commentaire .

je pense qu'il faut une commande servo pour réinitialiser et une commande servopos pour agir (c'est ce que j'ai cru comprendre sur des post precedents )
Je pense que tu peux alléger ton programme en initialisant directement a la position voulue ! plutôt que d'utiliser un servopos, étant donné que tu n'as pas besoin de valeur intermédiaire !

je ne suis pas un grand specialiste des picaxe (mais vous m'aidez à progresser )
hihihihi moi non plus , alors ne prends pas au pieds de la lettre ce que je dis hein !!! .


pour info je suis en cours de developpement de commandes d'aiguillage pour un circuit de train et je ne souhaite pas que les servo restent sous tension continuellement
ca je peux le comprendre, amis je suis quasiment sur que PieM a raison,, et que le servo ne consomme presque plus rien une fois en position ;( il ne resiste a rien et le moteur est coupé)

je ne souhaite pas non plus commander l'aiguillage si il est deja dans la position .
Je pense la aussi que tu t'embête avec ça ; Ça ne dérange en rien de commander quelques choses qui est déjà en place . Tu peut tres bien lui dire d'aller a droite s'il est deja a droite, il ne bougeras pas "normalement" et ca simplifierais pas mal ;

En même temps si ca fonctionne bien , et que ca te conviens ne touche a rien !!!!
 

alainav1

Senior Member
bonjour,
pour repondre
J'ai bien essayer de comprendre mais c'est galère car pas trop de commentaire
je vous transmettrai le projet (avec commentaire ) quand il sera terminé
quand a la stabilite des servo bas de gamme effectivement avec des servo à 4 euros j'ai eu des soucis (des gros a coup a la mise sous tension )
je souhaite utiliser des picaxe pour que les membre du club puissent programmer et etre autonome .
actuellement plusieurs membre apprennent a programmer .
sinon pour mon reseau perso j'ai fait les mêmes fonction avec des pic 16f donc le cout est nettement moins cher puisque que un 40 broche 16f887) ne coute que quelques euros mais il a fallu programmer le code emission (en assembleur )et la detection infrarouge .mais comme je suis equipé pour programmer les 16f et que ça m'amuse !
mon 16f887 me permet de traiter une trentaine de commande . chaque poussoir emet un code infrarouge different .
je vais l'adapter au picaxe de 40 pins pour le club sachant qu'un picaxe de ce type coute une dizaine d'euro ça reste raisonable puisque un seul µP prendra en charge l'emission des commandes du reseau .
le principe consite a emettre un code infrarouge (led emission sous le reseau et plusieur petite platine de reception ici ou la sous le reseau a proximite des aiguillage (donc beaucoup moins de longueurs de fil !)
mais je m'eloigne un peu du sujet
cordialement
Alain
 

ludo0404

Senior Member
Les galères avec la commande servo sont effectivement légions !
beaucoup de choses peuvent être en cause, dont la qualité des servo. J'ai eu des pb avec des servos bon marché, qui ont disparus avec des Hytec.
Si on veut être tranquille le meilleurs moyen est effectivement d'utiliser pulsout, ou bien un pwm.
Pour ce dernier , pour être à 50 Hz il faut passer à une fréquence de 2 MHz avec un setfreq m2 et utiliser un pwmout :
pwmdiv64, xx, 155, duty avec un duty de 25 à 65 environ. (à vérifier, me souviens plus)

Comment dire sans passer pour un nul.... Hummmmm ! Concretement, ca veut dire quoi ? C'est une manip dans le programme à faire ?

Ce qui est bizarre c'est qu'un seul des deux le fait....

Pour la qualité du servo, je ne m'y connait pas je vous laisse donc juger..... http://www.gotronic.fr/art-servomoteur-renforce-s06nf-18763.htm
 
Last edited:
Top