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