Convertir imágenes a hexadecimal para MicroPython

Ayer me cruce con un problema que quizás Uds ya les ocurrió; necesitaba crear un carácter personalizado para mostrarlo en el display LCD de 2×16.

Resulta que estoy trabajando con MicroPython. utilizando una librería para mostrar texto en el display, la librería se llama python_lcd. Para poder mostrar caracteres personalizados con esta librería es necesario primero construir un array de 8 hexadecimales, cada uno representa que puntos de las lineas horizontales estarán encendidas y apagadas. Luego se lleva a memoria este array, de manera que este disponible para su uso en el display; y por ultimo se lo muestra en pantalla indicando la dirección donde esta almacenado.

Existe una pagina en internet que permite dibujar manualmente los caracteres y luego devuelve el array necesario para mostrarlo en el display http://javl.github.io/image2cpp/; la había utilizado anteriormente y es muy útil si debemos dibujar un solo carácter. Quiero tratar de dibujar un imagen utilizando todos los caracteres del display, o en lo posible mas de uno.

El script que arme toma una imagen, lo recomendable es alimentarlo con una imagen de baja resolución y que sea blanco y negro, de manera de tener mejores resultados; recordemos que la resolución de cada carácter es de 8 lineas por 5 columnas.

El primer paso es entender que necesitamos para dibujar un carácter en el display, la librería nos pide un array de hex para mostrarlo; para construir este array, primero debemos identificar que puntos del carácter estarán encendidos por cada linea:

Luego debemos convertir estos bytes en hexadecimal y tenemos nuestro array para usarlo.

El script

El script utiliza opencv para leer la imagen que le proporcionamos, en caso de ser necesario, la redimensiona al tamaño proporcional de las columnas y filas que vamos a utilizar. Si es una imagen muy grande, es posible que se pierdan todos los detalles y tengamos una mancha en el display; por lo que vuelvo a recomendar utilizar imágenes de muy baja resolución.

Luego recorre las columnas de cada fila evaluando si se debe activar o no ese punto; y genera el array en hex.

Termina construyendo un archivo de salida, que contiene todos los caracteres y una segunda linea por cada carácter, que lo ubica en memoria.

Es necesario tener en cuenta que el script recorre las imágenes (al menos en esta primer versión) en el siguiente orden:

Por lo que si queremos dibujar en el display, seria necesario realizar, suponiendo que los caracteres se guarden en memoria siguiendo el nro. de la retícula:

lcd.putchar(chr(0)) #mostramos el carácter de la retícula 0
lcd.putchar(chr(2)) #mostramos el 2do carácter
lcd.move_to(0,1) #pasamos a la segunda linea
lcd.putchar(chr(1)) #mostramos el carácter de la retícula 1
lcd.putchar(chr(3)) #mostramos el ultimo carácter.

El script pueden descargarlo desde github

Instalando MicroPython en NodeMcu ESP8266

Para instalar MicroPython en NodeMcu solo tenemos que seguir unos sencillos pasos (si todo funciona bien):

  1. Instalar una herramienta llamada esptool, que vamos a utilizar para cargar el firmware.
    Se instala realizando: pip install esptool
  2. Luego de tener instalada la herramienta, debemos borrar el firmware actual, una vez que lo hagamos ya no podremos cargar programas utilizando el IDE de Arduino.
    Necesitamos saber cual es el puerto al que se encuentra conectado el NodeMcu, para eso les recomiendo que entren en el administrador de dispositivos.
    Desde la terminal corremos, en mi caso COM14 es el puerto que tomo el dispositivo:esptool –com COM14 erase_flash
  3. Descargamos la ultima versión del firmware desde http://micropython.org/download#esp8266 , y volvemos a utilizar la herramienta esptool para cargar el firmware. En mi experiencia, tuve mejores resultados utilizando una velocidad de transmision de 115200 y usando el parametro –verify para que valide que el firmware fue subido correctamente:esptool port COM14 baud 115200 write_flash flash_size=detect 0 esp8266-20180511-v1.9.4.bin –verify

    Una vez realizado esto ya tenemos cargado el firmware.