Adaptarse y correr

Informática y tecnología

Cómo diseñé mi propia radio FM

Hace años que me rondaba por la cabeza la idea de construir mi propia radio FM. Había llegado a comprar algunos de los componentes necesarios, y construí un prototipo pero me faltaba concretarlo en algo que pudiese usar todos los días. Sin cables a la vista.

Por fin me decidí. Y me puse manos a la obra.

Radio con carcasa imprimida en 3D.
Radio FM

Para la parte electrónica usé los siguientes componentes: Un módulo de radio para Arduino con el chip TEA5767, para sintonizar todos los canales; una pantalla OLED monócroma de 0.97 pulgadas, para mostrar la frecuencia sintonizada; amplificador de audio stereo; y un módulo ESP 32 WROOM, para controlarlo todo. El módulo de radio que utilicé no tiene control de volumen, de ahí que necesitara un amplificador para controlar el volumen.

El módulo de radio trabajaba a 5V y el ESP 32 a 3V, por tanto, usé un conversor de nivel para el bus I2C que conectaba ambos dispositivos. Como el ESP32 tiene dos comunicaciones serie I2C use uno para la pantalla y el otro para el módulo TEA5767. La alimentación de 5V y 3V la saqué de las correspondientes patillas de mi ESP 32. Falta por añadir que para sintonizar los canales use 2 patillas del ESP 32 que tienen «Touch sensor», o sea, que es sensible al tacto. Una patilla para subir la frecuencia y otra para bajarla que estaban conectadas a dos chapas de aluminio que hacían de botón.

Al amplificador van conectados dos altavoces para portátil.

La alimentación de toda la radio viene a través del puerto micro-USB del módulo ESP 32.

Faltaba la carcasa. La diseñé partiendo de cero tomando medidas a los componentes que quería fijar en ella. Creé todo el diseño con el programa OpenSCAD con el que generé los archivos de extensión STL. Luego usé el programa Ultimaker CURA, para que a partir de dicho archivo STL generase el código que entendiese mi impresora 3D. Finalmente, imprimí la carcasa en plástico PLA.

Fijé todos los componentes con tornillos y tuercas M2 y M3.

Os dejo unas imágenes de cómo quedó la radio FM.

Radio FM vista lateralmente.
Vista lateral de la radio.

Como hacer un visor de fractales

Hace algo menos de un mes me encontré con un artículo en la revista ‘The Magpi’. En él se hablaba de la construcción de un visor de fractales con un marco, una pantalla de tinta electrónica (e-ink display) y una Raspberry Pi. Aquí tenéis el artículo : https://magpi.raspberrypi.com/articles/piartframe.

A mi me encantó la idea desde el principio. Así que recordando que tenía una pantalla de tinta electrónica a la que no daba mucho uso (por no decir que estaba guardando polvo en una caja), decidí ponerme manos a la obra.

La pantalla venía con una placa de desarrollo para un microcontrolador ESP32. Se trata de una LilyGo ttgo T5 de 2.7 pulgadas con la particularidad de que es capaz de mostrar 3 colores, blanco, negro y rojo. Necesitaba también un marco. Elegí un porta-fotos de 10 x 15 cm con el marco negro que encontré en Amazon. Me encargué también un passepartout de 10 x 15 cm con una ventana del tamaño de mi display. ¿Qué es un passepartout? no es más que un cartón con una ventana biselada en medio para realzar el motivo central de una foto o cuadro. Lo pedí online en el «Taller del cuadro». También usé una tarjeta micro sd para almacenar temporalmente las imágenes mientras se van creado.

Como ya venía con un micro controlador, decidí no usar ninguna Raspberry Pi y programé todo el código en el entorno de programación Arduino.

Para hacer el software, partí de un ejemplo que muestra una serie de imágenes almacenadas en la micro SD. Tuve que hacer nueva la parte de generar la imagen en un bmp y el código de generación de la fractal. Por cierto, elegí el conjunto de Mandelbrot como fractal.

Ahora os voy a contar un truco que utilizé al programar el visor. La idea al principio era parametrizar la generación de las fractales y pasarle unos valores aleatorios para que siempre muestre imágenes distintas. El problema de este planteamiento es que no siempre genera imágenes bonitas. En muchas ocasiones dejaba la pantalla completamente en negro. Para solucionar esto lo que hice es que al arrancar se genera una imagen con el conjunto de Mandelbrot centrado y completo. Y me guardo en un fichero pares de valores x e y de los puntos en los que esa imagen cambia de color. Luego, genero un número aleatorio n y leo en la posición n del fichero la posición del centro de la imagen que voy a mostrar. Para aleatorizar más, calculo un segundo número aleatorio que me indica la cantidad de zoom que quiero realizar. Esto me asegura que muestro un fractal de una zona interesante y que siempre son imágenes distintas.

