synchroniser 4 aiguillages en utilisant un picaxe 18m2

cemoa

Member
bonjour à la communauté,

Pour synchroniser 4 aiguillages j'ai utilisé un picaxe 18m2, avec 4 capteurs de position. le programme fonctionne très bien à condition de mettre les 4 sorties au niveau bas et écrire "reset" pour relancer le programme en fin de boucle. Ceci est-il conforme ou y a t'il une meilleure écriture de ce programme?

Merci, bonne journée
JCD
Code:
#picaxe 18m2
#no_data
symbol ac11=pinc.1 	'capteur position a11
symbol ac12=pinc.7	'capteur position a12
symbol ac13=pinb.7	'capteur position a13
symbol ac14=pinb.5	'capteur position a14

symbol a11=pinc.0		'touche aiguillage a11
symbol a12=pinc.6		'touche aiguillage a12
symbol a13=pinb.6		'touche aiguillage a13
symbol a14=pinb.4		'touche aiguillage a14

symbol cde11=b.0		'command aiguillage a11
symbol cde12=b.1		'command aiguillage a12
symbol cde13=b.3		'command aiguillage a13
symbol cde14=b.2		'command aiguillage a14

symbol ac11_p=b2		'position aiguillage a11
symbol ac12_p=b3		'position aiguillage a12
symbol ac13_p=b4		'position aiguillage a13
symbol ac14_p=b5		'position aiguillage a14

symbol a11_t=b6		'touche aiguillage a11
symbol a12_t=b7		'touche aiguillage a12
symbol a13_t=b8		'touche aiguillage a13
symbol a14_t=b9		'touche aiguillage a14	

do	
low cde11:low cde12:low cde13:low cde14

'position aiguillage a11
	if ac11=1 then
		ac11_p=1:a11_t=1
		'	sertxd("11 - capteur position = ",#ac11_p," - touche aiguillage = ",#a11_t,cr,lf)	

elseif ac11=0  then		
				ac11_p=0:a11_t=0
				'	sertxd("11/2 - capteur position = ",#ac11_p," - touche aiguillage = ",#a11_t,cr,lf,cr,lf)	
end if
'position aiguillage a12
if ac12=1 then
	ac12_p=1:a12_t=1
				'	sertxd("12 - capteur position = ",#ac12_p," - touche aiguillage = ",#a12_t,cr,lf)
					elseif ac12=0 then
						ac12_p=0: a12_t=0
				'	sertxd("12/2 - capteur position = ",#ac12_p," - touche aiguillage = ",#a12_t,cr,lf,cr,lf)						
				end if
'position aiguillage a13				
if ac13=1 then
	ac13_p=1:a13_t=1
					'sertxd("13 - capteur position = ",#ac13_p," - touche aiguillage = ",#a13_t,cr,lf)
					elseif ac13=0 then
						ac13_p=0: a13_t=0
					'sertxd("13/2 - capteur position = ",#ac13_p," - touche aiguillage = ",#a13_t,cr,lf,cr,lf)						
			end if
'position aiguillage a14			
if ac14=1 then
	ac14_p=1:a14_t=1
					'sertxd("14 - capteur position = ",#ac14_p," - touche aiguillage = ",#a14_t,cr,lf)
				elseif ac14=0 then
						ac14_p=0: a14_t=0
					'sertxd("14/2 - capteur position = ",#ac14_p," - touche aiguillage = ",#a14_t,cr,lf,cr,lf)						
end if	

	'trajet a13-------->a12
if a13=0 and ac13_p=1 and ac12_p=1 then
	toggle cde12
	elseif a13=1 and ac13_p=0 and ac12_p=0 then
		toggle cde12	
end if

	'trajet a12-------->a13
if a12=1 and ac12_p=0 and ac13_p=0 then
	toggle cde13
	elseif a12=0 and ac12_p=1 and ac13_p=1 then
		toggle cde13
end if

	'trajet a13-------->a11
if a13=1 and ac13_p=0 and ac11_p=0 then
	toggle cde11
	elseif a13=0 and ac13_p=1 and ac11_p=1 then
		toggle cde11
		end if

	'trajet a11-------->a13
if a11=1 and ac11_p=0 and ac13_p=1 then
	toggle cde13
	elseif a11=0 and ac11_p=1 and ac13_p=0 then
		toggle cde13
end if

	'trajet a12-------->a14
if a12=1 and ac12_p=1 and ac14_p=1 then
	toggle cde14
	elseif a12=0 and ac12_p=0 and ac14_p=0 then
		toggle cde14
	end if
	
	'trajet a14-------->a12
	if a14=0 and ac14_p=1 and ac12_p=0 then
		toggle cde12
		elseif a14=1 and ac14_p=0 and ac12_p=1 then
			toggle cde12
			end if
	
	loop
	reset
 

PieM

Senior Member
bonjour à la communauté,

Pour synchroniser 4 aiguillages j'ai utilisé un picaxe 18m2, avec 4 capteurs de position. le programme fonctionne très bien à condition de mettre les 4 sorties au niveau bas et écrire "reset" pour relancer le programme en fin de boucle. Ceci est-il conforme ou y a t'il une meilleure écriture de ce programme?

Merci, bonne journée
JCD
Code:
#picaxe 18m2
#no_data
symbol ac11=pinc.1     'capteur position a11
symbol ac12=pinc.7    'capteur position a12
symbol ac13=pinb.7    'capteur position a13
symbol ac14=pinb.5    'capteur position a14

symbol a11=pinc.0        'touche aiguillage a11
symbol a12=pinc.6        'touche aiguillage a12
symbol a13=pinb.6        'touche aiguillage a13
symbol a14=pinb.4        'touche aiguillage a14

symbol cde11=b.0        'command aiguillage a11
symbol cde12=b.1        'command aiguillage a12
symbol cde13=b.3        'command aiguillage a13
symbol cde14=b.2        'command aiguillage a14

symbol ac11_p=b2        'position aiguillage a11
symbol ac12_p=b3        'position aiguillage a12
symbol ac13_p=b4        'position aiguillage a13
symbol ac14_p=b5        'position aiguillage a14

symbol a11_t=b6        'touche aiguillage a11
symbol a12_t=b7        'touche aiguillage a12
symbol a13_t=b8        'touche aiguillage a13
symbol a14_t=b9        'touche aiguillage a14    

do    
low cde11:low cde12:low cde13:low cde14

'position aiguillage a11
    if ac11=1 then
        ac11_p=1:a11_t=1
        '    sertxd("11 - capteur position = ",#ac11_p," - touche aiguillage = ",#a11_t,cr,lf)    

elseif ac11=0  then        
                ac11_p=0:a11_t=0
                '    sertxd("11/2 - capteur position = ",#ac11_p," - touche aiguillage = ",#a11_t,cr,lf,cr,lf)    
end if
'position aiguillage a12
if ac12=1 then
    ac12_p=1:a12_t=1
                '    sertxd("12 - capteur position = ",#ac12_p," - touche aiguillage = ",#a12_t,cr,lf)
                    elseif ac12=0 then
                        ac12_p=0: a12_t=0
                '    sertxd("12/2 - capteur position = ",#ac12_p," - touche aiguillage = ",#a12_t,cr,lf,cr,lf)                        
                end if
'position aiguillage a13                
if ac13=1 then
    ac13_p=1:a13_t=1
                    'sertxd("13 - capteur position = ",#ac13_p," - touche aiguillage = ",#a13_t,cr,lf)
                    elseif ac13=0 then
                        ac13_p=0: a13_t=0
                    'sertxd("13/2 - capteur position = ",#ac13_p," - touche aiguillage = ",#a13_t,cr,lf,cr,lf)                        
            end if
'position aiguillage a14            
if ac14=1 then
    ac14_p=1:a14_t=1
                    'sertxd("14 - capteur position = ",#ac14_p," - touche aiguillage = ",#a14_t,cr,lf)
                elseif ac14=0 then
                        ac14_p=0: a14_t=0
                    'sertxd("14/2 - capteur position = ",#ac14_p," - touche aiguillage = ",#a14_t,cr,lf,cr,lf)                        
end if    

    'trajet a13-------->a12
if a13=0 and ac13_p=1 and ac12_p=1 then
    toggle cde12
    elseif a13=1 and ac13_p=0 and ac12_p=0 then
        toggle cde12    
