Como falar com o microcontrolador da JS

Por que é necessário um microcontrolador? Por exemplo, para configurar uma cervejaria em casa. Se a sua cervejaria não for suficiente, você poderá fazer algo maior: criar uma sala de missões, organizar uma apresentação, uma fonte interativa que pinte uma imagem com gotas ou um estande para uma grande empresa. Você pode fazer qualquer coisa com um microcontrolador - tudo depende da sua imaginação.

Existe um equívoco de que, para criar suas próprias glândulas, você precisa conhecer o montador, C / C ++, ser capaz de gerenciar memória e entender profundamente a eletricidade. No passado, mas a tecnologia está se desenvolvendo e, agora, para a implementação completa de seu projeto, apenas o JS é suficiente!



Ok, sabemos JavaScript, mas como conectá-lo ao hardware? Que tipo de ferro existe e o que ele pode fazer? Como configurar todo o sistema? Na decodificação do relatório, Victor Nakoryakova no FrontendConf aprenderá: como, usando apenas JS, para controlar servos, como combinar fisicamente o sistema com um PC e sobre as opções de comunicação para o aplicativo em JS. Discutiremos os pacotes serialport e Firmata, serialport com firmware auto-escrito em C ++, Espruino e a programação do controlador diretamente em JS, Raspberry Pi, HTTP na rede local e HTTP e MQTT na nuvem.



Victor Nakoryakov ( nailxx ) - diretor técnico, co-fundador da Amperka. Ele gosta de tecnologias avançadas de desenvolvimento, programação funcional e computação física. A Amperka fabrica e vende módulos eletrônicos para que os não profissionais criem dispositivos inteligentes com as próprias mãos, kits de treinamento e componentes individuais que podem ser adicionados ao dispositivo - motores, GPS, SMS.

Onde escrever JavaScript


O Espruino possui um microcontrolador independente com JavaScript. A plataforma Espruino permite escrever JS diretamente no microcontrolador. Isso é algo autônomo em si: conectado a um computador, piscou e, em seguida, funciona de forma independente.

O Raspberry Pi é um pequeno computador com GPIO.

Em um aplicativo Web , para o front-end ou back-end.

Vou mostrar a operação do sistema usando um exemplo de sapo. para toad.amperka.ru a partir do seu telefone - uma interface web simples será exibida.



A coluna esquerda controla o olho esquerdo, o direito - o direito. O princípio é simples - apertei o botão, o servomotor vira o olho.



Demonstração em vídeo de uma posição com um sapo durante o relatório.

Como o sapo funciona


Ao abrir o toad.amperka.ru, você obtém uma página da Web estática com JS estático, que usa a biblioteca MQTT.js. Esta biblioteca entra em contato com o broker MQTT na nuvem.



Se você conhece Redis, Publish / Subscribe, RabbitMQ ou outras filas de mensagens, entendeu imediatamente do que se tratava. O MQTT é um intermediário de mensagens Machine-to-Machine . Leve e simples, para que até as glândulas fracas possam usá-lo.

O MQTT requer um broker no servidor. Mas você nem precisa levantá-lo - alugue. Por alguns dólares por mês, você terá seu próprio broker MQTT. Não é necessário back-end.

Por outro lado, há um controlador do broker MQTT. Existem muitos dispositivos diferentes com essa função, por exemplo, slot Wi-Fi . Este é um controlador que pode se conectar à Internet.



Funciona com base no popular chip ESP8266. Foi adicionada a capacidade de alimentar via micro-USB e conectar periféricos externos via contatos triplos para conectar-se a outros dispositivos.

Como programar hardware em JS


Nada fora do comum, JS regular - ES6 quase completo. Algumas funções e objetos para trabalhar em um nível baixo com sinais elétricos foram adicionados à biblioteca padrão. Por exemplo, funções para leitura e escrita digital simples.

digitalRead - leitura digital . Esta é uma pergunta para o controlador: "Existem três volts no pino número 4?" Se houver tensão, retornará VERDADEIRO; se não, FALSO. Isso implementa a leitura de sensores binários simples: botões, interruptores, fechaduras de palheta e sensores de movimento infravermelho.

digitalWrite é uma simples gravação digital . Dizemos digitalWrite TRUE - 3V com pino. Dizemos digitalWrite FALSE - 0V. Usando esse princípio simples, você pode acender / apagar uma faixa de LED ou lançar um míssil nuclear. Enviamos um sinal fraco ao relé, ele comuta uma grande carga e o foguete voou.

Também existem funções para trabalhar com valores intermediários entre 0 e 3V:

  • analogRead;
  • analogWrite;
  • setWatch;
  • digitalPulse.

Os comandos permitem que você interrogue todos os tipos de torções e forneça funções para gravação difusa.

Em seguida, vêm os objetos para trabalhar com interfaces que são aceitas no mundo dos microcontroladores. Se na web entendemos e estamos familiarizados com HTTP, WebSocket, TCP, então para um microcontrolador é:

  • Porta serial - serial;
  • Barramento I2C
  • Barramento SPI
  • Ônibus OneWire.

Como chutar um servomotor


Por exemplo, eu vou lhe dizer como controlar um motor que fica em uma posição hipodérmica. O protocolo do motor é simples. 0V é aplicado ao pino de controle - o limite inferior. Uma vez a cada 20 μs, ele precisa ser chutado, fornecendo uma unidade estável de 3V e depois de um tempo - redefinir para 0.



Então tudo se repete novamente. Dependendo do comprimento da unidade, obtemos diferentes velocidades de rotação. Com um comprimento de pulso de 1.500 μs, o motor fica parado. Quando desviado em uma direção ou outra, gira no sentido horário ou anti-horário. A magnitude do desvio afeta a velocidade de rotação.

Como programar


A programação da plataforma Espruino é feita no IDE Espruino com o mesmo nome. A placa do microcontrolador está conectada ao computador com um cabo micro-USB. A única coisa é que você precisa instalar o driver, o que leva 1,5 minutos. O driver está instalado para MAC e Windows, e no Linux tudo funciona imediatamente.

Aqui está um exemplo de um programa que é carregado no ambiente com um clique. Ele pisca um LED uma vez por segundo:

var on = false; setInterval(function() { on = !on; LED1.write(on); },500); 

À esquerda no ambiente está o intérprete REPL. Digite "1 + 1". O programa fornece a resposta "2". Milagre!

O milagre é que, quando você pressiona os botões, o número “1”, o sinal “+” e a próxima unidade passam pelo cabo do controlador. Quando você pressiona ENTER, a expressão é executada dentro do microcontrolador, não no computador. O microcontrolador obteve o resultado “2” e o retornou de volta ao computador através de um cabo. “2” foi exibido no monitor.

JavaScript é executado dentro do hardware.

Além do entretenimento com aritmética, você pode girar os motores. Você precisará da função analogWrite, que envia uma onda quadrada. Falamos sobre o alfinete para emitir uma onda. Por exemplo, no meu quadro, ele é assinado como A7. Em seguida, indicamos a duração - por exemplo, 1300 μs de 20 000 μs, serviremos um. Também é necessária uma opção que define a frequência desse chute - 50 vezes por segundo, ou seja, 20.000 μs.

 >analogWrite(A7, 1300 / 2000, {freq: 50}} =undefined > 

Passaremos por 1500 - forçaremos a girar na outra direção com maior velocidade.

 >analogWrite(A7, 2300 / 2000, {freq: 50}} =undefined > 

Ou diga para.

 >digitalWrite(A7, 0) =undefined > 

Usando as mesmas funções, você pode escrever um programa inteiro que, dependendo de fatores externos - pressionando botões, leituras do sensor - fará o que você deseja.

Bibliotecas


Nem sempre é conveniente recuperar os detalhes da implementação do protocolo. Portanto, para todos os tipos de ferro, muitas bibliotecas foram criadas, de pequenas a gigantes. Eles contêm todos os recursos técnicos. As bibliotecas usam métodos compreensíveis: ler dados de uma etiqueta nfc, ler a concentração de dióxido de carbono em ppm ou enviar uma mensagem ao Telegram.
  • servo.write;
  • barometer.init;
  • barometer.read;
  • barometer.temperature;
  • nfc.listen;
  • nfc.on ('tag', ...);
  • nfc.readPage;
  • nfc.writePage;
  • relay.turnOn;
  • relay.turnOff;
  • gas.calibrate;
  • gas.read ('CO2');
  • telegram.sendMessage.

É útil entender os comandos de baixo nível, mas para começar a criar, não é necessário saber.

Código do Cliente


Portanto, quando clicamos em um dos botões da coluna esquerda ou direita em nosso sapo, o valor que queremos definir no servo correspondente é enviado ao tópico sapo / olho / esquerda ou direita.



 <button class="toad__eye__control" data-queue="left" data-payload="1300"> -1 </button> 

1300 é a duração do pulso. De onde vêm a esquerda e 1300? Acabei de adicioná-los ao HTML como atributos de dados.

Em JS, escrevemos código simples.

 import mqtt from 'mqtt'; const client = mqtt.connect(`ws://${location.hostname}:9001`); function onEyeControlClick() { const { queue, payload } = this.dataset; client.publish(`toad/eye/${queue}`, payload); } document.querySelectorAll(".toad__eye__control") .forEach(e => e.addEventListener('click', onEyeControlClick)); 

Vamos analisar o código em partes. No início, nos conectamos ao broker, que por padrão funciona na porta 9001: const client = mqtt.connect(`ws://${location.hostname}:9001`); .

Ao clicar em qualquer um dos botões, publicamos uma nova mensagem com carga útil, que recebemos do atributo de dados: client.publish(`toad/eye/${queue}`, payload); .

Em seguida, publicamos sobre o tópico, que também é formado com base no atributo de dados. Esse é todo o nosso código JS no navegador.

Código do Conselho


Quando o slot Wi-fi é iniciado, ele se inscreve nos tópicos de interesse e recebe os dados. Quando eles chegam, o slot responde e faz os motores funcionarem.



O código no quadro é convencionalmente dividido em várias partes. Para começar, estamos conectando bibliotecas. Em particular, esta é apenas a biblioteca que executa o Servo para não recuperar detalhes. Eles estão no escopo de amperka.

 const ssid = "Droidxx"; const password = "****"; const brokerHostname = "toad.amperka.ru"; const leftEye = require("@amperka/servo").connect(A5); const rightEye = require("@amperka/servo").connect(A7). 

Todos podem criar e publicar suas próprias bibliotecas. Fizemos várias dezenas para nossos próprios e outros módulos populares. All Open Source - entre, use-o .

Então, precisamos de bibliotecas para trabalhar com os corretores Wi-Fi e MQTT .

 const wifi = require("Wifi"); const mqtt = require("tinyMQTT").create(brokerHostname); 

Não há sistema operacional, portanto, mesmo a conexão ao Wi-Fi é uma operação manual. O cuidado de conexão é seu, mas não é tão difícil. Para conectar-se à rede, simplesmente chamamos o método "connect", que, se for bem-sucedido ou não, chamará "callback" e relatará os resultados da operação.

 wifi.connect(ssid, { password: password }, function(e) { if (e) { console.log("Error connecting:", e); wifi.disconnect(); } else { console.log("Wi-Fi OK, connecting to broker ..."); mqtt.connect(); } }); 

Se tudo estiver bem, conecte-se ao broker MQTT.

