clavier 16 touches pour commander une quarantaine d'aiguillages et autres fonctions

cemoa

Member
Les diodes, on ne les utilise pas pour la simple matrice carrée (16touches/8bits)
Bonsoir zorgloub
Voilà pourquoi je t'ai posé la question" Clavier à Matrice carrée à diodes " en fait je savais bien que j'avais besoin des 2 yeux parce que j'ai pas fait Gaffe au titre "Clavier à Matrice carrée classique (16 touches pour 8 pins i/o)", et je me demandais pourquoi tu mettais des diodes sur ce type de clavier!!
enfin bref c'est peut-être l'âge!
 

PapyJP

Senior Member
Ma problématique actuelle est la commande d'une quarantaine d'aiguillages et autres comme éclairage, ....
Comme d' hab, je prends le train en marche et je n' ai pas lu les 80 messages. Et je souris car ça me fait souvenir qu' en 2012 j' avais proposé à un copain, féru de modélisme ferroviaire mais perdu dans les boutons et la filasse qui va avec, d' utiliser un Minitel comme unique poste de pilotage.
Comme il ne connaissait que le Basic, j' avais choisi Picaxe comme processeur pour dialoguer avec le Minitel et assurer les commandes E/S qui vont bien.

J' avais fait appel aux forumeurs pour programmer correctement le dialogue entre un Minitel et un Picaxe. C' était le début d' une grande aventure avec les Picaxes en Basic qui dure toujours ... J' en profite pour les remercier de leur infinie patience.

Un clavier complet + un écran ( 25 lignes, 40 colonnes en N&B )). C' est pas le rêve ?

Quelques euros en brocante, un simple cable DIN 5 broches entre le Minitel et le processeur, facile à programmer, des posssibilités de commande à l' infini, des messages en retour, des adaptations et mises à jour programmables, tout est possible.
On trouve sur la toile la notice complète ( hard et soft ).

C' est une solution efficace et élégante pour venir à bout de la ' problématique ' de cemoa.
On peut prévoir plusieurs Minitel + Picaxe ( ce qui a été fait pour séparer les fonctions )
Mais peut-être trouvera-t-il que cette solution est ringarde ?
 

cemoa

Member
Bonjour PapyJP
c'est très gentil de proposer cette solution, un peu vintage et je te remercie pour l'intérêt que tu portes à ce projet, surtout ne sois pas vexé, mais j'utilise un ordi de bureau avec écran plat pour communiquer avec la maquette. Et puis mon petit plaisir était d'apprendre à utiliser le bus I2C en écriture et lecture avec un Picaxe et des PCF8574, tout cela pour prouver à un neveu pas beaucoup plus jeune que moi, mais qui connaît tout ça, qu'à mon âge, j'ai encore toutes mes neurones et j'aime bien me prendre le chou!
Donc le clavier est en cours d'essais et ne va pas tarder à être mis en service, bien sur je:rolleyes::rolleyes: communiquerai à la communauté les résultats de ce projet.
Bonne journée
JCD
 

cemoa

Member
Réalisation du clavier 16 touches

bonjour à la communauté,
ci-joint une photo pour illustrer la réalisation du clavier 16 touches ainsi que le code utilisé pour les fonctions dont j'ai besoin, selon le code proposé par MGU et modifié à ma sauce. Certainement que cette réalisation n'est pas très académique ni qu'elle correspond à l'art et la tradition, mais elle fonctionne pour mes besoins et va me permettre de continuer d'installer tous les aiguillages et de les tester, ensuite je compléterai le programme en ajoutant la fonction annulation, composition de trajets, etc..
La carte mère est prévue pour accueillir 3 cartes de commande des sorties soit 62 sorties, ainsi que 2 cartes d'extension pour utiliser les entrées et sorties du PICAXE 20X2 disponibles pour le moment.
Les lignes "sertxd" servent surtout à visualiser le déroulement du programme, ils n'ont pas d'utlité pour mes besoins.
Merci à toute la communauté pour les conseils et remarques et particulièrement à MGU, son aide m'a permis d'apprende et comprendre le BUS I2C et l'utilisation des PCF8574 et 8574A.
Bonne soirée
JCD

DSCN0059.JPG