end if

    'trajet a12-------->a13
if a12=1 and ac12_p=0 and ac13_p=0 then
    toggle cde13
    elseif a12=0 and ac12_p=1 and ac13_p=1 then
        toggle cde13
end if

    'trajet a13-------->a11
if a13=1 and ac13_p=0 and ac11_p=0 then
    toggle cde11
    elseif a13=0 and ac13_p=1 and ac11_p=1 then
        toggle cde11
        end if

    'trajet a11-------->a13
if a11=1 and ac11_p=0 and ac13_p=1 then
    toggle cde13
    elseif a11=0 and ac11_p=1 and ac13_p=0 then
        toggle cde13
end if

    'trajet a12-------->a14
if a12=1 and ac12_p=1 and ac14_p=1 then
    toggle cde14
    elseif a12=0 and ac12_p=0 and ac14_p=0 then
        toggle cde14
    end if
    
    'trajet a14-------->a12
    if a14=0 and ac14_p=1 and ac12_p=0 then
        toggle cde12
        elseif a14=1 and ac14_p=0 and ac12_p=1 then
            toggle cde12
            end if
    
    loop
    reset
ça serait mieux de savoir en quoi consiste ce programme !

Quel intérêt de définir une variable byte qui est l'état d'une entrée ?
il suffit d'utiliser pinsX à condition d'utiliser les ports avec plus de logique.
 

cemoa

Member
ça serait mieux de savoir en quoi consiste ce programme !

Quel intérêt de définir une variable byte qui est l'état d'une entrée ?
il suffit d'utiliser pinsX à condition d'utiliser les ports avec plus de logique.
Bonjour Piem,
Je vais essayer d'expliquer ce programme.
- les 4 aiguillages permettent aux convois d'accéder à une gare
- 1 voie montante et une voie descendante dirigent un convoi sur un quai
-si un quai est occupé par un convoi, le train arrivant devra être dirigé vers un quai libre
-si le 3ème quai est occupé par un train, il doit pouvoir repartir sur une voie libre
-pour cela les 4 aiguillages devront être commandés simultanément dit selon un terme ferroviaire en "aiguilles composées", ce principe permet la mise en sécurité des voies
-donc si le quai 1 est occupé, le train arrivant sera dirigé sur le quai 2, pour cela les aiguilles a11 et a13 seront commandées ainsi que les aiguilles a12 et a14 pour laisser repartir le train stationné sur le quai 3.
J'ai donc équipé chaque aiguillage d'un capteur de position d'aiguille (MicroRupteur commandé mécaniquement par l'aiguille)
j'espère que mon explication est suffisante et pas trop confuse!

Pourquoi j'ai utilisé une variable de type byte plutôt que pinsX, j'ai pensé que je risquais d'avoir besoin de ces variables pour un traitement ultérieur des informations, transmissions de données par exemple. C'est vrai que pour le moment je ne sais pas ce que je vais en faire!

Bonne journée
IMG_0748 (Copier).JPG

View attachment SchemaAiguillages.pdf
 
Last edited:

PieM

Senior Member
la variable byte n'ayant que deux valeurs 1 ou 0, l'intérêt est limité!

en outre ecrire :

Code:
'position aiguillage a11
    if ac11=1 then
        ac11_p=1:a11_t=1
        '    sertxd("11 - capteur position = ",#ac11_p," - touche aiguillage = ",#a11_t,cr,lf)    

elseif ac11=0  then        
                ac11_p=0:a11_t=0
                '    sertxd("11/2 - capteur position = ",#ac11_p," - touche aiguillage = ",#a11_t,cr,lf,cr,lf)    
end if
'position aiguillage a12
if ac12=1 then
    ac12_p=1:a12_t=1
                '    sertxd("12 - capteur position = ",#ac12_p," - touche aiguillage = ",#a12_t,cr,lf)
                    elseif ac12=0 then
                        ac12_p=0: a12_t=0
                '    sertxd("12/2 - capteur position = ",#ac12_p," - touche aiguillage = ",#a12_t,cr,lf,cr,lf)                        
                end if