Após uma conexão bem-sucedida, subscrevemos tópicos interessantes, ou seja, tudo o que começa com sapo / olho.

 mqtt.on("connected", function() { mqtt.subscribe("toad/eye/*"); console.log("Connected to broker", brokerHostname); }); 

Quando recebemos uma mensagem, descobrimos de onde ela veio. Isso é muito semelhante a uma simples análise de URL. Dependendo do tópico, decidimos qual olho influenciaremos. Se você tem algo consciente, então, nesse olho, escrevemos o que veio em "carga útil" em microssegundos.

 mqtt.on("message", function(msg) { const eye = (msg.topic === "toad/eye/left") ? leftEye : (msg.topic === "toad/eye/right") ? rightEye : null; if (eye) { eye.write(Number(msg.message), "us"); } }); 

Essa é toda a magia de um sapo.

Limitações de Espruino JS


Passamos pela plataforma Espruino. Torcer os sapos não é sua única opção. Mas a plataforma tem seus próprios cardumes, o que nos leva a considerar outras opções.

“Total” 1–4 Mb de RAM . Há uma limitação na RAM. No código e nos dados ao mesmo tempo, apenas alguns megabytes são fornecidos. Pode parecer que em uma época em que a RAM é medida por shows, isso não é suficiente. Mas para um grupo de pequenos dispositivos isso é suficiente. Com 2 Mb, você pode fazer coisas maravilhosas - o suficiente para a fonte.

Não é tão simples com o NPM . Esse problema se aplica ao IDE do Espruino. Se escrevermos “exigir”, o Espruino procurará em um lugar, em outro e, se não, produzirá um fallback no NPM. Neste ponto, pode diminuir a velocidade. O Espruino nem sempre é capaz de lidar com pacotes complexos. Seu poder, nesse sentido, é muito menor que o do mesmo Webpack ou Parcel. Isso é uma dor, mas se você mesmo configurar a cadeia de ferramentas, com uma compreensão do que está acontecendo dentro do ferro, não haverá problema.

Variedade de ferro. Nem todo hardware chamado plataforma de desenvolvimento puxa o Espruino. Pelos padrões do mundo dos microcontroladores, o Espruino é voraz - ele precisa de 500 Kb de RAM. Essa memória não dará nenhum pedaço de ferro. O canhão Arduino Uno ou Arduino Nano possui apenas 2 Kb de RAM - portanto, é impossível por lá. É possível trabalhar com o Espruino no hardware, o que fazemos no hardware oficial do Espruino.



A Espruino é uma empresa de uma pessoa que frequentemente usa o Kickstarter com novos produtos e sempre coleciona com sucesso. Se você deseja apoiar a plataforma - compre oficialmente.

Existe uma terceira opção - escolha uma devboard poderosa o suficiente, mas de terceiros. Por exemplo, a empresa ST, que produz "Nuclear" e "Discovery". É provável que o ferro rotulado com STM32 puxe o Espruino.

Vamos examinar duas opções alternativas. O primeiro é o Raspberry Pi.

Raspberry pi


Este é um computador Linux completo do tamanho de um cartão de visita.




Além disso, existem pinos de entrada / saída. Se você tiver o Raspberry Pi à sua disposição, use a seguinte topologia de dispositivo.



Aqui a nuvem é opcional - um dispositivo móvel pode se conectar diretamente ao dispositivo via nome do host, API ou sistema para detectar automaticamente um dispositivo na rede. Eu tenho uma TV inteligente e um disco rígido de backup em casa. Eles são acessíveis a partir de todos os outros dispositivos, simplesmente porque estão na mesma LAN.

O princípio é o mesmo. Coloque o dispositivo no Raspberry Pi na rede e construa o cliente para que ele se conecte diretamente a ele através de HTTP ou WebSocket, ignorando os intermediários. A nuvem usa o aplicativo no Raspberry Pi para seus propósitos: registra sensores ou transmite previsões meteorológicas.

A próxima topologia possível com um back-end completo.



