branchement clavier matricé 12 ou 16 touches sur Picaxe

jominy

New Member
Bonsoir à tous
Je voudrais faire une télécommande.
Je voudrais savoir comment câbler un clavier matricé 3x4 touches (ou 4X4 peu importe) sur un picaxe : je ne pense pas qu'il faille brancher les colonnes et les lignes directement aux entrées sans ajouter des résistances ou des liaisons à la masse, pour avoir des niveaux logiques ''clairs'' ??
Merci
 
Last edited:

jominy

New Member
Bonjour à tous
Merci à Jojojo (montage très futé et très intéressant, mais qui complique trop mon projet (et mes compétences car j'apprend petit à petit), mais encore merci pour ton aide).
Je change de type de clavier car je vais utiliser un picaxe qui aura suffisamment de broches pour ce que je veux faire (un 20M2 ou 28X2)
Je dispose donc d'un clavier 12 touches (13 fils = 12 fils pour les retours de BP et 1 fil commun) les 12 fils branchés sur 12 entrées du picaxe.
A chaque fois qu'un bouton sera pressé correspondra une commande serout envoyant des trames Pelco pour piloter un dôme PTZ.

ex : if entrée 1=1 then serout C.1, T9600, $ff 01 00 02 32 00 35 ...

Je pense mettre le commun à 5V et les entrées à la masse via une résistance pour les forcer à l'état bas au repos.
Une boucle if testera les l'état des 12 entrées et enverra la trame serout correspondante.
Ai je pris la bonne direction ?
La trame serout sera t'elle envoyée en continu tant qu'on appuie sur le bouton ?
Merci d'avance pour vos conseils
 

jominy

New Member
Bonjour
J'ai fait quelques tests et ca commence a fonctionnner, mais ...
La commande de stop qui suit la fin de l'appui sur une des touches est maintenue (la sortie serout envoie des trames de stop en continu alors que je voudrais qu'elle n'envoie qu'un stop d'une 1/2 seconde par exemple, juste le temps necessaire pour mettre a l'état bas la commande en cours).
Je voulais donc essayer cela :
Code:
serout [2000],c.6,T4800,($FF,$01,$00,$00,$30,$00,$01)
mais le timeout de 2000 (ou autre valeur) est vu comme une erreur de syntaxe
Ou me suis je trompé ?
Merci
 

PieM

Senior Member
mais le timeout de 2000 (ou autre valeur) est vu comme une erreur de syntaxe
Ou me suis je trompé ?
Merci
timeout est fait pour SERIN ! pour serout ça n'aurait pas de sens, le picaxe envoyant la trame même s'il n'y a rien de connecté.

dans votre programme vous envoyez un ou deux serout, et vous ne continuez le programme que si les touches sont relâchées.
 

BESQUEUT

Senior Member
Code:
serout [2000],c.6,T4800,($FF,$01,$00,$00,$30,$00,$01)
mais le timeout de 2000 (ou autre valeur) est vu comme une erreur de syntaxe
Ou me suis je trompé ?
Ben oui : c'est normal...
Un serout est toujours exécuté immédiatement ; ce n'est pas comme un serin qui attends qu'un caractère soit reçu.
Donc il ne peut pas y avoir de timeout (qui suppose que la commande attends quelque chose...)
S'il est dans une boucle, il est exécuté indéfiniment...
Mais pour vous aider, il faudrait que vous publiez l'intégralité de votre code...
 

jominy

New Member
Bonsoir
Voici le montage que je souhaite réaliser :

telecommande pupitre PTZ .jpeg

A chaque appui sur une touche, on doit envoyer une trame Pelco serout correspondant à la fonction (par ex droite à la vitesse de 255 : $ff 01 00 02 3f 00 42 ) et au moment du relâchement de la touche la trame pelco correspondant au stop ($ff 01 00 00 00 00 01).
Je ne sais pas comment gérer les durées de la commande serout.
Comment configurer la commande serout pour une durée déterminée (0.5 seconde par ex)?
Merci d'avance

Merci de me prévenir si l'image n'est pas lisible, mais j'ai été très limité par le forum en taille autorisée, il faut que je me renseigne là-dessus ...
 

jominy

New Member
Bonjour
OK POUR LE PROGRAMME ... mais y'a pas grand chose puisque justement c'est que j'essaie de l'écrire avec votre aide

Code:
input C.3      		'droite
input C.2      		'haut
symbol led = C.2    	'led temoin
low led

main:
if pinc.3 =1 then high led : serout c.6,T4800,($FF,$01,$00,$02,$3f,$00,$42) else serout c.6,T4800,($FF,$01,$00,$00,$00,$00,$01) : low led             end if
if pinc.2 =1 then high led : serout c.6,T4800,($FF,$01,$00,$08,$00,$3f,$48) else serout c.6,T4800,($FF,$01,$00,$00,$00,$00,$01) : low led             end if
goto main
 

dje8269

Senior Member
bonsoir,

Pour vous aider je crois qu'il faudrait re-poster une image de votre schéma qui se voit plutôt mal , voir trés mal.
puis re-expliquer ce que vous voulez faire ;

Dnas votre programme et dans le desordre :

- vous ne nommez pas le type de picaxe a utiliser au debut
- vous forcez C.2 et C.3 en entrée alors que par defaut elle le sont donc pas besoin*
- ensuite vous redéfinissez C.2 en sortie avec la led ??? faudrait savoir ?

Je ne vois pas de led sur votre schéma même en zoomant .
je ne vois de condo sur l'alim du picaxe , conseillé

d'apres ce que j'ai compris en plus clair ;

Code:
#PICAXE 28X2

Symbol droite = pinC.3
Symbol haut = pinC.2


main:

do
	
	if droite = 1 then 
		serout c.6,T4800,($FF,$01,$00,$02,$3f,$00,$42)
	else 
		serout c.6,T4800,($FF,$01,$00,$00,$00,$00,$01)
	end if


	if haut =1 then 
		serout c.6,T4800,($FF,$01,$00,$08,$00,$3f,$48) 
	else 
		serout c.6,T4800,($FF,$01,$00,$00,$00,$00,$01)
	end if

loop
 

BESQUEUT

Senior Member
Ce programme envoie des commandes serout en permanence, quel que soit l'état des entrées.
S'il ne doit le faire que pendant un certain temps, il faut :
- définir la condition qui lance les serout,
- chronométrer les envois,
- arrêter d'envoyer quand le temps maximal est atteint.

C'est ce que suggère votre demande réitérée de mettre un timeout sur serout.
Mais ça ne semble pas correspondre à votre besoin réel.
 
Last edited:

BESQUEUT

Senior Member
La commande de stop qui suit la fin de l'appui sur une des touches est maintenue (la sortie serout envoie des trames de stop en continu alors que je voudrais qu'elle n'envoie qu'un stop d'une 1/2 seconde par exemple, juste le temps necessaire pour mettre a l'état bas la commande en cours).
En fait, vous souhaitez qu'elle n'envoie qu'un stop. POINT FINAL
La notion de 1/2 seconde n'a aucun intérêt dans ce cas.
 

