Publicidad

viernes, 2 de diciembre de 2016

Teclado matricial con PIC

Vamos a explicar como conectar un teclado matricial tipo membrana a un microcontrolador PIC mediante un sencillo ejemplo. El método que proponemos permite conectar a nuestro microcontrolador 16 teclas usando solamente 8 pines. El código debería ser válido para cualquier microcontrolador, incluso de otras marcas, aunque siempre habrá que revisarlo y posiblemente realizar algunas adaptaciones si se migra a otra plataforma, sin embargo, el algoritmo permanece igual con cualquier microcontrolador.
El ejemplo se realizó para un PIC16F88, aunque como ya hemos mencionado, es compatible básicamente con cualquier microcontrolador PIC. Debido a que el programa utiliza todos los bits del puerto B en nuestro microcontrolador,  pensamos que tal vez sea buena idea utilizar un PIC con buena cantidad de pines como un PIC16F877 o un PIC18F4550, por mencionar un par de ejemplos de micros populares. Para este ejemplo, utilizamos XC8 y MPLAB X como entorno de desarrollo.
En nuestra portada mostramos el equipo que hemos utilizado para probar el teclado matricial, incluido el PIC16F88 en una tarjeta entrenadora y el PICKit 3 como programador/depurador.

¿Como funciona un teclado matricial?

El principio de funcionamiento es sencillo y es similar a lo que haríamos para multiplexar leds o dipslays de 7 segmentos. El programa configura el puerto B del PIC de la siguiente forma:  RB4 a RB7 funcionan como salidas y la otra mitad (RB0-RB3) como entradas. Las filas (horizontal) del teclado matricial se conectan a los bits más significativos que funcionan como salidas, mientras que las columnas (vertical) se conectan a los bits menos significativos del puerto que funcionan como entradas con resistencias pull-down. Cualquier tecla que se oprima en una columna causará que uno de los bits menos significativos del puerto (RB0 – RB3) cambie de un estado lógico bajo a un estado alto.
La siguiente imágen muestra las conexiones del teclado al puerto B del microcontrolador. La imagen muestra el teclado en reposo (sin teclas oprimidas).
teclado_matricial_4x4_funcionamiento
¿Que pasa cuando se oprime una tecla en un teclado matricial?… la corriente puede fluir a través del switch y el voltaje de los pines conectados a las filas del teclado (5 V o nivel alto) aparece ahora también en alguno de los pines RB0 a RB3 según la columna en la que se encuentra la tecla oprimida. La siguiente imagen ilustra lo que sucede al oprimir una tecla: al oprimir el botón 6 provocamos un cambio en el PIN RB2 que ahora recibe un 1 o estado alto. Sabemos entonces que se ha pulsado un botón en la segunda columna y se muestra como un nivel lógico alto aparece en los bits menos significativos del puerto B, especificamente en RB2.
teclado_matricial_4x4_tecla_oprimida
De esta manera el microcontrolador sabe que se ha oprimido una tecla al detectar un cambio de nivel en los bits menos significativos. Hasta el momento, se sabe que se ha oprimido una tecla en alguna columna (dependiendo del bit activo RB3 a RB0), sin embargo, no sabemos en cual fila. Para resolver en que fila se oprimió una tecla, hay que realizar un proceso de escaneo del teclado. En este proceso, colocaremos en secuencia un 1 lógico (estado alto) en los 4 bits más significativos del puerto y leeremos el estado de los 4 bits menos significativos. Sigamos con el ejemplo en el que se ha oprimido la tecla 6 pero ahora viéndolo gráficamente en una animación:
Animación del funcionamiento del teclado matricial
El microcontrolador escanea en forma sucesiva los pines de salida, mientras lee las entradas en la parte baja del puerto, de manera que puede detectar que teclas están oprimidas en cada fila. Ahora solo falta escribir nuestro codigo en C que implemente los procedimientos mencionados anteriormente y nos devuelva un valor de la tecla oprimida, por ejemplo, mediante un número binario.

Programa en C para teclado matricial

El programa es bastante sencillo e implementa todos los procesos que describimos en la teoría vista anteriormente. El código se ha mantenido simple intencionalmente para que se pueda apreciar el funcionamiento de la manera más obvia posible. La función keypad_read() es la encargada de realizar la mayor parte de las tareas para determinar que tecla ha sido pulsada. El valor que retorna es una palabra de 16 bits en la cual, cada uno de los bits representa una tecla, en donde un bit en estado alto representa una tecla oprimida. Como la función no retorna como tal la tecla pulsada, sino una cadena de bits que representan las teclas, es posible detectar cuando se presiona más de una tecla de forma simultanea. El código de esta función es el siguiente:

Detalles de la implementación

En nuestra implementación del hardware, todos los pines tienen conectada una resistencia “pull-down”, por lo que se mantienen en estado bajo (0) cuandoel teclado esta en reposo. Cuando se presiona un botón, el estado del pin cambia a estado alto (1). Esto puede hacerse de manera inversa, utilizando las resistencias “pull-up” incluidas internamente en el puerto B de muchos PIC que están diseñadas para este tipo de aplicaciones. En nuestro caso, la tarjeta que utilizamos tiene resistencias pull-down previamente conectadas en los pines, por lo que decidimos aprovecharlas.
Es un buen ejercicio invertir la lógica del código para permitir que este funcione con resistencias “pull-up”, por lo que te recomendamos que realices al menos este ejercicio.

Proyecto de MPLAB con teclado matricial

Para probar el código anterior, hemos desarrollado un ejemplo completo que puede abrirse con MPLAB X y grabarse directamente sobre un PIC16F88. El programa esta configurado para una velocidad de reloj de 4 Mhz y utiliza el puerto B completo para conectar el teclado. Para mantener las cosas simples, mostramos el número binario correspondiente a la tecla oprimida mediante leds conectados en el puerto A (nada de pantallas ni cosas complicadas). Puedes descargar este proyecto a continuación:

Conclusión

Con la información que tenemos hasta este momento, ya podemos darnos una idea de como funciona un teclado matricial y podemos comenzar a incluirlo en nuestros proyectos. Nos queda de tarea estudiar más a fondo el funcionamiento del puerto B de los PIC, que incluye varias funciones opcionales como resistencias pull-up internas e interrupción por cambio de estado en los pines, ideales para facilitar la conexión de teclados matriciales.

Ensamblador VS C

El adentrarse al mundo de los microcontroladores  para muchos no es una elección sino una obligación ya que la tira de materias de la escuela muchas veces la exige y para muchos el camino ya esta trazado es decir según la predilección del maestro y sus conocimientos nos introducirá a lenguaje ensamblador o lenguaje C.
Pero hay una pequeña parte de estudiantes que tienen la elección de aprender a programar microcontroladores según su elección ya sea porque el profesor les ha regalado ese derecho o porque simplemente te ha interesado el tema y quieres aprender a programarlos.
Un detalle que me gustaría aclarar es que cuando me refiero a la palabra “estudiante”  no quiere decir exclusivamente alguien que se esta formando en un centro de estudios ya sea facultad, bachillerato, colegio, etc. Me refiero a todo aquel que por alguna razón ha dejado la comodidad del sillón y decidio aprender un tema en especifico.

BIT