Porta-retratos con fractal de Mandelbrot

Como construir un reloj sincronizado por el protocolo NTP, con un microcontrolador ESP8266 y una pantalla OLED.

Las pasadas navidades construí un reloj para ponerlo en el salón. La idea era tener un reloj que no fuese necesario ponerlo en hora. Os detallo someramente como lo hice.

Hardware

Para realizarlo use los siguientes componentes: un microcontrolador ESP8266, una pantalla OLED de menos de dos pulgadas, 3 tornillos M2,5 y una carcasa de plástico PLA que construí con una impresora 3D a partir de un diseño que encontré en la web de Thingiverse.

El microcontrolador ESP8266 se caracteriza por tener wifi, así que aproveche esta característica para obtener la hora de internet. De esta forma no necesitaba disponer de un reloj en tiempo real, ni diseñar un sistema más o menos complicado de puesta en hora. Como desventaja decir que al usar la wifi de mi casa el reloj no funcionará si me lo llevo a otro lugar (salvo que lo reprograme con el SSID y password de la nueva wifi, que no es nada complicado).

Para montar todo el hardware imprimí en 3D un monitor para la pantalla OLED y la placa ESP8266. En realidad esta carcasa estaba diseñada para realizar un monitor de control de un servidor de Octoprint, pero se ajustaba perfectamente a lo que yo necesitaba.

Software

Para que todos estos componentes funcionasen faltaba el software para lo cual fusione dos ejemplos que vienen con el entorno Arduino a los que les hice modificaciones para que se mostrase en la pantalla la información que yo quería.

Tras instalar la placa esp8266 en el entorno Arduino tome como ejemplo un script para obtener la hora por NTP que usaba la librería «ntpclient». Pero unos meses más tarde, con el cambio al horario de verano, dejé de tener la hora sincronizada. Por tanto, tuve que buscar otro ejemplo que tuviese en cuenta el «day saving time» el script elegido se llama NTP-TZ-DST y viene dentro del apartado de ejemplos para la placa ESP8266 en el entorno de desarrollo para Arduino.

El otro ejemplo que combiné con el anterior fue un reloj que mostraba la hora en digital y en analógico por turnos sobre un pantalla OLED de 1,3 pulgadas. Lo modifiqué para que cuando se mostrase la hora en digital mostrase también la fecha. Además, le añadí una tercera vista en la que se mostraba la hora en digital simulando un visor de 4 dígitos de 7 segmentos. El propósito era aprovechar mejor todo el área de la pantalla para poder ver de lejos la hora.

Para finalizar, os dejo un vídeo con el reloj en funcionamiento.

Información y barra de progreso de un comando que has lanzado previamente y que se demora demasiado tiempo

En una entrada anterior os expliqué como hacer una copia de una tarjeta micro SD dañada de una Raspberry Pi 400. El caso es que el comando de copia del estilo:

dd if=/dev/sdb of=/dev/sdc

tarda mucho tiempo en terminar. Además no ofrece información de como va el proceso y podemos llegar a pensar que se ha bloqueado.

Yo conocía el comando ‘pv’, que muestra información de como va la trasferencia de un fichero. El problema era que ya había lanzado el comando ‘dd’ y no quería detenerlo para volver a lanzarlo usando ‘pv’. Pues llevaba ya varias horas de procesamiento.

Rebuscando en la pagina de manual de Linux (comando ‘man pv‘) encontré que se podía lanzar el comando con la opción -d que indica que muestre el progreso de un descriptor de fichero de un proceso en ejecución.

Abrimos otra terminal distinta a la en que hemos lanzado el comando dd. Los comandos a ejecutar son los siguientes: (lo he hecho como root)

pv -d <PID>:<FD>
Como añadir una barra de progreso para un proceso activo.

Con el comando ‘ps’ encontramos el PID del proceso que esta tardando demasiado, en este caso el 5464. Con el comando ‘ls’ encontramos los descriptores de fichero que tiene abiertos dicho proceso. 0 es la entrada estándar, 1 la salida estándar, y 2 la salida de error estándar. El descriptor que buscamos es el 0. El comando ‘pv’ muestra el progreso de lectura del descriptor de fichero 0 del proceso 5464. Como podéis ver se muestran los Gigas copiados, cuanto lleva ejecutándose el comando, la velocidad de transferencia, la barra de progreso, el porcentaje de lo ya copiado y el tiempo estimado para acabar.

Nota: Es posible que en vuestro sistema no encontréis el comando ‘pv’. Para instalarlo:

sudo apt install pv

Recuperar sistema tras error en la tarjeta micro SD de una Raspberry Pi

