positionnement avec un moteur pas à pas

BESQUEUT

Senior Member
En début de session, vous allez définir un circuit.
donc une position particulière de vos aiguillage sur le circuit actif. Peu importe leur position initiale.
Par contre si vous vous amusez à changer manuellement une position d'aiguillage sur ce circuit, c'est la cata assurée.
Inutile donc de mettre en mémoire.

chaque pcf a deux ports 0à7 et 10 à 17, image de b0 et b1 par exemple. b0 va être l'image des aguilles à commander à droite, et b1 l'image des aguilles à commander à gauche.
l'état de 8 aiguillages va être défini dans votre programme par un octets.
disons pos1_aiguil = %00101100
cad les aiguilles 1,2,5,7,8 à droite donc les autres à gauche.
pour commander vos aiguilles :
vous aurez b0 = pos1_aiguil donc %00101100
et b1 = not pos1_aiguil soit donc %11010011

et pour envoyer ça sous forme cadencée:

Code:
w1 = 1
do
  [COLOR="#FF0000"]w2[/COLOR] = w0 & w1
  hi2cout ([COLOR="#FF0000"]b0,b1[/COLOR])
  pause x
  w1 = w1 * 2   (ou bien  w1 <<1 sur X2)
loop until w1 = 0
Y a pas un schisme là ?

De plus, la sortie doit être temporisée pour éviter de cramer la bobine.
Pourquoi ne pas faire tout simplement :
Code:
  b1 =not b0
  hi2cout (b0,b1)
  pause 500
  hi2cout (0,0) ' ou 255,255 si on est en logique négative
 
Last edited:

PieM

Senior Member
Y a pas un schisme là ?

De plus, la sortie doit être temporisée pour éviter de cramer la bobine.
Pourquoi ne pas faire tout simplement :
Code:
  b1 =not b0
  hi2cout (b0,b1)
  pause 500
  hi2cout (0,0) ' ou 255,255 si on est en logique négative

effectivement c'est dans le cas présent hi2cout (b4,b5)
et il manque à la fin de la pause un hi2cout (0,0)
il y avait une pause (pause x) , et les bobines doivent être mises sous tension les unes après les autres. voir #514.
 
Last edited:

BESQUEUT

Senior Member
Ca ne sert à rien de parcourir les 16 bits, 8 suffisent
Code:
b2 = 1
do
  b3=b0 & b2
  [S]b4=not b3[/S]
  b4=not b0 & b2
  hi2cout (b3,b4)
  pause x
  b2 = b2* 2  
loop until b2 = 0
 hi2cout (0,0)  ' ou 255,255
NB: b1 n'est pas utilisé ; peut donc servir à autre chose ou bien tout décaler
 
Last edited:

PieM

Senior Member
Ca ne sert à rien de parcourir les 16 bits, 8 suffisent
moi je veux bien, mais je ne vois pas comment actionner qu'une seule bobine à la fois en envoyant sur 16 sorties 8 états et leurs compléments.
sur les 16 bits envoyés par HI2Cout un seul au maxi doit être au niveau haut.
 

PieM

Senior Member
@zeltron

en résumé:

vous avez pour vos aiguilles une variable qui définit l'état de 8 aiguilles
disons Aig_0_7 pour les 8 premières, Aig_8_15 pour les 8 suivantes, etc...

vous pouvez avoir de programmé un circuit qui va à l'avance définir chaque groupe Aig_xxx
sinon, pour activer une aiguille donnée dans un sens :

setbit Aig_0_7, 3 va mettre à 1 le bit 3 donc l'aiguille n°3 à droite (par exemple)
clearbit Aig_0_7, 5 va mettre à 0 le bit 5 donc l'aiguille n°5 à gauche (par exemple)

Cela sera suivi par la mise à jour:

Code:
[color=Purple]b2 [/color][color=DarkCyan]= [/color][color=Black]Aig_0_7  lsbyte de [/color][color=Purple]w1
b3[/color][color=DarkCyan]= not [/color][color=Black]Aig_0_7  msbyte de [/color][color=Purple]w1[/color]

