domingo, 21 de abril de 2019

"Hello World" telegráfico en Raspberry Pi Zero

Hace algo menos de 40 años atrás escribía en la entonces recientemente salida revista K64 mi primer artículo, se trataba de emitir código Morse con una revolucionaria para la época computadora Sinclair ZX81.  El artículo causó bastante furor por entonces y fue seguido por muchos mas en una colaboración que duró varios años y produjo un par de docenas de artículos. Hace mucho que la revista dejó de salir pero yo sigo usando los dibujos pues me gustan mucho y me transportan brevemente a una época muy linda. Hay un proyecto que trata de compilar imágenes de las ediciones, así que quien tenga números en papel quizás quiera contribuir.  El dibujo que hicieron para ese artículo lo usé muchas veces en éste blog, pues aquel no fue ni el primer ni el último manipulador electrónico que diseñé, ni para la ZX81 (o TS1000 como se la conocía por aquí) ni para muchas otras plataformas que le siguieron. Esta introducción es para tratar de explicar porque tantas veces he realizado éste tipo de proyectos. En realidad cuando uno incursiona en una nueva plataforma enfrenta una curva de aprendizaje, que es bastante áspera al comienzo pues se tiene que aprender muchas cosas de golpe. 
Es una estrategia muy útil para enfrentarla hacer un "Hello World", que no es mas que un pequeño programita que hace solo eso, genera el texto "Hello World" y lo presenta por cualquiera sea el dispositivo disponible. Parece una soberana tontería, pero no lo es. Para poder lograr que un programa tan simple funcione hay que tener muy configurado el ambiente, haber entendido todas las opciones necesarias, encontrar que editor hay disponible y como usarlo, enfrentarse con problemas en casa uno de esos pasos anteriores y encontrar como solucionarlos. No es nada trivial. Y es una manera de hacer "algo" sin que la complejidad de ese "algo" sea fuente de ningún problema; es como salir con trapito rojo a "torear" a los problemas para que aparezcan ya así eliminarlos de a uno. Pero en realidad el Hello World no ayuda a mas que saber que la configuración anda, pero no permite explorar mucho del resto del ambiente, así que en mi caso usualmente hago un segundo proyecto corto, pero mas complejo, con el cual terminar de familiarizarme. Es un proyecto que conozco mucho, que no me es difícil, pero para el cual tengo que poner en juego algunas técnicas de programación y entender como funciona la entrada-salida de la plataforma "nueva", ese proyecto es y ha sido siempre un manipulador de telegrafía. Explico todo ésto para intentar compartir cuando, inevitablemente, me comenten que se puede hacer lo mismo con un integrado LM555 que no, no es lo mismo.
En este caso le tocó a la Raspberry Pi. En realidad no es el primer proyecto que hago con ésta placa, hace ya algunos años que hago cosas con ellas, pero últimamente casi todos mis proyectos están basados en ese plataforma. Contribuye que tengo que practicar CW "a mano" (habilidad que en la que me he endurecido bastante luego de usar un teclado por mas de una década) y que cuando fui a buscar mi keyer basado en un PIC 12F675 encontré que no funcionaba (vaya uno a saber porque). Las alternativas eran buscar porque no andaba y repararlo, o hacer uno nuevo. Por supuesto que es mas divertido hacer uno nuevo, y eso hice, porque de eso se trata un hobby, de divertirse.
Como he comentado varias veces he construido un cluster de placas Rasbpberry Pi que las uso para experimentación de distinto tipo, balizas multimodo, monitor de WSPR, el nodo SatNOGS y un par que están libres para otros usos y desarrollos. Tengo también dos placas Raspberry Pi Zero, una tipo W (con Wifi) y la otra sin el. La que tiene Wifi (lambda crux) la transformé en un beacon WSPR/FT8 explicado en una entrada anterior. La otra placa (delta crux) me resulta un poco difícil encontrarle un uso permanente, es pequeña y no es fácil acomodarla en la "torre" donde está el cluster, además como adquiere Wifi mediante un "dongle" externo no siempre lo hace bien, y en ocasiones para encontrar donde está en la red tengo que "buscarla" con el utilitario nmap o incluso conectarla a un monitor/teclado cuando se niega a conectarse, un fastidio. Así que nada mejor para ella que un uso que no requiera red salvo ocasionalmente. Un manipulador (keyer) cumple esa condición, es necesario conectarse a la red para construirlo y quizás para configurarlo, o mejorarle el nivel del software o acaso hacer algún mantenimiento, pero en el uso diario es completamente independiente ("standalone" lo que en inglés significa "que se para solo"). Pero en vez de escribirlo desde cero simplemente exploré en GitHub un poco que había al respecto y me encontré con el paquete denominado iambic-keyer de Rick (N1GP), que cumplía con casi la totalidad de lo que necesitaba. El "casi" lo solucioné haciendo "fork" del paquete en mi propio espacio GitHub y haciendo una nueva versión donde hice los agregados que necesitaba (http://www.github.com/lu7did/iambic-keyer). El programa tiene una arquitectura simple, la lógica del keyer está en el módulo iambic.c (https://github.com/lu7did/iambic-keyer/blob/master/iambic.c) (el que modifiqué) mientras que la generación de tonos está en keyed_tone.c (el que no modifiqué); según el help el programa originalmente estaba implementado en una FPGA en Verilog por Phil (VK6PH).
Esas modificaciones fueron muy simples, cambiar un poco los mensajes, acomodar los puertos de salida a lo que necesitaba y agregar una función para poder cambiar la velocidad sin tener que re-lanzar el programa mediante la lectura del estado del puerto GPIO 19. Esta última trabaja de manera que si detecta la paleta en "punto" con el pulsador de velocidad a masa va disminuyendo la velocidad hasta 5 ppm y en caso de ser "raya" la incrementa progresivamente hasta 50 ppm. El circuito es realmente mínimo, todas las salidas se configuran para tener su resistencia interna de pull-up activadas por lo que solo hay que conectarlas a masa para producir un "0" mientras que la lectura en reposo dá un "1" (recordar que estos pines manejan 3.3V y muy baja capacidad de corriente). El manipulador va entre GPIO13 y GPIO15, la salida para "manipular" es GPIO12, se usa un transistor PNP para manipular poniendo a masa la base. Si se es temeroso sobre a que se conecta siempre se puede utilizar un optoaislador en lugar de un transistor. La electrónica es suficientemente simple, pero nunca está de mas utilizar un diagrama para dejar las cosas claras.
El armado he vuelto a utilizar las latitas de pastillas "Altoids" que tan prácticas son para circuitos simples, primero se ponen todos los conectores directamente en montaje "auto soportado" (araña) y luego con unos pilares pequeños de metal la placa misma; hay que cavar agujeros para los dos conectores USB (alimentación y expansión).
El programa tiene la opción de generar su propio "zumbador" utilizando un puerto GPIO de salida o de hacerlo mediante una placa de sonido. La Raspberry Pi Zero no tiene salida de audio (como si lo tienen sus primas mayores, los modelos "normales"). No encontré incómodo usar un pequeño hub USB para conectar al mismo tiempo un "dongle" Wifi y una placa de sonido USB. Para manejar el sonido se usa un paquete llamado jack el cual debe ser instalado. Para su construcción el programa utiliza la librería de manejo del GPIO denominada wiringPi, ¡muy conveniente!
En ejecución hay que realizar una serie de pasos para que todo ejecute correctamente, por lo que en esos casos es siempre útil hacer un pequeño script bash que impida los errores, al efecto hice el script keyer que es parte del paquete y que se opera con la misma interfaz que un servicio (sudo ./keyer start o sudo ./keyer stop), el programa debe ser ejecutado con sudo por el tipo de operaciones que hace para manipular el hardware. Para que el funcionamiento sea completamente "standalone" es necesario arrancar el programa cada vez que se da boot a la placa. Tuve algunas dificultades para que funcionara bien como servicio o arrancándolo como parte de la secuencia init.d del Linux por lo que usé el método de fuerza bruta, puse en el cron la sentencia de llamada a continuación de la macro "@reboot" de forma que se ejecute al boot de la placa.
Anda lindo y por cierto que ya estoy practicando mis muy oxidadas habilidades de enviar CW manualmente, cosa que el Rafa Panoni (LU3HAZ) me enseñó muy bien, pero que la comodidad del teclado hace perder, de manera que vuelvan a hacer juego con las muy afiladas de tomar CW a oido. Y si todavía alguien propone un manipulador con un 555 o integrados CMOS le concederé inmediatamente que es mas barato, le discutiré un poco que sea mas fácil y definitivamente cerraré la discusión con la invitación  a que use el manipulador para escuchar música.



No hay comentarios:

Publicar un comentario