Code:
#picaxe 20x2
#no_data
Symbol IO_ADR = $40 'I2C address of 8574 all address line low
'Symbol IO_ADR = $70		'I2C address of 8574AP all address line low
Symbol IO_ADR2 = $71	'I2C addresse du 1er PCF8574AP en lecture
Symbol io_adr3 = $73	'i2c addresse du 2?me pcf8574ap en lecture
symbol io_adr4 = $75	'i2c addresse du 3?me pcf8574ap en lecture
symbol io_adr5 = $77	'i2c addresse du 4?me pcf8574ap en lecture
symbol io_adr6 = $79	'i2c addresse du 5?me pcf8574ap en lecture

symbol flag=bit0
symbol cpt=b1
symbol poidsfaible = b2
symbol Touche = b3
symbol octetlu = b4
symbol temp = b9
symbol nombre=b5
symbol classe=b6
symbol mini=b7
symbol maxi=b8
symbol unite=b10
symbol dizaine=b11
symbol equipement=b12
symbol cptouche1=b13
symbol cptouche2=b14
hi2csetup i2cmaster, io_adr,i2cfast,i2cbyte 'EEPROM 24LC16B
HI2cOut [IO_ADR],(%11110000)	'ESSAI''all rows low, all columns high if you want to use interrupt
hi2cout[io_adr],(%11110000)			
hi2cout [io_adr2],(%00000000)
hi2cout [io_adr3],(%00000000)
hi2cout [io_adr4],(%00000000)					
hi2cout [io_adr5],(%00000000)					
hi2cout [io_adr6],(%00000000)

touches:
'------------------------------------------------dizaine
touche =240
nombre=0