Hoy os voy a contar el proceso que he seguido para recuperar el sistema operativo sin perder datos en una Raspberry pi 400.

El problema: Una Raspberry Pi 400 con una tarjeta micro SD de 128 GB. Sistema operativo (en adelante SO) instalado en la micro SD: Ubuntu 22.4 64 bits. Tras un reinicio del sistema, este no arranca. Al iniciar se nos queda en una pantalla de consola que se identifica como BusyBox.

Esto del Busybox es un mini sistema operativo que en este caso se utiliza para intentar recuperar el sistema.

Intento lo siguiente, para descubrir el nombre de las particiones:

/sbin/fdisk -l

y después intento repararla con el comando fsck

fsck <nombre_de_la_partición>

Por desgracia no es posible recuperarse del error porque me da el mensaje: «unable to set superblock flags». Es decir tengo una SD en la que no se puede escribir pero todavía se puede leer.

La tarjeta micro SD está dañada, pero no está todo perdido. Aunque, eso sí, toca comprar una tarjeta micro SD nueva de igual o mayor capacidad.

Ya con la nueva tarjeta, lo que voy a hacer ahora es hacer una copia de la tarjeta vieja y duplicarla en la tarjeta nueva. Esto puede hacerse de varias maneras pero os voy a explicar como lo hice yo.

En primer lugar necesitamos un equipo distinto y un lector USB de tarjetas SD (si el equipo no dispone de ranuras para tarjetas de memoria). Si no tenemos otro equipo podríamos usar la misma Raspberry Pi con otro SO basado en Linux y un lector de tarjetas USB para la tarjeta dañada y luego para la nueva, ya que la ranura micro SD estará ocupada por la tarjeta del sistema operativo.

En mi caso contaba con un ordenador con SO Debian y un adaptador de tarjetas SD a USB. Arranco el sistema con la tarjeta SD dañada dentro del adaptador USB. Abro una consola de comandos y ejecuto el comando:

fdisk -l

Hay que identificar el nombre del dispositivo del la tarjeta SD. En mi caso lo reconozco porque en la salida del comando pone ‘Modelo de disco: Flash Reader’. que esta identificado como ‘/dev/sdb’. Quédate con este nombre porque lo necesitaremos en el siguiente comando.

Ahora vamos a hacer la copia de la tarjeta. Si dispusiésemos de dos ranuras micro SD podríamos hacer hacer la copia directamente de una tarjeta a otra. Pero lo mas normal es que solo tengamos un adaptador de tarjetas SD a USB. La solución en mi caso es hacer la copia de la tarjeta a un disco duro y después sustituir la tarjeta dañada por la nueva en el adaptador USB y copiar el fichero a la tarjeta.

el comando para hacer la copia es ‘dd’ al que se le pasan al menos dos parámetros if que indica el fichero de entrada y of que indica el fichero de salida:

dd if=/dev/sdb of=~auxfile

Después de realizar la copia, que tardará un rato largo, sustituimos la tarjeta dañada por la nueva y ejecutamos el siguiente comando:

dd if=~auxfile of=/dev/sdb

Con esto ya habríamos hecho la copia. Sacamos la tarjeta del adaptador y la introducimos en la Raspberry Pi, y a correr.

Truco: Configuración correcta para acceder a una impresora de red en Windows

Llevaba un tiempo experimentando problemas con un PC de mi casa. El problema era que desde un equipo con Windows 11 no podía imprimir. Si usaba el asistente de Windows para añadir impresora la encontraba y me dejaba imprimir… hasta que reiniciaba el equipo y entonces no se encontraba la impresora de nuevo.

En un principio pensé que tal vez la impresora tenía algún fallo o que quizás lo que fallaba era el driver de la impresora en Windows 11. Pero era algo mucho más sencillo de arreglar…

Me conectaba a la red usando un adaptador wifi. Descubrí que en las opciones de red me estaba conectando a una red pública. Fue cambiar la opción de tipo de red a una red privada y empezó a funcionar el descubrimiento de la impresora en la red.

Solución: Hay que configurar la red que estás usando como privada para que funcione el descubrimiento de servicios de red. Entre ellos las impresoras conectadas a la red.

Es algo muy básico, pero que si no se te ocurre mirarlo no das con la solución.

La vida

El mundo esta cambiando aceleradamente. Si permaneces inmutable estás destinado a extinguirte. A los seres vivos solo les queda una salida: adaptarse y seguir adelante. Esta es la carrera de la vida. Adaptarse y correr: «Adapt & run».

Esta es la primera entrada de un blog que sé como comienza pero que no sé como continuará. La vida es así. Está en constante cambio. Yo no podía ser menos, así que prepárate para lo inesperado. La idea es empezar escribiendo sobre asuntos de tecnología y programación, después ya veremos como evoluciona todo.