Node.js é o servidor mais popular no momento. Devido à sua natureza assíncrona e sem bloqueio, o Node é a escolha óbvia para aplicações web em tempo real, como salas de chat, aplicações de página única, streaming de vídeo, etc. Pelas mesmas razões, o Node está atraindo engenheiros de IoT. Como os aplicativos da web desenvolvidos no Node operam em tempo real, eles são mais adequados para implementar operações incorporadas controladas pela web e de tempo crítico. Além disso, com o express.js adicionado ao Node, você pode programar tanto o back-end quanto o front-end do aplicativo de rede na mesma linguagem, ou seja, JavaScript.
Uma estrutura popular chamada “Johny-five” é usada para controlar microcontroladores a partir de backend JavaScript. “Johny-five” é uma plataforma JavaScript Robotics & IoT criada por Rick Waldron em 2012. Ela é mantida por uma comunidade de desenvolvedores de software e engenheiros de hardware apaixonados, com mais de 75 desenvolvedores contribuindo para a estrutura. A estrutura pode ser usada para controlar uma variedade de microcontroladores e plataformas SoC compatíveis com Arduino, incluindo Arduino, Raspberry Pi, Tessel 2, Particle Photon, Intel Edison, etc. Para placas não Arduino, plug-ins IO específicos da plataforma estão disponíveis. O plugin IO pode fazer o “johny-five” se comunicar com qualquer plataforma de hardware.
Neste projeto, primeiro configuraremos um servidor Node e implementaremos um código JavaScript backend para controlar o Arduino diretamente. Um JavaScript de back-end “johny-five” pode ser executado em um servidor Node para controlar diretamente o Arduino e placas compatíveis com Arduino. Isso é demonstrado piscando um LED no Arduino UNO executando JavaScript em um servidor Node.
A seguir, expandimos o servidor Node com a ajuda de Express.js e Socket.io para hospedar uma página da web e usamos a biblioteca JavaScript SerialPort para comunicar dados diretamente de uma página da web para o Arduino. O Arduino será programado para ler dados seriais diretamente da página da web e desvanecer um LED de acordo com o fluxo de dados recebido.
Componentes necessários
- Arduino UNO x1
- LEDx1
- Resistência 470Ω x1
- Tábua de ensaio x1
- Fios de ligação em ponte x1
- Cabo USB para conectar o Arduino ao computador x1
Configurando o servidor Node
Primeiro de tudo, precisamos instalar o Node.js em um computador. Você pode baixar o Node.js para Microsoft Windows e Mac OS neste link. Basta baixar e executar a configuração do Node.js em seu computador. Após a conclusão da instalação, você pode verificar a versão atual do Node.js instalada executando o seguinte comando no prompt de comando no caso do Windows ou Terminal no caso do Linux/macOS.
nó -v
Em seguida, crie uma pasta com o nome “Arduino Control”. Na mesma pasta, abra o prompt de comando/Terminal e instale a biblioteca johny-five executando o seguinte comando.
npm instalar johny-cinco
Após instalar a biblioteca johny-five na pasta indicada, a pasta terá arquivos e pastas, conforme mostra a imagem abaixo.
Esta pasta agora é um projeto Node.js. Em seguida, instale express.js no projeto Node executando o seguinte comando no prompt de comando/Terminal na mesma pasta.
npm instalar expresso
Em seguida, instale socket.io no projeto Node executando o seguinte comando no prompt de comando/Terminal na mesma pasta.
npm instalar soquete.io
Em seguida, instale a biblioteca JavaScript serialport no projeto Node executando o seguinte comando no prompt de comando/Terminal na mesma pasta.
npm instala porta serial
Agora, nosso servidor Node.js está pronto com os pacotes johny-five, express, socket.io e serialport instalados no projeto Node. Todos esses módulos são armazenados na pasta “node_modules”.
Preparando o Arduino para comunicação com o computador host
Para fazer o Arduino se comunicar com um computador host, precisamos implementar um protocolo intermediário entre o Arduino e o computador host. Esse protocolo é chamado de protocolo Firmata. Felizmente, está disponível uma biblioteca Firmata que implementa o protocolo Firmata no Arduino.
Para este projeto, precisamos simplesmente fazer upload de um esboço Firmata padrão para o Arduino, para que o Arduino seja receptivo ao que enviamos do nosso computador. Abra o Arduino IDE, navegue até Arquivo-> Exemplos->Firmata-> StandardFirmata. Compile e carregue o esboço de exemplo no Arduino.
Agora, o Arduino está pronto para receber comandos do computador host e dançar no código JavaScript que executaremos no servidor Node.
LED piscando no Arduino usando “johny-five”
Podemos fazer qualquer coisa literária na placa Arduino usando a biblioteca JavaScript “johny-five”. Depois de carregar o Firmata para o Arduino, temos controle total do Arduino a partir do computador host. Vamos exercer esse controle piscando um LED no Arduino por meio da codificação JavaScript. Conecte um LED a qualquer GPIO do Arduino. O diagrama de circuito a seguir mostra um LED conectado ao pino 3 do Arduino.
Agora, crie um arquivo com o nome “blink.js” na pasta “Arduino Control” e abra-o em qualquer editor de código de sua escolha, como Visual Studio Code, Atom, NotePad++, etc. editor e salve o arquivo.
const {Board, Led} = require(“johnny-five”);
placa const = nova placa ;
board.on(“pronto”, => {
led const = novo Led(5);
led.blink(500);
});
Para executar o projeto, abra o prompt de comando/Terminal na mesma pasta e execute o seguinte comando para executar o “blink.js” no servidor Node.
Nó Blink.js
À medida que o arquivo Javascript “blink.js” for executado, o LED conectado ao Arduino começará a piscar, conforme mostrado no vídeo a seguir.
(Link para vídeo de demonstração P34-DV01)
Criando um servidor websocket no Node
Já vimos como controlar o Arduino a partir de código JavaScript executado em um servidor Node. Agora, vamos criar um servidor web que hospede uma página web e permita o envio de dados da página web para o Arduino. Neste projeto, usaremos a página web para desbotar um LED no Arduino.
Para construir um servidor web, crie um arquivo chamado “fade.js” na pasta “Arduino Control”. Copie e cole o seguinte código em fade.js.const expresso = requer('expresso');
const app=express ;
const http = requer('http');
servidor const = http.createServer(app);
app.get('/', (req, res) => {
res.sendFile(__dirname + '/public/index.html');
})
servidor.ouvir(8080, => {
console.log('escutando em *:8080');
});
console.log(“Servidor Web iniciado, vá para ' no seu navegador.”);
Este é um servidor web simples em Node.js construído usando express.js. O servidor simplesmente busca index.html da pasta “/public/” e publica a página da web como resposta quando a porta 8080 é aberta no host local.
O código JavaScript para o servidor web expresso começa importando express.js. Um novo aplicativo é instanciado usando o módulo expresso. O módulo HTTP é importado para lidar com solicitações HTTP. Um objeto servidor é instanciado chamando o método http.createServer no objeto expresso “app”. Para enviar index.html da pasta “pública” como resposta http, o método app.get é chamado. O endereço IP e a porta são definidos como localhost e porta 8080 para o servidor Node escutar chamando o método server.listen . O retorno de chamada também imprime uma mensagem no console. Finalmente, é notificado que o servidor está rodando em localhost:8080 imprimindo outra mensagem no console. Essas mensagens serão impressas no prompt de comando/Terminal de onde a aplicação do servidor será executada.
Crie uma pasta “public” dentro da pasta “Arduino Control” e crie um arquivo com o nome “index.html”. O index.html contém um controle deslizante para controlar o brilho do LED. Ele usa socket.io para enviar ou emitir (na terminologia socket.io) valores deslizantes do navegador para o servidor Node. Abra index.html em um editor de código de sua escolha e cole o seguinte código HTML.
Salve e feche index.html. Observe como o objeto socket.io é instanciado usando o método connect.io , e uma função de ouvinte “led” é definida usando o método socket.on para comunicar o valor do controle deslizante do navegador para o servidor Node.
A página HTML pode ser melhor apresentada adicionando algum CSS. Abra style.css em qualquer editor de código de sua escolha e cole o seguinte código da folha de estilo. Na mesma pasta “pública” que contém “index.html”, crie um arquivo com o nome “style.css”.
Salve e feche style.css. Agora a página da web se parece com a seguinte.
Preparando o Arduino para receber dados seriais
Não estamos desbotando diretamente o LED do JavaScript em execução no servidor Node. Em vez disso, o servidor Node hospeda uma página da web em localhost:8080. A página da web recebe a entrada do usuário e comunica os dados de entrada do navegador para o servidor Node. Em seguida, o servidor Node agrupa os dados recebidos em um objeto buffer e se comunica com a porta serial à qual o Arduino está conectado no computador host. Portanto, o Arduino deve ser programado para ler dados seriais do computador host e desbotar o LED gerando um sinal PWM no respectivo pino. Em vez de Firmata, agora carregue o seguinte esboço para o Arduino.
configuração nula
{
Serial.begin(9600);
pinMode(3, SAÍDA);
}
loop vazio
{
while(!Serial.available );
analogWrite(3, Serial.read );
}
O LED está conectado ao pino 3 do Arduino, conforme mostrado no diagrama de circuito acima. O GPIO3 também é um pino PWM, portanto pode desbotar o LED usando o método analogWrite .
LED desbotado no Arduino do servidor Node.js
Para desbotar o LED no Arduino, precisamos enviar dados da porta serial do computador host para o Arduino. Para isso, é utilizada a biblioteca JavaScript serialport. A biblioteca já está instalada no projeto do Node durante a configuração do servidor Node.
Agora, adicione as seguintes linhas a “fade.js” para instanciar uma porta serial no script backend.
const {SerialPort} = require('serialport');
porta const = new SerialPort({
caminho: 'COM4',
taxa de transmissão: 9600,
});
No nosso caso, o Arduino está conectado à porta serial de um PC com Windows, “COM4”. A porta pode ser diferente no seu caso. Substitua o nome da porta após a variável de caminho de acordo com o seu sistema, seja Linux ou macOS ou uma porta de comunicação diferente no PC com Windows. No Microsoft Windows, você pode encontrar a porta à qual o Arduino está conectado abrindo o “Gerenciador de Dispositivos” e navegando até “Portas”. Expanda a porta que mostra o Arduino.
No macOS e no Linux, para saber a qual porta o Arduino está conectado, abra o Terminal e execute o seguinte comando.
ls /dev/tty*
Procure /dev/tty.usbmodem* ou /dev/tty.usbserial* no caso do macOS ou /dev/ttyUSB* ou /dev/ttyACM* no caso do Linux.
Crie uma variável global “brilho” para armazenar o brilho do LED. Finalmente, use socket.io para comunicar o valor do controle deslizante do servidor Node para a porta serial do computador host. Adicione o seguinte código JavaScript a fade.js para instanciar um objeto socket.io.
Observe como o mesmo script de back-end hospeda uma página da web no host local, recebe entrada da página da web em um navegador, transfere os dados para o servidor e comunica os dados do servidor para a porta serial do computador host.
Para executar o projeto, abra o prompt de comando/Terminal na mesma pasta, “Arduino Control” e execute o seguinte comando para executar o “fade.js” no servidor Node.
Nó fade.js
À medida que o arquivo Javascript “fade.js” será executado, abra a URL “localhost:8080” em um navegador web e mova o controle deslizante para controlar o brilho do LED conectado ao Arduino. A execução do projeto é demonstrada no vídeo a seguir.
Você pode baixar os arquivos completos do projeto no link a seguir.
Arduino-Control.ZIP