Utilizando Node.js para o controle de hardware pela WEB através do protocolo Firmata

Neste artigo falarei sobre uma aplicação muito interessante que pode ser feita utilizando-se Node.js: o controle de hardware pela WEB. A aplicação que escolhi foi o controle do estado de diversos leds conectados a um Arduino, com o qual o servidor Node.js se comunicará. É uma aplicação extremamente simples do ponto de vista do hardware, mas que servirá para ilustrar os conceitos necessários para a criação de aplicações mais complexas. O código-fonte completo da aplicação pode ser baixado do repositório no GItHub.

A Aplicação

Primeiramente, descreverei em detalhes a aplicação que será desenvolvida. Ela consistirá de dois leds, que poderão ser acendidos ou apagados pelo usuário através de uma interface WEB. Além disso, o usuário poderá monitorar o estado desses leds a qualquer momento. A mesma aplicação poderá ser utilizada por diversas pessoas, e se um outro usuário alterar o estado de um dos leds através de outra instância da aplicação, os demais usuários serão informados disso em tempo real.

A aplicação é dividida em três partes distintas:

  • Interface do Usuário – Exibe o estado dos dois leds, e permite que esse estado seja modificado. O estado dos leds é mantido atualizado com o estado físico dos mesmos. Essa camada se comunica diretamente com o servidor Node.js;
  • Servidor Node.js – Recebe as solicitações de alteração de estado dos leds, e as repassa ao Arduino. Também é responsável por avisar à camada de interface das mudanças ocorridas no estado dos leds em tempo real. Essa camada se comunica tanto com a interface quanto com a camada de Hardware;
  • Hardware – Consiste dos dois leds mais o Arduino.

A comunicação entre a interface do usuário e o servidor Node.js será feita através da biblioteca http://socket.io, e a comunicação do servidor com o Arduino será feita de maneira serial. Cada uma dessas três partes serão descritas a seguir, de maneira independente.

Interface do Usuário

A interface é bastante simples. Cada um dos leds é representado um ícone, que pode estar em preto (led apagado) ou amarelo (led aceso). Além disso, há dois botões de ação. Se um led estiver aceso, e o botão correspondente a ele for acionado, esse led será apagado; caso contrário, ele será aceso. Os nomes dos leds são referentes aos pinos do Arduino aos quais eles estão conectados fisicamente.

Interface do usuário formada por dois leds, cada um deles com um botão de ação associado.

Para a geração do HTML da página, optei por utilizar a linguagem de template jade. É uma linguagem bastante simples, que facilita a geração do HTML através de uma linguagem mais limpa, e que possui uma série de funcionalidades. Essas funcionalidades não serão detalhadas, mas o leitor que sentir necessidade é convidado a ler a documentação oficial. O código abaixo gera todo o HTML da interface.

O css presente em style.css é bastante simples, então não vou adicioná-lo ao artigo para não deixá-lo desnecessariamente comprido.

Agora, descreverei o código javascript que será responsável por fazer a comunicação entre o navegador e o servidor Node.js. Essa comunicação será feita através da biblioteca socket.io. Ela permite que uma conexão seja mantida aberta entre as duas partes da aplicação, de modo que qualquer uma delas pode enviar uma mensagem para a outra a qualquer momento.

Essa conexão é estabelecida através do código abaixo.

Nesse código, localhost é o endereço do servidor node.js, e 5555 é a porta através da qual as mensagens serão trocadas. Agora, quando um dos botões for pressionado, devemos avisar ao servidor. Isso será feito disparando um evento, que chamarei de toggle_led.

Na linha 3, disparamos o evento toggle_led. Esse evento será “escutado” pelo servidor em tempo real, e terá como parâmetro a variável led_number, que possui o número do led cujo estado deve ser invertido. Por fim, precisamos atualizar o estado dos leds na tela do usuário quando o servidor acender ou apagar algum dos leds.

Nesse caso, o servidor disparará o evento changed, e enviará como parâmetro o estado atual dos dois leds. Assim, cada um dos leds recebe a classe HTML on ou off, dependendo de ele estar aceso ou apagado. Todos os usuários que estiverem utilizando a aplicação escutarão o evento changed quando o servidor modificar o estado de um dos leds. Assim, todos eles terão em sua tela o estado atualizado dos leds.

Servidor Node.js

Apesar de se uma aplicação simples, eu optei por utilizar o framework Express. Desse modo, se eu quiser fazer algo mais complexo futuramente, não haverá grandes dificuldades. Como eu já expliquei o básico sobre esse framework em outro artigo, vou explicar aqui apenas a parte referente à aplicação deste artigo.

Primeiramente, adicione os pacotes socket.iojohnny-five à sua aplicação. O pacote socket.io já foi explicado anteriormente, e o johnny-five é quem fará a comunicação com o Arduino. Abaixo, é feita a  inicialização dos leds e da comunicação com o Arduino .

Na linha 4, devemos informar a porta serial à qual o Arduino se encontra conectado. Na linha 7, o evento ready é disparado pela variável board após a comunicação ter sido estabelecida com a placa. Por fim, após a inicialização dos leds, a função ioChanged() avisará aos usuários da aplicação que o estado dos placa mudou, disparando o evento changed para a camada de interface do usuário. Essa função será apresentada a seguir.

Para permitir a comunicação em tempo real entre o servidor e a camada de interface, devemos inicializar o pacote socket.io, como a seguir.

Assim, quando um usuário se conectar ao servidor através da porta 5555, a função a seguir será executada.

Primeiramente, verificamos se a comunicação entre o servidor e o Arduino já foi estabelecida. Em caso afirmativo, o estado dos leds é enviado para o usuário que acabou de se conectar ao servidor através do evento changed. Na linha 5, sempre que esse usuário gerar o evento toggle_led para o servidor, o estado físico do led correspondente é alterado (linha 6), e, então, todos os usuários que estejam usando a aplicação no momento são avisados disso em tempo real (linha 7).

Por fim, segue a implementação da função ioChanged().

Camada de Hardware

Muito pouco precisa ser feito na camada de hardware para que a comunicação com o servidor seja feita. O pacote johnny-five, responsável por fazer essa comunicação, utiliza o protocolo Firmata. Sendo assim, precisamos gravar um programa no Arduino que seja implemente esse protocolo. Felizmente, a IDE do Arduino já vem com um exemplo que implementa o protocolo Firmata. Assim, só precisamos gravá-lo!

Para isso, vá em File -> Examples  -> Firmata  -> StardardFirmata, como mostra a Figura abaixo.

Feito isso, basta gravar o programa no Arduino, e a comunicação estará funcionando! Agora, basta conectar os leds aos pinos 2 e 13 do Arduino, para que a aplicação esteja finalizada.

 

 

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *