Plataformas de Electrónica

David E. Barrera
developer
job skills
projects
electronics
software
hardware
arduino
programming language

A que me dedico cuando no estoy en el trabajo? A pequeños proyectos electrónicos que en algun momento han de ser utiles… Hoy les presento algunos ejemplos…

Arduino

El microcontrolador por excelencia… Pero muchos escuchan el nombre microcontrolador y ya piensan que es complicadísimo, que se requiere un diplomado, masterado, o algún título avalado por alguna universidad cara para poder trabajar con eso… Al contrario! Si puedes usar una calculadora, estas trabajando con un microcontrolador (no exactamente, pero el concepto es ese)…

Qué es un microcontrolador? En palabras simples es un chip que repetidamente hace lo que se le diga que haga… Por ejemplo, si yo le digo prende y apaga un foco, el microcontrolador prende y apaga ese foco continuamente hasta que 1) le cambie las instrucciones o 2) lo desconecte de la fuente de energia.

Simple, verdad? Ok, entonces, cómo le decimos al microcontrolador que instrucciones realizar? Bueno, ahí es donde puede complicarse un poco la cosa… Para ciertos microcontroladores, se requieren equipos especializados y lenguaje de programación de bajo nivel (Assembler). Pero, con el nacimiento de la plataforma Arduino, esto de programar microcontroladores se descomplicó de gran manera logrando que este arte pueda ser realizado por humanos comunes, como usted y yo…

Arduino[1] descomplica el uso de microcontroladores de la siguiente manera:

  1. Facilita la comunicación entre el programador y el microcontrolador haciendo uso de estándares de comunicación como el USB. Toda computadora tiene al menos un puerto USB.

  2. Permite usar lenguaje de programación de alto nivel (lenguaje de programación C++ principalmente) para manipular el microcontrolador. También pueden ser usados otros lenguajes como Python, JavaScript, hasta Scratch!

Siendo así, ahora la único que falta es como usar correctamente el lenguaje para que el microcontrolador lo entienda. A continuación, un ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
void setup() 
{
    pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
    digitalWrite(LED_BUILTIN, HIGH);
    delay(1000);
    digitalWrite(LED_BUILTIN, LOW);
    delay(1000);
}

Analicemos el código:

  • Lineas 1 y 6: Como había dicho, un microcontrolador es un chip que hace algo repetidas veces. La linea 1 establece la configuración inicial. La linea 6 establece las instrucciones a ser repetidas.
  • Linea 3: Como configuración inicial decimos que el pin LED_BUILTIN sea de salida, esto es que este pin enviará información hacia afuera. Pero qué significa LED_BUILTIN? Las diferentes placas soportadas en la plataforma Arduino tienen un foquito, un LED, integrado, pero cada placa lo tiene en un diferente pin, por ejemplo el modelo UNO lo tiene en el pin 13, el modelo MKR1000, en el pin 6. Entonces, en vez de especificar manualmente por cada modelo el pin del LED, usamos esta variable que lo hace por nosotros.
  • Lineas 8 y 10: La instrucción digitalWrite() lo que hace es escribir en LED_BUILTIN el estado, HIGH, encendido, o LOW, apagado.
  • Lineas 9, 11: La instrucción delay() lo que hace es detenerse, hace una pausa por el tiempo que se le indique en milisegundos; en nuestro caso, 1000 milisegundos que equivale a 1 segundo.

Una vez analizado el código linea por linea, podemos ver que el script lo que hace es encender un led por un segundo y lo apaga por un segundo y esto lo repite indefinídamente, o mas específicamente, hasta que cambie las instrucciones o hasta que apague el microcontrolador, como había mencionado antes.

Con el despertar de la comunidad maker gracias a esta plataforma, muchos componentes existen para trabajar con Arduino. Mis favoritos son:

  • Display OLED 0.96" - Display OLED monocromático de 128x64 pixeles
  • DHT11 - Sensor de Temperatura y Humedad
  • BMP180 - Sensor de Presion Atmosferica y Temperatura
  • HC-SR04 - Sensor de Distancia Ultrasonico
  • LDR - Sensor de Luz
  • Modulo Relay de n Canales - Control de equipos de Alto Voltaje
  • HC-SR501 - Sensor de Movimiento Infrarrojo
  • 44E Hall Effect - Sensor Magnetico

Existen muchos más, pero estos en particular son mis favoritos. Pero lo interesante de Arduino es que no solo trabaja con módulos externos, sino tambien permite ser expandido usando lo que se denomina ‘'’shield’'’s. Un shield es una placa que se coloca por encima del Arduino y expande la funcionalidad, como por ejemplo:

Y así como con los módulos, existen muchos más.

Podemos ver que es una plataforma bastante flexible, donde podemos hacer volar nuestra imaginación para crear.

Raspberry Pi

En el mundo actual de la electrónica, Arduino no es la única plataforma que permite el desarrollo de proyectos. También hay otro jugador. Raspberry Pi. A diferencia del Arduino que es un microcontrolador, el Raspberry Pi es una computadora en toda la extensión de la palabra, no solo ejecuta un conjunto de intrucciones preprogramadas una y otra vez, sino que ejecuta procesos y podemos interactuar con este como lo hacemos con una computadora normal.

Muchas veces la confusión radica en su apariencia física y en su enfoque. Por ejemplo, ambos pueden ser usados con módulos y HATs (como Shields, pero para Raspberry Pi). Pero con el Raspberry Pi no solo estamos limitados a hacer una sola acción, sino que podemos realizar varias acciones a la vez. Por ejemplo, podemos leer datos atmosféricos y almacenarlos en una base de datos para poder ser visualizado en una pagina web, todo esto en el mismo dispositivo. Saliendo del mundo de la electrónica, la plataforma Raspberry Pi esta diseñada para ser una computadora pequeña y accesible para aprender a programar. [2]

Programación

Como Raspberry Pi es una computadora con su propio sistema operativo, no necesitamos programarla, pero podemos escribir programas para que trabajen con algun HAT en particular, o tan solo usando algunos componentes exteriores. El lenguaje de programación que podemos usar son varios, Python y Scratch son los mas populares. Usemos Python para recrear el ejemplo de arriba.

1
2
3
4
5
6
7
8
9
10
from gpiozero import LED  # importamos el objeto LED de la libreria gpiozero
from time import sleep    # importamos la funcion sleep() de la libreria time

led = LED(17)             # decimos que el LED esta conectado al pin 17

while True:               # creamos un loop infinito
    led.on()              # enciende led
    sleep(1)              # espera 1 segundo
    led.off()             # apaga led
    sleep(1)              # espera 1 segundo

Aunque con los comentarios podemos ver qué es lo que sucede, aquí podemos ver que las instrucciones son un poco más claras. También podemos ver unas instrucciones especiales al inicio, from gpiozero import LED y from time import sleep. A diferencia de Arduino, que usa una modificación de C++ diseñado para programar microcontroladores, Python es un lenguaje de programación general que desconoce que existen los pines para conectar componentes externos a la computadora, es por esto que se debe agregar al código una libreria [3] , o al menos un componente de esa libreria, en nuestro caso importamos el módulo LED de la librería gpiozero [4], haciendo más sencillo el uso de componentes en proyectos de eletrónica.

Proyectos

Como podrán ver, mi entusiasmo por este tema es alto. Por lo cual me he involucrado en varios proyectos en los últimos años. A continuación los más destacados:

Medidor de Calorias

Creo que este fue uno de mis primeros proyectos. El objetivo de este proyecto era medir las calorías consumidas basado en el giro de rueda de una bicicleta estática. Para este proyecto usé los siguientes materiales:

  • Imán
  • Sensor de Efecto Hall
  • Pantalla LCD 16x2
  • Arduino
  • Bicicleta estática

El concepto es sencillo, basado en la fuerza ejercida para mover la rueda, calcular las calorías consumidas. Suena sencillo, verdad? El problema fue encontrar los cálculos físico-matemáticos para llegar a esto, especialmente para la última parte. Pero como todo problema, es de resolverlo por partes. Lo primero era lograr medir la velocidad del giro de la rueda. Luego era calcular la fuerza ejercida para tener esa velocidad. Finalmente era calcular las calorias consumidas al ejercer dicha fuerza[1][2][3]. Como había dicho, esto último fue lo más complicado ya que la información es escasa y la fórmula es variable de acuerdo al peso y estatura de la persona, valores que deberián ser ajustados en cada sesión.

