Como construir um servidor Node.js para controlar o Arduino a partir de uma página da web

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

  1. Arduino UNO x1
  2. LEDx1
  3. Resistência 470Ω x1
  4. Tábua de ensaio x1
  5. Fios de ligação em ponte x1
  6. 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

Conteúdo Relacionado

Voltar para o blog

Deixe um comentário

Os comentários precisam ser aprovados antes da publicação.