'position aiguillage a13                
if ac13=1 then
    ac13_p=1:a13_t=1
                    'sertxd("13 - capteur position = ",#ac13_p," - touche aiguillage = ",#a13_t,cr,lf)
                    elseif ac13=0 then
                        ac13_p=0: a13_t=0
                    'sertxd("13/2 - capteur position = ",#ac13_p," - touche aiguillage = ",#a13_t,cr,lf,cr,lf)                        
            end if
'position aiguillage a14            
if ac14=1 then
    ac14_p=1:a14_t=1
                    'sertxd("14 - capteur position = ",#ac14_p," - touche aiguillage = ",#a14_t,cr,lf)
                elseif ac14=0 then
                        ac14_p=0: a14_t=0
                    'sertxd("14/2 - capteur position = ",#ac14_p," - touche aiguillage = ",#a14_t,cr,lf,cr,lf)                        
end if
c'est en fait dire:

Code:
ac11_p= pinC.1 1:a11_t= pinC.1
ac12_p= pinC.2 1:a12_t= pinC.2
ac13_p= pinC.3 1:a11_t= pinC.3
ac14_p= pinC.4 1:a11_t= pinC.4

sertxd("entete"," - capteur position = ",#ac11_p," - touche aiguillage = ",#a11_t,cr,lf,cr,lf)
sertxd("entete"," - capteur position = ",#ac12_p," - touche aiguillage = ",#a12_t,cr,lf,cr,lf)
sertxd("entete"," - capteur position = ",#ac13_p," - touche aiguillage = ",#a13_t,cr,lf,cr,lf)
sertxd("entete"," - capteur position = ",#ac14_p," - touche aiguillage = ",#a14_t,cr,lf,cr,lf)
en définissant entete en fonction de l'état
Et utiliser de façon homogène les ports B et C c'est simplifier la suite...
Un trajet se réduit à ecrire un byte sur un port de sortie.
 

cemoa

Member
et maintenant j'ai besoin de gérer 16 cantons avec un picaxe 20x2

Bonjour Piem,
Je vous remercie pour tous vos très bons conseils, ils me permettent d'avancer mon projet.

Maintenant j'ai besoin de gérer au moins 12 cantons pour le moment. Donc j'utilise encore un 20X2 et des PCF8574A. J'ai repris le programme du clavier 16 touches que j'ai modifié pour gérer 16 entrée/sorties. Le truc fonctionne très bien pour 8 entrées sorties, mais pour 16, je ne comprends pas ce qu'il faut faire pour utiliser le 2ème PCF8574A pour passer à 16 entrées/sorties.
Pourriez vous m'aider pour comprendre le fonctionnement avec 2 pcf 8574
Par avance merci.

Code pour 8 entrées/sorties.
Code:
#picaxe 20x2
#no_data
Symbol io_adr = $70	'I2C addresse du 1er PCF8574AP en ecriture
Symbol io_adr2 = $72'I2C addresse du 2eme PCF8574AP en lecture
Symbol io_adr3 = $77	'i2c addresse du 3eme pcf8574ap en lecture
symbol io_adr4 = $79	'i2c addresse du 4eme pcf8574ap en lecture

symbol flag=bit0
symbol cpt=b1
symbol poidsfaible = b2
symbol num_capteur = b3
symbol octetlu = b4
symbol var_temp=b5
symbol temp = b9
symbol capteurmini=b10
symbol capteurmaxi=b11
symbol capteur=b12

hi2csetup i2cmaster, io_adr,i2cfast,i2cbyte 'addresse du 1er pcf8574ap en ecriture

		hi2cout [io_adr],(%11111111)
		hi2cout [io_adr2],(%11111111)
		hi2cout [io_adr3],(%00000000)
		hi2cout [io_adr4],(%00000000)	
		
num_capteur=255
capteurmini=0:capteurmaxi=16
'capteur=0

num_capteur=255
capteurmini=0:capteurmaxi=16 '--->8

gosub lectouche	

			sertxd("num capteur : ",#num_capteur,13,1)
var_temp =num_capteur  '-1 // 8   ; var_temp devient 0 ? 7
var_temp = dcd var_temp      ; met le bit n? (var_temp) ? 1  

if num_capteur <9 then : hi2cout [io_adr3],(var_temp)
  elseif num_capteur <17 then : hi2cout [io_adr4],(var_temp)

endif
pause 200             
reset

lectouche:
	do	
		poidsfaible=%00000000	;init ? xxxx0001	
		for cpt=1 to 8	;scann sur bits poids faible
			pause 20

			temp=not poidsfaible  or %00000000  ;
		hi2cout [io_adr],(temp)	;envoi octet

			pause 20
		hi2cin [io_adr],(octetlu)	;test sur retour octet	

			if octetlu <=254  and flag=0 and	octetlu <> temp then	;pins < 11111111 (255) c?d une touche appuyee, premier passage	
				pause 20
				lookdown octetlu,(254,253,251,247, 239,223,191,127),num_capteur	

	sertxd("temp: ",#temp,"octet lu: ",#octetlu,"num capteur: ",#num_capteur,13,1)			
				flag=1
			elseif octetlu > 254 and flag=1  then	;relachement touche	
	pause 20
			flag=0
				if num_capteur <=capteurmaxi and num_capteur>=capteurmini then retour
pause 20
			endif
			poidsfaible=poidsfaible*2	;decalage du 0 a gauche (futur 1...)
next

	loop
retour:
	return
essai de code pour 16 entrées/sorties:
Code:
#picaxe 20x2
#no_data
symbol io_adr = $70	'i2c addresse du 1er pcf8574ap en ecriture
symbol io_adr2 = $72'i2c addresse du 2eme pcf8574ap en ecriture
symbol io_adr3 = $77	'i2c addresse du 3eme pcf8574ap en lecture
symbol io_adr4 = $79	'i2c addresse du 4eme pcf8574ap en lecture

symbol flag=bit0
symbol cpt=b1
symbol poidsfaible = b2
symbol num_capteur = b3
symbol octetlu = b4
symbol var_temp=b5
symbol temp = b9
symbol capteurmini=b10
symbol capteurmaxi=b11
symbol capteur=b12

hi2csetup i2cmaster, io_adr,i2cfast,i2cbyte 'addresse du 1er pcf8574ap en ecriture

		hi2cout [io_adr],(%11111111)
		hi2cout [io_adr2],(%11111111)
		hi2cout [io_adr3],(%00000000)
		hi2cout [io_adr4],(%00000000)	
		
num_capteur=255
capteurmini=0:capteurmaxi=16 '--->8

gosub lectouche	

			sertxd("num capteur : ",#num_capteur,13,1)
var_temp =num_capteur  '-1 // 8   ; var_temp devient 0 ? 7
var_temp = dcd var_temp      ; met le bit n? (var_temp) ? 1  

if num_capteur <9 then : hi2cout [io_adr3],(var_temp)
  elseif num_capteur <17 then : hi2cout [io_adr4],(var_temp)

endif
pause 200             
reset
lectouche:
	do	
		poidsfaible=%00000000	;init ? xxxx0001	
		for cpt=1 to 16	;scann sur bits poids faible
			pause 20

			temp=not poidsfaible  or %00000000  ;
			if cpt<9 then
		hi2cout [io_adr],(temp)	;envoi octet
		elseif cpt>8 then
			
		hi2cout [io_adr2],(temp)	;envoi octet			

			pause 20
		end if
		if cpt<9 then
		hi2cin [io_adr],(octetlu)	;test sur retour octet	
	elseif cpt>8 then
		hi2cin [io_adr2],(octetlu)	;test sur retour octet	
		end if
			if octetlu <=254  and flag=0 and	octetlu <> temp then	;pins < 11110000 (240) c?d une touche appuyee, premier passage	
				pause 20
				lookdown octetlu,(254,253,251,247,239,223,191,127,246,245,243,239,231,215,183,119),num_capteur	

	sertxd("temp: ",#temp,"octet lu: ",#octetlu,"num capteur: ",#num_capteur,13,1)			
				flag=1
			elseif octetlu > 254 and flag=1  then	;relachement touche	
	pause 20
			flag=0
				if num_capteur <=capteurmaxi and num_capteur>=capteurmini then retour
pause 20
		endif


next
	loop
retour:
	return
View attachment AlimCantonsA1_A16.DSN
 
Top