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

MGU

Senior Member
Le bon ordre dans le lookdown dépend du câblage du clavier et de la disposition des touches. la variable "touche" retourne une valeur de 0 à 15, il faut ordonner les combinaisons du lookdown suivant la touche appuyée.

Détail: dans le programme original, les R de lookup sur les poids forts de pinsC forçaient les poids à 1
Ici, il faut veiller à ce que les décalages ne poussent pas un 0 dans les poids forts . La modif |%11110000 (| = OU logique) fait la même chose en forçant les poids forts à 1 avant l'envoi au¨PCF

255 n'est pas la bonne valeur. Je vais essayer d'expliquer pourquoi.
l'octet envoyé au clavier est %11111110 ou 11111101 ou 11111011 ou 11110111. ces octets sont tous >240
Si aucune touche n'est appuyée, cet octet revient tel quel , octetlu N'EST PAS < 240, le test est négatif, et on tourne.
SI on appuie sur une touche: Un des 1 du poids fort est connectée à un 0 du poids faible (doit falloir des R de pullup sur les broches du clavier reliées au poids forts ?) , l'octet lu contient alors deux 0.
Pa ex : 11011011 . Avec ce 0 dans les poids forts, octetlu est < 240 . Le test est positif, on entre dedans...et je m’aperçois qu'on va y rester parce que octetlu ne va pas changer...
Faut donc tester le relâchement de touche autrement.

A suivre....

MM
 

PieM

Senior Member
Michel,
en fait le décalage ne risque pas d'aller sur les poids forts, car poidsfaible est réinitialisé à 1 tous les 4 décalages à gauche. Donc le |%11110000 ne me semble pas nécessaire.
Ensuite, concernant le test d'appui d'une touche, une autre façon consiste à tester l'entrée et la sortie du PCF; donc tester
If reserved <> temp then ...lookdown....
A partir du moment ou on a la valeur de la touche, il faut refaire un HI2IN jusqu'à temps d'avoir xxxx1111 1111xxxx dans un do loop.
 
Last edited:

MGU

Senior Member
Oui bon, pas de soucis pour l'appui, c'est le relâchement le problème.
Alors, j'ai mis un flag pour ne traiter le test positif qu'au relâchement, en attendant mieux.
Le "OU" ne sert effectivement à rien

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 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 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   ;
		hi2cout [io_adr],(temp)	;envoi octet
		hi2cin [io_adr],(octetlu)	;test sur retour octet		
			if octetlu <240 and flag=0	then	;pins < 11110000 (240) càd une touche appuyée, premier passage			
				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								
				flag=0
				if touche <=maxi and touche>=mini then retour				
			endif
			poidsfaible=poidsfaible*2	;décalage du 0 à gauche (futur 1...)
		next
	loop
retour:
	return
MM
 
Last edited:

cemoa

Member
Bonjour MGU
Super ton code, il fonctionne avec ISIS VSM, je n'ai pas essayé avec Proteus8.
J'ai ajouté des pauses car il semble que le relâchement des touches provoque l'avance du programme, il faut certainement jouer sur les durées de pause, pour une lecture stable des touches.
J'ai aussi ajouté du code pour commander les sorties des PCF8574A, pour le moment limité à 32 aiguillages, 2 zones d'éclairage et 6 départs de voie des gares, en attendant le développement de la maquette
Depuis 1 heure j'essaie en vain de copier le code comme tu l'as indiqué. J'espère cette fois y arriver! A toute fin utile, je joins tout de même les fichiers.
Je renonce pour le moment!
Je m'y prend certainement mal, je ne pige pas, voici le message retourné: Le texte que vous avez entré est trop long (32152 caractères). Veuillez le raccourcir à 10000 caractères.
faut'il dans ce cas partager le fichier en 4 morceaux ?
encore merci et bonne journée
JCD
 

Attachments

MGU

Senior Member
Bonjour,

Ah, ces claviers... il peut y avoir des rebonds et des mauvais contacts (16 touches = 16 mauvais contacts potentiels). On imagine un montage où les classes s'affichent en clair sur un petit LCD, avec un choix limité aux possibilités réelles, pas de mauvais contacts, pas d'erreurs...mais c'est un rêve...

Les textes .bas sont des textes "ordinaires", écrits dans un éditeur. Normalement, on sélectionne le texte, clic droit "copier", on va dans un autre éditeur clic droit "coller", c'est tout.

Bonne bidouille

MM
 

MGU

Senior Member
Voici le code posté en #44

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 io_adr7 = $7b	'i2c addresse du 6?me pcf8574ap en lecture
symbol io_adr8 = $7d	'i2c addresse du 7?me pcf8574ap en lecture
symbol io_adr9 = $7f	'i2c addresse du 8?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 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 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 100
	
		if classe="a" and nombre=01 then
			hi2cout [io_adr2],(1)   'aiguillage n?1
			pause 500
		elseif classe="a" and nombre=02 then
			hi2cout [io_adr2],(2)	'aiguillage n?2
			pause 500
		elseif classe="a" and nombre=03 then
			hi2cout [io_adr2],(4)	'aiguillage n?3
			pause 500
		elseif classe="a" and nombre=04 then
			hi2cout [io_adr2],(8)	'aiguillage n?4
			pause 500
		elseif classe="a" and nombre=05 then
			hi2cout [io_adr2],(16)	'aiguillage n?5
			pause 500
		elseif classe="a" and nombre=06 then
			hi2cout [io_adr2],(32)	'aiguillage n?6
			pause 500
		elseif classe="a" and nombre=07 then
			hi2cout [io_adr2],(64)	'aiguillage n?7
			pause 500
		elseif classe="a" and nombre=08 then
			hi2cout [io_adr2],(128)	'aiguillage n?8
			pause 500			
		elseif classe="a" and nombre=09 then
			hi2cout [io_adr3],(1)	'aiguillage n?9
			pause 500
		elseif classe="a" and nombre=10 then
			hi2cout [io_adr3],(2)	'aiguillage n?10
			pause 500			
		elseif classe="a" and nombre=11 then
			hi2cout [io_adr3],(4)	'aiguillage n?11
			pause 500
		elseif classe="a" and nombre=12 then
			hi2cout [io_adr3],(8)	'aiguillage n?12
			pause 500		
		elseif classe="a" and nombre=13 then
			hi2cout [io_adr3],(16)	'aiguillage n?13
			pause 500
		elseif classe="a" and nombre=14 then
			hi2cout [io_adr3],(32)	'aiguillage n?14
			pause 500
		elseif classe="a" and nombre=15 then
			hi2cout [io_adr3],(64)	'aiguillage n?15
			pause 500
		elseif classe="a" and nombre=16 then
			hi2cout [io_adr3],(128)	'aiguillage n?16
			pause 500	
		elseif classe="a" and nombre=17 then
			hi2cout [io_adr4],(1)	'aiguillage n?17
			pause 500
		elseif classe="a" and nombre=18 then
			hi2cout [io_adr4],(2)	'aiguillage n?18
			pause 500
		elseif classe="a" and nombre=19 then
			hi2cout [io_adr4],(4)	'aiguillage n?19
			pause 500		
		elseif classe="a" and nombre=20 then
			hi2cout [io_adr4],(8)	'aiguillage n?20
			pause 500
		elseif classe="a" and nombre=21 then
			hi2cout [io_adr4],(16)	'aiguillage n?21
			pause 500			
		elseif classe="a" and nombre=22 then
			hi2cout [io_adr4],(32)	'aiguillage n?22
			pause 500
		elseif classe="a" and nombre=23 then
			hi2cout [io_adr4],(64)	'aiguillage n?23
			pause 500
		elseif classe="a" and nombre=24 then
			hi2cout [io_adr4],(128)	'aiguillage n?24
			pause 500		
		elseif classe="a" and nombre=25 then
			hi2cout [io_adr5],(1)	'aiguillage n?25
			pause 500
		elseif classe="a" and nombre=26 then
			hi2cout [io_adr5],(2)	'aiguillage n?26
			pause 500
		elseif classe="a" and nombre=27 then
			hi2cout [io_adr5],(4)	'aiguillage n?27
			pause 500
		elseif classe="a" and nombre=28 then
			hi2cout [io_adr5],(8)	'aiguillage n?28
			pause 500			
		elseif classe="a" and nombre=29 then
			hi2cout [io_adr5],(16)	'aiguillage n?29
			pause 500
		elseif classe="a" and nombre=30 then
			hi2cout [io_adr5],(32)	'aiguillage n?30
			pause 500
		elseif classe="a" and nombre=31 then
			hi2cout [io_adr5],(64)	'aiguillage n?31
			pause 500
		elseif classe="a" and nombre=32 then
			hi2cout [io_adr5],(128)	'aiguillage n?32
			pause 500
		elseif classe="a" and nombre=32 then
			hi2cout [io_adr5],(128)	'aiguillage n?32
			pause 500
		elseif classe="e" and nombre=01 then
			hi2cout [io_adr6],(1)	'zone ?clairage 1
			pause 500			
		elseif classe="e" and nombre=02 then
			hi2cout [io_adr6],(2)	'zone ?clairage 2
			pause 500
		elseif classe="b" and nombre=01 then
			hi2cout [io_adr6],(4)	'd?part voie 1, gare 1
			pause 500		
		elseif classe="b" and nombre=02 then
			hi2cout [io_adr6],(8)	'd?part voie 2, gare 1
			pause 500
		elseif classe="b" and nombre=03 then
			hi2cout [io_adr6],(16)	'd?part voie 3, gare 1
			pause 500			
		elseif classe="b" and nombre=04 then
			hi2cout [io_adr6],(32)	'd?part voie 1, gare 2
			pause 500
		elseif classe="b" and nombre=05 then
			hi2cout [io_adr6],(64)	'd?part voie 2, gare 2
			pause 500		
		elseif classe="b" and nombre=06 then
			hi2cout [io_adr6],(128)	'd?part voie 3, gare 2
			pause 500
			
	
	end if
	reset
lectouche:
	do	
		poidsfaible=%1			;init ? xxxx0001		
		for cpt=1 to 4 		;scann sur bits poids faible
			temp=not poidsfaible |%11110000  ;ex: not poids =xxxx1110 et ?crasement poid fort =11111110
		hi2cout [io_adr],(temp)	;envoi octet
		hi2cin [io_adr],(octetlu)	;test sur retour octet		
			if octetlu <240 and flag=0	then	;pins < 11110000 (240) c?d une touche appuy?e, premier passage		

				lookdown octetlu,(238,222,190,126, 237,221,189,125, 235,219,187,123, 231,215,183,119),touche		
				pause 20				
				flag=1
				'pause 20
			elseif octetlu > 240 and flag=1 then 		;rel?chement touche
				pause 5
				flag=0
				'pause 20
				if touche <=maxi and touche>=mini then retour				
			endif
			poidsfaible=poidsfaible*2	;d?calage du 0 ? gauche (futur 1...)
		next
	loop
retour:
	return
J'ai survolé le code ci dessus:

Comme l'a souligné Piem, le |%11110000 est à supprimé, il ne sert à rien (je l'ai corrigé dans #43 ).

Il me semble que le programme pourrait être "compacté" .

J'essayerais une pause 50 ou 100 entre hI2Cout et hI2Cin, pour voir . Je ne vois pas trop l'utilité ailleurs.

MM
 
Last edited:

PieM

Senior Member
Il me semble que le programme pourrait être "compacté" .
Oh que oui!
il suffit de voir que l'adresse du PCF est une fonction de nombre /8 pour chaque classe, et que la valeur écrite pour le PCF est le nombre de décalage d'un bit = à nombre //8.

En gardant une valeur numérique pour classe, une macro de 10 lignes permet de tout faire, et de remplacer plus de 120 lignes de code!
 

cemoa

Member
Pour les rebonds et mauvais contacts c'est bien vrai, mais ça peut facilement se traiter, j'en ai largement fait l'expérience, bon d'accord la solution des potars est la meilleure, mais pour le moment elle ne m'arrange pas, néanmoins pour un autre projet de distributeur audio/vidéo, c'est promis, c'est cette solution que j'adopterai.
Maintenant je passe au dessin du CI après validation sur une plaque de cablage dit rapide!

ben oui les textes.bas sont des textes ordinaires, mais peut-être que le chat qui se promène souvent sur mon bureau a bouffé le copie/collé de ma souris ou le CTRL/C et CTRL/V de mon clavier!!!
Bonne journée
JCD
 

cemoa

Member
Bonjour PIEM,

ça c'est sur je vais compacter, je ne travaille avec les Indoux qui écrivent des lignes pour facturer le + possible :rolleyes:les clients, mais là j'ai fait dans l'urgence de ma curiosité, avec du copie/collé c'est super sonique à écrire.
Bonne journée
JCD
 

MGU

Senior Member
Bonjour PIEM,

ça c'est sur je vais compacter, je ne travaille avec les Indoux qui écrivent des lignes pour facturer le + possible :rolleyes:les clients, mais là j'ai fait dans l'urgence de ma curiosité, avec du copie/collé c'est super sonique à écrire.
Bonne journée
JCD
Ce n'est pas non plus une critique, le programme a le mérite d'être clair, et tant que les limites de capacité ne sont pas atteintes , c'est juste une question d'esthétique.

Je me posais une autre question sur le câblage du réseau. Les liaisons I2C ont une distance limitée. Tout partira donc d'une console centrale. Ça va faire un sacré paquet de fils.
Il me semble possible de délocaliser les PCF aux endroits stratégiques avec une liaison RS232 et des décodeurs 08M2. Du point de vue de l&#8217;architecture, il serait très facile d'ajouter des "modules" PCF.
Enfin, c'est juste une idée, je ne connais pas la surface couverte par le projet...

MM
 

BESQUEUT

Senior Member
Ce n'est pas non plus une critique, le programme a le mérite d'être clair, et tant que les limites de capacité ne sont pas atteintes , c'est juste une question d'esthétique.
Oui tout à fait...
Cela dit, si le but est d'apprendre, autant prendre les bonnes habitudes...
Dans la structure :
Code:
[color=Blue]if [/color][color=Black]classe[/color][color=DarkCyan]=[/color][color=Red]"a" [/color][color=DarkCyan]and [/color][color=Black]nombre[/color][color=DarkCyan]=[/color][color=Navy]01 [/color][color=Blue]then
                  hi2cout [PLAIN][[/PLAIN][/color][color=Black]io_adr2[/color][color=Blue][PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]1[/color][color=Blue])   [/color][color=Green]'aiguillage n?1
                  [/color][color=Blue]pause [/color][color=Navy]500
            [/color][color=Blue]elseif [/color][color=Black]classe[/color][color=DarkCyan]=[/color][color=Red]"a" [/color][color=DarkCyan]and [/color][color=Black]nombre[/color][color=DarkCyan]=[/color][color=Navy]02 [/color][color=Blue]then
                  hi2cout [PLAIN][[/PLAIN][/color][color=Black]io_adr2[/color][color=Blue][PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]2[/color][color=Blue])   [/color][color=Green]'aiguillage n?2
                  [/color][color=Blue]pause [/color][color=Navy]500
            [/color][color=Blue]elseif [/color][color=Black]classe[/color][color=DarkCyan]=[/color][color=Red]"a" [/color][color=DarkCyan]and [/color][color=Black]nombre[/color][color=DarkCyan]=[/color][color=Navy]03 [/color][color=Blue]then
                  hi2cout [PLAIN][[/PLAIN][/color][color=Black]io_adr2[/color][color=Blue][PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]4[/color][color=Blue])   [/color][color=Green]'aiguillage n?3
                  [/color][color=Blue]pause [/color][color=Navy]500
            [/color][color=Blue]elseif [/color][color=Black]classe[/color][color=DarkCyan]=[/color][color=Red]"a" [/color][color=DarkCyan]and [/color][color=Black]nombre[/color][color=DarkCyan]=[/color][color=Navy]04 [/color][color=Blue]then
                  hi2cout [PLAIN][[/PLAIN][/color][color=Black]io_adr2[/color][color=Blue][PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]8[/color][color=Blue])   [/color][color=Green]'aiguillage n?4
                  [/color][color=Blue]pause [/color][color=Navy]500[/color]
La pause est présente dans tous les cas. Donc on peut la mettre après le test, et donc une seule au lieu de 41.
Par ailleurs, je suspecte fort que cette pause soit inutile et puisse même nuire à la réactivité du programme.

En ce qui concerne les tests, et tout en restant bestial, il me semble que séparer les différents cas de figure améliorerait la lisibilité et réduirait le nombre de lignes :
Code:
            [color=Blue]if [/color][color=Black]classe[/color][color=DarkCyan]=[/color][color=Red]"a" [/color][color=Blue]then
                  if [/color][color=Black]nombre[/color][color=DarkCyan]=[/color][color=Navy]01 [/color][color=Blue]then
                        hi2cout [PLAIN][[/PLAIN][/color][color=Black]io_adr2[/color][color=Blue][PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]1[/color][color=Blue])   [/color][color=Green]'aiguillage n?1
      
                  [/color][color=Blue]elseif [/color][color=Black]nombre[/color][color=DarkCyan]=[/color][color=Navy]02 [/color][color=Blue]then
                        hi2cout [PLAIN][[/PLAIN][/color][color=Black]io_adr2[/color][color=Blue][PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]2[/color][color=Blue])   [/color][color=Green]'aiguillage n?2

                  [/color][color=Blue]elseif [/color][color=Black]nombre[/color][color=DarkCyan]=[/color][color=Navy]03 [/color][color=Blue]then
                        hi2cout [PLAIN][[/PLAIN][/color][color=Black]io_adr2[/color][color=Blue][PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]4[/color][color=Blue])   [/color][color=Green]'aiguillage n?3

                  [/color][color=Blue]elseif [/color][color=Black]nombre[/color][color=DarkCyan]=[/color][color=Navy]04 [/color][color=Blue]then
                        hi2cout [PLAIN][[/PLAIN][/color][color=Black]io_adr2[/color][color=Blue][PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]8[/color][color=Blue])   [/color][color=Green]'aiguillage n?4

                  [/color][color=Black]...
                  [/color][color=Blue]elseif [/color][color=Black]nombre[/color][color=DarkCyan]=[/color][color=Navy]32 [/color][color=Blue]then
                        hi2cout [PLAIN][[/PLAIN][/color][color=Black]io_adr5[/color][color=Blue][PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]128[/color][color=Blue]) [/color][color=Green]'aiguillage n?32

            [/color][color=Blue]elseif [/color][color=Black]classe[/color][color=DarkCyan]=[/color][color=Red]"e" [/color][color=Blue]then
                  if [/color][color=Black]nombre[/color][color=DarkCyan]=[/color][color=Navy]01 [/color][color=Blue]then
                        hi2cout [PLAIN][[/PLAIN][/color][color=Black]io_adr6[/color][color=Blue][PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]1[/color][color=Blue])   [/color][color=Green]'zone ?clairage 1
            
                  [/color][color=Blue]elseif [/color][color=Black]nombre[/color][color=DarkCyan]=[/color][color=Navy]02 [/color][color=Blue]then
                        hi2cout [PLAIN][[/PLAIN][/color][color=Black]io_adr6[/color][color=Blue][PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]2[/color][color=Blue])   [/color][color=Green]'zone ?clairage 2
            
            [/color][color=Blue]elseif [/color][color=Black]classe[/color][color=DarkCyan]=[/color][color=Red]"b" [/color][color=Blue]then
                  if [/color][color=Black]nombre[/color][color=DarkCyan]=[/color][color=Navy]01 [/color][color=Blue]then
                        hi2cout [PLAIN][[/PLAIN][/color][color=Black]io_adr6[/color][color=Blue][PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]4[/color][color=Blue])   [/color][color=Green]'d?part voie 1, gare 1
      
                  [/color][color=Blue]elseif [/color][color=Black]nombre[/color][color=DarkCyan]=[/color][color=Navy]02 [/color][color=Blue]then
                        hi2cout [PLAIN][[/PLAIN][/color][color=Black]io_adr6[/color][color=Blue][PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]8[/color][color=Blue])   [/color][color=Green]'d?part voie 2, gare 1

                  [/color][color=Blue]elseif [/color][color=Black]nombre[/color][color=DarkCyan]=[/color][color=Navy]03 [/color][color=Blue]then
                        hi2cout [PLAIN][[/PLAIN][/color][color=Black]io_adr6[/color][color=Blue][PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]16[/color][color=Blue])  [/color][color=Green]'d?part voie 3, gare 1
            
                  [/color][color=Blue]elseif [/color][color=Black]nombre[/color][color=DarkCyan]=[/color][color=Navy]04 [/color][color=Blue]then
                        hi2cout [PLAIN][[/PLAIN][/color][color=Black]io_adr6[/color][color=Blue][PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]32[/color][color=Blue])  [/color][color=Green]'d?part voie 1, gare 2

                  [/color][color=Blue]elseif [/color][color=Black]nombre[/color][color=DarkCyan]=[/color][color=Navy]05 [/color][color=Blue]then
                        hi2cout [PLAIN][[/PLAIN][/color][color=Black]io_adr6[/color][color=Blue][PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]64[/color][color=Blue])  [/color][color=Green]'d?part voie 2, gare 2

                  [/color][color=Blue]elseif  [/color][color=Black]nombre[/color][color=DarkCyan]=[/color][color=Navy]06 [/color][color=Blue]then
                        hi2cout [PLAIN][[/PLAIN][/color][color=Black]io_adr6[/color][color=Blue][PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]128[/color][color=Blue]) [/color][color=Green]'d?part voie 3, gare 2
                  [/color][color=Blue]endif
      
            end if
            pause [/color][color=Navy]500[/color]
Les liaisons I2C ont une distance limitée.
Certes,... mais il ne faut rien exagérer : avec du fil de bonne qualité, le BUS I2C reste stable sur plusieurs mètres, et peut aussi jouer sur la vitesse du bus en cas de soucis.
Par ailleurs, le "noeud I2C=PCF..." est commun à plusieurs aiguillage : le câblage peut partir en étoile ou en bus depuis la console, puis en étoile depuis chaque noeud vers les aiguilles sur plusieurs mètres.
En supposant la console à peu près au centre du plateau (ce qui semble logique...) et disons 3m vers les n&#339;uds et 3 autres mètres vers les aiguillages, ça nous fait un plateau d'au moins 10 m de large. Si M. Cemoa nous dit que son plateau est nettement plus grand que ça, alors oui, il faut investiguer un peu plus précisément.
 
Last edited:

cemoa

Member
Bonsoir PIEM,

En effet les liaisons I2C sont prévue pour des courtes distances, à l'origine il me semble que c'était prévu exclusivement entre composants d'une même carte d'un téléviseur par exemple ou de plusieurs cartes sur une carte mère, depuis l'industrie automobile l'utilise entre composants distants, environ 4 à 5 m en utilisant si besoin des transitors genre ULN28..., maintenant ils en sont à la fibre optique je crois, comme chez les allemands les français je ne sais pas. Il y a déjà un moment que je ne suis plus dans la course.

Pour ma maquette, les circuits de commande des aiguillages sont sous la maquette proche des appareils. J'ai prévu plusieurs bus d'alimentation 2x12V pour l'électronique, les cartes sont équipées avec un régulateur 5V, 18V pour les aiguillages et autres, 24V pour la traction. Pour tout ce qui est commande, comme ce ne sont que des impulsions, j'utilise du câble en nappe, donc pour les distances entre liaisons maximum 3 m, je passerai par des opto-coupleurs genre CNY, ce que j'ai déjà fait sans problème pour le pont tournant.

Ci-joint 2 photos pour donner une idée de la grandeur de la maquette, l'encombrement au sol est 3m X 2m70 soit grosso modo 9 m² et 1m60 en élévation.
Bonne soirée et encore un grand merci au forum pour l'intérêt porté à mon projet.
JCD
PS Je ne suis pas certain que les 2 photos soient bien téléchargées
pas moyen de télécharger 2 photo de taille très réduite en GIF et aussi Les téléchargements non utilisés dans une heure seront supprimés, ok mais alors pourquoi certains inutilisés depuis bien longtemps sont encore là? et bien sur pas moyen de les supprimer manuellement, ou bien je n'ai pas pigé la manip.
Bon c'est l'heure syndicale dons il fera jour demain!
 
Last edited:

cemoa

Member
Bonsoir Besqueut

Si, si, ma pause 500 est très utile pour le développement du programme, elle me laisse simplement le temps de visualiser la sortie sur les leds montées sur la plaque de câblage rapide, ensuite je la baisserai à 10 ou 20 pour laisser le temps à l'aiguillage d'enregistrer la commande, et peut-être même qu'il n'y aura pas du tout de pause, c'est à voir pendant les essais. si j'ai écrit le programme de cette façon, c'est simplement dans l'urgence de ma curiosité, après, c'est promis je ferai comme il faut dans l'art et la tradition, en commençant comme a fait remarquer PIEM par compacter tout le programme. Je trouve super et sympa toutes les remarques et suggestions, ça prouve l'intérêt du forum.
Bonne soirée à tout le forum
JCD
 

BESQUEUT

Senior Member
Autre variante du même code avec SELECT CASE au lieu du IF :
Code:
            [color=Blue]select case [/color][color=Purple]classe
            [/color][color=Blue]case [/color][color=Red]"a"
                  [/color][color=Blue]select case [/color][color=Purple]nombre 
                        [/color][color=Blue]case [/color][color=Navy]1[/color][color=Black]:[/color][color=Blue]hi2cout [PLAIN][[/PLAIN]io_adr2[PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]1[/color][color=Blue])   [/color][color=Green]'aiguillage n?1
                        [/color][color=Blue]case [/color][color=Navy]2[/color][color=Black]:[/color][color=Blue]hi2cout [PLAIN][[/PLAIN]io_adr2[PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]2[/color][color=Blue])  [/color][color=Green]'aiguillage n?2
                        [/color][color=Blue]case [/color][color=Navy]3[/color][color=Black]:[/color][color=Blue]hi2cout [PLAIN][[/PLAIN]io_adr2[PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]4[/color][color=Blue])  [/color][color=Green]'aiguillage n?3
                        [/color][color=Blue]case [/color][color=Navy]4[/color][color=Black]:[/color][color=Blue]hi2cout [PLAIN][[/PLAIN]io_adr2[PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]8[/color][color=Blue])  [/color][color=Green]'aiguillage n?4
      '           ...
                        [/color][color=Blue]case [/color][color=Navy]32[/color][color=Black]:[/color][color=Blue]hi2cout [PLAIN][[/PLAIN]io_adr5[PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]128[/color][color=Blue])     [/color][color=Green]'aiguillage n?32
                  [/color][color=Blue]endselect

            case [/color][color=Red]"e"
                  [/color][color=Blue]select case [/color][color=Purple]nombre
                        [/color][color=Blue]case [/color][color=Navy]1[/color][color=Black]:[/color][color=Blue]hi2cout [PLAIN][[/PLAIN]io_adr6[PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]1[/color][color=Blue])  [/color][color=Green]'zone ?clairage 1
                        [/color][color=Blue]case [/color][color=Navy]2[/color][color=Black]:[/color][color=Blue]hi2cout [PLAIN][[/PLAIN]io_adr6[PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]2[/color][color=Blue])  [/color][color=Green]'zone ?clairage 2
                  [/color][color=Blue]endselect
            
            case[/color][color=Red]"b"
                  [/color][color=Blue]select case [/color][color=Purple]nombre 
                  [/color][color=Blue]case [/color][color=Navy]1[/color][color=Black]:[/color][color=Blue]hi2cout [PLAIN][[/PLAIN]io_adr6[PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]4[/color][color=Blue])  [/color][color=Green]'d?part voie 1, gare 1
                  [/color][color=Blue]case [/color][color=Navy]2[/color][color=Black]:[/color][color=Blue]hi2cout [PLAIN][[/PLAIN]io_adr6[PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]8[/color][color=Blue])  [/color][color=Green]'d?part voie 2, gare 1
                  [/color][color=Blue]case [/color][color=Navy]3[/color][color=Black]:[/color][color=Blue]hi2cout [PLAIN][[/PLAIN]io_adr6[PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]16[/color][color=Blue]) [/color][color=Green]'d?part voie 3, gare 1
                  [/color][color=Blue]case [/color][color=Navy]4[/color][color=Black]:[/color][color=Blue]hi2cout [PLAIN][[/PLAIN]io_adr6[PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]32[/color][color=Blue]) [/color][color=Green]'d?part voie 1, gare 2
                  [/color][color=Blue]case [/color][color=Navy]5[/color][color=Black]:[/color][color=Blue]hi2cout [PLAIN][[/PLAIN]io_adr6[PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]64[/color][color=Blue]) [/color][color=Green]'d?part voie 2, gare 2
                  [/color][color=Blue]case [/color][color=Navy]6[/color][color=Black]:[/color][color=Blue]hi2cout [PLAIN][[/PLAIN]io_adr6[PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Navy]128[/color][color=Blue])      [/color][color=Green]'d?part voie 3, gare 2
                  [/color][color=Blue]endselect
      
            endselect
            pause [/color][color=Navy]500[/color]
Est-ce réellement plus long à écrire ?
si j'ai écrit le programme de cette façon, c'est simplement dans l'urgence de ma curiosité, après, c'est promis je ferai comme il faut dans l'art et la tradition, en commençant comme a fait remarquer PIEM par compacter tout le programme.
Comme dit par Piem, il y a moyen de simplifier pas mal :
Code:
            [color=Purple]temp[/color][color=DarkCyan]=[/color][color=Purple]nombre[/color][color=DarkCyan]-[/color][color=Navy]1[/color][color=DarkCyan]//[/color][color=Navy]8
            [/color][color=Blue]if [/color][color=Purple]classe[/color][color=DarkCyan]=[/color][color=Red]"a" [/color][color=Blue]then
                  [/color][color=Purple]adr[/color][color=DarkCyan]=[/color][color=Blue]io_adr2 
            else 
                  [/color][color=Purple]adr[/color][color=DarkCyan]=[/color][color=Blue]io_adr6
            endif
      
            if [/color][color=Purple]classe [/color][color=DarkCyan]=[/color][color=Red]"b" [/color][color=Blue]then [/color][color=Purple]temp[/color][color=DarkCyan]=[/color][color=Purple]temp[/color][color=DarkCyan]+[/color][color=Navy]2
            [/color][color=Purple]temp[/color][color=DarkCyan]=[/color][color=Navy]1[/color][color=DarkCyan]<<[/color][color=Purple]temp
            adr[/color][color=DarkCyan]=[/color][color=Purple]nombre[/color][color=DarkCyan]-[/color][color=Navy]1[/color][color=DarkCyan]/[/color][color=Navy]8[/color][color=DarkCyan]*[/color][color=Navy]2[/color][color=DarkCyan]+[/color][color=Purple]adr
            [/color][color=Blue]hi2cout [PLAIN][[/PLAIN][/color][color=Purple]adr[/color][color=Blue][PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Purple]temp[/color][color=Blue])

            pause [/color][color=Navy]500[/color]
Pour le coup, même avec des copier/coller, ça me semble plutôt plus court à écrire ?
 
Last edited:

cemoa

Member
Pour le coup, même avec des copier/coller, ça me semble plutôt plus court à écrire ?[/QUOTE]

Bonjour BESQUEUT
Bien sur que c'est votre solution qui est parfaitement académique, dans l'art et la tradition, c'était mon objectif de ce matin, mais puisque vous l'avez fait pendant mon sommeil réparateur je ne vais pas réinventer la poudre à éternuer, donc, si ça ne vous dérange pas, je vais faire un copie/coller en modifiant la lettre de "classe" par son code (a-> 97, b->98 etc.....), parce que le 20X2 refuse classe="a", classe="b" mais accepte classe=97, classe=98....
C'est super, c'est un vrai travail d'équipe sur ce forum.
Dans l'immédiat je vais essayer de terminer mon programme de la nuit encore 1 heure ou 2.
Bon dimanche et encore merci pour l'aide précieuse du forum
JCD
 

PieM

Senior Member
Je suis un peu surpris par l'approche faite dans l'utilisation du clavier, qui me semble manquer totalement d'ergonomie;
De fait, toute entrée clavier, même erronée conduit irrésistiblement à une activation d'une sortie d'un PCF. Aucun repentir possible!
Certes, une catastrophe ferroviaire ne fera pas de victime. Mais quand même !
A titre personnel, j'ai une toute autre manière d'utiliser un clavier sur mes réalisations.
Tout d'abord, le choix de l'item (classe ici) se fait par balayage d'un menu en clair par deux touches < et > sur un clavier 4x4.
- Afficher "Aiguillage" au lieu de "classe a" est plus causant, et ne nécessite pas l'utilisation d'un lexique.
- Le nombre d'items n'est pas limité par le nombre de touches clavier.
Le choix se fait par une touche validation (touche * pour moi)
La saisie d'une valeur numérique est également validée ou corrigée par une touche correction/annulation (touche # pour moi)
il est possible de corriger ainsi toute frappe erronée.

Une fois tous les éléments sélectionnés, il y a toujours une validation globale pour action, ou annulation possible.
Cette méthode permet même d'utiliser un clavier 4x3 touches, en utilisant la touche # pour le balayage menu.

Je ne saisi pas trop non plus la méthode liée aux commandes via les sorties PCF.
Je pensais que l'état de chaque PCF était l'image des sorties puissance correspondantes.
Or là, il n'en est rien puisque à chaque commande, on met toutes les sorties sauf une à 0.
 
Last edited:

cemoa

Member
Bonjour PIEM,
vos remarques sont pour quel code? je n'ai pas encore essayé le dernier code de BESQUEUT. Avec le programme de MGU modifié en urgence à ma sauce il était impératif de choisir en premier une classe( aiguillage ou gare, ou éclairage) puis 1 numéro d'appareil pour valider, ce qui fonctionne parfaitement sans risque d'erreur sur la plaque d'essai dit câblage rapide. Je pense qu'il est possible d'inverser les commandes en commençant par composer un N° d'appareil puis valider par la classe.

Ce clavier n'est que le répétiteur du clavier de l'ordinateur, à la limite on peut se passer des commandes de l'ordi, et continuer d'afficher toutes les infos sur l'écran, c'est peut-être un peu compliqué à expliquer, mais c'est ainsi que ça se passe pour le moment, bien sur il y a une interface en rs232 pour le moment entre la maquette et l'ordi, code en VB6 peut-être prochainement en python. Comme j'ai toujours une nouvelle idée en tête, ou bien qu'il m'en est suggéré d'autres le bidule évolue en permanence.

Maintenant c'est bien la démarche de BESQUEUT que j'avais entête pour compacter le programme comme vous l'avez conseillé.

ouf j'ai réussi à joindre les photos, en fait je me suis aperçu que la taille maximum des images ne peut dépasser 19,5 kO.
Bon dimanche
JCD

Maquette3.gif Maquette1.gif
 
Last edited:

PieM

Senior Member
Ignorant la structure d'ensemble de votre programme de gestion avec des entrées multiples, PC, clavier, et autres, ma remarque ne concerne que le sujet abordé, à savoir le clavier.

J'ai cru comprendre que ce clavier, comme le titre le sous entend, était destiné à commander des aiguillages et autres sorties.
Donc ma réflexion porte sur le fait que le programme clavier tel qu'il est construit, conduit obligatoirement à une écriture HI2Cout, donc à l'activation de quelque chose. Sans correction possible.
Vous parlez de validation, mais il n'y a pas de validation par une action volontaire sur une touche particulière.
Sur votre schéma DSN, aucune touche n'est affectée à corriger ou valider.
Imaginez un téléphone à touches sur lequel dès que vous avez composé 10 chiffres , bon ou mauvais, l'appel se lancerait automatiquement, sans possibilité d'arrêter.
 

MGU

Senior Member
Bonjour,

Pour les photos, j'utilise Light Image Resizer, gratuit et très efficace, poids divisé par 10 sans dégradation apparente.

Dans mon code, on entre: classe /dizaines/ unités (c'était l'ordre qui me semblait logique). Mais en inversant l'ordre, on peut taper un chiffre et si le deuxième caractère est une classe (càd >10), on valide. C'est le seul intérêt que je vois dans l'inversion.

Je suis de l'avis de PieM, il faut introduire une procédure d'annulation en cas d'erreur de frappe, les erreurs sont inévitables et il faut un moyen d'en sortir. Un poussoir sur interruption par ex.

MM
 

BESQUEUT

Senior Member
Je suis de l'avis de PieM, il faut introduire une procédure d'annulation en cas d'erreur de frappe, les erreurs sont inévitables et il faut un moyen d'en sortir. Un poussoir sur interruption par ex.
Why not ?
Cela dit, soit il s'agit d'un sujet d'étude pour voir les différentes façons d'interfacer un clavier, et l'ergonomie est secondaire,
Soit ce montage a un but réel, et il me semble (comme déjà dit) que la meilleure ergonomie serait de travailler directement sur le synoptique à l'écran. Dans ce cas, pas besoin de clavier, et le Picaxe ne sert que d'interface entre l'ordi et les aiguillages...