mini=0:maxi=9
gosub lectouche

	lookup touche,("0123456789abcdef"),classe
					dizaine=touche
		cptouche2=1
		pause 20		
	if  touche >=0 and cptouche2=1 then
					dizaine=touche	*10		
		sertxd("1 - dizaine = ",#dizaine," - classe = ",classe," - touche = ",#touche," - touche2 = ",#cptouche2,13,10)

	end if		
'------------------------------------------------unite
mini=0:maxi=9

		gosub lectouche
	lookup touche,("0123456789abcdef"),classe
					unite=touche
			cptouche1=1				
					pause 20
if touche>=0 and cptouche1=1 then	
					unite=touche	
			sertxd("2 - unite = ",#unite," - classe = ",classe," - touche = ",#touche," - touche1 = ",#cptouche1,13,10)	

end if
'------------------------------------------------validation		

if unite>0 and dizaine=0 and cptouche1=1 then
		goto valide1
				elseif unite>=0 and dizaine>=10 and cptouche2=1 then
			goto valide2
end if
	valide1:
mini=10:maxi=16
	gosub lectouche
	lookup touche,("0123456789abcdef"),classe
	equipement=classe
				if equipement="a" and cptouche1=1 and dizaine=0  then
nombre=unite
	sertxd("3 - aiguillage = ",#nombre," - classe = ",classe," - touche1 = ",#cptouche1,13,10,13,10)	
	sertxd("4 unite = ",#unite,13,10,13,10)
goto commandes	
end if	
		valide2:
	mini=10:maxi=16
	gosub lectouche
	lookup touche,("0123456789abcdef"),classe
	equipement=classe		
					if equipement="a" and cptouche2=1 and dizaine =>10 then
nombre=dizaine+unite
	sertxd("5 - aiguillage = ",#nombre," - classe = ",classe," - touche2 = ",#cptouche2,13,10,13,10)
		sertxd("6 dizaine = ",#dizaine," unite = ",#unite,13,10)
goto commandes		
	end if
pause 1000	

commandes:
select case nombre
		case 01
			hi2cout [io_adr2],(1):pause 1000				
		case 02
			hi2cout [io_adr2], (2):pause 1000
		case 03
			hi2cout [io_adr2], (4):pause 1000
		case 04
			hi2cout [io_adr2], (8):pause 1000
		case 05 
			hi2cout [io_adr2],(16):pause 1000
		case 06
			hi2cout [io_adr2], (32):pause 1000
		case 07
			hi2cout [io_adr2], (64):pause 1000
		case 08 
			hi2cout [io_adr2], (128):pause 1000
		case 09
			hi2cout [io_adr3],(1):pause 1000
		case 10
			hi2cout [io_adr3], (2):pause 1000
		case 11
			hi2cout [io_adr3], (4):pause 1000
		case 12
			hi2cout [io_adr3], (8):pause 1000
		case 13
			hi2cout [io_adr3], (16):pause 1000
		case 14
			hi2cout [io_adr3], (32):pause 1000
		case 15
			hi2cout [io_adr3], (64):pause 1000
		case 16
			hi2cout [io_adr3], (128):pause 1000
end select
reset
lectouche:
	do	
		poidsfaible=%1			;init ? xxxx0001	
		for cpt=1 to 4		;scann sur bits poids faible
			temp=not poidsfaible  |%11110000 ;
		hi2cout [io_adr],(temp)	;envoi octet
			pause 20
		hi2cin [io_adr],(octetlu)	;test sur retour octet	

			if octetlu <240  and flag=0 and	octetlu <> temp then	;pins < 11110000 (240) c?d une touche appuy?e, premier passage	
				pause 20
				lookdown octetlu,(238,222,190,126, 237,221,189,125, 235,219,187,123, 231,215,183,119),touche		
				flag=1
			elseif octetlu > 240 and flag=1  then	;rel?chement touche	
	pause 20
			flag=0
				if touche <=maxi and touche>=mini then retour
pause 20
			endif
			poidsfaible=poidsfaible*2	;d?calage du 0 ? gauche (futur 1...)
		next
	loop
retour:
	return
 
Last edited:

alainav1

Senior Member
bonjour,
l'utilisation d'un minitel c'est original .
si PapyJP pouvait détailler plus son travail pour bénéficier de son expérience se serait symp.
cordialement
Alain
 

PieM

Senior Member
Pour simplifier:

Code:
commandes:
select case nombre
        case 01
            hi2cout [io_adr2],(1):pause 10008
        case 02
            hi2cout [io_adr2], (2):pause 1000
        case 03
            hi2cout [io_adr2], (4):pause 1000
        case 04
            hi2cout [io_adr2], (8):pause 1000
        case 05 
            hi2cout [io_adr2],(16):pause 1000
        case 06
            hi2cout [io_adr2], (32):pause 1000
        case 07
            hi2cout [io_adr2], (64):pause 1000
        case 08 
            hi2cout [io_adr2], (128):pause 1000
        case 09
            hi2cout [io_adr3],(1):pause 1000
        case 10
            hi2cout [io_adr3], (2):pause 1000
        case 11
            hi2cout [io_adr3], (4):pause 1000
        case 12
            hi2cout [io_adr3], (8):pause 1000
        case 13
            hi2cout [io_adr3], (16):pause 1000
        case 14
            hi2cout [io_adr3], (32):pause 1000
        case 15
            hi2cout [io_adr3], (64):pause 1000
        case 16
            hi2cout [io_adr3], (128):pause 1000
end select
reset
peut être avantageusement remplacé par:

Code:
commandes:[INDENT]var_temp = nombre - 1 // 8[COLOR=#008000]    ; var_temp devient 0 à 7[/COLOR]
[/INDENT]
[INDENT]var_temp = DCD var_temp      [COLOR=#008000]; met le bit N° (var_temp) à 1  
[/COLOR]
if nombre < 9 then : hi2cout [io_adr2],(var_temp)
[/INDENT]
[INDENT=3]  else :  hi2cout [io_adr3],(var_temp)        
[/INDENT]
[INDENT]endif
pause 1000             
reset
[/INDENT]


il faut avant définir var_temp comme byte.

Sinon l'utilisation systématique du goto avec des reset n'est pas trop l'idéal ! ...​
 

BESQUEUT

Senior Member
Sinon l'utilisation systématique du goto avec des reset n'est pas trop l'idéal ! ...
C'est le moins que l'on puisse dire... (et vous connaissez mon abjection pour la commande GOTO...)
Mais bon : on a bien des voitures "start and stop" maintenant...
 

cemoa

Member
C'est le moins que l'on puisse dire... (et vous connaissez mon abjection pour la commande GOTO...)
Mais bon : on a bien des voitures "start and stop" maintenant...
Vous êtes très certainement des informaticiens très pointus, alors pourriez-vous développer vos remarques, elles me seront ainsi qu'à tous les bricolos de mon genre, j'en suis certain, très utiles pour progesser dans ce foutu langage basic dédié au picaxe, à mon époque ça existai déjà et jamais personne ne s'en est plaint et puis pourquoi il existe? personnellement je préfère le C et même le pascal. et puis flûte, pourquoi faire simple quand on peut prendre son pied à faire compliqué!!
et puis les voitures star et stop reposent les moteurs, les pieds et les jambes et font ch.... les autres qui attendent que votre bagnolle veuille bien repartir.
Donc si je comprends votre remarque, les" goto-reset " ralentissent le programme, j'ai gagné? Et alors j'suis pas pressé.
Enfin bref vos informations sont les bienvenues.
tout ça c'est de l'humeur humoriste.
Bonne soirée
JCD
 

BESQUEUT

Senior Member
Vous êtes très certainement des informaticiens très pointus, alors pourriez-vous développer vos remarques, elles me seront ainsi qu'à tous les bricolos de mon genre, j'en suis certain, très utiles pour progesser
Effectivement, chacun est libre de programmer comme ça lui plait.

Tant que ça tient dans la mémoire, on se moque d'écrire 20 lignes au lieu de 2...
Tant que le bidule est suffisamment réactif, on n'a pas besoin d'optimiser la vitesse (mais n'oublions pas que les Picaxes étant interprétés, ils sont bien plus lents que les PICs qui les contiennent...)

Là où ça se corse, c'est :
- quand ça ne marche pas comme prévu,
- quand 6 mois plus tard on veut ajouter une fonctionnalité,
- quand on finit par demander de l'aide sur le forum.

A ce moment précis, intervient un critère de plus : la lisibilité du code.

Sur ce critère précis, j'ai une règle simple : ne pas utiliser la commande GOTO.
Simple, et super efficace.
Il y a une annexe : si on a écrit deux fois (ou plus) la même choses (ou quasiment la même chose)
alors un sous-programme est probablement plus lisible, plus efficace et plus facile à maintenir.
Et si, cerise sur le gâteau, on utilise une macro et des variables avec des noms explicites, alors il n'y a presque plus besoin de commentaires tant c'est facile à lire.

Seule dérogation, si et seulement si on pointe dans la famille des "informaticiens très pointus" ET que l'on doit optimiser la taille et/ou la vitesse du code, il peut arriver qu'un GOTO soit utile.
Dans tous les autres cas,, ça ne contribue qu'à rentre le code illisible et c'est par conséquence une source d'erreurs.

Ne pas oublier également que si le Picaxe rencontre plus de RETURN que de GOSUB, il va faire un "STACK UNDER ou OVER FLOW"
En fait, sur un Picaxe réel, ça passe quand même mais le résultat n'est pas toujours celui escompté. Sur le simulateur, c'est tout simple : ça bloque !
Et la plupart du temps, le fougueux développeur ne comprends pas pourquoi...

Là encore, il existe un remède quasi miraculeux : bannir le GOTO. En effet, il est très difficile sans utiliser GOTO d'écrire un programme qui ne passe pas un même nombre de fois par GOSUB et par RETURN.

En ce qui concerne le RESET, (outre que c'est une sorte de GOTO en plus violent...) ne pas oublier que ça réinitialise pas mal de choses. Du coup, ça devient difficile d'avoir un appareil qui se souvient de ce qui vient juste de se passer...

A bon entendeur...
 
Last edited:

PieM

Senior Member
Tant que ça tient dans la mémoire, on se moque d'écrire 20 lignes au lieu de 2...
Oui bien sûr, sauf que qd on démarre un projet qui risque de prendre de l'extension avec une dizaine de PCF, il est intéressant de réfléchir avant à une structure de commande.
Je rappelle ce qui a été fait avec l'ami zeltron où une commande d'aiguillage se faisait par une commande " Aiguillage(N°, sens)".
Une simplification bien documentée est aussi lisible que 200 lignes répétitives.
Mais il est exact que chacun fait comme il veut. Par contre j'ai de plus en plus de mal à aider pour un programme de 500 lignes non structuré.

J'ajoute qu'utiliser un reset dans un programme revient à couper le courant!
C'est plutôt à éviter dans la mesure où toutes les variables en RAM sont réinitialisées.
Alors ça peut créer des surprises...

Si vous êtes adepte du C ou du Pascal je doute fort que vous ne réalisiez pas de programme structuré.
 
Last edited:
Top