BESQUEUT

Senior Member
A chaque fois qu'un bouton sera pressé correspondra une commande serout envoyant des trames Pelco pour piloter un dôme PTZ.
Ca c'est clair, et il n'est pas question de timeout ou de durée.
La seule notion "intuitive" que vous n'avez pas exprimé, mais qu'il faut prendre en compte, c'est que
LE BOUTON DOIT ËTRE RELACHE avant de prendre en compte une nouvelle commande.
Après envoi d'un serout,
faites une boucle pour attendre que le bouton soit relâché...
 

jominy

New Member
Bonsoir
La led temoin est en A.0 (erreur de ma part), elle n'apparait pas sur le schéma, les condos non plus.
Pour ce qui est de l'image, je l'ai reduite au minimum de la taille autorisée.
Je peux l'envoyer par email
J'ai seulement mis 2 fonctions (haut et droite) puisqu'après ca sera 12 fois la même chose .
Le code de dje8269 fonctionne (mes différents essais de code arrivent également au même résultat) mais le programme envoie des trames de stop en permanence ce qui bloque le port rs485 : je ne peux plus piloter le dôme avec l'interface web




LE BOUTON DOIT ËTRE RELACHE avant de prendre en compte une nouvelle commande.
Après envoi d'un serout,
faites une boucle pour attendre que le bouton soit relâché...
C'est bien la que je bloque... donnez moi des pistes svp
 

jominy

New Member
Voici ou j'en suis

Code:
#PICAXE 28X2

symbol droite = pinC.3
symbol haut = pinC.2
symbol led = A.0    	'led temoin
low led
serout c.6,T4800,($FF,$01,$00,$00,$00,$00,$01)