O servidor sobe na nuvem. Seu cliente é o mesmo aplicativo móvel que mantém uma conexão via HTTP ou WebSocket. Por outro lado, a conexão já é realizada através do Raspberry Pi, usando HTTP ou o mesmo MQTT.

Nesta abordagem, a vantagem é o controle total: validação, autorização, negação para os clientes. Ao mesmo tempo, a disponibilidade mundial é um dispositivo em Moscou e a comunicação com ele está disponível em Vladivostok.

Limitações do Raspberry Pi


Carregamento longo. Raspberry Pi é um computador completo e leva tempo para começar. Como disco rígido, é usado um cartão SD. Até o cartão mais rápido ainda perde um HDD comum, sem mencionar o SSD. Com o tempo, a carga está se aproximando de um minuto.

A próxima desvantagem é o consumo de energia . Em termos de eficiência energética, fale sobre o Raspberry Pi como um dispositivo móvel. Não vai durar muito da bateria - a conta vai para o relógio. Para que o dispositivo funcione por seis meses ou um ano, é necessário um programa competente para o microcontrolador e um conjunto de baterias.

O GPIO ruim é de entrada / saída de uso geral . Os recursos de alimentação de onda, leitura de onda, trabalho com sinais analógicos no Raspberry Pi são muito mais fracos que os dos microcontroladores, para os quais essa é a principal tarefa. Por exemplo, pronto para uso em um Raspberry Pi, não será possível controlar o servo no modo hardware.



A restrição é condicional, porque pode ser contornada pela extensão. Por exemplo, o ferro Troyka Cap , que assume todo o controle de baixo nível de trabalho com os sinais em si. O Raspberry Pi se comunica com ela através de um pacote de alto nível. Dá comandos para torcer o servo e ele funciona. Usando esses cartões de expansão, você pode conectar o que quiser.

Arduino


Você pode usar o Arduino habitual, do qual todos estão cansados. Mas o JavaScript precisará ser movido para algum lugar que possa transformar o Node JS - um computador antigo ou o mesmo Raspberry Pi.



Conectamos um computador desnecessário antigo ao Arduino através de um cabo USB. No Arduino, preencha o firmware Firmata padrão uma vez . Ela transforma o Arduino em um zumbi que segue as instruções de um mestre - um computador antigo. O mestre diz para transmitir tal e tal sinal a tal e tal pino, e o Arduino transmite.

Para comunicação, são usadas bibliotecas com NPM - SerialPort e Firmata com uma API clara. Então, você está novamente no mundo JS, escrevendo um programa de alto nível que envia ao seu servidor. Você confia no Arduino para trabalhar com sinais, e ela o executa.

Nem sempre o Firmata conseguirá gerenciar tudo. É capaz de fornecer interação com o hardware a que se destina: servos, faixas de LED, controladores de mídia. Mas se a capacidade de ler um giroscópio ou acelerômetro muito específico não for incorporada - ele não funcionará. Então você tem que escrever um programa em C em um Arduino regular.

Mas isso não é tudo - se você não quiser escrever em C, use a ferramenta Open Source XOD.io.



Este é um ambiente de programação visual em que o gráfico que você está criando se transforma em código, e você já pode compilá-lo e preenchê-lo. O XOD.io permite que pessoas que não estão familiarizadas com as complexidades e nuances da programação de microcontroladores criem rapidamente programas simples. Se você cresceu no Firmata, mas ainda não sente forças para escrever em um nível baixo - use o XOD.io.

A próxima conferência FrontendConf será realizada em outubro. Você sabe sobre JavaScript que a maioria dos desenvolvedores de front-end não conhece, desenvolve interfaces que são convenientes de usar ou encontram o graal de desempenho e estão prontas para dizer onde está, estamos aguardando aplicativos para relatórios.

Coletamos relatórios interessantes no programa, notícias da conferência, vídeos e artigos no boletim regular - inscreva-se .

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


All Articles