[color=Black]var_temp [/color][color=DarkCyan]= [/color][color=Navy]1[/color]
[color=Blue]do
   [/color][color=Purple]w0 [/color][color=DarkCyan]=  [/color][color=Purple]w1 [/color][color=DarkCyan]& [/color][color=Black]var_temp   [/color][color=Green]'masque tous les bits sauf 1
   [/color][color=Blue]hi2cout [PLAIN][[/PLAIN][/color][color=Black]%0100xxx0[/color][color=Blue][PLAIN]][/PLAIN][/color][color=Black], [/color][color=Blue]([/color][color=Purple]b0[/color][color=Black],[/color][color=Purple]b1[/color][color=Blue])  [/color][color=Green]'(les xxx étant fonction du numéro du pcf lié aux entrées A0-A2)
   [/color][color=Blue]pause [/color][color=Navy]300 [/color][color=Green]'à définir
   [/color][color=Blue]hi2cout [PLAIN][[/PLAIN][/color][color=Black]%0100xxx0[/color][color=Blue][PLAIN]][/PLAIN][/color][color=Black], [/color][color=Blue]([/color][color=Navy]0[/color][color=Black],[/color][color=Navy]0[/color][color=Blue]) [/color][color=Green]'RAZ la bobine en cours
   [/color][color=Black]var_temp [/color][color=DarkCyan]= [/color][color=Black]var_temp [/color][color=DarkCyan]*[/color][color=Navy]2 [/color][color=Green]' decale à gauche le bit de masquage[/color]
[color=Blue]loop until [/color][color=Black]var_temp [/color][color=DarkCyan]= [/color][color=Navy]0[/color]
 

BESQUEUT

Senior Member
moi je veux bien, mais je ne vois pas comment actionner qu'une seule bobine à la fois en envoyant sur 16 sorties 8 états et leurs compléments.
sur les 16 bits envoyés par HI2Cout un seul au maxi doit être au niveau haut.
J'étais en train de proposer un code : voir # 523
(A moins qu'il n'y ait une utilité particulière à envoyer deux fois les mêmes commandes ?)
 
Last edited:

zeltron

Senior Member
ok merci je n'ai pas suivi vos conversations car j'étais à l'exterieur
j'ai 8 posts à décortiquer :D
vais étudier tout ça tranquillement
finalement ce n'est pas si facile cette histoire
#520 pour moi le câblage n'a jamais posé de problême en générale avec moi ça marche du 1er coup
par contre avec le soft alors là c'est pas le même fromage....
c'est trés formateur et je m'éclate malgré que je vous suis avec des brouettes de retard
 

PieM

Senior Member
#520 pour moi le câblage n'a jamais posé de problème en générale avec moi ça marche du 1er coup
mais je n'en ai jamais douté ! :rolleyes:

Ce qu'il faudrait, c'est savoir comment vous allez conduire votre circuit :
- ce sont des circuits préprogrammé
- des circuits configurés à la demande
- les deux
y aura t-il des contrôles de cohérence sur la position des aiguilles ?
 

zeltron

Senior Member
mais je n'en ai jamais douté ! :rolleyes:

Ce qu'il faudrait, c'est savoir comment vous allez conduire votre circuit :
- ce sont des circuits préprogrammé
- des circuits configurés à la demande
- les deux
y aura t-il des contrôles de cohérence sur la position des aiguilles ?
j'ai les mollets gonflés à bloc:D

vi les deux


c'est pour cela que je pense utiliser 2 picaxes
un pour les commandes voies de grande lignes avec la gestion d'un picaxe (manu et auto dirons nous) à venir
avec 2 alims pwm
mais ayant tous les sous programme au point ça devrai être plus facile

le second picaxe en place va gérer les 5 aiguillages du dépot, le pont, la commutation des voies de garage autour du pont et du dépot
une alim pwm en séquentiel, tout cela uniquement en manu
ca c'est pratiquement fait

je ne vois aucune utilitées que ces 2 picaxes communique entre eux

par contre je me pose encore cette question sans réponse
un ou 2 afficheurs, un ou 2 claviers
ça peut paraitre dingue en 1er reflexion de doubler l'ensemble mais pas tant que ça
c'est plus simple point de vue programmation tout est fait et ça marche bien
c'est moins lourd pour les menus,
c'est simultané sans lapin de garenne (je cours pas assez vite pour l'attraper)
ce n'est pas tres cher
les grands réseaux utilisent plusieurs tco celui ci etant en ech z ne fait pas grand mais comporte un nb de composants identiques aux grands
avec un chaussepied ça devrait rentrer

