Fazendo uma guirlanda com uma criança

imagem

Nível de dificuldade: para iniciantes.

A idéia surgiu quando a guirlanda velha quebrou na véspera de Ano Novo. O filho olhou para a faixa de LED RGB e perguntou se era possível fazer uma guirlanda com ela. Você pode - eu disse, e o filho começou a descrever por um longo tempo exatamente como a guirlanda deveria piscar. Não entendi nada e decidi ter certeza de que ele poderia fazer o que quisesse por conta própria. Comecei analisando meus próprios desejos para o projeto:

  1. Ambiente de desenvolvimento no estilo zero
  2. trabalho offline - a capacidade de trabalhar com o dispositivo desligado
  3. Trabalhe por via aérea, sem conectar um fio
  4. Confiabilidade - nenhum programa baixado deve "travar" o dispositivo até que uma reinicialização seja necessária


Plataforma de hardware


transistores

Baseado na placa ESP8266 com NodeMCU ( como esta ), foram adicionados alguns transistores e resistores. Os módulos selecionados têm um regulador de tensão de 3-20 volts, que permite que ele seja alimentado pela mesma fonte que a fita. As saídas esp fornecem uma voltagem de 3 volts com um limite de corrente de 12mA, então usei transistores bipolares convencionais para controlar a fita.

imagem

Para que a fumaça branca não saia do microcontrolador, coloquei um resistor de 220 Ohm entre a saída e a base. Esp tem software pwm, alguns pinos têm uma finalidade especial, selecionei experimentalmente.

Firmware


Antes de usar, o esp8266 precisa ser atualizado, eu uso o NodeMCU com lua, embora ele tenha um pouco menos de recursos do que o Arduino com C ++. Portanto, a maneira mais fácil de começar é com o firmware pronto do nodemcu-build.com . Para o nosso projeto, precisaremos adicionar o módulo pwm. Depois de um tempo, um link para a imagem cairá no correio. Você precisa pegar aquele com flutuador.

Você pode fazer o flash com qualquer programador daqui e eu uso o NodeMCU Flasher.

O NodeMCU possui um sistema de arquivos, a execução começa com o módulo init.lua, eu uso o ESPlorer para download.

Diodo intermitente


O momento seguinte me enganou. A numeração interna (GPIO0-16) é usada apenas em programas nativos (Arduino / C ++). De lua, a notação do quadro é usada. Por exemplo, para usar GPIO16 / D0 (LED embutido). de Lua, você precisa escrever gpio.write (0, gpio.HIGH). Você pode piscar um diodo diretamente no console do ESPlorer.

imagem

Diferentemente do Arduino, o nodemcu não pode usar delay e busy-loop, o console e o wifi usam o mesmo processador para funcionar. Um cão de guarda também é incorporado ao quadro, que será reiniciado se o código executar mais de 500 ms. Recomenda-se não ocupar o processador por mais de 2ms. Para resolver o problema, existem funções node.task.post e tmr

Escolhendo um ambiente de desenvolvimento


No começo, eu queria usar o Scratch, mas não era adequado para mim, porque não me permite trabalhar offline - o programa é executado em um computador no ambiente de trabalho e todas as placas funcionam passivamente. Tendo vasculhado a Internet, me deparei com o Google Blockly . Acabou sendo exatamente o que você precisa: ele suporta a geração de código em lua e a criação de seus próprios blocos. Após experimentar, decidi fazer meu projeto baseado na Web, escolhi o nodejs como servidor e o Blockly como front-end. Era absolutamente necessário criar 2 blocos - definindo a cor e o atraso. A Blockly possui funções internas para trabalhar com cores no formato #ffffff, criando uma função para definir a cor não era um problema.

Título 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; }; 


Assim, 2 dos 3 requisitos foram encerrados.

Função Sleep ()


Aqui eu tive que pensar especificamente sobre como combinar a operação confiável do OTA com a execução do código personalizado. Felizmente, lua possui uma biblioteca de rotinas

Depois de pensar e ler atentamente a documentação, percebi que todo o código do cliente precisava ser executado na corotina e use yield em vez de sleep para que o módulo principal pudesse definir um timer.

Além disso, para proteger a placa de um loop infinito, corrigi o código após o gerador inserindo yield (0) no início de cada iteração de cada loop

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

Download OTA


Decidi implementar a solução mais simples para a rede local, a placa se conecta ao wifi doméstico, ao servidor em um endereço fixo, envia um identificador exclusivo (para processar corretamente as reconexões) e espera atualizações do programa por esse soquete.

Resultado


github.com/farafonoff/BlocklyESP8266


Você pode adicionar muito, por exemplo, algum tipo de opção de autorização para trabalhar em redes públicas, um configurador fácil de usar no modo hostap, melhorar a modularidade init.lua e oferecer suporte à sua atualização OTA (agora apenas o módulo com o programa carregado é atualizado).

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


All Articles