El lenguaje ensamblador  también es llamado lenguaje de bajo nivel y se le llama así porque es el lenguaje mas directo para programar un microcontrolador después de los nemónicos   generalmente  lo vamos a ver de la forma “LDAA, PORTB” es un lenguaje muy especifico y exacto .
Lenguaje C es conocido también como lenguaje de alto nivel y generalmente engloba muchas instrucciones de ensamblador y lo vamos a ver de la forma  “lcd_putc([“Hola Mundo“)” en este ejemplo se manda a desplegar en una LCD el mensaje “Hola mundo ” que en ensamblador  llevaría cuando menos 200 instrucciones.
Una de las cosas que gusta a muchos sobre el ensamblador es que tienes el control total sobre el microcontrolador que si bien es una ventaja si hace mas pesado la elaboración de un programa.
Con C la situación es más automática lo cual hace la elaboración del programa mas sencillo pero con cierta pérdida del control.
Como se que para muchos esta explicación los ha dejado como al principio vamos con una analogía.

ROBOT

Imaginemos que tenemos el control de un ser humano, el cual obedece nuestras ordenes y deseamos que de tres pasos hacia adelante (imaginemos que se encuentra de pie en un estado inicial) en ensamblador tendríamos que hacer a grandes rasgos algo asi:
→ Levanta la pierna izquierda
→ Impulsate hacia adelante
→Estira la pierna izquierda
→Levanta la pierna derecha
→Acerca la pierna derecha a la izquierda
→Estira la pierna Derecha
Este procedimiento lo tendría que repetir 3 veces para dar 3 pasos hacia adelante.
Con lenguaje C sería algo asi
→ Da un paso
→ Da un paso
→ Da un paso
En apariencia lenguaje C parece ser la mejor opción  pero veamos porque hay esa  diferencia.
Nuestro microcontrolador no entiende lenguaje C, el entiende mnemónicos que son números que generalmente vienen representados en números hexadecimales , a algunos de nosotros nos toco programar nuestro precioso microprocesador 8085 en nemónico y créanme terminas viendo números hexadecimales en todas partes, pero llego ensamblador que  si bien tenia cierto parecido con nemónico le dio mas coherencia a las líneas de programa . Los desarrolladores de lenguaje C para microcontroladores  agrupan instrucciones de ensamblador y las sintetizan a una sola instrucción, retomando el caso del cuerpo humano en ensamblador se tuvieron 6 lineasde código  el desarrollador de lenguaje C tomo esas 6 lineas de código las metio en una librería  en la cual puso una instrucción que le llamo “Da un paso”.

binarios

Todo parece indicar que no hay una buena razón para aprender ensamblador , pero… que pasa si la metodología que siguió el desarrollador de C para llevar a cabo un proceso no nos convence del todo, retomemos el ejemplo del cuerpo humano,  que pasa si sigo esta instrucciones para una persona que es alta o baja obviamente va a ver mayor o menor desplazamiento y si me importa la distancia de desplazamiento pues esas instrucciones en lenguaje C me quedan cortas pero como así esta diseñado o me acoplo con esas instrucciones o lo hago en ensamblador , a eso me refiero  con la perdida de control en lenguaje C.
Ya en términos formales cada uno de ellos tiene su fortaleza, mientras con lenguaje C la simplicidad nos ayuda a la rapidez para elaborar un programa, en ensamblador la exactitud es nuestro fuerte.
Y a todo esto ¿realmente vale la pena aprender ensamblador? Yo fui de los que aprendio primero con mnemónicos luego con ensamblador y finalmente lenguaje C, y siendo sinceros el 80% de mis programas los elaboro en lenguaje C, en diez años que llevo programando en lenguaje C me he topado con al menos 5 errores en el compilador C, errores que muchas veces me llevaron a revisar librerías de lenguaje C y modificarlas en ensamblador o acoplarlas a mis necesidades especificas y esto me ha hecho ganar proyectos y elaborarlos mas rapido, asi que a mi si me ha servido y mucho.

Human brain function represented by red and blue gears

¿A quien recomiendo aprender ensamblador? A todo el que desee aprender mas a fondo la programación de microcontroladores, pues si bien al menos en mi experiencia no ocupo mucho ensamblador el  haberlo aprendido me ayudo porque aprendi también mas sobre electrónica pues para empezar a interactuar con cualquier dispositivo llamese LCD, reloj de tiempo real (DS1307), memorias EEPROM, DAC, Buffer, etc  requieres leer y releer la hoja de datos de estos dispositivos y empezar a aventurarte a jugar con ellos con sus respectivos fallos y aciertos, y este conocimiento muchas veces hace la diferencia para ganar un puesto de trabajo, vencer en un concurso, o ganar licitaciones asi como algunos proyectos ya que te ayuda pensar diferente. Pero sí, desafortunadamente requiere mucho trabajo.  Asi que ensamblador es para todo aquel que desea mas conocimiento, le gusta la precisión, las cosas a detalle y que odia las “cajas negras”.
¿A quien recomiendo aprender lenguaje C? Tambien a todos, si bien ensamblador es exacto hay ciertas cosas que lenguaje C nos facilita, recuerdo mi primer programa en C el mentado “Hola mundo” en una LCD no podía creer que mis 200 lineas de código ensamblador fueran sustituidas por 3 lineas en lenguaje C , ese dia me sentí como su hubiera perdido el tiempo estudiando ensamblador, después me di cuenta que no fue asi pero bueno la idea es esa, simplicidad, pero no por eso poco poderoso, si no pregunten a aquellos que nos toco hacer una multiplicación o una división de números decimales o hacer un filtro pasabajos en ensamblador , ese si fue un dolor de cabeza, en lenguaje C solo escribes la formula y listo.
Como verán a estas alturas mi forma de ver estos dos lenguajes no son como rivales sino mas bien complementos,  como tal cada uno de ellos es fuerte en ciertas cosas y juntos son un arma muy poderosa.
Retomando una pregunta de uno de nuestros lectores  ¿Qué aprendo primero?
Creo que aprender primero lenguaje C es una ventaja porque nos introduce al mundo de los circuitos digitales de manera mas amigable y sencilla,  y para la mayoría eso va a ser mas que suficiente , ensamblador lo puedes aprender después cuando sientas que necesitas aprender mas cuando lenguaje C te ha empezado a hacer las cosas mas difíciles que fáciles.

Arduino VS PIC

Muchas veces nos han llegado clientes preguntándonos ¿es mejor PIC o Arduino? ¿Cual es más fácil de aprender? ¿qué me recomendarías?, etc . Y la primera pregunta que ha muchos viene a la mente es ¿Es correcto comparar Arduino con PIC?  Para contestar esa pregunta primero tenemos que saber en que consiste cada uno de ellos.


PIC es un microcontrolador de Microchip, es un microcontrolador muy popular hasta hace un par de años era el microcontrolador mas vendido en el mundo , sin embargo los nuevos microcontroladores ARM Cortex han ido adquiriendo popularidad.  Si de Arduino hay cientos o miles de aplicaciones de PIC hay millones, y esta diferencia es de esperarse pues los microcontroladores PIC tienen mucho mas tiempo en el mercado que Arduino.
En términos sencillos un microcontrolador es un dispositivo que se puede programar para hacer distintas tareas y para ello cuenta con ciertos perifericos para llevarlo a cabo, pero el cual requiere de elementos adicionales para poder interactuar con el mundo. Es en cierto modo como si tuvieramos el CPU de una computadora , es capaz de hacer muchas cosas pero sin el teclado el mouse y una pantalla donde visualizar la información no podriamos hacer un uso adecuado del CPU, lo mismo pasa con un microcontrolador, sin teclados , sin conexion a la computadora, sin pantallas, o sin otras interfaces no podriamos hacer un uso del microcontrolador.
Arduino logo
Ahora que sabemos que es un microcontrolador pasamos a la descripción de Arduino.
Arduino es una plataforma de código abierto con la cual un entusiasta de la electrónica puede crear proyectos de electrónica digital, domótica, robótica , etc. de forma rápida y sencilla ademas de económica, es decir tiene las tres “B” Bueno Bonito y Barato, y es que los cientos de proyectos que andan circulando por la red son realmente increíbles. Su placa mas popular el Arduino UNO, se basa en el microcontrolador Atmega328 de Atmel.
Y en este punto ya tenemos la principal diferencia de ambas tecnologías
PIC es un microcontrolador, Arduino es una placa de desarrollo basada en un microcontrolador Atmega328
en el mercado hay muchas placas de desarrollo basadas en microcontroladores PIC pero a parte de estar a un mayor precio que las placas de Arduino, no han llegado a ser tan populares como Arduino.
Entonces  ¿porque Arduino se ha hecho tan popular si no son los primeros en hacer placas de desarrollo?  Son varios factores los que han hecho popular a Arduino. Dentro de ellos esta que
las placas de desarrollo Arduino son Open Source
es decir si bien puedes comprar una placa de Arduino Uno a los creadores de la misma tecnología , también existe la posibilidad de que uno se fabrique la suya sin infringir derechos de Autor, o lo que es mejor podríamos estar fabricando placas exactamente iguales y venderlas y no violar la ley pues es un sistema de código abierto.
El software de programación también es freeware
Y es que cuando los creadores dijeron que esta tecnología iba a ser gratis realmente lo hicieron totalmente gratis, y no hay algo que a la gente llame mas la atención que la palabra en algun producto que diga gratis, otro punto importante a tomar en cuenta es que para programar un PIC se requiere a parte de la placa un programador “quemador” de PICS mientras que Arduino en su placa de desarrollo ya lo tiene integrado.
Si lo se tenemos ya cierta información acerca de cada cosa y aun así me dirán
¿que es mejor PIC o Arduino?
En mi humilde opinión Arduino yo la recomendaría para las personas que son aficionados a la electrónica o para estudiantes que desean introducirse al mundo de la electrónica pero no llegar mas fondo. Y es que para hacer una aplicación de Arduino solo basta comprar cualquiera de sus placas , bajar el software de programación y en cuestión de horas o un par de días ya tienes lista tu primera aplicación, siempre y cuando tengas nociones de programación en lenguaje C, ademas es práctico por ejemplo para un arquitecto que desea diseñar un sistema de iluminación innovador  utilizar Arduino pues la aplicación estaría lista mas rapido que si lo intenta hacer con un PIC.
Y aprender PIC se lo recomendaría a personas que desean mas libertad a la hora de diseñar, puesto que las placas Arduino en su afán de hacer una placa universal y sencilla también le han dado una forma y color que no pueden modificarse, es decir una estructura ya delimitada. Mientras con Arduino se tienen un poco mas de una decena de diferentes Arduino, con PIC tenemos cientos de ellos para escoger con diferentes tamaños formas y capacidades.
Con PIC tienes la oportunidad de crear tu propio Arduino
Imagina que se te descompuso el control de tu Automóvil, ninguna placa de Arduino podrías adaptar para que ocupara exactamente  las dimensiones de la cajita del control en cambio con PIC ya hay un microcontrolador que hasta circuito de rf trae integrado, en este sentido podríamos comparar a ambos con un artesano (PIC) y una fábrica (Arduino) , el artesano puede hacer un jarrón de tal manera que ergonomicamente le siente bien a la persona que lo va a utilizar para que no sea demasiado grande o pesado para esa persona y esto lo puede ir cambiando por cada persona que requiera de un jarrón mientras que una fábrica va a hacer un jarrón universal y mientras a un tipo de persona le puede resultar pesado o grande a otras les va a parecer pequeño e insuficiente.
Asi que no puedo decir que es mejor Arduino o PIC , esto depende de la persona en concreto y lo que desea hacer.
¿Cual es mas fácil aprender?
Aqui definitivamente el ganador es Arduino por la estructura que ya trae de fábrica.
Espero les haya gustado el articulo no se olviden de comentar. Saludos

¿Que es Arduino?


Arduino es una plataforma de prototipos electrónica de código abierto (open-source) basada en hardware y software flexibles y fáciles de usar. Está pensado para artistas, diseñadores, como hobby y para cualquiera interesado en crear objetos o entornos interactivos.
Arduino puede sentir el entorno mediante la recepción de entradas desde una variedad de sensores y puede afectar a su alrededor mediante el control de luces, motores y otros artefactos. El microcontrolador de la placa se programa usando el Arduino Programming Language (basado en Wiring) y el Arduino Development Environment (basado en Processing). Los proyectos de Arduino pueden ser autonomos o se pueden comunicar con software en ejecución en un ordenador (por ejemplo con Flash, Processing, MaxMSP, etc.).
Las placas se pueden ensamblar a mano o encargarlas preensambladas; el software se puede descargar gratuitamente. Los diseños de referencia del hardware (archivos CAD) están disponibles bajo licencia open-source, por lo que eres libre de adaptarlas a tus necesidades.
Arduino recibió una mención honorí ca en la sección Digital Communities del Ars Electronica Prix en 2006.



¿Por qué Arduino?

Hay muchos otros microcontroladores y plataformas microcontroladoras disponibles para computación física. Parallax Basic Stamp, Netmedia’s BX-24, Phidgets, MIT’s Handyboard, y muchas otras ofertas de funcionalidad similar. Todas estas herramientas toman los desordenados detalles de la programación de microcontrolador y la encierran en un paquete fácil de usar. Arduino también simplifica el proceso de trabajo con microcontroladores, pero ofrece algunas ventajas para profesores, estudiantes y a aficionados interesados sobre otros sistemas:

Barato: Las placas Arduino son relativamente baratas comparadas con otras plataformas microcontroladoras. La versión menos cara del modulo Arduino puede ser ensamblada a mano, e incluso los módulos de Arduino preensamblados cuestan menos de 50$.

Multiplataforma: El software de Arduino se ejecuta en sistemas operativos Windows, Macintosh OSX y GNU/Linux. La mayoría de los sistemas microcontroladores están limitados a Windows.
Entorno de programación simple y claro: El entorno de programación de Arduino es fácil de usar para principiantes, pero su cientemente flexible para que usuarios avanzados puedan aprovecharlo también. Para profesores, está convenientemente basado en el entorno de programación Processing, de manera que estudiantes aprendiendo a programar en ese entorno estarán familiarizados con el aspecto y la imagen de Arduino.

Código abierto y software extensible: El software Arduino está publicado como herramientas de código abierto, disponible para extensión por programadores experimentados. El lenguaje puede ser expandido mediante librerias C++, y la gente que quiera entender los detalles técnicos pueden hacer el salto desde Arduino a la programación en lenguaje AVR C en el cual está basado. De forma similar, puedes añadir código AVR-C directamente en tus programas Arduino si quieres.

Código abierto y hardware extensible: El Arduino está basado en microcontroladores ATMEGA8 y ATMEGA168 de Atmel. Los planos para los módulos están publicados bajo licencia Creative Commons, por lo que diseñadores experimentados de circuitos pueden hacer su propia versión del módulo, extendiéndolo y mejorándolo. Incluso usuarios relativamente inexpertos pueden construir la versión de la placa del módulo para entender como funciona y ahorrar dinero.

Publicidad