ouf j'ai réussi à joindre les photos, en fait je me suis aperçu que la taille maximum des images ne peut dépasser 19,5 kO.
Ce n'est pas une raison pour réduire les images à 100x75 pixels : c'est timbrepostoïdal !
Préférez garder une taille raisonnable (genre 1024x768), mais utilisez une compression efficace, genre jpeg...
Bonjour PIEM,
vos remarques sont pour quel code? je n'ai pas encore essayé le dernier code de BESQUEUT.
Sauf erreur de ma part, les différents codes proposés ne sont que des ré-écritures de la même chose : ça ne devrait strictement rien changer à l'ergonomie d'ensemble. Comme dit plus haut, l'idée est d'illustrer différentes techniques de programmation. Par contre, si on veut parler d'ergonomie, il faut commencer par décrire le contexte, le ou les utilisateurs et les objectifs visés...
En première approche, un petit dessin valant mieux qu'un long discours, les techniques WISIWIG et donc l'utilisation d'un écran graphique semblent bien adaptées si disponibles (que ce soit sur un PC ou une tablette...)
Mais bon, c'est aussi affaire de goût : j'en connait qui préfèrent la ligne de commande aux interfaces graphiques...
 
Last edited:

PieM

Senior Member
Il me semblait que la question de la validation ou annulation d'une commande faite à partir d'un clavier dépassait la simple notion d'ergonomie.
Sur tout appareil sur lequel on rentre des informations, il y a une touche pour valider ce qu'on a tapé, avant de lancer une action. Mais chacun l'entend comme il veut.

Quant à son interfaçage, pour moi c'est clair depuis le début, il se fait par un balayage ligne colonne via un PCF8574 en I2C.

Soit ce montage a un but réel, et il me semble (comme déjà dit) que la meilleure ergonomie serait de travailler directement sur le synoptique à l'écran. Dans ce cas, pas besoin de clavier,
Donc si l'objectif d'utiliser un clavier est réel, (ce qui est le sujet de ce fil) il convient d'utiliser autre chose ...
On dirait du shadok ! :rolleyes:
 

BESQUEUT

Senior Member
Donc si l'objectif d'utiliser un clavier est réel, (ce qui est le sujet de ce fil) il convient d'utiliser autre chose ...
On dirait du shadok ! :rolleyes:
Bien vu : je me suis mal exprimé. Il fallait lire
"Si le but du projet est de commander réellement un plateau ferroviaire..."
et dans ce cas, il serait effectivement préférable d'ouvrir un autre thread.
Le sujet du présent thread serait plutôt :
"Quelle est la moins mauvaise solution pour utiliser un clavier afin de commander un plateau ferroviaire"
C'est aussi du Shadok...
Celà dit, en #3 et #21 il est question d'autres approches, et en #30 la volonté d'apprendre est clairement exprimée.
 
Last edited:

cemoa

Member
Bonsoir BESQUEUT,
Désolé, mais mes images même au format ticket de métro au lieu de timbre poste sont trop lourdes pour le site! En utilisant Light Image Resizer, c'est pas mieux!
Bonne soirée
JCD
 

BESQUEUT

Senior Member
Bonsoir BESQUEUT,
Désolé, mais mes images même au format ticket de métro au lieu de timbre poste sont trop lourdes pour le site! En utilisant Light Image Resizer, c'est pas mieux!
Bonne soirée
JCD
Quel logiciel et quel compression utilisez vous ?
Avez-vous essayé Paint/Enregistrer sous/JPEG ?
 

cemoa

Member
Bien sur, d'autant qu'à l'origine c'est du JPEG, converti au format gif, mais le site a dit 19,5Ko donc c'est 19,5Ko pas plus

Tout à fait d'accord avec vous, je sujet est le clavier, pas la maquette, bien que j'ai déjà utilisé un 18m2 pour synchroniser des aiguillages et un 20m2 pour piloter le pont tournant toujours en utilisant le bus I2C mais uniquement en écriture.
Je dois vite installer le clavier avant Nöel, pour que les petits, les grands aussi puissent appuyer sur des boutons
Bonne soirée
 

BESQUEUT

Senior Member
Bien sur, d'autant qu'à l'origine c'est du JPEG, converti au format gif, mais le site a dit 19,5Ko donc c'est 19,5Ko pas plus
J'avoue ne pas comprendre...
gif est un format non compressé, donc logiquement une image minuscule pèse un poids terrible.
Pourquoi ne compressez vous pas une image "normale" en jpeg pour réduire son poids ?
Si vos images sont déjà en jpeg, pourquoi les avoir converti en gif ? Quelles sont les dimensions (en pixels) des images d'origine et leur poids ?
Si le poids d'une image jpeg est trop important, vous pouvez la ré-enregistrer, toujours en jpeg, mais en diminuant la qualité.
 

cemoa

Member
Bonjour MGU,

Peut-être que je n'applique pas la bonne méthode, j'ai repéré une balise "Insert Image" mais à chaque fois j'ai le message: taille fichier limité à 19,5Ko, et si je fait du copier/coller c'est la même chose. pouvez-vous m'expliquer votre méthode?

Bonne journée
JCD
 

cemoa

Member
Alors là je n'y comprend rien! hier pas moyen de télécharger les images, aujourd'hui avec la même méthode c'est passé comme une lettre à la poste quand il n'y pas de grève!! et sans limitation de taille de fichier!

bonne journée et bonne semaine
JCD

DSCN0058.JPG DSCN0057 (Copier).JPG
 

MGU

Senior Member
Bonjour,

Oui, c'est mieux, pour se rendre compte de l'ampleur de la tâche....
Bon bricolage

MM
 

zorgloub

Member
Bonsoir à la Communauté,

Je te propose de jeter un oeil sur une de mes études relative à la gestion des claviers matricés.
---> http://alpmn.byethost32.com/matrices.htm
J'arrive à gérer 112 switches sur 8 bits !
Ca pourrait peut-être t'aider et t'ouvrir de nouvelles perspectives pour tes projets.
Bonne lecture à tous.
 

PieM

Senior Member
J'arrive à gérer 112 switches sur 8 bits !
Ca pourrait peut-être t'aider et t'ouvrir de nouvelles perspectives pour tes projets.
Bonne lecture à tous.
A ce stade, il vaut mieux utiliser un (vieux) clavier PS2 et l'instruction KBIN du picaxe ! 107 touches décodées avec deux E/S, et la possibilité d'utiliser les leds du clavier avec KBLED.
 

cemoa

