​ ​ ​ ​ synchroniser 4 aiguillages en utilisant un picaxe 18m2
Results 1 to 5 of 5

Thread: synchroniser 4 aiguillages en utilisant un picaxe 18m2

  1. #1
    Member
    Join Date
    Nov 2011
    Location
    Arles,France
    Posts
    45

    Default synchroniser 4 aiguillages en utilisant un picaxe 18m2

    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

  2. #2
    Senior Member
    Join Date
    Jan 2010
    Location
    34 France
    Posts
    3,767

    Default

    Quote Originally Posted by cemoa View Post
    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.
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème . (Les Shadoks)

  3. #3
    Member
    Join Date
    Nov 2011
    Location
    Arles,France
    Posts
    45

    Default

    Quote Originally Posted by PieM View Post
    ç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

    SchemaAiguillages.pdf
    Last edited by cemoa; 28-03-2017 at 09:41. Reason: pièces non jointes

  4. #4
    Senior Member
    Join Date
    Jan 2010
    Location
    34 France
    Posts
    3,767

    Default

    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.
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème . (Les Shadoks)

  5. #5
    Member
    Join Date
    Nov 2011
    Location
    Arles,France
    Posts
    45

    Default 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
    AlimCantonsA1_A16.DSN

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •