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

cemoa

Member
bonjour à la communauté,
Encore un papi retraité aux commandes d'une maquette ferroviaire.
Ma problématique actuelle est la commande d'une quarantaine d'aiguillages et autres comme éclairage, .... Actuellement c'est 1 aiguillage, 1 bouton donc pour 40, 40 boutons! Alors je me dis que si je peux faire la même chose avec 12 ou 16 touches ce serait plus simple à manipuler.
Donc je suis parti sur le principe d'un clavier matricé 16 touches : 0 à 9 et A,B,C,D,E,F, les chiffres pour identifier le N° de l'appareil, les lettres pour valider les choix : aiguillage, éclairage, etc. J'ai choisi un picaxe 20X2 parce que j'en ai plusieurs en stock, donc je peux me permettre d'en faire fumer 1 et 1 PCF8574 pour lire le clavier et 5 PCF8574A pour commander les appareils. J'ai trouvé dans le forum une parti qui répond à ma problématique, et qui fonctionne parfaitement pour 16 touches, mais pour dépasser 16 et enregistrer des nombres plus grands je suis complètement paumé. Donc si la communauté veut bien m'aider à comprendre le fonctionnement du clavier pour compter bien au delà de 16: 17,18,19...........100, je lui en serais très, très reconnaissant.View attachment Clavier_131016.bas, View attachment ClavierVSM131016.DSN
Je joins le schéma, et le code pompé dans le forum et modifié à ma sauce, mais je ne comprend pas quelles fonctions je dois utiliser pour afficher 10,11,......17,18,......20,30,......etc
Merci pour votre aide
 

MGU

Senior Member
Bonjour,

J'essaie de penser à ce qui serait le plus pratique.
De toute façon, il faut un afficheur pour visualiser la sélection. Je me demande si le plus pratique ne serait pas un simple potar et un poussoir de validation.
On sélectionne une classe: aiguillages; gares; éclairages...etc On valide
On sélectionne un numéro: 1;2;3...On valide
Un potar tourne sur 270°. avec une plage de 10° (ce qui est déjà confortable), on fait 27 choix. Il y a combien d'aiguillages ?

MM
 

cemoa

Member
Bonjour,

J'essaie de penser à ce qui serait le plus pratique.
De toute façon, il faut un afficheur pour visualiser la sélection. Je me demande si le plus pratique ne serait pas un simple potar et un poussoir de validation.
On sélectionne une classe: aiguillages; gares; éclairages...etc On valide
On sélectionne un numéro: 1;2;3...On valide
Un potar tourne sur 270°. avec une plage de 10° (ce qui est déjà confortable), on fait 27 choix. Il y a combien d'aiguillages ?

MM
Bonsoir,
Merci de vous intéresser à mon projet
le thème de la maquette est" d'hier à aujourd'hui, de la mer à la montagne" sur 3 niveaux et devrait occuper un papi + quelques petits cerveaux dernière génération et tout mon ex bureau!
Compte tenu du nombre de commandes en projet, je ne sais pas si un potar et une touche de validation seraient suffisant, ce qui serait pourtant sympa comme manip. Actuellement le circuit ferroviaire comporte 22 aiguillages à terme il devrait en compter 46, 3 passages à niveau, 5 gares, 1 station de lavage, 1 ou 2 moulins à vent + l'eclairage. C'est pour cela que j'ai pensé au clavier matriciel le principe est un numéro d'appareil validé par une touche de choix ( touche2 et touche 3, validation: aiguillage ce qui donnerait "aiguillage 23") hors c'est le traitement de 2 touches pour composer le 23 que je n'arrive pas à faire. J'aurais aimé pouvoir taper le 2, le 3 et 10, j'ai essayé des tas de manip dans le programme joint à mon message, mais rien à faire, ça marche pas, faut dire que je suis un débutant en bus I2C, et en langage PICAXE, alors j'accepte toutes les aides.
Bonne soirée
 

MGU

Senior Member
Pour valider un nombre à deux chiffres sur le clavier, ma première idée est que tous les nombres auront deux chiffres, ex pour taper 1, il faut taper 01
Les nombres sont donc composés de deux chiffres, dizaine et unité.
La validation se fait au relâchement des touches.
On tape donc un chiffre, validé au relâchement, on le multiple par 10, et on tape le second, celui des unités, on fait la somme des deux variables pour avoir une variable à deux chiffres

Si on remplace le clavier par un potar, soit on couvre le total des 46 nombres (270/46= 5,8°), soit on rentre dizaines et unités par la même manip. La gestion du potar est beaucoup plus simple que le clavier.

Ébauche de code pour traitement potar. Il y aurait donc 6 ou 7 classes et 46 nombres.
Ici, on sélectionne une classe et un nombre, manque la suite
Faite un essai, on ne sait jamais...

Code:
symbol classe=b1
symbol memoclasse=b2
symbol num=b3
symbol valid=pinC.6
	serout C.0, N2400,(254,1)
	do
		readadc B.0,classe
		classe=7*classe/255
		select case classe
		case 0
			if memoclasse<>classe then
				gosub raz
			endif 
			serout C.0, N2400,(254,128,"AIGUILLAGE")
			if valid=0 then
				 gosub numero
			endif
			memoclasse=classe
		case 1
			if memoclasse<>classe then
				gosub raz
			endif 
			serout C.0, N2400,(254,128,"GARE")
			if valid=0 then
				 gosub numero
			endif
			memoclasse=classe
		else
			gosub raz
		endselect
	loop

numero:
        do loop while valid=0
	do	
		serout C.0, N2400,(254,192,"numero ?")
		readadc B.0,num	
		num=46*num/255
		serout C.0, N2400,(254,202,#num," ")
		if valid=0 then
			 gosub trait
		endif
	loop	
	return

raz:
	serout C.0, N2400,(254,128,"                ")
	return

trait:
do loop
	return

MM
 
Last edited:

BESQUEUT

Senior Member
Ma problématique actuelle est la commande d'une quarantaine d'aiguillages et autres comme éclairage, .... Actuellement c'est 1 aiguillage, 1 bouton donc pour 40, 40 boutons!
Ça me surprend un peu : n'y a-t-il pas deux positions pour chaque aiguillage ?
Comment savez-vous dans quelle position est chaque aiguillage ?
Sinon : on peut aussi utiliser deux potars : un pour les dizaines et un pour les unités... ou un encodeur rotatif...
 

cemoa

Member
Bonjour Besqueut,
je vous remercie pour votre réponse
En effet un aiguillage a 2 positions, je commande les aiguillages par impulsion, la 1ère l'ouvre, la 2ème le ferme, la détection de position est détectée par un microswitch à l'état 0 ou 1, chaque aiguillage est équipé par ce circuit spécialisé dont schéma joint: View attachment CdeAiguillageImplusion.DSN, View attachment CdeAiguillageImplusion.PDF, le microswitch permet de commander un trajet du convoi, la position des feux de signalisation, .... la tension ajustable permet d'actionner divers moteurs de marque hornby, peco sachant pour hornby, jouef une tension de 12 V est suffisante, alors que pour Peco, selon les modèles d'aiguillage et de moteur la tension peut varier entre 12V et 18V voir 19V.

Aujourd'hui je vais tester les propositions que vous m'avez soumises
Bonne journée
 

jojojo

Senior Member
A ma sauce:
- on écrit en EEprom le premier chiffre
- on incrémente l'adresse en EEprom
- on écrit le second chiffre
- on valide, ce qui fait lire les deux valeurs en EEprom
- exécution, et RAZ des deux valeurs en EEprom.
Le zéro est proscrit, bien sur.

Méthode valable pour autant de chiffres a saisir, qu'il y a d'adresse EEprom (!).

Exemple:

Code:
'***************************************************************************

'Telecommande Manchester 14M2
'Emetteur type à relais statique
'Consommation quasi nulle en veille (moins de 2µA)
'G.Treels
'2016


'Sortie en cmd  Radiometrix  869.5Mhz 500mW
'deux chiffres plus une validation d'envoi
'****************************************************************************

	#picaxe 14M2
	Let dirsC=%000100
	Let dirsB=%100010
	Symbol LED=C.2
	Symbol ENTX=B.1
	Symbol DATATX=B.5
	Symbol NOTX=1				'le N° de cette télécommande
				
pause 5						'stab alim ADC
							'temps de décharge condo
Do
	
	
	Readadc C.4,b0
					'U fct touche, cf schema
					
	
	

	If b0>230 Then 
		b1=11
		Exit
	End If
		
	If b0 >200 Then
		b1=10
		Exit
	End If
	If b0	>180 Then
		b1=11
	Exit
	End If
	If b0 >170 Then
		b1=1
		Exit 
	End If
	If b0 >155 Then
		b1=2
	Exit 
	End If
	
	If b0>140 Then
		b1=3
	Exit 
	End If
	If b0 >130 Then
		b1=4
		Exit 
	End If
	If b0>120 Then
		b1=5
		Exit
	End If
	If b0>115 Then
		b1=6
		Exit
	End If
	If b0>109 Then
		b1=7
		Exit
	End If	
	If b0 >103 Then
		b1=8
		Exit
	End If	
	If b0 >100 Then
		b1=9
		Exit
	End if
Loop	

	If b1<>11 Then	'pas valid
		Read 0,b12
		If b12<1 Then
			Write 0,b1
			Goto fin
		Else
			Write 1,b1
			Goto fin
		End If
	Else			'valid
		Read 0,b12
		Read 1,b11
		
		If b12>0 and b11>0 then
			Gosub TX
			Gosub EraseProm
			Goto fin
		Else
			Gosub Erreur
			Gosub EraseProm
			Goto fin
		End If
	End If
	Goto fin
	
Erreur:			
	For b5=1 to 10
		High LED
		pause 20
		Low LED
		pause 5
	Next b5
	Write 0,0
	Write 1,0
	Return
	

TX:
	Gosub Etat_Batt
	High LED
	High ENTX
	for b5=1 to 5	'Init TX cf doc Radiometrix
	High DATATX		'+/- 100ms 
	pause 10
	Low DATATX
	Pause 10
	next b5
	
	
	For b13=1 to 5					'Envoi 5 trames contenant
	RFout DATATX,(1,1,1,1,NOTX,b10,b12,b11)	'le N° du TX, état batt					
	Next b13						'et les 2 chiffres du code							

	Low ENTX
	Low LED
	Return
	
EraseProm:	
	Write 0,0
	Write 1,0
	Return
	
Etat_Batt:
	Readadc C.0,b10	'après diviseur 10k/8.2k
	If b10<165	Then	'soit 7.5Vbatt, 3.2V après diviseur
		High LED
		Pause 60	'un flash led, avant envoi
		Low LED
		Pause 60
	End if
	Return
		
	
FIN:
 
Last edited:

MGU

Senior Member
Bonjour,

Dans le cas du clavier, je réserverais les lettres pour les classes: A=AIGUILLAGES; B= GARES;....
Et les chiffres pour les numéros.

Pour tester le potar, voici un code pour 4 classes. Le nombre de numéros est adapté à chaque classe.
Affichage sur LCD série en C.0
Le poussoir sur C.6, pullup activée, donc 1 au repos.
A tester....

Code:
symbol classe=b1
symbol memoclasse=b2
symbol num=b3
symbol maxi=b4
symbol valid=pinC.6
	serout C.0, N2400,(254,1)
	do
		readadc B.0,classe
		classe=7*classe/255
		select case classe
		case 0
			if memoclasse<>classe then
				gosub raz
			endif 
			serout C.0, N2400,(254,128,"AIGUILLAGE")
			maxi=46
			if valid=0 then
				 gosub numero
			endif
			memoclasse=classe
		case 1
			if memoclasse<>classe then
				gosub raz
			endif 
			serout C.0, N2400,(254,128,"GARE")
			maxi=6
			if valid=0 then
				 gosub numero
			endif
			memoclasse=classe
		case 2
			if memoclasse<>classe then
				gosub raz
			endif 
			serout C.0, N2400,(254,128,"PASSAGE A NIVEAU")
			maxi=3
			if valid=0 then
				 gosub numero
			endif
			memoclasse=classe
		case 3
			if memoclasse<>classe then
				gosub raz
			endif 
			serout C.0, N2400,(254,128,"STATION LAVAGE")
			maxi=1
			if valid=0 then
				 gosub numero
			endif
			memoclasse=classe
		case 4
			if memoclasse<>classe then
				gosub raz
			endif 
			serout C.0, N2400,(254,128,"MOULIN A VENT")
			maxi=2
			if valid=0 then
				 gosub numero
			endif
			memoclasse=classe
		else
			gosub raz
		endselect
	loop

numero:
	do loop while valid=0
	
	do			
		serout C.0, N2400,(254,192,"numero ?")
		readadc B.0,num	
		num=maxi*num/255 
		
		serout C.0, N2400,(254,202,#num," ")
		if valid=0 then
			 gosub trait
		endif
	loop	
	return

raz:
	serout C.0, N2400,(254,128,"                ")
	return

trait:
do loop
	return
MM
 

PieM

Senior Member
Bonjour,

Je n'ai pas tout compris de votre programme select case; quel intérêt d'écrire systématiquement en EEPROM des valeurs qui ne sont utilisées que pour des actions fugitives ?
Vous définissez touchex comme variable puis comme constante !?

Sinon, dans le main: (en gros...)

do while toucheappuyee <> 255 ; clavier au repos
k=1 ; nombre = 0
do while toucheappuyee <> validation
gosub getkey
nombre = toucheappuyee * k + nombre
K =K*10
loop
loop

permet de rentrer n'importe quel nombre.
 

jojojo

Senior Member
quel intérêt d'écrire systématiquement en EEPROM des valeurs qui ne sont utilisées que pour des actions fugitives ?
Simple, Piem: Dans ce cas de figure, le µP n'est alimenté QUE lors de l'appui sur une touche. Donc, si je veux mémoriser un nombre à deux chiffres, impossible d'utiliser de la RAM.
 

PieM

Senior Member
Simple, Piem: Dans ce cas de figure, le µP n'est alimenté QUE lors de l'appui sur une touche. Donc, si je veux mémoriser un nombre à deux chiffres, impossible d'utiliser de la RAM.
Oui mais je parlais du cas de cemoa ! Ses circuits sont alimentés en permanence et les aiguillages sont des bistables.
 

MGU

Senior Member
Bonjour,

Un code allégé, avec une meilleure numérotation, de 1 à Nmax

Code:
#picaxe 20X2
#no_data
symbol classe=b1
symbol memoclasse=b2
symbol num=b3
symbol maxi=b4
symbol valid=pinC.6
	pullup %100000000000000	;pullup sur C.6
	serout C.0, N2400,(254,1)
	do
		readadc B.0,classe
		classe=7*classe/255	;en prévision de 7 classes
		select case classe
		case 0			
			serout C.0, N2400,(254,128,"AIGUILLAGE      ")
			maxi=46
			if valid=0 then
				 gosub numero
			endif			
		case 1			
			serout C.0, N2400,(254,128,"GARE            ")
			maxi=6
			if valid=0 then
				 gosub numero
			endif
		case 2			
			serout C.0, N2400,(254,128,"PASSAGE A NIVEAU")
			maxi=3
			if valid=0 then
				 gosub numero
			endif			
		case 3			
			serout C.0, N2400,(254,128,"STATION LAVAGE  ")
			maxi=1
			if valid=0 then
				 gosub numero
			endif			
		case 4			
			serout C.0, N2400,(254,128,"MOULIN A VENT   ")
			maxi=2
			if valid=0 then
				 gosub numero
			endif			
		else
			gosub raz
		endselect
	loop

numero:
	do loop while valid=0	
	do			
		serout C.0, N2400,(254,192,"numero ?")
		readadc B.0,num	
		num=maxi*num/256+1		
		serout C.0, N2400,(254,202,#num," ")
		if valid=0 then
			 gosub trait
		endif
	loop	
	return

raz:
	serout C.0, N2400,(254,128,"                ")
	return

trait:
do loop
	return
 

cemoa

Member
Oui mais je parlais du cas de cemoa ! Ses circuits sont alimentés en permanence et les aiguillages sont des bistables.
Bonjour PieM
Vous avez tout a fait raison de poser cette question, la réponse est simple, j'utilise ces "write et ces read" pour visualiser l'affichage des valeurs des variables en cours de développement du programme, donc c'est vrai, ils ne servent à rien dans la commutation des aiguillages, car ce qui m'intéresse est la transmission de la valeur pour commuter l'aiguillage concerné via les PCF8574A. Par contre quand le bidule fonctionnera, j'enverrai les infos de positions des aiguillages à l'ordi pour faire un joli dessin à l'écran.
encore merci à la communauté pour vos aides qui me permettent de mieux comprendre le langage pour PICAXE, j'espère vite avancé ce projet de clavier car c'est, je pense, le dernier gros challenge de l'électronique avant de m'atteler à la décoration de la maquette avec mon petit fis et petit, petit neveu.
Bien évidemment, maintenant que j'ai pris gout aux dialogues du forum, je vais venir plus souvent participer en questions et peut-être réponses si je sais!!!
 

cemoa

Member
Bonjour,

Je n'ai pas tout compris de votre programme select case; quel intérêt d'écrire systématiquement en EEPROM des valeurs qui ne sont utilisées que pour des actions fugitives ?
Vous définissez touchex comme variable puis comme constante !?

Sinon, dans le main: (en gros...)

do while toucheappuyee <> 255 ; clavier au repos
k=1 ; nombre = 0
do while toucheappuyee <> validation
gosub getkey
nombre = toucheappuyee * k + nombre
K =K*10
loop
loop

permet de rentrer n'importe quel nombre.
bonsoir PieM
je n'ai pas tout compris, mais je suis très intéressé. alors quitte à passer pour un ignare:
dans votre programme à quoi correspondes K et nombre, faut'il affecter des variables?
avec cette méthode peut-on enregitrer un nombre à 2 chiffres, doit-on employer l'écriture en EEPROM pour lire 2 chiffres?
parce que les résultats de mes essais en affectant des variables restent muets comme des carpes.
bonne soirée
 

BESQUEUT

Senior Member
bonsoir PieM
je n'ai pas tout compris, mais je suis très intéressé. alors quitte à passer pour un ignare:
dans votre programme à quoi correspondes K et nombre, faut'il affecter des variables?
avec cette méthode peut-on enregitrer un nombre à 2 chiffres, doit-on employer l'écriture en EEPROM pour lire 2 chiffres?
parce que les résultats de mes essais en affectant des variables restent muets comme des carpes.
bonne soirée
Comme indiqué, PieM a donné des indications "en gros" il faut affiner...
pas de Picaxe sous la main, mais voici quelques pistes...
K et nombre doivent être des symboles.
K peut être un simple byte, mais pour nombre, il faut choisir entre byte et word.
K est vraisemblablement la touche (KEY)
Nombre est la valeur saisie au clavier.
Si vous dépasser 255 ou 65534, nombre devient n'importe quoi...
Il faut prévoir une touche pour remettre ce nombre à zéro, ou revenir à zéro dès que nombre dépasse la valeur limite souhaitée.
 

MGU

Senior Member
Bon, tant pis, je range mon potar...
Pour les claviers, voici une page pour le traitement complet d'un clavier 16 touches
http://www.wifeo.com/m_editeur.php?nom_page=decodeur-clavier-matriciel-4-x-4
Pour générer un nombre de deux chiffres, il faut exécuter le programme deux fois.
Au premier tour, on a le premier chiffre (ex 6). on le multiplie par 10 et on sauvegarde dand une variable "nombre". nombre=60
Au deuxième tour, on a un second chiffre (ex 3)que l'on ajoute à nombre. On a maintenant un nombre à deux chiffres: nombre=63
et on continue le programme

Bonne bidouille
MM
 

BESQUEUT

Senior Member
Bon, tant pis, je range mon potar...
C'est pourtant un truc très commode...
Et pour afficher : une led près de chaque aiguillage, ou sur un schéma.
Quand on tourne le potar, on passe d'un aiguillage à l'autre.
Du coup, pas besoin de mettre une étiquette sur chaque aiguillage, puis de taper un nombre...

Si le but final est d'afficher le schéma sur un écran, autant cliquer directement sur l'aiguillage...
Du coup, le projet serait plus d'interfacer ces aiguillages avec un PC (ou un smartphone...) qu'avec un clavier matriciel...
 

PieM

Senior Member
K est une variable type byte.
initialisée à 1 en début de saisie d'une touche, elle est multipliée par 10 à chaque saisie suivante.
nombre est la valeur saisie cumulée des valeurs successives de touche multipliées par k.
le nombre de chiffres n'est pas limité.

Tout ceci pour rester avec l'approche de la gestion clavier par un expenseur I2C, qui est aussi une solution intéressante.
Toutefois, dans le cas présent, une solution potar ou codeur rotatif me semble plus simple. Surtout si on est pas familier de l'I2C.
 

MGU

Senior Member
De toute façon, chacun fait comme il veut...

Avec le potar, on ne peut sélectionner dans chaque classe que des cas possibles.

Avec le clavier, il faut faire attention à éliminer les erreurs, par ex les lettres si on veut un chiffre et inversement.

Voici mon code clavier pour un nombre à deux chiffres, le test sur "touche < 10" sélectionne uniquement les chiffres, il faudrait "touche>10 pour les lettres.

Le code est complet, avec affichage LCD série en B.0. Le clavier occupe le port C , les broches I2C sont toujours dispo.
Pour le simu, C4 à C7 sont initialisés à 1 (pullup)
Ensuite, il faut cliquer sur une des touches C4 à C7, et attendre le blocage, C0 à C3 sont tirées au hasard du scan

Code:
#picaxe 20X2
#no_data
dirsC=%1111		;C.0 à C.4 en sorties
symbol cpt=b1
symbol PoidsFaible =b2
symbol touche=b3
symbol affich=b4
symbol nombre=b5
symbol LCD=B.0
	serout LCD,N2400,(254,1)
	pullup %1111000000000000	;pullup sur C.4 à C.7	
	nombre=0
	serout LCD,N2400,(254,128,"dizaines: ")
	gosub lectouche	
	nombre=touche*10
	serout LCD,N2400,(254,128,"unites  : ",#nombre," ")
	gosub lectouche
	nombre=nombre+touche
	serout LCD,N2400,(254,128,"nombre=   ",#nombre," ")
        pause 1000
	reset

lectouche:
	Do	
		PoidsFaible=%1			;init à XXXX0001
		for cpt=1 to 4 		;scann sur bits poids faible
			pinsC=not PoidsFaible	;ex init:poids faible de pinsC =XXXX1110	
			if pinsC <240	then	;pins < 11110000 (240) càd une touche appuyée  
				lookdown pinsC,(126,125,123,119,190,189,187,183,222,221,219,215,238,237,235,231),touche				
				do loop while pinsC < 240		;attente relachement
			if touche <10 then retour
			else 	
				serout LCD,N2400,(254,128,"")	;simu bug si on supprime le else ???
			endif
			PoidsFaible=PoidsFaible*2	;décalage du 0 à gauche (qui deviendra un 1...)
		next
	loop
retour:
	return
Me semble que l'adressage des PCF est limité à 8. avec le nombre de sorties, ça va faire juste pour le clavier en plus

MM
 
Last edited:

PieM

Senior Member
Me semble que l'adressage des PCF est limité à 8. avec le nombre de sorties, ça va faire juste pour le clavier en plus
Oui, et pour préserver l'avenir, j'utiliserais plutôt des pcf8575: 8 adressables mais 16 E/S.
 

cemoa

Member
Bon, tant pis, je range mon potar...
Pour les claviers, voici une page pour le traitement complet d'un clavier 16 touches
http://www.wifeo.com/m_editeur.php?nom_page=decodeur-clavier-matriciel-4-x-4
Pour générer un nombre de deux chiffres, il faut exécuter le programme deux fois.
Au premier tour, on a le premier chiffre (ex 6). on le multiplie par 10 et on sauvegarde dand une variable "nombre". nombre=60
Au deuxième tour, on a un second chiffre (ex 3)que l'on ajoute à nombre. On a maintenant un nombre à deux chiffres: nombre=63
et on continue le programme

Bonne bidouille
MM
Bonjour MGU,
Ne soyez surtout pas vexé si je n'ai pas encore abordé votre proposition de potar, mais j'y réfléchi sérieusement, car c'est une solution que je trouve sympa, seulement je me pose la question de ce qui sera le plus pratique dans le cas d'une commande de trajet, composé de n aiguillages pour un convoi X. je sais qu'en composant un code au clavier je pourrai facilement avec une seule manip commander tous les aiguillages nécessaires pour composer ce trajet. Dans tous les cas j'aurai besoin de passer par un bus I2C pour commander tous les expandeurs PCF8574 et PCF8574A. D'autant que ce clavier n'est que le répétiteur manuel des commandes informatisées sur ordinateur et certainement tablette.
Mais toutes ces manip son un peu longues, car comme chacun sait, les retraités sont surchargés d'activités en tout genre, alors bidouiller 2h/jour c'est déjà pas mal, l'idéal est d'envoyer sa nana faire du lèche vitrine avec les copines, ainsi c'est la liberté de bidouiller au moins 4h.
Encore merci à toute la communauté pour les conseils.
Bonne journée
 

cemoa

Member
Oui, et pour préserver l'avenir, j'utiliserais plutôt des pcf8575: 8 adressables mais 16 E/S.
Mais vous avez tout à fait raison, alors pourquoi des PCF8574, simplement parce que il m'en reste une dizaine , sachant que j'en ai déjà utilisé pour un pont tournant, la synchronisation de commutation d'aiguillages, un automate d'arrosage, donc si besoin je mettrai des 8575, d'autant que le PCF8574 est en cours d'obsolescence mais pas le PCF8574A.
Bonne journée
 

MGU

Senior Member
Bonjour,

Toujours avec le clavier, j'ai poussé le bouchon un peu plus loin avec une lettre (classe) et un nombre à deux chiffres

voici le code:

Code:
#picaxe 20X2
#no_data
dirsC=%1111		;C.0 à C.4 en sorties
symbol cpt=b1
symbol PoidsFaible =b2
symbol touche=b3
symbol affich=b4
symbol nombre=b5
symbol classe=b6
symbol mini=b7
symbol maxi=b8
symbol LCD=B.0
	serout LCD,N2400,(254,1)
	pullup %1111000000000000	;pullup sur C.4 à C.7	
	nombre=0
	serout LCD,N2400,(254,128,"classe:   ")
	mini=10:maxi=16
	gosub lectouche
	lookup touche,("0123456789ABCDEF"),classe
	serout LCD,N2400,(254,128,"classe:   ",classe)
	mini=0:maxi=9
	serout LCD,N2400,(254,128,"dizaines: ",classe)
	gosub lectouche	
	nombre=touche*10
	serout LCD,N2400,(254,128,"unites:   ",classe,#nombre," ")
	gosub lectouche
	nombre=nombre+touche
	serout LCD,N2400,(254,128,"adresse:  ",classe,#nombre," ")
	pause 2000
	reset
lectouche:
	Do	
		PoidsFaible=%1			;init à XXXX0001
		for cpt=1 to 4 		;scann sur bits poids faible
			pinsC=not PoidsFaible	;ex init:poids faible de pinsC =XXXX1110	
			if pinsC <240	then	;pins < 11110000 (240) càd une touche appuyée  
				lookdown pinsC,(126,125,123,119,190,189,187,183,222,221,219,215,238,237,235,231),touche				
				do loop while pinsC < 240		;attente relachement
			if touche <=maxi and touche>=mini then retour
			else 	
				serout LCD,N2400,(254,192," ")	;simu bug si on supprime le else ???
			endif
			PoidsFaible=PoidsFaible*2	;décalage du 0 à gauche (ou du 1...)
		next
	loop
retour:
	return
Et le résultat, assez proche de la demande initiale:

simu clavier.JPG

Curieusement, le suppression du else serout entraine un bug du simulateur PE6, (PE5 ne fonctionne pas du tout avec ce code)

MM

MM
 
Last edited:

PieM

Senior Member
seulement je me pose la question de ce qui sera le plus pratique dans le cas d'une commande de trajet, composé de n aiguillages pour un convoi X. je sais qu'en composant un code au clavier je pourrai facilement avec une seule manip commander tous les aiguillages nécessaires pour composer ce trajet
Quel que soit le système de saisie, cela aboutit à définir un élément et un nombre associé. commander l'aiguillage 27 ou le trajet 89, c'est exactement pareil.
 

cemoa

Member
dirsc=%1111 ;c.0 à c.4 en sorties

MM
re,re,re bonjour MGU
Merci pour ce code que je suis en train (c'est le cas de le dire) de tester, pourquoi dirsc=%1111 et do loop while pinsC < 240, ne peut-on pas utiliser un N° de touche dans mon cas la 10(aiguillage) soit dans le data 221?
apparemment, il n'y a pas de souci avec PE6, par contre avec le simulateur proteus8 à jour c'est pas la même chanson! bref je regarde ça.
 

MGU

Senior Member
re,re,re bonjour MGU
Merci pour ce code que je suis en train (c'est le cas de le dire) de tester, pourquoi dirsc=%1111 et do loop while pinsC < 240, ne peut-on pas utiliser un N° de touche dans mon cas la 10(aiguillage) soit dans le data 221?
apparemment, il n'y a pas de souci avec PE6, par contre avec le simulateur proteus8 à jour c'est pas la même chanson! bref je regarde ça.
Toutes les broches sont à priori des entrées. dirsc déclare les broches désignées en sorties
Une page sur le basic picaxe: http://electromag1.wifeo.com/les-picaxes-et-leur-basic.php

J'ai pas compris le data 221. Détaille ce que tu veux faire

Le détail de ce code est sur cette page (mag1 est mon pseudo sur d'autres forums) : http://electromag1.wifeo.com/decodeur-clavier-matriciel-4-x-4.php
Si il y a des points obscures, je préciserai.

MM
 

PieM

Senior Member
pourquoi dirsc=%1111 et do loop while pinsC < 240, ne peut-on pas utiliser un N° de touche dans mon cas la 10(aiguillage) soit dans le data 221?
J'ai l'impression que ça se mélange les touches ...
Le code indiqué par Michel (alias MGU alias mag1) est celui de son programme de décodage du clavier 4x4.
Le do loop while pinsC < 240 sert à détecter que les touches ne sont plus appuyées. (240 = 128 + 64 + 32 +16 soit les poids des entrées C4 à C7)
Quand au 221, il s'agit du code renvoyé par le PCF pour la touche 10 je pense. Mais ça n'a rien à voir dans ce programme.
 

cemoa

Member
Toutes les broches sont à priori des entrées. dirsc déclare les broches désignées en sorties
Une page sur le basic picaxe: http://electromag1.wifeo.com/les-picaxes-et-leur-basic.php

J'ai pas compris le data 221. Détaille ce que tu veux faire

Le détail de ce code est sur cette page (mag1 est mon pseudo sur d'autres forums) : http://electromag1.wifeo.com/decodeur-clavier-matriciel-4-x-4.php
Si il y a des points obscures, je préciserai.

MM
Super bien fait le site, bizarre dans ton message précédent je suis arrivé sur le site VIFEO sur lequel était demandé identifiant et mot de passe et là je suis arrivé directement sur les fichiers, bref, j'ai vu qu'en fait pour décoder le clavier ce sont les broches C.0 à C.7 d'un 20M2 qui sont utilisées, hors j'utilise un expandeur PCF8574 en passant par le bus I2C d'un 20X2 pour décoder le clavier, donc le schéma est différend. Par conséquent je vais bidouiller mon code avec les morceaux du tient pour tenter d'obtenir les bons résultats. le data 221 est une ânerie de ma part, je fini par tout confondre!
Encore merci, je continue en attendant l'heure syndicale pour retraité.
 

MGU

Senior Member
Je t'ai dirigé par erreur vers l'"entrée des artistes". Pour les visiteurs, c'est par ici: http://electromag1.wifeo.com/.

20M2 ou 20X2, ici, c'est pareil.
Mon avis: décoder le clavier à travers un PCF, pourquoi pas, mais c'est se compliquer la vie. Vu l'ambition du projet, si il n'y a pas assez de pattes, je choisirais un 40X2, moins cher que le 28X2, et 3,60 euros de plus que le 20X2, il a le meilleur rapport perfo/prix.
Je réserverais un port pour le gestion clavier, et il devrait rester assez de pattes pour le reste .

MM
 

cemoa

Member
Je t'ai dirigé par erreur vers l'"entrée des artistes". Pour les visiteurs, c'est par ici: http://electromag1.wifeo.com/.

20M2 ou 20X2, ici, c'est pareil.
Mon avis: décoder le clavier à travers un PCF, pourquoi pas, mais c'est se compliquer la vie. Vu l'ambition du projet, si il n'y a pas assez de pattes, je choisirais un 40X2, moins cher que le 28X2, et 3,60 euros de plus que le 20X2, il a le meilleur rapport perfo/prix.
Je réserverais un port pour le gestion clavier, et il devrait rester assez de pattes pour le reste .

MM
Pourquoi je fais komssa parceke :
1- j'ai les composants en stock,
2- j'ai envie d'apprendre l'I2C de fond en comble,
3-bien que je sois électronicien de formation depuis les années 68-69, j'ai fais beaucoup plus de commerce et de gestion dans ce très beau domaine que de bureau d'étude, d'atelier ou d'après-vente
4-parce que l'électronique est mon loisir, les activités physiques me sont malheureusement restreintes mis a part les voyages.
5-parce que il n'y a pas que les petits enfants qui ont le droit et l'obligation de s'amuser, les " papi retraités "aussi
6-tant que les neurones fonctionnent tout va et que l'on a envie de se prendre le choux avec ce genre de problème ça permet de pas voir tout le reste!!!
d'accord, pas d'accord???
Allez, bonne soirée
JCD
 

cemoa

Member
Bonjour,

Toujours avec le clavier, j'ai poussé le bouchon un peu plus loin avec une lettre (classe) et un nombre à deux chiffres

Bonsoir MGU,
Voici le code modifié pour faire fonctionner via le bus I2C un clavier matricé 4X4 avec 1 PCF8574 et 1 20X2, je pense que ça fonctionne avec n'importe quel picaxe. je continu de le modifier pour mes besoins. Sans votre aide je serais encore en train de me poser la question "KOMENFOFER???"
Merci, merci, merci beaucoup.

View attachment ClavierEssai61116.bas
 

Attachments

Last edited:

MGU

Senior Member
Bonjour,

Si ça aide, tant mieux...

J'ai survolé le code, j'avoue ne pas tout comprendre (ex: =255 ).
Le contenu du lookdown dépend de la combinaison obtenue en appuyant sur une touche. On a un octet du genre %1111XXXX si rien n'est appuyé. les 1 (poids fort reliés à des entrées) sont au niveau haut par les pullup sur ces entrés.
Si on appuie, un des 4 "1" passe à 0, ex: 11011110 et cet octet est toujours <240 (car %11110000 =240).

Pour le reste, je ne suis pas un expert en I2C, je n'ai mis le nez dedans que pour le fonctionnent des LCD I2C chinois : http://electromag1.wifeo.com/lcd-i2c-expandeur-pcf8574.php

MM
 
Last edited:

PieM

Senior Member
Le test avec 255 n'a en effet pas de sens.
Il faut faire un test entre ce qui est écrit sur le PCF et ce qui est lu, avant le lookdown. C'est ce qui détermine si une touche a été appuyée.
Il faut en outre limiter le décalage aux 4 bits de poids faible !
 
Last edited:

MGU

Senior Member
Il faut en outre limiter le décalage aux 4 bits de poids faible !
C'est vrai ça.
Avec un truc de ce genre ? Pour écraser systématiquement les poids forts
temp=not poidsfaible |%11110000
La lecture de l'octet en retour nous dit si une touche est appuyée et laquelle.

MM
 

cemoa

Member
Le test avec 255 n'a en effet pas de sens.
Il faut faire un test entre ce qui est écrit sur le PCF et ce qui est lu, avant le lookdown. C'est ce qui détermine si une touche a été appuyée.
Il faut en outre limiter le décalage aux 4 bits de poids faible !
Pour le moment 255 ne sert à rien, j'ai simplement omis de supprimer cette ligne. Je continue d'avancer pour pouvoir sélectionner un N° d'appareil et l'affecter à 1 choix (aiguillage, gare,......)
 

PieM

Senior Member
Pour le moment 255 ne sert à rien, j'ai simplement omis de supprimer cette ligne. Je continue d'avancer pour pouvoir sélectionner un N° d'appareil et l'affecter à 1 choix (aiguillage, gare,......)
Oui, mais il faudrait tout de même que l'acquisition d'une touche fonctionne, ce qui n'est pas le cas avec ce programme qui renvoie systématiquement la même valeur de touche si on appuie sur rien!
Le principe de fonctionnement du décodage avec le PCF ne me semble pas avoir été saisi....
 

cemoa

Member
Oui, mais il faudrait tout de même que l'acquisition d'une touche fonctionne, ce qui n'est pas le cas avec ce programme qui renvoie systématiquement la même valeur de touche si on appuie sur rien!
Le principe de fonctionnement du décodage avec le PCF ne me semble pas avoir été saisi....
???? ah bon, l'essai avec le simulateur vsm affiche les bonnes valeurs avec ce programme, qui ceci dit n'est qu'un programme d'essai pour comprendre le fonctionnement du bidule en utilisant le bus I2C, Je ne manquerai pas de soumettre les résultats de mes bidouilles en cours.
Dans le programe actuel il faut commencer par appuyer sur une touche choix puis sur un chiffre soit par exemple "aiguillage" qui est la touche 10 et un chiffre, par contre le résultat affichera uniquement la "classe" comme dans le proramme de MGU et 01 puis 11, je sais bien que ces valeurs sont n'importe quoi, mais ce qui m'intereesse est de comprendre le principe.
Maintenant je bidouille le prog pour sélectionner 1 N° d'appareil validé par 1 choix, donc en effet le prog devra attendre la validation par une touche choix pour continuer.
bonne journée
 

MGU

Senior Member
Bonjour,

Je n'ai pas VSM (connais pas les possibilités) et je n'ai fait aucun essai.
Je pense qu'il serait prudent de monter le clavier sur une plaque d'essais, pour être sûr du fonctionnement de cette fonction essentielle.
Perso, je réserve b0 à d'éventuelles variables bit (0 ou 1).

Pour le code, l'utilisation des balises
Code:
, présentes dans l'option "Avancé", en bas à droite de cette page évite de devoir ouvrir PE pour le lire.
Je ne sais pas ce que donnerait un essai avec VSM
L'ordre dans le lookdown est conforme au câblage du clavier sur la page du site, on peut changer l'ordre, selon les touches du clavier mais il faut garder les valeurs.

[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
hi2csetup i2cmaster, io_adr,i2cfast,i2cbyte 'eeprom 24lc16b
'hi2csetup i2cmaster, io_adr, i2cslow, i2cbyte
hi2cout [io_adr],(%11110000)	'essai''all rows low, all columns high if you want to use interrupt
hi2cout [io_adr2],(%00000000)
hi2cout [io_adr3],(%00000000)
hi2cout [io_adr4],(%00000000)					
hi2cout [io_adr5],(%00000000)					
hi2cout [io_adr6],(%00000000)	

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 lcd=b.0
	serout lcd,n2400,(254,1)
	sertxd(254,1,13,10)
	pullup %00001000	;pullup sur c.3
	nombre=0
	'serout lcd,n2400,(254,128,"classe:   ")
	sertxd(254,128,"classe:   ",13,10)
	mini=10:maxi=16
	gosub lectouche
	lookup touche,("0123456789abcdef"),classe
	'serout lcd,n2400,(254,128,"classe:   ",classe)
	sertxd (250,128,"classe:   ",classe,13,10)
	mini=0:maxi=9
	'serout lcd,n2400,(254,128,"dizaines: ",classe)
	sertxd (254,128,"dizaines: ",classe,13,10)
	gosub lectouche	
	nombre=touche*10
	'serout lcd,n2400,(254,128,"unites:   ",classe,#nombre," ")
	sertxd(254,128,"unites:   ",classe,#nombre," ",13,10)
	gosub lectouche
	nombre=nombre+touche
	'serout lcd,n2400,(254,128,"adresse:  ",classe,#nombre," ")
	sertxd (254,128,"adresse:  ",classe,#nombre," ",13,10)
	pause 2000
	reset
lectouche:
	do	
		poidsfaible=%1			;init à xxxx0001		
		for cpt=1 to 4 		;scann sur bits poids faible
			temp=not poidsfaible |%11110000  ;Ex: not poidsfaible =xxxx1110 et écrasement poids fort par le "OU" =11111110
		hi2cout [io_adr],(temp)	;envoi octet
		hi2cin [io_adr],(octetlu)	;test sur retour octet		
			if octetlu <240	then	;pins < 11110000 (240) càd une touche appuyée				
				lookdown octetlu,(126,125,123,119,190,189,187,183,222,221,219,215,238,237,235,231),touche
				do loop while octetlu <240		;attente relachement
				if touche <=maxi and touche>=mini then retour	;si on est dans la fourchette, on sort. Sinon, on continue
				goto retour
			else 											;ce else ne sert à rien
				serout lcd,n2400,(254,192," ")	;simu bug si on supprime le else ???
			endif
			poidsfaible=poidsfaible*2	;décalage du 0 à gauche (futur 1...)
		next
	loop
retour:
	return
MM
 

cemoa

Member
toujours le clavier 16 touches

Bonsoir MGU
il semble que le code qui permet le bon affichage soit:

'__________________________________________________________________________________________
'lookdown octetlu,(126,125,123,119,190,189,187,183,222,221,219,215,238,237,235,231),touche
'------------------------------------------------------------------------------------------
lookdown octetlu,(238,222,190,126, 237,221,189,125, 235,219,187,123, 231,215,183,119),touche
do loop while octetlu <255 ;attente relachement

Je ne sais pas pourquoi, peut-être est-ce en relation avec le PCF, en tout cas c'est ce qui s'approche le plus de la réalité avec le simulateur proteus VSM. comme tu me le suggère, je teste aussi sur tablette de cablage rapide, mais j'aime bien avant être sur de la solution avant les essais physiques en utilisant le simulateur.
Je ne parviens pas à joindre les copies d'écran du simulateur, désolé.
Merci encore
JCD
 

PieM

Senior Member
Bonsoir MGU
il semble que le code qui permet le bon affichage soit:

'__________________________________________________________________________________________
'lookdown octetlu,(126,125,123,119,190,189,187,183,222,221,219,215,238,237,235,231),touche
'------------------------------------------------------------------------------------------
lookdown octetlu,(238,222,190,126, 237,221,189,125, 235,219,187,123, 231,215,183,119),touche
do loop while octetlu <255 ;attente relachement

Je ne sais pas pourquoi, peut-être est-ce en relation avec le PCF, en tout cas c'est ce qui s'approche le plus de la réalité avec le simulateur proteus VSM. comme tu me le suggère, je teste aussi sur tablette de cablage rapide, mais j'aime bien avant être sur de la solution avant les essais physiques en utilisant le simulateur.
Je ne parviens pas à joindre les copies d'écran du simulateur, désolé.
Merci encore
JCD
Ce n'est pas possible que do loop while octetlu <255 fonctionne!
il faut être logique; octetlu est forcement <255, car le hi2cout (temp) ne peut être égal à 255, son complément poids faible étant compris entre 1 et 8!
Après, l'ordre du lookdown est lié au câblage clavier <-> sorties PCF.
Pour ce qui me concerne, l'ancien programme ne fonctionnait pas correctement sous VSM.
 
Top