le seul truc c'est que ce n'est pas pro mais ça cela ne rentre pas en compte alors
cette solution me botte...

oui controle et commande de cohérence
exemple
si l'on dévie en manu (a l'aide de son numero) un aiguillage vers une voies secondaire,
il faut que l'aiguillage au bout de cette voie qui retourne sur la voie principale, soit aussi dévié en auto

mais toute commande aiguillage est en boucle ouverte il n'y a aucun retour info possible de la position du dit aiguillage
 
Last edited:

PieM

Senior Member
je ne vois aucune utilitées que ces 2 picaxes communique entre eux

par contre je me pose encore cette question sans réponse
un ou 2 afficheurs, un ou 2 claviers

oui controle et commande de cohérence
exemple
si l'on dévie en manu (a l'aide de son numero) un aiguillage vers une voies secondaire,
il faut que l'aiguillage au bout de cette voie qui retourne sur la voie principale, soit aussi dévié en auto

mais toute commande aiguillage est en boucle ouverte il n'y a aucun retour info possible de la position du dit aiguillage
De toute façon, si besoin les deux picaxes pourront toujours communiquer ensuite.

2 claviers ? a moins de faire du piano à deux mains, il est possible de commuter le clavier vers un picaxe ou un autre... ce n'est qu'une question de soft, la sortie ana du clavier pouvant aller sur plusieurs picaxes ...

par contre au niveau afficheur je pense qu'un 2 lignes est un peu restreint vu le nombre d'infos à afficher (à définir, hein ?)

En fait le contrôle de cohérence comme on a pas de feedback, sera une mise en cohérence: l'action manuelle sur une aiguille va entraîner la mise en position de sa copine après message et validation, non ? Enfin c'est une idée.
 

BESQUEUT

Senior Member
mais toute commande aiguillage est en boucle ouverte il n'y a aucun retour info possible de la position du dit aiguillage
Si l'on suppose :
1) Que les aiguilles sont mises dans une position connue au démarrage du programme,
2) que l'on s'interdit de manoeuvrer les aiguilles autrement que via le programme,
alors le programme sait à tout moment quelles sont les positions de chaque aiguille, (et il n'y a besoin que d'un seul bit par aiguille)
Il me semble assez logique au démarrage de reprendre la dernière position connue, donc je verrai assez bien ça en EEPROM.
Mais comme suggéré par PieM, on peut avoir plusieurs configurations pré-définies, et dans ce cas, il suffit de savoir laquelle doit être appliquée au démarrage.

Les "sécurités" et autres "cohérences" doivent être mises en oeuvre au moment de la commande d'une aiguille :
- si l'aiguille X est mise en position A alors les aiguilles Y, Z,... doivent être en positions ...
- si l'aiguille X est mise en position B alors les aiguilles Y, Z, K, T, ... doivent être en positions ...
 

zeltron

Senior Member
ok avec tout ça!
sauf ça
Il me semble assez logique au démarrage de reprendre la dernière position connue, donc je verrai assez bien ça en EEPROM.
c'est logique mais comme les aiguillages sont équipés de levier mecanique de chgt de position ils peuvent avoir été déplacées
entre 2 démarrages donc ce n'est pas viable
 

BESQUEUT

Senior Member
ok avec tout ça!
sauf ça
Il me semble assez logique au démarrage de reprendre la dernière position connue, donc je verrai assez bien ça en EEPROM.
c'est logique mais comme les aiguillages sont équipés de levier mecanique de chgt de position ils peuvent avoir été déplacées
entre 2 démarrages donc ce n'est pas viable
Ben si justement : si on ne déplace pas les aiguilles à la main tant que le programme tourne, on a une situation cohérente en mémoire.
En supposant que les aiguilles aient été modifiées hors programme, le prochain démarrage remettra les choses dans l'ordre.
 

dje8269

