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.
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:
- 1x LED;
- 1x Resistor 1K ohm;
- 1x Push-button.
Montagem do circuito para controle GPIO em linguagem Nodejs na Raspberry Pi
Veja abaixo a montagem do circuito:
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:
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:
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.
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.