main:
	if pinc.3 =1 then 
		high led
		serout c.6,T4800,($FF,$01,$00,$02,$3f,$00,$42)
	else
		serout c.6,T4800,($FF,$01,$00,$00,$00,$00,$01)
	low led
end if

goto main
mais bien sur la sortie C.6 bloque le port rs485 en permanence avec des trames stop quand aucun bouton n'est appuyé...
A+
 

dje8269

Senior Member
voila

Code:
#PICAXE 28X2

symbol droite = pinC.3
symbol haut = pinC.2
symbol led = A.0    	'led temoin
low led
serout c.6,T4800,($FF,$01,$00,$00,$00,$00,$01)


'########### programme principal ###########
do
	if droite =1 then 
		high led
		do
			serout c.6,T4800,($FF,$01,$00,$02,$3f,$00,$42)
		loop while droite = 1			' ici on reboucle tant que le BP est appuyé
	
		serout c.6,T4800,($FF,$01,$00,$00,$00,$00,$01)
		low led
end if

loop
Pour la photo je pense que tu as reduis la resolition ou le poids , ce qui as changé la taille ; il faut diminuer la taille et la compression ; en JPEG une image ne doit pas depassé les 100Ko . j'arrive a mettre des photos de 6 millions de pixels .
Si tu met des symbol il faut les utiliser
Ne pas utiliser de "goto" mais une boucle pour un programme principal .
 

jominy

New Member
Avec ce code on approche de la vérité ...
Le petit souci est que la commande serout de stop est trop courte, d'où une prise en compte aléatoire.
C'est pour cette raison que je voudrais faire la faire durer quelques centaines de ms... et la , je ne sais pas comment faire (une boucle pour faire une petite tempo ?)
A+
 

BESQUEUT

Senior Member
Le programme dje me semble bien correspondre au besoin, surtout si plusieurs touches doivent être détectées.
 

dje8269

Senior Member
Voila : la commande stop est envoyée 5 fois de suite , il suffit d'augmenter le for next si ca suffit pas ;

Code:
#PICAXE 28X2

symbol droite = pinC.3
symbol haut = pinC.2
symbol led = A.0    	'led temoin
low led
serout c.6,T4800,($FF,$01,$00,$00,$00,$00,$01)


'########### programme principal ###########
do
	if droite =1 then 
		high led
		do
			serout c.6,T4800,($FF,$01,$00,$02,$3f,$00,$42)
	loop while droite = 1			' ici on reboucle tant que le BP est appuyé
		low led	
		for b2 = 0 to 5
		serout c.6,T4800,($FF,$01,$00,$00,$00,$00,$01)
		next
		
end if

loop
 

PieM

Senior Member
Essayez ce principe pour les 12 touches

Code:
main:

do 
	b1 = pinsB
	b2 = pinsC and $0F
loop while b1=0 and b2=0

select b1
	case 0 
	case 1  ': serout c.6,T4800,($FF,$01,$00,........)
	case 2  ': serout c.6,T4800,($FF,$01,$00,........)
	case 4  '; serout c.6,T4800,($FF,$01,$00,,.......)
	case 8
	case 16
	case 32
	case 64
	case 128  ':serout c.6,T4800,($FF,$01,$00,,.......)

end select

select b2
	case 0
	case 1  ':serout c.6,T4800,($FF,$01,$00,........)
	case 2  ':serout c.6,T4800,($FF,$01,$00,........)
	case 4  ':serout c.6,T4800,($FF,$01,$00,,.......)
	case 8  ':serout c.6,T4800,($FF,$01,$00,,.......)

end select
pause 200
do 
	b1 = pinsB
	b2 = pinsC and $0F
	serout c.6,T4800,($FF,$01,$00,$00,$00,$00,$01)
loop until b1=0 and b2=0

goto main
 

jominy

New Member
Merci à tous
Dje8269 ton programme fonctionne, j'ai juste eu à ajuster la durée de la boucle (de 0 à 5 je suis passé de 0 à 10) jusqu'à ce que ça semble bien fonctionner.
Par contre bizarrement, sans que la sortie c.6 soit active, ça me bloque le rs485. Ca doit peut-être mettre c.6 en low donc à la masse ???
Mais je vais réfléchir à ajouter une seconde sortie qui coupera physiquement c.6 quand elle est muette.
Encore merci
La suite un autre jour ...
bonne soirée à tous
 
Top