Controlando GPIO em linguagem Nodejs na Raspberry Pi Deixe um comentário

Nos primórdios da Web, lá pelos anos 90, a empresa Netscape desenvolveu um Navegador Web e também uma linguagem de programação que posteriormente veio a ser chamada de JavaScript. Até os dias de hoje, os navegadores e sites funcionam através do Javascript. Em meados dos anos 2000 surgiu o Node.js, que torna possível utilizar a linguagem JavaScript em servidores, sendo muito popular entre desenvolvedores Web para desenvolvimento de sistemas back-end. Neste artigo iremos desenvolver 3 exemplos controlando GPIO em linguagem Nodejs na Raspberry Pi.

Imagem 1 - Controle a GPIO da Raspberry Pi em Nodejs

Instalação do Nodejs

Para realizar os projetos de GPIO em linguagem Nodejs na Raspberry Pi é necessário, primeiramente, instalar o Nodejs no sistema Linux. Partirei do pressuposto que você já tenha um cartão SD com a imagem Raspbian e também acesso ao terminal (shell) do sistema, seja via SSH ou monitor e teclado. Case não tenha, basta acessar o post Primeiros Passos com Raspberry Pi e Linux.

Existe uma aplicação chamada NVM (Node Version Manager) que facilita bastante a instalação e gerenciamento de versões do Nodejs em um sistema Linux. Para instalar o NVM execute os 4 seguintes comandos no terminal da Raspberry Pi:

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

Para verificar a instalação do NVM bem sucedida execute o seguinte comando:

nvm --version

Se funcionar, siga para a instalação do Nodejs propriamente dito com os comandos abaixo.

Para listar as versões LTS (Long Term Support) disponíveis para instalação use o seguinte comando:

nvm ls-remote --lts

Para instalar a última versão (na data da escrita deste artigo), utilize o comando abaixo:

nvm install v10.16.0

Para verificar a versão do Nodejs instalado, execute o comando:

node --version

Configuração inicial para controle do GPIO em linguagem Nodejs na Raspberry Pi

Antes de começar a programação de GPIO em linguagem Nodejs na Raspberry Pi propriamente dita, temos que configurar o projeto e instalar um pacote. Crie uma pasta com o nome que desejar para o projeto e entre nela:

mkdir rpi-gpio-nodejs
cd rpi-gpio-nodejs

Desenvolvedores de todo o mundo criam pacotes que podem ser integrados ao seu projeto Nodejs. Esses pacotes ampliam as funções de seu projeto com funções específicas. O nome desse gerenciador é NPM (Node Package Manager), que já foi instalado juntamente com o Nodejs. Podemos iniciar um projeto Nodejs com o comando abaixo:

npm init

Isso irá iniciar uma aplicação onde você poderá inserir informações de seu projeto Nodejs como: nome do autor, licença e etc. Preencha da forma que desejar ou pode deixar tudo em branco. Após finalizado o npm init, você verá que um arquivo chamado package.json foi criado dentro da pasta do seu projeto. É um arquivo que contém todas as informações do seu projeto.

Existe um pacote chamado node-rpio que foi desenvolvido justamente para trabalhar com GPIO da Raspberry Pi. Para incluirmos esse pacote como uma dependência do nosso projeto executamos o comando abaixo:

npm install rpio --save

Verifique o GitHub do node-rpio. Lá você irá encontrar toda a documentação do pacote com exemplos de controle de GPIO e até mesmo de I2C, SPI e PWM.

Pronto! Já temos o ambiente configurado para iniciar a programação em si.

Material necessário

A montagem do circuito para os projetos GPIO em linguagem Nodejs na Raspberry Pi é bem simples, utilizando apenas:

Montagem do circuito para controle  GPIO em linguagem Nodejs na Raspberry Pi

Veja abaixo a montagem do circuito:

Imagem 2 - Circuito esquemático

Exemplos GPIO em linguagem Nodejs na Raspberry Pi

Exemplo 1 – Blink LED

Dentro da pasta do projeto crie um arquivo chamado blink.js. Nesse arquivo faremos a programação do primeiro exemplo onde um um LED irá piscar com intervalo de 1 segundo.

var rpio = require('rpio'); //define uso do rpio

LED = 29 //define pino do LED

var ledState = 0; //define estado do led