Senior Member
ils peuvent avoir été déplacées entre 2 démarrages donc ce n'est pas viable
Donc il te faut absolument une initialisation au démarrage ;

C'est comme si qqun tournait le pont quand celui ci est arreté . il aurait fallu absolument une initialisation a chaque demarrage .

Pour moi c'est le plus simple et le plus sur ;
Tu met tout a zero au demarrage ; et tu lis la derniere position enregistrer en EEprom, et tu l'applique
 

alainav1

Senior Member
bonjour,

reprendre la dernière position connue, donc je verrai assez bien ça en EEPROM.
si ça peut vous etre utile ?
j'ai fait un tco de commande avec des interupteurs
ils sont lus a chaque mise sous tension donc pas besoin d'eproom
le TCO de commande emet de l'infarouge pour afficher le circuit sur un TCO de visualisation et pour commander les aiguillages
j'ai fait cette video
https://www.youtube.com/watch?v=ZCO4-dhbek8
depuis j'ai ajouté une commande de vitesse et sens de train aussi en infrarouge
c'est fait avec des pic16f690 mais je vais reprogrammer en picaxe 20m2 car c'est pus facile en picaxe pour les membres du club qui debutent en programmation

cordialement
Alain
 

BESQUEUT

Senior Member
Donc il te faut absolument une initialisation au démarrage ;

C'est comme si qqun tournait le pont quand celui ci est arreté . il aurait fallu absolument une initialisation a chaque demarrage .

Pour moi c'est le plus simple et le plus sur ;
Tu met tout a zero au demarrage ; et tu lis la derniere position enregistrer en EEprom, et tu l'applique
Pourquoi remettre à zéro pour changer juste après ?
Au démarrage on remet dans le dernier état connu c'est tout. (Mais c'est peu être trop simple ?)
 

zeltron

Senior Member
sympathique cette vidéo
mais le materiel est déjà consequent alors qu il n'y a que 2 aiguillages
avec 20...
les voies sont fabriquées maison j'ai l'impression?

@Piem
si les 2 picaxes attendent en même temps une saisie clavier
comment un seul clavier monté en // sur 2 picaxes peut marcher?

Au démarrage on remet dans le dernier état connu c'est tout. (Mais c'est peu être trop simple ?)
oui c'est bien mais
je ne trouve pas ça simple mais trop compliqué pour moi, point de vue soft je n'ose même pas imaginer un code pareil !
 
Last edited:

dje8269

Senior Member
Pourquoi remettre à zéro pour changer juste après ?
Au démarrage on remet dans le dernier état connu c'est tout. (Mais c'est peu être trop simple ?
Pour connaître sans risque d'erreur les positions. Car si on touche manuellement , le logiciel peut ne plus savoir comment est l aiguillage ?

En même temps c'est du tout ou rien , donc vous avez raison, suffit de remettre les deux bêtes et forcément, les positions seront bonnes.
J'ai rien dis !

je ne trouve pas ça simple mais trop compliqué pour moi, point de vue soft je n'ose même pas imaginer un code pareil
Yop, Zeltron, non c'est pas trop compliqué, à chaque changement d'état, tu enregistre la valeur dans la mémoire Et promenade du picaxe. Ainsiste au démarrage, tu va recharger cette valeur . C'est deux lignes de code pas plus
 

zeltron

Senior Member
En même temps c'est du tout ou rien , donc vous avez raison, suffit de remettre les deux bêtes et forcément, les positions seront bonnes.
J'ai rien dis !
vi si un aiguillage en position gauche reçois la commande gauche il ne se passe rien du moins pendant une seconde
si plus ben ça sent la tsf :D:mad:
 

alainav1

Senior Member
ppour repondre à

"mais le materiel est déjà consequent alors qu il n'y a que 2 aiguillages
avec 20..."

c'est une demo pour monter les differente type de commande