Botonera Inalámbrica

No sé si el nombre es el correcto, pero expresa bien el concepto. La idea es esta: un profesor publica un cuestionario de opciones múltiples y los estudiantes responden desde estos dispositivos. Pero lo interesante de este proyecto fueron dos cosas: 1) había que hacer el lado administrativo para el profesor (crear las preguntas, las respuestas, tener un cuadro estadístico de las respuestas por cuestionario) y el web service para la botonera obtener las preguntas y opciones y mostralas en una pantalla que tiene cada botonera. Veamos los materiales:

  • Arduino Yún
  • Pantalla LCD 20x4
  • Botones

Para este proyecto tuve que hacer mucha investigación ya que nunca había trabajado con un Yún. Técnicamente debería ser sencillo, ya que he trabajado con Arduino por mucho tiempo, pero la interfaz inalámbrica era manejada por un microprocesador al cual accedía mediante otras librerías que no eran las normales. Y para rematar, no existe mucha documentación acerca del uso del Yún, lo cual complicaba las cosas. Por ahí encontré una guía de como hacer un HTTP Request usando un botón. Pero el ejemplo funcionaba para un botón… Yo tenía varios! Entonces encontré un video que usa una especie de interrupciones para sensar los botones. Mezclé ambos conceptos y logré que funcione. Cada botón enviaba un HTTP Request distinto para almacenar diferentes respuestas en la base de datos.

Todo iba bien hasta que todo cambió… En la pantalla no solo debía mostrar las opciones de respuesta, sino también las preguntas! Un metodo adicional al Web Service, un HTTP Request adicional en el Arduino. Lo que quedó pendiente fue manejar la longitud de la pregunta, ya que usaba una linea de la pantalla para mostrar la pregunta, si excedía los 20 caracteres, se cortaba la pregunta.

[Código]

Parqueo Inteligente

Este proyecto lo hice dos veces, pero el primero falló. Pero de esa falla, aprendí para mejorar en el segundo. En la segunda versión hubieron complicaciones, pero todo salió bien al final. Vamos con los materiales:

  • Arduino Mega
  • Sensores de Distancia HC-SR04
  • Sensor de Obstaculos FC-51
  • Motores Servo
  • Pantalla LCD 16x2 con Interfaz I2C
  • HC-05 BT
  • Cables, muchos cables

Este proyecto se ha convertido en un clásico para tesis o proyectos de grado. Honestamente, la idea es sencilla, sensar cada parqueo y mostrar el estado de cada uno en una pantalla. Aunque en esta parte sencilla es donde la mayoria falla. Tienden a crear una variable por cada sensor de distancia en vez de hacer un array. Lo interesante de esta segunda vez fue que había que tomar en cuenta los parqueos de accesibilidad reducida por separado. Lo nuevo, manejar también la pluma de acceso con una aplicación móvil via Bluetooth, mostrando un mensaje de acuerdo al estado uno de bienvenida o uno diciendo que no hay disponibilidad.

[Código]

Estación Metereológica

Este es mi proyecto actual. Aún no he escrito ningún código, solo he probado los componentes. Hasta el momento tengo:

  • Arduino Uno
  • DHT11
  • BMP180

Con esto tengo temperatura, presión y humedad, lo suficiente como para pronosticar lluvia (quiza?). Al menos el concepto es sencillo, alta humedad y presión, baja temperatura indican alta probabilidad de lluvia. La matemática detrás, probablemente sea la mas complicada. Aún no hago mi investigación. Y por último hará un registro horario de las mediciones en una base de datos, por lo cual he de necesitar un módulo WIFI (ESP8266) o cambiarme de plataforma a Wemos (D1 Mini parece ser el mejor candidato, aunque aún no lo puedo dominar completamente). Otra cosa que quiero agregar es un medidor de indice UV. Hasta ahí va mi idea por ahora.