rpio.open(LED, rpio.OUTPUT, rpio.LOW); //define LED como output

setInterval(function() {
   ledState = !ledState; //troca estado do led
   if(ledState == 0) rpio.write(LED, rpio.HIGH); //acende LED
   else rpio.write(LED, rpio.LOW); //apaga LED
}, 1000); //configura intervalo de 1000 ms

Na primeira linha do programa temos que indicar que usaremos o módulo rpio. Para isso utilizamos require e atribuímos o módulo rpio a um var também de nome rpio (mas poderia ser qualquer outro nome).

Definimos LED como 29 que é o pino onde o LED está conectado. Note que 29 é o número físico do pino e não o número do GPIO.

Definimos um var ledState para guardar o estado do LED.

Usamos então  função rpio.open que leva 3 argumentos: o pino que o LED está conectado (LED = 29), função do pino (INPUT ou OUTPUT) e o estado inicial do pino quando a função é chamada.

Finalmente criamos um loop com a função setInterval que irá alterar o valor de ledState entre 1 e 0 e acionar o LED de acordo utilizando a função rpio.write.

Veja o programa em ação:

Imagem 3 - Controlando a GPIO da Raspberry Pi em Nodejs

Exemplo 2 – Leitura de Botão

No exemplo 2 é mostrado como ler o estado de um push-button. Utilizando console.log podemos exibir mensagens no console. No caso deste exemplo é exibido o estado do push-button.

var rpio = require('rpio'); //define uso do rpio

BTN = 32; //define pino da chave 

rpio.open(BTN, rpio.INPUT, rpio.PULL_UP); //configura botao como input

setInterval(function() {
   console.log('Button State: ' + (rpio.read(BTN) ? 'OFF' : 'ON')); //escreve no console estado do botao
}, 10); //configura intervalo de 10 ms para leitura

Veja abaixo a execução do exemplo:

Imagem 4 - Controlando a GPIO da Raspberry Pi em Nodejs

Exemplo 3 – Controle do LED com botão

No exemplo 3 faremos uma combinação dos dois exemplos acima para realizar o controle liga/desliga do LED através do push-button.

var rpio = require('rpio'); //define o uso do rpio

// configura pinos botão e LED
BTN = 32;
LED = 29;

// configura botao como entrada e LED como saida
rpio.open(BTN, rpio.INPUT, rpio.PULL_UP);
rpio.open(LED, rpio.OUTPUT, rpio.LOW);

// inicializa variáveis para controle do LED e botao
var btnState = 0;
var ledState = 1;
var btnLock = 0;

setInterval(function() {
   btnState = rpio.read(BTN) // le botao
   
   // trata o estado do botao e controla o LED de acordo
   if(btnState == 0 && btnLock == 0) {
       ledState = !ledState;
       ledState ? rpio.write(LED, rpio.LOW) : rpio.write(LED, rpio.HIGH);    
       btnLock = 1;
   }

   if(btnState == 1 && btnLock == 1) {
       btnLock = 0
   }
   console.log('LED1: ' + (ledState ? '0' : '1')); // escreve estado do LED no console
}, 50);

Veja abaixo a execução do exemplo.

Imagem 5 - Controlando a GPIO da Raspberry Pi em Nodejs

Para executar qualquer um dos exemplos de controle de GPIO em linguagem Nodejs na Raspberry Pi acima, basta executar no terminal a aplicação node seguida do nome do programa:

node blink.js

Conclusão

Neste tutorial mostrei a vocês como instalar e configurar o Nodejs para controlar GPIO em linguagem Nodejs na Raspberry Pi. Aproveitando o ecossistema de pacotes do Nodejs, podemos expandir uma aplicação embarcada com funções de rede, implementação de API, controle remoto de GPIOs, implementação de Webserver e etc.

Não deixe de ver a documentação do Nodejs. O primeiro exemplo deles é bem legal ensinando como fazer um Webserver que responde Hello, World!

Coloquei no meu GitHub os exemplos deste tutorial para controle de GPIO em linguagem Nodejs na Raspberry Pi e também alguns outros um pouco mais elaborados utilizando 2 LEDs e 2 push-buttons. Fica de dever de casa pra vocês.

Gostou? Ajude-nos a melhorar o Blog comentando abaixo sobre este tutorial.

Faça seu comentário

Acesse sua conta e participe