Cześć !!
En esta entrega, de Raspberry y Perl (mi lenguaje preferido tipo script) les contare cómo reconocer los dígitos de un teclado membrana 4x4. Estos son los mas baratos que hay en el mercado y lucen mas o menos así.
Lo primero que debemos hacer es que estos teclados no traen un circuito interno, o resistores, capacitores, etc. Son mas simples botones que al ser presionados unen dejan pasar la corriente de un lado al otro. Las conexiones estan distribuidas como una matriz, de izquierda a derecha en el bus, los 4 primeras corresponden a las filas iendo conectadas a los numeros 1,4, 7 y * respectivamente mientras que el resto corresponde a la fila *,0,# y D. Al presionar por ejemplo la tecla 1, la corriente pasara a travez de la fila 1 y la cola 1 o lo que en el bus seria el 1 y el 5(de izquierda a derecha), sea el sentido que sea.
Teniendo claro lo anterior, pasamos a la conexión del tecladito a la Raspberry. Las conexiónes de la 1,2,3,4 del bus irán conectadas a los pins 7,11,13,15 de la board(ojo, no confundir con los pins GPIO) y los 5,6,7,8 a los 12,16,18,22.
Pasamos al código en Perl, previamente debemos haber instalado la libreria HIPI (que explique en el ultimo post).
#!/usr/bin/perl
use HiPi::BCM2835;
use HiPi::Constant qw( :raspberry );
use strict;
#Iniciamos objeto BCM
my $bcm = HiPi::BCM2835->new()
|| die "No se pudo iniciar ";
my @keypad=[
[1,2,3,'A'],
[4,5,6,'B'],
[7,8,9,'C'],
['*',0,'#','D'] ];
#pinboard filas [7,11,13,15] columnas[12,16,18,22], los pasamos a pin GPIO internos
my @fil=[4,17,27,22];
my @col=[18,23,24,25];
#Establecemos las columnas como de SALIDA y el voltage.
for (my $j=0; $j <= 3; $j++) {
$bcm->gpio_fsel($col[0][$j],RPI_PINMODE_OUTP);
$bcm->gpio_write($col[0][$j],1);
}
#Establecemos como de entrada las filas, y PUD
for (my $i=0; $i <= 3; $i++) {
$bcm->gpio_fsel($fil[0][$i],RPI_PINMODE_INPT);
$bcm->gpio_set_pud($fil[0][$i],RPI_PUD_UP);
}
while(1){
for (my $j=0; $j <= 3; $j++) {
#Establecemos el voltage a 0
$bcm->gpio_write($col[0][$j],0);
for (my $i=0; $i <= 3; $i++) {
#verificamos que la fila no se haya desactiado,
if(($bcm->gpio_lev($fil[0][$i])) == 0){
# si se desactivo imprima el numero de la matrix
print "digitos :$keypad[0][$i]->[$j]\n";
while(($bcm->gpio_lev($fil[0][$i]))== 0 ){
}
}
}
#Establecemos el voltage a 3.3 V nuevamente a la col
$bcm->gpio_write($col[0][$j],1);
}
}
A continuación la explicacion:
Dado que si presiono 1, el voltage pasara por la conexion del bus en 1 y 5(7, 12 en pin de board y 4 y 18 en los pins GPIO), la conexion del bus 1 sea de entrada y la 5 de salida, asi yo sepa que mi pin 1 esta energizado, que hay un paso de corriente, se que el número puede ser 1,4,7,* pero no puedo saber mas.
El algoritmo establece los pins de columna como ,RPI_PUD_UP, una propiedad que desactiva y activa en microsegundos el voltage, a continuacion, procedemos a desactivar el voltage de la cola 1(conexion 5 de bus del tecladito) y verificamos el voltage de la fila1(conexion 1,2,3,4 del bus) con $bcm->gpio_lev(), si este se desactivó, hemos encontrado la posicion exacta(i y j) de que numero se ha presionado y procedemos a imprimirlo(de la matrix "$keypad). Tan pronto salímos, activamos el voltage a 3.3 con $bcm->gpio_write($col[0][$j],1);.
Espero les haya servido. Do widzenia
En esta entrega, de Raspberry y Perl (mi lenguaje preferido tipo script) les contare cómo reconocer los dígitos de un teclado membrana 4x4. Estos son los mas baratos que hay en el mercado y lucen mas o menos así.
Lo primero que debemos hacer es que estos teclados no traen un circuito interno, o resistores, capacitores, etc. Son mas simples botones que al ser presionados unen dejan pasar la corriente de un lado al otro. Las conexiones estan distribuidas como una matriz, de izquierda a derecha en el bus, los 4 primeras corresponden a las filas iendo conectadas a los numeros 1,4, 7 y * respectivamente mientras que el resto corresponde a la fila *,0,# y D. Al presionar por ejemplo la tecla 1, la corriente pasara a travez de la fila 1 y la cola 1 o lo que en el bus seria el 1 y el 5(de izquierda a derecha), sea el sentido que sea.
Teniendo claro lo anterior, pasamos a la conexión del tecladito a la Raspberry. Las conexiónes de la 1,2,3,4 del bus irán conectadas a los pins 7,11,13,15 de la board(ojo, no confundir con los pins GPIO) y los 5,6,7,8 a los 12,16,18,22.
Pasamos al código en Perl, previamente debemos haber instalado la libreria HIPI (que explique en el ultimo post).
#!/usr/bin/perl
use HiPi::BCM2835;
use HiPi::Constant qw( :raspberry );
use strict;
#Iniciamos objeto BCM
my $bcm = HiPi::BCM2835->new()
|| die "No se pudo iniciar ";
my @keypad=[
[1,2,3,'A'],
[4,5,6,'B'],
[7,8,9,'C'],
['*',0,'#','D'] ];
#pinboard filas [7,11,13,15] columnas[12,16,18,22], los pasamos a pin GPIO internos
my @fil=[4,17,27,22];
my @col=[18,23,24,25];
#Establecemos las columnas como de SALIDA y el voltage.
for (my $j=0; $j <= 3; $j++) {
$bcm->gpio_fsel($col[0][$j],RPI_PINMODE_OUTP);
$bcm->gpio_write($col[0][$j],1);
}
#Establecemos como de entrada las filas, y PUD
for (my $i=0; $i <= 3; $i++) {
$bcm->gpio_fsel($fil[0][$i],RPI_PINMODE_INPT);
$bcm->gpio_set_pud($fil[0][$i],RPI_PUD_UP);
}
while(1){
for (my $j=0; $j <= 3; $j++) {
#Establecemos el voltage a 0
$bcm->gpio_write($col[0][$j],0);
for (my $i=0; $i <= 3; $i++) {
#verificamos que la fila no se haya desactiado,
if(($bcm->gpio_lev($fil[0][$i])) == 0){
# si se desactivo imprima el numero de la matrix
print "digitos :$keypad[0][$i]->[$j]\n";
while(($bcm->gpio_lev($fil[0][$i]))== 0 ){
}
}
}
#Establecemos el voltage a 3.3 V nuevamente a la col
$bcm->gpio_write($col[0][$j],1);
}
}
A continuación la explicacion:
Dado que si presiono 1, el voltage pasara por la conexion del bus en 1 y 5(7, 12 en pin de board y 4 y 18 en los pins GPIO), la conexion del bus 1 sea de entrada y la 5 de salida, asi yo sepa que mi pin 1 esta energizado, que hay un paso de corriente, se que el número puede ser 1,4,7,* pero no puedo saber mas.
El algoritmo establece los pins de columna como ,RPI_PUD_UP, una propiedad que desactiva y activa en microsegundos el voltage, a continuacion, procedemos a desactivar el voltage de la cola 1(conexion 5 de bus del tecladito) y verificamos el voltage de la fila1(conexion 1,2,3,4 del bus) con $bcm->gpio_lev(), si este se desactivó, hemos encontrado la posicion exacta(i y j) de que numero se ha presionado y procedemos a imprimirlo(de la matrix "$keypad). Tan pronto salímos, activamos el voltage a 3.3 con $bcm->gpio_write($col[0][$j],1);.
Espero les haya servido. Do widzenia
Este comentario ha sido eliminado por el autor.
ResponderEliminar