Member
J'arrive à gérer 112 switches sur 8 bits !
Ca pourrait peut-être t'aider et t'ouvrir de nouvelles perspectives pour tes projets.

Bonjour zorgloub et à tous les Belges

je ne jette pas 1 oeil, mais 2, je ne veux pas risquer de ne pas tout voir!
En effet je suis très intéressé par ton étude.
D'abord le clavier à matrice carrée à diodes, sur ton schéma, est-ce les flèches qui représentes les diodes et leur position ou les flèches représentent-elles simplement les entrées et sorties pour les lignes et colonnes?
Il est vrai que les traitement de l'anti-rebond avec ce type de clavier est délicat, et surtout en utilisant 1 PCF8574 et le bus I2c, l'insertion de "pauses" semble insuffisant pour résoudre ce problème, je vais tester la préconisation de Piem en plaçant des capas en // sur les contacts.
Je fini par croire que MGU a raison en proposant de s'affranchir de l'anti-rebond en utilisant des potentiomètres à la place des touches.
Néanmoins ton étude m'intéresse pour traiter la détection de position des aiguillages que j'ai équipés de micro rupteurs, en effet détecter la position d'une quarantaine d'aiguillage n'est pas simple, ainsi que la position des convois en utilisant des contacts "ILS", et l'occupation des voies en utilisant de l'infra rouge, de l'effet hall, ou capteur de courant.
Merci pour ton étude et bonne journée
JCD
 

cemoa

Member
Anti stress pour anti rebond

Bonjour MGU,
voici des lignes de ton programme modifiées pour s'affranchir des "anti rebond". j'ai ajouté des "pause 20" après chaque flag et avant le traitement du retour. Pour le moment c'est efficace.
Je continue maintenant en passant aux essais physiques.
Je continuerai d'informer la communauté du développement de ce sujet
Bonne journée
JCD

Code:
[color=Black]lectouche:
   [/color][color=Blue]do 
      [/color][color=Black]poidsfaible[/color][color=DarkCyan]=[/color][color=Navy]%1       [/color][color=Green];init ? xxxx0001     
      [/color][color=Blue]for [/color][color=Black]cpt[/color][color=DarkCyan]=[/color][color=Navy]1 [/color][color=Blue]to [/color][color=Navy]4       [/color][color=Green];scann sur bits poids faible
         [/color][color=Black]temp[/color][color=DarkCyan]=not [/color][color=Black]poidsfaible   [/color][color=Green];
      [/color][color=Blue]hi2cout [PLAIN][[/PLAIN][/color][color=Black]io_adr[/color][color=Blue][PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Black]temp[/color][color=Blue]) [/color][color=Green];envoi octet
      [/color][color=Blue]hi2cin [PLAIN][[/PLAIN][/color][color=Black]io_adr[/color][color=Blue][PLAIN]][/PLAIN][/color][color=Black],[/color][color=Blue]([/color][color=Black]octetlu[/color][color=Blue])  [/color][color=Green];test sur retour octet  

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

cemoa

Member
Bonjour PieM
Certes pour l'utilisation en clavier autant faire comme tu dis avec un vieux clavier PS, mais l'étude de zorgloub reste intéressante pour traiter des capteurs distants tels que des ILS et autres capteurs.
Bonne journée
JCD
 

zorgloub

Member
Salutatoa Cémoa ;)

Ravi que mon étude t'aie intéressée.
C'est toujours gratifiant de savoir que les heures passées à une étude "pour le plaisir de mes neurones" seront utiles à d'autres :)
Sur mon schéma de la toute première matrice carrée (16touches/8bits) les flêches ne sont pas des diodes.
En "bon electronicien", les diodes sont des diodes ;)
Les petites flêches (sens) mentionnent soit des entrées, soit des sorties, suivant leurs orientations.
Si chaque switch doit commander un aiguillage avec mécanique à solenoïde, je ne pense pas que les rebonds se ressentent. Mais là, c'est ton domaine et ton expérience qui le vérifiera.
Impatient de voir ce que tu vas faire de tout ca !

A suivre ...

Cordiales salutations.
 

jojojo

Senior Member
@Zorgloub : Moi, j'ai dévoré tout ton site.
TRÈS intéressant.

Georges.
PS HS:
Le pseudo, c'est en rapport avec Spirou et Fantasio ?
 

cemoa

Member
Bonsoir zorgloub, Frankin et tous les autres
c'est bien ce qui me semblait une diode est une diode, mais alooooors quand tu parles des diodes tu les caches où ces diodes sur ton scéma? parce que là j'ai pas trouvé l'intrus!
pour ce qui concerne mon clavier 16 touches, je n'utilise pas de diode puisque j'utlilise un PCF8574 via le bus I2c.
Pour l'application de tes claviers matricés, c'est sur il va y avoir un moment de surchauffe méningique, mais pas tout de suite!
si, si, si les solénoïdes sont sensibles aux rebonds, si tu es intéressé j'ai posté en début de discussion le schéma de commande des aiguillages par impulsion, sans ça les bobines risque de rougir de tremblements incontrolables, et les transistors de rendre l'âme! Mais ceci dit l'objet de la discussion n'est pas l'électronique pour maquette ferroviaiare.
Bonne soirée
JCD
 

zorgloub

Member
Hello Cemoa,

Les diodes, on ne les utilise pas pour la simple matrice carrée (16touches/8bits)
Elles deviennent nécessaires pour les matrices plus complexes: Matrice carrée double (32touches/8bits), matrice triangulaire "polyphonique", triangulaire double, ... taritées plus bas sur ma page web.

Par ailleurs, une petite idée pour "éviter" les rebonds: traiter le problème par programmation de ton µProcesseur.

Principe:

Lire l'état du switch et le placer dans une variable
Pause de 20msec
Relire l'état du switch
IF l'état est identique à celui précédemment mémorisé THEN
-Le switch est stable et on garde la valeur
ELSE
-Le switch n'est pas stabilisé. Répéter la boucle jusqu'à obtention de la stabilité.
ENDIF

Un traitement par programme t'évite une mutitude de R/C à chaque switch.

@+++
----------------------------
 

PieM

Senior Member
Par ailleurs, une petite idée pour "éviter" les rebonds: traiter le problème par programmation de ton µProcesseur.
Pourquoi ne pas utiliser l'instruction BUTTON, qui a cette fonction d'implémentée ?
 
Top