Hacer una guirnalda con un niño

imagen

Nivel de dificultad: para principiantes.

La idea surgió cuando la vieja guirnalda se rompió en la víspera de Año Nuevo. El hijo miró la tira de LED RGB y preguntó si era posible hacer una guirnalda con ella. Puedes - dije, y el hijo comenzó a describir durante mucho tiempo exactamente cómo debería parpadear la guirnalda. No entendí nada y decidí asegurarme de que él pudiera hacer lo que quisiera por su cuenta. Comencé analizando mis propios deseos para el proyecto:

  1. Entorno de desarrollo estilo scratch
  2. trabajo sin conexión: la capacidad de trabajar con el dispositivo apagado
  3. Trabaja por aire, sin conectar un cable
  4. Fiabilidad: ningún programa descargado debe "colgar" el dispositivo hasta que sea necesario reiniciar


Plataforma de hardware


transistores

Basado en la placa ESP8266 con NodeMCU ( como esta ), se le agregaron un par de transistores y resistencias. Los módulos seleccionados tienen un regulador de voltaje de 3-20 voltios, que le permite alimentarse desde la misma fuente que la cinta. Las salidas esp dan un voltaje de 3 voltios con un límite de corriente de 12 mA, por lo que utilicé transistores bipolares convencionales para controlar la cinta.

imagen

Para que el humo blanco no salga del microcontrolador, coloco una resistencia de 220 ohmios entre la salida y la base. Esp tiene software pwm, algunos pines tienen un propósito especial, seleccioné experimentalmente.

Firmware


Antes de usar, esp8266 necesita ser flasheado, uso NodeMCU con lua, aunque tiene un poco menos de características que Arduino con C ++. Entonces, la forma más fácil de comenzar es con el firmware listo de nodemcu-build.com . Para nuestro proyecto, necesitaremos agregar el módulo pwm. Después de un tiempo, aparecerá un enlace a la imagen en el correo. Necesitas tomar el que tiene flotador.

Puede flashearlo con cualquier programador desde aquí , y uso NodeMCU Flasher.

NodeMCU tiene un sistema de archivos, la ejecución comienza con el módulo init.lua, uso ESPlorer para descargar.

Diodo parpadeante


El siguiente momento me engañó. La numeración interna (GPIO0-16) se usa solo en programas nativos (Arduino / C ++). Desde lua, se usa la notación del tablero. Por ejemplo, para usar GPIO16 / D0 (LED incorporado). desde Lua, debe escribir gpio.write (0, gpio.HIGH). Puede parpadear un diodo directamente desde la consola ESPlorer.

imagen

A diferencia de Arduino, nodemcu no puede usar delay y busy-loop, la consola y wifi usan el mismo procesador para funcionar. También se ha incorporado un perro guardián en el tablero, que lo reiniciará si su código se ejecuta más de 500 ms. Se recomienda no ocupar el procesador más de 2 ms. Para resolver el problema, hay funciones node.task.post y tmr

Elegir un entorno de desarrollo


Al principio quería usar Scratch, pero no me convenía, porque no me permite trabajar sin conexión: el programa se ejecuta en una computadora en un entorno scratch y todos los tableros funcionan pasivamente. Habiendo hurgado en Internet, me encontré con Google Blockly . Esto resultó ser exactamente lo que necesita: admite la generación de código en lua y la creación de sus propios bloques. Después de experimentar, decidí hacer mi proyecto basado en la web, elegí nodejs como servidor y Blockly como interfaz. Era absolutamente necesario crear 2 bloques: establecer el color y el retraso. Blockly tiene funciones incorporadas para trabajar con colores en el formato #ffffff, crear una función para configurar el color no fue un problema.

Encabezado de spoiler
Blockly.Lua['set_color'] = function (block) { var parseColor = Blockly.Lua.provideFunction_( 'set_colour_rgb', ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(s)', ' local rs,gs,bs = s.match(s, "#(..)(..)(..)");', ' setColor(tonumber(rs, 16),tonumber(gs, 16),tonumber(bs, 16));', 'end']); var value_color = Blockly.Lua.valueToCode(block, 'Color', Blockly.Lua.ORDER_ATOMIC); var code = `set_colour_rgb(${value_color})\n`; return code; }; 


Por lo tanto, se cerraron 2 de los 3 requisitos.

Función Sleep ()


Aquí tuve que pensar específicamente sobre cómo combinar la operación confiable de OTA con la ejecución de código personalizado. Afortunadamente, lua tiene una biblioteca de rutina

Después de pensar y leer atentamente la documentación, me di cuenta de que todo el código del cliente debía ejecutarse en forma rutinaria y usar el rendimiento en lugar de la suspensión, para que el módulo principal pudiera establecer un temporizador.

Además, para proteger la placa de un bucle infinito, parcheé el código después del generador insertando rendimiento (0) al comienzo de cada iteración de cada bucle

 function MCUPostProcessLua(code) { return code.replace(/ do[ ]?\n/, ' do \ncoroutine.yield(0);\n'); } 

Descarga OTA


Decidí implementar la solución más simple para la red local, la placa se conecta al wifi doméstico, se conecta al servidor en una dirección fija, envía un identificador único (para procesar correctamente las reconexiones) y espera actualizaciones del programa a través de este socket.

Resultado


github.com/farafonoff/BlocklyESP8266


Puede agregar mucho, por ejemplo, algún tipo de opción de autorización para trabajar a través de redes públicas, un configurador fácil de usar en modo hostap, mejorar la modularidad init.lua y soporte para su actualización OTA (ahora solo se actualiza el módulo con el programa cargado).

Source: https://habr.com/ru/post/es409449/


All Articles