pour 15 aiguillages 1 picaxe 20m2 (equipé d'un tsop ) et 15 servo sur le circuit
un tsop recoit l'info code et suivant celui ci il commande les 15 servos


idem pour le TCO (15 interrupteurs 15 interrupteurs une led infrarouge precedé d'un transistor)

pour plus d'aiguillage un piaxe à 40 boche ou deux 20m2



"les voies sont fabriquées maison j'ai l'impression?"
tout a fait
bonne soirée
 

zeltron

Senior Member
me revoila
mon programme avance bien, il marche bien, il s'allonge de jour en jour
mais y'a un truc que je n'arrive pas a faire
alors que j'arrive bien a memoriser l'état 1 ou 2 (droit ou gauche d'un aiguillage) quand il est commandé en manu par mon sous programme
je ne sais pas comment demander la memorisation de tout les aiguillages à droite dans le menu initialisation des aiguillages
voici le code en particulier
Code:
		dat=1
			for boucle = 1 to 6 'boucle pour commander sequentiellement
			dat=dat<<1+bit6 ' les 6 aiguillages commande a droite
			w21=not dat
			hi2cout [%01000000], (b42,b43) 
			pause pause_aig
			next boucle
			
			let dat = 65535 'remet ? 0 tous les aiguillages
			hi2cout [%01000000], (b44,b45) 'envoie du reset aiguillage
			pause pause_aig
			
	'		Etat_aig=1
			
	'		write  L_aiguille,Etat_Aig
			
			serout B.7,N2400_16,(254,128,"AIGUILS A DROITE")	
			serout B.7,N2400_16,(254,192,"      Merci     ")
			PAUSE 4000
et voici l'ensemble du programme
View attachment prog.txt
 

PieM

Senior Member
Je crois que vous êtes parti sur un système qu'il va être difficile d'étendre dès que vous allez dépasser 8 aiguillages, car il va falloir gérer à chaque fois un programme différents avec des adresses I2C.
Si vous avez 25 aiguillages et si vous voulez mémoriser en plus plusieurs circuits prédéfinis, ça va faire du monde !

Un groupe de 8 aiguillage est représenté par une simple variable byte (par exemple : Gr_Aig_1, Gr_Aig_2, etc ). Soit une aiguille est à 1 soit à 0 selon son sens. En outre, à chaque variable de groupe peut être affecté automatiquement l'adresse I2C.
C'est pour cela que je vous disais que pour mettre une l'aiguille N°5 à 1 il suffit d'écrire setbit Gr_Aig_1, 5. Et pour la mettre à 0 cleatbit Gr_Aig_1, 5

Mémoriser l'état de vos aiguilles consistait donc à ne mémoriser qu'un seul byte par groupe de 8 aiguillages.
et il est un peu dommage de mémoriser systématiquement tout changement dans l'EEPROM. Pourquoi ne pas le faire qu'en fin de session ? en cas de coupure d'alim, ce n'est pas dramatique de remettre une config donnée...
 

zeltron

Senior Member
j'ai testé votre idée de setbit Gr_Aig_1, 5.
mais ça ne marche pas ou alors je me suis mal pris
la commande des aiguillages étant inversé setbit Gr_Aig_1, 5. eteint la bobine 5
et les autres metrons en surcharge les buffers inverseurs
je n'ai pas réucis à utiliser cette commande ni l'inverse clearbit qui alimente tous sauf 5
 

PieM

Senior Member
la commande des aiguillages étant inversé setbit Gr_Aig_1, 5. eteint la bobine 5
Pour commander une bobine d'aiguillage, vous devez bien mettre l'entrée de l'uln à 1, donc la sortie du pcf à 1 , non ?
Gr_Aig_xx représente l'état de chaque aiguille mais n'est pas ce qu'il faut envoyer par la commande hi2c . Sinon vous actionnez systématiquement toutes les bobines déjà dans le bon sens.

si c'est inversé alors il suffit de faire:

dat = $FFFF 'tout à 1
cleartbit dat, 5 met la bobine 5 à droite (ou à gauche) 'pour changer de sens : cleartbit dat, 15
hi2cout [%01000000], (b42,b43)
pause pause_aig
hi2cout [%01000000], ($FF,$FF)
 
Last edited:

zeltron

Senior Member
Pour commander une bobine d'aiguillage, vous devez bien mettre l'entrée de l'uln à 1, donc la sortie du pcf à 1 , non ?
non... c'est l'inverse
mais ce n'est pas grave je vais inverser le hard s'il faut car par le soft c'est un peu prise de tête

ok je vais tester votre methode
 

PieM

Senior Member
non... c'est l'inverse
mais ce n'est pas grave je vais inverser le hard s'il faut car par le soft c'est un peu prise de tête
Non surtout pas, c'est plus facile d'adapter le soft plutôt que d'inverser le signal par hard !

Donc le 0 est actif pour actionner une bobine. C'est facile...
En outre, a la mise sous tension les sorties sont à l'état haut sur le pcf je crois.
Combien d'aiguillages aurez vous à gérer en final ?
 

PieM

Senior Member
vi 42 bobines

et pour les leds j'en compte 80 sur le synoptique :eek:
Ben ça fait du monde !

vous avez droit à 8 pcf8575 sur le même bus soit 8*16 = 128 entrées/sorties
il est possible de rajouter des pcf8574A qui ont une adresse différente mais sont en 8 bits . ce qui fait 64 entrées sorties possibles en plus sur le même bus.

Tout cela pour dire qu'il faut dès maintenant une solution permettant de commander n'importe quelle sortie (ou lire n'importe quelle entrée) avec une syntaxe simple du type:

act_aiguille (n°, sens)
ou
act_led (n°, état)

sans avoir à se casser la tête à chercher : l'adresse du bon pcf, quel bit mettre à 1 ou à 0, actualiser le byte représentatif de l'état d'un groupe d'aiguilles, actualiser l'allumage ou l'extinction d'une led, et memoriser en eEprom (si souhaité.)

Comme déjà dit, il est important de savoir à tout moment l'état de vos aiguillages (pour les leds c'est inutile)
cet état pour 8 est contenu dans un byte.
il faut convenir qu'un bit à 1 est la position droite et un bit 0 est la gauche. Par exemple.
Si le contenu de ce byte est utile pour mettre à jour la totalité des aiguilles comme vu avec le programme de chenillard, (cas du circuit prédéfini) il n'est pas question d'utiliser ça pour actionner un aiguillage. Sinon toute cde va se traduire par l'activation en séquence de toutes les 16 sorties, y compris donc celles qui sont déjà dans le bon état.

Donc à mon avis, une commande d'un aiguillage doit donc se traduire par
1- la mise à 0 de l'unique sortie du bon pcf
2 -la mise à jour du byte d'état correspondant
et cerise, l'allumage ou non de /des leds correspondantes.

Si vous êtes partant, je vous propose une solution de principe avec une aide pour le petit s/prog ou macro lié
 

zeltron

Senior Member
j'ai testé votre code en #549 ça marche trés bien je vais l'adopter
surtout si c'est plus facile pour la suite !
merci
 

zeltron

Senior Member
Si vous êtes partant, je vous propose une solution de principe avec une aide pour le petit s/prog ou macro lié
nos messages se sont téléscopé
bien sur je suis partant et je ne demande qu'à apprendre
un grand merci!
 

PieM

Senior Member
déjà il faut determiner quel est le pcf qui correspond à l'aiguille N, et sur ce pcf qu'elle est la bonne valeur à activer.

si vos aiguillages sont numérotés de 1 à 21 on peut savoir par N/8 quel est le pcf concerné:
si N=5 N/8 = 0 donc ce sera le pcf ayant 0 pour adresse complémentaire (les 3 bits A0...A2) donc %01000000
si N= 20 N/8 = 2 donc ce sera le pcf ayant 2 pour adresse complémentaire (donc %01000100)

en parallèle la fonction modulo va dire quelle est la sortie sur ce pcf
si N=5, N//8 = 5 donc 5eme sortie du pcf1
si N=20, N//8 = 4 donc 4eme sortie du pcf2

l'adresse du pcf est très simple à calculer automatiquement.
on sait qu'elle est %0100xxx0
de fait l'adresse réelle de base est %0100000 soit $20 auquel picaxe demande de rajouter systématiquement un 0 en lsb.
nos adresses complémentaires seront donc simplement à ajouter à cette adresse $20, puis pour faire plaisir à picaxe on ajoute le 0 en décalant à gauche le byte adresse.

l'adresse sera adr_pcf = N/8 + $20 <<1 (ou *2 si on a un M2)
et le numéro de broche sera N//8

à suivre...
 
Top