<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Bitácora de Vuelo (Publicaciones sobre electrónica)</title><link>http://blog.taniquetil.com.ar/</link><description></description><atom:link href="http://blog.taniquetil.com.ar/categories/electronica.xml" rel="self" type="application/rss+xml"></atom:link><language>es</language><copyright>Contents © 2023 &lt;a href="mailto:facundo@taniquetil.com.ar"&gt;Facundo Batista&lt;/a&gt; CC BY-NC-SA</copyright><lastBuildDate>Tue, 04 Jul 2023 00:42:58 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Fase uno del arranque de DSAF</title><link>http://blog.taniquetil.com.ar/posts/0858/</link><dc:creator>Facundo Batista</dc:creator><description>&lt;p&gt;Finalmente arrancó mi viaje de volver un poco a jugar con microcontroladores. Ya tenía &lt;a class="reference external" href="https://github.com/facundobatista/dsaf/"&gt;la especificación que armé&lt;/a&gt; pero me faltaba ir a los bifes.&lt;/p&gt;
&lt;p&gt;Me propuse hacer una primera versión apenas funcional para poder comenzar a darle estructura, porque es muy difícil arrancar algo tan complejo y multinodo. Ya tengo algo cumple con las mínimas condiciones:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En el nodo distribuido&lt;/strong&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;una clase ejemplo como Sensor Manager: leer el conversor analógico-digital y una entrada binaria&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;correr ese Manager periódicamente y reportar los datos que obtenga&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;mostrar el estado con sólo un led: prendido cuando está arrancando y luego ya en funcionamiento regular un parpadeo corto cada cinco segundos&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;En el nodo de administración&lt;/strong&gt;: sólo escuchar en un puerto y mostrar lo que reciba del nodo distribuido&lt;/p&gt;
&lt;p&gt;¡Lo tengo funcionando! Saqué tres videos muy muy cortitos al respecto. El primero es el "nodo distribuido" que prende el led al arrancar y luego parpadea:&lt;/p&gt;
&lt;div class="youtube-video align-center"&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/y-xabMHO7s4?rel=0&amp;amp;wmode=transparent" frameborder="0" allow="encrypted-media" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;p&gt;Ese nodo va tirando logs, acá lo vemos mostrando que arranca, se conecta a la red, empieza a reportar lo del sensor, etc:&lt;/p&gt;
&lt;div class="youtube-video align-center"&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/4VsVhINNdA0?rel=0&amp;amp;wmode=transparent" frameborder="0" allow="encrypted-media" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;p&gt;Y los logs del nodo de administración, que recibe y muestra la data del sensor:&lt;/p&gt;
&lt;div class="youtube-video align-center"&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/wTq44yn3qAE?rel=0&amp;amp;wmode=transparent" frameborder="0" allow="encrypted-media" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;p&gt;(los videos podrían estar mejor sí, podría haber grabado directamente la terminal, pero los tomé rápido y después desarmé cosas, así que no los iba a volver a hacer)&lt;/p&gt;
&lt;p&gt;Las cosas que me chocaron o desafíos que se me presentaron fueron varias.&lt;/p&gt;
&lt;p&gt;Más allá de empezar a desempolvar las cosas de electrónica (por ejemplo, necesitaba una resistencia de 10kΩ y tuve que empezar a revolver todo) encontré que programar en MicroPython es fácil y podés empezar a tirar código funcional y rápido, pero tiene sus limitaciones... &lt;strong&gt;no es CPython&lt;/strong&gt;, y eso se nota por muchos lados:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;no encontré forma de extraer un traceback cuando hay una excepción (para mostrarla o enviarla como reporte)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;no hay &lt;cite&gt;urllib.request&lt;/cite&gt;! Buscando encontré que sí trae un &lt;cite&gt;urequest&lt;/cite&gt; (&lt;em&gt;micro request&lt;/em&gt;), que tiene un &lt;cite&gt;urlopen&lt;/cite&gt; útil, pero no hay &lt;cite&gt;Request&lt;/cite&gt; (esto me complicó la vida para mandar &lt;em&gt;headers&lt;/em&gt; así que estoy mandando los bytes crudos sin decir que es JSON, es un detalle fácil de considerar en el server).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;hay otros módulos que no están y uno ya los usa casi inconscientemente entonces se sufre al no tenerlos, como &lt;cite&gt;itertools&lt;/cite&gt; o &lt;cite&gt;logging&lt;/cite&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;También es evidente que hay mayores restricciones por el entorno. Por ejemplo, memoria disponible. En el método &lt;cite&gt;NetworkManager.hit&lt;/cite&gt; (en &lt;cite&gt;main.py&lt;/cite&gt;) tuve que cerrar la respuesta antes de devolver el contenido... teóricamente esa respuesta se cerraría sola al limpiarse el objeto cuando la función termina, pero en la práctica pasaba que luego de una decena de &lt;em&gt;hits&lt;/em&gt; se desconectaba con un error raro que por lo que encontré en Internet estaba relacionado con que se acababa la memoria.&lt;/p&gt;
&lt;p&gt;Otro tema bien relacionado con el hardware puntual que estoy usando (el &lt;a class="reference external" href="https://es.wikipedia.org/wiki/ESP8266"&gt;ESP8266&lt;/a&gt;) es que tengo disponible sólo un /timer/. Por ahora lo estoy usando para el parpadeo de la luz de estado, pero necesito más funciones periódicas (la otra luz, mandar automáticamente al server el status del nodo, etc). Voy a tener que implementar un "supertimer" arriba de este único timer...&lt;/p&gt;
&lt;p&gt;Tener tests no es tan fácil tampoco, ya que módulos como &lt;cite&gt;network&lt;/cite&gt; o &lt;cite&gt;machine&lt;/cite&gt; están disponibles al correr en el microcontrolador, pero los tests lo corro en mi máquina... por ahora zafé estructurando el código de manera que lo que quise probar estuviese aislado del hardware, pero en algún momento hay que tener ahí &lt;em&gt;stubs&lt;/em&gt;... tengo que ver si hay algo ya hecho, no quiero armarlo yo.&lt;/p&gt;
&lt;p&gt;Y encontré que la funcionalidad que quería, con dos o tres cosas "sucediendo solas" además del funcionamiento del sensor, y la complejidad de los estados por los que puede pasar (que al mismo tiempo le da confiabilidad en el funcionamiento) no era tan fácil de implementar. Terminé armando una &lt;cite&gt;FSM &amp;lt;https://es.wikipedia.org/wiki/M%C3%A1quina_de_estados&amp;gt;&lt;/cite&gt; chiquitita con sus transiciones y estados, y de paso dispuse que ese objeto maneje automáticamente las luces, justamente, de estado. Esto le dio robustez al funcionamiento y en la práctica simplificó bastante el código.&lt;/p&gt;
&lt;p&gt;Conclusiones: con el tiempo invertido podría haber armado en C un hack &lt;a class="reference external" href="https://www.youtube.com/watch?v=VUMcETL6sx4"&gt;sucio y desprolijo&lt;/a&gt; que haga más o menos lo que quería. Pero codear en Python es más alto nivel, puedo armar facilmente estructuras que hacen lo que me propuse de forma robusta y que me van a permitir escalar. Una gran elección.&lt;/p&gt;
&lt;p&gt;Detalles que me quedaron para la(s) próxima(s) iteración(es) antes de pensar en más funcionalidad según la spec:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;dejar de usar el led interno para el (único) estado y poner dos leds verdes y azul como corresponde, y manejarlos correctamente&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;que la config no esté hardcodeada (aunque todavía no quiero depender del Configurator) y que soporte que la misma no exista&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;implementar el "supertimer", y poder mandar periódicamente estado del nodo al server&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;que el Sensor Manager no acceda directamente al hardware, sino a través de una capa ofrecida por el Framework&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;poder leer el estado de la batería e incorporar eso en el estado&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;manejar "batería baja" correspondientemente&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;que el logger sólo arme las cadenas y muestre en pantalla si el nivel corresponde&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les contaré más en el futuro.&lt;/p&gt;</description><category>distribuído</category><category>electrónica</category><category>sensor</category><category>servidor</category><guid>http://blog.taniquetil.com.ar/posts/0858/</guid><pubDate>Tue, 04 Jul 2023 00:30:00 GMT</pubDate></item><item><title>Facilitar la instalación distribuida de sensores y actuadores</title><link>http://blog.taniquetil.com.ar/posts/0856/</link><dc:creator>Facundo Batista</dc:creator><description>&lt;p&gt;Uno de los proyectos que tenía anotado de hace rato para volver a jugar un poquito con electrónica era armar un framework para poder instalar sensores (y en un futuro) actuadores por ahí sin tener que preocuparme por cableado, juntar los datos, y varios detalles más.&lt;/p&gt;
&lt;p&gt;El último par de semanas estuve trabajando en una especificación inicial para eso, la puse en el README del proyecto de Github donde voy a ir subiendo todo: &lt;a class="reference external" href="https://github.com/facundobatista/dsaf"&gt;Distributed Sensors and Actuators Framework&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;El framework a grandes rasgos tiene tres tipos de nodos:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Manager: El nodo central con la interfaz administrativa para el operador humano y una API para exponer todo. Permitiría ver toda la data que mandan los sensores, poder interactuar con los mismos, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sensores y actuadores: Los nodos que generan y transmiten la info, o reciben data y actúan acordemente. Acá la idea es tener un hardware basado en ESP32 programado en Python.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configurador: Es el nodo que configura los nodos distribuidos para que puedan conectarse al Manager. Se usa una sola vez por cada nodito distribuido para que se configure automáticamente.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;a class="reference external image-reference" href="https://github.com/facundobatista/dsaf"&gt;&lt;img alt="La interacción entre los nodos" src="http://blog.taniquetil.com.ar/images/dsaf-system.png"&gt;&lt;/a&gt;
&lt;p&gt;Vayan al proyecto para leer bien el detalle de a qué habilita el nodo central de administración, toda la funcionalidad de los nodos distribuidos y cómo trabaja el configurador, más gráficos, etc.&lt;/p&gt;
&lt;p&gt;¡Se agradecen comentarios!&lt;/p&gt;</description><category>actuador</category><category>administración</category><category>datos</category><category>electrónica</category><category>ESP32</category><category>hardware</category><category>Python</category><category>sensor</category><guid>http://blog.taniquetil.com.ar/posts/0856/</guid><pubDate>Mon, 29 May 2023 18:34:00 GMT</pubDate></item><item><title>Minecraft y la electrónica</title><link>http://blog.taniquetil.com.ar/posts/0823/</link><dc:creator>Facundo Batista</dc:creator><description>&lt;p&gt;Una de las cosas que más me cautivó siempre de Minecraft, además de su total libertad para construir y alterar "el mundo", es que esas construcciones no son pasivas, sino que existen actuadores, generadores de energía, etc.&lt;/p&gt;
&lt;p&gt;Claro, todo es un poco simplificado y "raro" a nivel de la física como la conocemos, pero eso es en pos de la jugabilidad, y aunque a veces puede ser un incordio (hay que aprenderse esos detalles), no es realmente un problema.&lt;/p&gt;
&lt;p&gt;Como muestra basta un botón. Digo, como ejemplo sólo basta un interruptor. En nuestra realidad un interruptor corta o permite el flujo de corriente por el mismo, pero en Minecraft un interruptor es un generador de energía: sólo con poner "cerca" ese botón con un actuador (por ejemplo, una puerta), tenemos el circuito armado.&lt;/p&gt;
&lt;img alt='La puerta y el botón, "sin cables"' src="http://blog.taniquetil.com.ar/images/minecraftelect/botondirecto.png"&gt;
&lt;p&gt;Ahí no hay nada más que lo que vemos, la puerta y el botón sobre el bloque de piedra. Si en el juego vamos y apretamos ese botón, la puerta se abre.&lt;/p&gt;
&lt;section id="el-polvo-rojo"&gt;
&lt;h2&gt;El polvo rojo&lt;/h2&gt;
&lt;p&gt;Pero Minecraft introduce un elemento más que lo cambia todo: la "piedra roja", o "redstone". Se encuentra en las profundidades del planeta, y cuando la minamos con pico de hierro o diamante, nos da polvo de piedra roja (o polvo de redstone, como normalmente se lo denomina).&lt;/p&gt;
&lt;p&gt;Tiene muchos usos. Si lo aplicamos directamente sobre otros bloques cumple la función de "cableado", ya que transmite energía. También podemos hacer antorchas de redstone, que son simplemente generadores de energía, y nos permite armar (con otros componentes) muchísimos más elementos "de alto nivel", como comparadores, repetidores, placas de presión, relojes, brújulas, pistones, etc.&lt;/p&gt;
&lt;img alt="El botón y la puerta, pero ya no tan simple" src="http://blog.taniquetil.com.ar/images/minecraftelect/botonrepetidor.png"&gt;
&lt;p&gt;Una vez que empezás a combinar los elementos, casi que sólo la imaginación es el límite. En la imagen de recién puse el botón y la puerta, como al principio, pero cableados entre sí (porque están lejos) y con un repetidor en el medio (al que se le puede configurar el tiempo de demora al repetir): el efecto es que uno aprieta el botón, y la puerta se abre unos segundos después.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="la-inquietud"&gt;
&lt;h2&gt;La inquietud&lt;/h2&gt;
&lt;p&gt;Durante mucho tiempo estuve con la idea de hacer algo de electrónica dentro del juego, el otro día me decidí, y armé una compuerta NAND.&lt;/p&gt;
&lt;p&gt;Una &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Puerta_NAND"&gt;compuerta NAND&lt;/a&gt; es una de los elementos clásicos de la electronica, y no es más que una AND negada. Aunque al aprender &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Puerta_l%C3%B3gica"&gt;las compuertas lógicas en electrónica digital&lt;/a&gt; siempre se empieza por ANDs y ORs, que son más fáciles, la electrónica realmente gira alrededor de las NANDs porque toda la lógica siempre se puede implementar con NANDs y su implementación (su fabricación) es la más sencilla de todas.&lt;/p&gt;
&lt;p&gt;Al tratar de armar esto dentro del juego me di cuenta que se aplicaban esas reglas raras que a veces tiene el juego en general o la redstone en particular, y tuve que buscar por ahí cómo se podía hacer la compuerta. No es tan difícil, pero implica usar "antorchas de piedra roja" (redstone torches), que es una especie de antorcha hecha con polvo de piedra roja (no como las antorchas comunes, que las hacemos con carbón), y sirven tanto de generación de energía como de inversores de señal.&lt;/p&gt;
&lt;img alt="Una NAND simple en Minecraft" src="http://blog.taniquetil.com.ar/images/minecraftelect/nandsimple.png"&gt;
&lt;p&gt;Armé entonces la compuerta NAND, como muestra la imagen: con dos antorchas cableadas juntas, y usando dos palancas como entradas de señal (que generan un 0 o un 1 en función de la posición) y una puerta para mostrar el estado de salida (abierta representa un 1).&lt;/p&gt;
&lt;img alt="La tabla de verdad de la NAND usando dos palancas y una puerta" src="http://blog.taniquetil.com.ar/images/minecraftelect/tablaverdadnands.png"&gt;
&lt;p&gt;Ahí vemos la tabla de verdad de la NAND (o sea, cada salida para todas las combinaciones de entrada).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="electronica-mas-compleja"&gt;
&lt;h2&gt;Electrónica más compleja&lt;/h2&gt;
&lt;p&gt;Una vez que tuve la NAND, el resto es cuestión de escalar en complejidad. Entonces decidí hacer un flip-flop, para que mediante dos botones pudiera mantener un estado de salida.&lt;/p&gt;
&lt;p&gt;Podríamos argumentar que si en Minecraft queremos una salida estable podemos usar una palanca y ya, pero por un lado acá vamos por el aprendizaje, no la sencillez, y por el otro tengamos en cuenta que en la entrada podemos tener algún dispositivo automático que genere energía por un momento (por ejemplo, un sensor de presencia), y podemos querer agregarle "estado" a eso.&lt;/p&gt;
&lt;p&gt;Volvamos. Un &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Biestable"&gt;flip-flop&lt;/a&gt; es el elemento electrónico más básico que puede mantener un estado estable durante un tiempo indefinido (efectivamente almacenando información... o sea, "recuerda" si está en cero o en uno, podemos decir que es la memoria estable más básica).&lt;/p&gt;
&lt;p&gt;Hay de distintos tipos, pero apunté al más sencillo, el set-reset, que sólo tiene dos entradas, una para poner al flip-flop en 1 ("set", o S), y la otra para ponerlo en 0 ("reset", o R).&lt;/p&gt;
&lt;img alt="Implementación de un flip-flop SR usando NANDs" src="http://blog.taniquetil.com.ar/images/minecraftelect/diagramaflipflop.png"&gt;
&lt;p&gt;Entonces, armé ese circuito, y puse una puerta en una de las salidas (la otra no me interesa). Fíjense en el diagrama de arriba que la entrada "set" y "reset" están negadas (la barrita horizontal arriba de la S y la R). Estuve viendo cómo hacer un negador simple en Minecraft y no me salió (teoricamente las antorchas redstone funcionarían, pero como del otro lado estaban cableadas no me anduvo en el apurón), así que opté por un viejo truco del electrónico, usar una NAND (¿les dije que son la base de todo?) con las entradas unidas.&lt;/p&gt;
&lt;img alt="Dos botones, la puerta al fondo" src="http://blog.taniquetil.com.ar/images/minecraftelect/flipflop-usuario.png"&gt;
&lt;img alt="Una vista del entrecruzamiento de las NANDs" src="http://blog.taniquetil.com.ar/images/minecraftelect/flipflop-cruce.png"&gt;
&lt;p&gt;Me terminaron quedando los dos botones cerquita, uno para abrir la puerta y otro para cerrarla (le puse cartelitos como recordatorio). A la izquierda y derecha de cada botón está su NAND-negador correspondiente, y más adelante las dos NANDs cruzadas que arman el flip-flop (se puede ver mejor el cruce de los "cables" en la segunda imagen).&lt;/p&gt;
&lt;p&gt;El circuito anda de perlas. Ahora tengo ganas de hacer algo más complejo, pero tendría que ver de hacer ese flip-flop más compacto sin que se "toquen los cables" (no es fácil con el polvo redstone), y ver de simplificar esos negadores.&lt;/p&gt;
&lt;p&gt;Ya les contaré.&lt;/p&gt;
&lt;/section&gt;</description><category>compuertas</category><category>electrónica</category><category>flip-flop</category><category>Minecraft</category><category>NAND</category><guid>http://blog.taniquetil.com.ar/posts/0823/</guid><pubDate>Mon, 14 Dec 2020 23:26:00 GMT</pubDate></item><item><title>¡Yo quiero!</title><link>http://blog.taniquetil.com.ar/posts/0273/</link><dc:creator>Facundo Batista</dc:creator><description>&lt;p&gt;Dos dispositivos maravilla.&lt;/p&gt;
&lt;p&gt;El primero, es una computadora tamaño mínimo, &lt;a class="reference external" href="http://www.linutop.com/index.es.html"&gt;Linutop&lt;/a&gt;.&lt;/p&gt;
&lt;img alt="Minicomputadora" src="http://blog.taniquetil.com.ar/images/dosdev_maq.jpg"&gt;
&lt;p&gt;Pesa menos de 300 gramos, y tiene un procesador AMD de 433MHz, 256 MB de RAM, 4 puertos USB, audio, salida VGA, y red. No tiene disco rígido, pero viene con un disco USB de 1GB preparado para bootear Linux, ¡sólo se enchufa y se usa!&lt;/p&gt;
&lt;p&gt;El segundo es un &lt;a class="reference external" href="http://steampunkworkshop.com/keyboard.shtml"&gt;teclado&lt;/a&gt;, hecho artesanalmente.&lt;/p&gt;
&lt;img alt="Teclado bizarro" src="http://blog.taniquetil.com.ar/images/dosdev_keyb.jpg"&gt;
&lt;p&gt;La electrónica y los mecanismos de las teclas son "reciclados" de un teclado común, pero el flaco este armó toda la estructura rígida; las superficies de las teclas las recicló algunas de una máquina de escribir, fabricó el resto.&lt;/p&gt;
&lt;p&gt;En el sitio pueden ver instrucciones paso a paso de cómo armarlo, e incluso videos para comprenderlo mejor.&lt;/p&gt;
&lt;p&gt;Gracias a Dave y a Ramón por los enlaces originales de ambos dispositivos.&lt;/p&gt;
&lt;p&gt;Bueno, ya saben que me pueden regalar en el próximo cumpleaños, :p.&lt;/p&gt;</description><category>computación</category><category>electrónica</category><category>hardware</category><category>teclado</category><guid>http://blog.taniquetil.com.ar/posts/0273/</guid><pubDate>Thu, 19 Jul 2007 13:53:02 GMT</pubDate></item></channel></rss>