Como usar acelerômetro com ESP8266 NodeMCU 24

O assunto IoT (Internet das Coisas) está em alta e por isso vem surgindo inúmeras plataformas de desenvolvimento para esse tipo de solução. Uma delas, provavelmente a mais interessante e utilizada pelos makers, é o módulo Wifi ESP8266 NodeMCU. Além desse pequeno módulo conter I/O’s, regulador de tensão e conectividade USB que facilita programação via IDE do Arduino, contém um módulo WiFi que possibilita conexão à nuvem. E é essa conexão que vamos utilizar para ligar um acelerômetro com ESP8266 NodeMCU, enviando os dados para uma página web.

Acelerômetro com ESP8266 NodeMCU

Antes de mostrarmos o funcionamento do acelerômetro com ESP8266 NodeMCU, recomendamos a leitura do post Tutorial: Acelerômetro MPU6050 com Arduino.

Um Pouco de Teoria Sobre o MPU6050 e sua Comunicação I2C

O MPU6050 é uma IMU (Inertial Measurement Unit), que mede valores de aceleração em 3 eixos, X, Y e Z e velocidade angular também em X, Y e Z. Por isso esse sensor tem 6 graus de liberdade (6DOF). Além dessas medições o sensor também pode medir temperaturas de -40 a 80°C. O sensor ainda conta com um DMP(Digital Motion Processor) que pode realizar inúmeros cálculos e algoritmos complexos dentro do próprio MPU6050. Entre esses algoritmos temos detecção de passos, tap-detection, cálculos de ângulo e muito mais. Mais informações sobre o sensor podem ser encontradas no datasheet e no site da InveSense.

O protocolo I2C, que é um protocolo estilo mestre/escravo, consiste basicamente em leitura e escrita de valores em determinados registros. Isso é feito através do envio e recebimento de bits 0 e 1 de uma forma ordenada e em sequência. Para saber mais leia este pequeno resumo.

No caso deste projeto, temos o NodeMCU como mestre e o MPU6050 como escravo. De acordo com mapa de registro do MPU6050, o endereço I2C padrão do MPU6050 é 0x68 podendo ser alterado para 0x69 conectando o pino AD0 para 3,3V, ou seja, podemos utilizar até dois desses sensores em conjunto. Os valores enviados pelo MPU6050 são valores puros (raw data) que, se desejado, podem ser convertidos para ângulos utilizando-se de cálculos ou algoritmos.

Circuito acelerômetro com ESP8266 NodeMCU

Para montagem do circuito do acelerômetro com ESP8266 NodeMCU foram utilizados os seguintes materiais:

A ligação do circuito foi feita da seguinte maneira:

Circuito acelerômetro com ESP8266 NodeMCU

O pino Vin do NodeMCU possui 5V, que é a mesma tensão ligada ao conector USB. Com este pino podemos alimentar o MPU6050. O acelerômetro em si opera a 3,3V mas como placa GY-251 possui um regulador de tensão, podemos utilizar 5V sem problemas para alimentação. As linhas de SDA e SCL de comunicação I2C possuem na placa resistores de pull-up para 3,3V de acordo com seu esquemático. Sendo assim, a comunicação I2C pode ser realizada diretamente no NodeMCU que também opera a 3,3V. Ou seja, tudo é energizado via USB 5V e ambas as placas regulam para suas tensões de operação 3,3V.

Configuração da IDE Arduino para o NodeMCU

O NodeMCU pode ser facilmente programado usando a IDE do Arduino como visto no post Como programar o NodeMCU com IDE Arduino. 

Entre na IDE do Arduino e clique em Arquivo -> Preferências:

Menu Preferências IDE Arduino

Na tela seguinte, digite o link abaixo no campo URLs adicionais de Gerenciadores de Placas:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

A sua tela ficará assim:

Tela Preferências IDE Arduino

Clique em OK para retornar à tela principal da IDE

Agora clique em Ferramentas -> Placa -> Gerenciador de Placas:

Menu Gerenciador de Placas IDE Arduino

Utilize a barra de rolagem para encontrar o esp8266 by ESP8266 Community e clique em Instalar.

Tela Gerenciador de Placas IDE Arduino

Assim teremos disponíveis as placas da linha ESP8266, suas bibliotecas e exemplos incluídos.

No menu Ferramentas -> Placas, selecione a placa NodeMCU 1.0 (ESP 12-E module)

Menu Placas IDE Arduino

Instalação da biblioteca ArduinoJSON

Este projeto usará a biblioteca ArduinoJson.h que fará a conversão dos dados do MPU6050 em formato JSON.

Para instalá-la clique em Sketch -> Incluir Biblioteca -> Gerenciar de Bibliotecas…

Menu Gerenciador de Bibliotecas IDE Arduino

No campo Refine sua busca… procure por json, selecione a biblioteca ArduinoJson by Benoit Blanchon e clique em instalar.

Tela Gerenciador de Bibliotecas IDE Arduino

Programação do NodeMCU

Para comunicação com o sensor temos basicamente duas funções usando Wire, uma de escrita e outra de leitura de registros do sensor. A partir dessas duas funções podemos realizar diversas tarefas com o sensor, como por exemplo, inicializá-lo, verificar a comunicação, escolher as escalas, ler os valores entre outras.

As funções de escrita e leitura de registros são writeRegMPU() e readRegMPU()  que encotram-se nas linhas de código 68 e 79 respectivamente.

Para que as leituras do sensor sejam enviadas ao servidor o programa formata esses dados em JSON usando a bibliotexa ArduinoJSON resultando no seguinte formato:

Com os dados convertidos para JSON eles estão prontos para serem enviados à internet.

Exibição dos Dados na Página Web

Para melhor visualização dos dados do acelerômetro com ESP8266 NodeMCU, foi desenvolvido um Web Server em NodeJS instalado em uma Rasberry Pi 3 que responde a requisições HTTP como GET e POST.

O NodeMCU envia uma requisição POST no link /accel com as leituras do sensor em formato JSON. A requisição segue o seguinte formato:

O servidor então recebe esses dados e exibe em tempo real para os clientes que acessam o servidor via browser.

Para que o NodeMCU saiba sua geolocalização, foi utilizada a API do site ip-api.com. O NodeMCU realiza um HTTP GET request no link /json e recebe de volta o seguinte JSON:

Assim que o NodeMCU recebe sua geolocalização ele repassa para o servidor que exibe então, em um Google Maps.

O servidor exibe a seguinte página para os clientes que o acessam via browser:

Tela Página Web de Monitoramento Remoto

O código completo do servidor escrito em Node.js pode ser encontrado no GitHub.

Código acelerômetro com ESP8266 NodeMCU

 

Conclusão

Neste artigo foi apresentado um sistema de monitoramento remoto de um acelerômetro com ESP8266 NodeMCU usando um sensor MPU6050, cobrindo temas teóricos como comunicação I2C e o modo de comunicação do MPU6050. Fizemos com que a placa Wifi NodeMCU se portasse como um Web Client, enviando as leituras do MPU6050 a um servidor através de HTTP requests como também seus dados de geolocalização.

Gostou do post do acelerômetro com ESP8266 NodeMCU? Ajude-nos a melhorar o blog atribuindo uma nota a este tutorial (estrelas no final do artigo), comente e visite nossa loja FILIPEFLOP !

Posts Relacionados

Deixe uma resposta

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

24 Comentários

  1. Muito bom!!!
    A biblioteca de Kalman pra arduino(https://github.com/TKJElectronics/KalmanFilter), que eh usada para achar o angulo com o mpu6050, ja esta funcionando com o esp8266 e outros arduinos de 32bits.
    Seria bacana se vc pudesse fazer um post usando-a para mostrar o angulo via web.

  2. Caro Bauermeister, Muito bom o seu tutorial! Enfim todas as informações para configurar a IDE do arduino reunidas num só artigo bem claro.
    Tenho uma dúvida que gostaria que esclarecesse: Pelo que entendi, o servidor deverá ser instalado em um Raspberry Pi-3. Se assim for, me parece que isto é um complicador, pois a grande maioria dos usuários de arduino, assim como eu, não tem esta plataforma por ser de alto custo. Não seria melhor optar por instalar o Web Server em um PC ou em Note book?
    Fica a sugestão para próximo tutorial!

    1. Olá JAGoris, obrigado pela leitura e sugestões!
      Foi usada uma Raspberry Pi 3 apenas por conveniência e por se tratar de uma solução embarcada onde poderia colocar a Raspberry Pi em uma caixinha ao invés de um computador ligado 24/7 apenas para tarefa de servidor. Mas o servidor pode ser executado em computadores com Linux ou Windows bastando apenas instalar o Node.js e os módulos corretamente para cada plataforma. Existem outros métodos de comunicação com servidores como MQTT que também poderia ser usado em uma solução como essa.

      Giovanni Bauermeister
    2. Gostei de sua sugestão sobre o WebServer.

  3. TUNIOT é um gerador de código de bloco para NODEMCU.
    http://easycoding.tn/

    1. Roberto, muito boa sua dica. Já criei um código para usar no ESP e funciona muito bem. Obrigado por compartilhar.

  4. Bom dia.
    Gostaria de uma dica de como criar um código entre dois ESP8266, sendo assim:
    ESP8266_(número-1), com dois botôes envia comando para o ESP8266_9número-2) ligar dois leds ou relay.
    Os dois se conectando e responde automaticamente, quando estiverem no raio de alcance.
    Esta uma ideia para fazer um controle remoto com dois ESP8266.

    Desde já obrigado

    1. Olá Roberto,

      Você tem que configurar um ESP8266 como Access Point e outro como cliente, ou seja, um deles vai criar uma rede wifi e o outro vai se conectar nessa rede.
      Mais informações aqui:
      http://randomnerdtutorials.com/how-to-make-two-esp8266-talk/

      Abraço

    2. OK, muito obrigado, vou estudar o código.
      Quando vcs vão falar a respeito do ESP32?, e como instalar para o IDE Arduino?

  5. Giovanni a parte do Raspberry não esta incluída neste seu artigo ? Teria como enviar pelo email? Eu achei muito bom este seu artigo parabéns.

    Abraços.

    1. Olá Armando,

      Eu inclui o link para o Github.
      https://github.com/giobauermeister/projeto-mpu6050-nodeMCU

      Lá você encontra tanto o código do NodeMCU como do servidor escrito em Nodejs.
      O servidor pode ser executado em qualquer computador ou placa tipo Raspberry que suporte Nodejs.

      Giovanni Bauermeister
  6. Entendi todo o projeto, só travei na parte de botar o site pra rodar e configurar o IP no código do nodeMCU. To usando só o nodeMCU e um notbook com Windows.

    Artur Felipe Veloso
    1. Olá Artur,

      O site desenvolvido é um Web Server feito em NodeJS.
      Pra colocar o site pra rodar você precisa ter NodeJS instalado em seu sistema.

      Veja no seguinte link como instalar NodeJS no Windows:
      http://blog.teamtreehouse.com/install-node-js-npm-windows

      O código do servidor e também a pagina Web HTML podem ser encontrados no meu GitHub
      https://github.com/giobauermeister/projeto-mpu6050-nodeMCU/tree/master/nodejs-server

      Giovanni bauermeister
      1. GIOVANNI aproveitando a pergunta, considerando que eu já instalei o Node.js no Raspberry em que diretório eu coloco os seus arquivos?

        1. Olá Armando,

          Em qualquer diretório de sua preferência.
          Aí dentro da pasta onde estão os arquivos do servidor bastaria executar “nodejs server.js”
          Se der algum erro sobre pacotes não instalados veja no início do código todos os “require”. Como
          var express = require(‘express’);
          Ai tem q ir instalando os pacotes pelo npm (node package manager).

          Dê uma olhada nesse tutorial: https://www.element14.com/community/community/raspberry-pi/raspberrypi2/blog/2015/03/25/rpi2-nodejs-expressjs-sockjs-angularjs

          Abraço!

          Giovanni Bauermeister
    2. Então Artur no código do NodeMCU voce tem que colocar o IP do seu notebook (tipo: 192.168.0.132) para que o NodeMCU possa enviar as informações para ele. Voce descobre o IP Wireless do seu notebook usando o comando ipconfig na linda de comando do Windows.

      Ate mais.

  7. Giovanni funcionou beleza, só que que eu fiz com Esp8266 Wemos D1 pro e com Raspberry PI 2, mas funcionou tudo perfeito. Eu vi que parte da pagina fica em um site da amazon (nuvem) , tem como modificar isso?

    Muito obrigado.

    1. Eu já descobri e editei o arquivo index.html e troque a figura…rsrs

      Abraços

  8. Tem como fazer um esuqema pra usa o gseture sensor da sarkfun no nodemcu??

  9. Olá, fiz tudo conforme mas achou q meu mpu6050 está com algum defeito. veja as leituras:

    AcX = -8284 | AcY = -144 | AcZ = 14244 | Tmp = 28.39 | GyX = -221 | GyY = 42 | GyZ = -18
    AcX = -8388 | AcY = -128 | AcZ = 14072 | Tmp = 28.39 | GyX = -203 | GyY = -40 | GyZ = 4
    AcX = -8412 | AcY = -268 | AcZ = 14060 | Tmp = 28.39 | GyX = -229 | GyY = -12 | GyZ = -24
    AcX = -8672 | AcY = -116 | AcZ = 13704 | Tmp = 28.34 | GyX = -146 | GyY = -52 | GyZ = -53

    é normal isso mesmo parado em cima de uma mesa?

  10. Oi! Eu executei tudo mas não aparece nenhum dado na página index.html
    Não mexi nenhum arquivo do lugar. No esp ele diz que está conectado no servidor e está enviando os dados.
    Quando eu do ‘node server.js’ ele fica aberto e executando…e as vezes até joga na tela do Rpi a cidade onde estou devido a busca da localização pelo esp, mas não mostra mas nenhum outro dado nem envia nada para a index.html.

    De vez em quando ele me joga este erro no Rpi:
    events.js:141
    throw er; // Unhandled ‘error’ event
    ^

    Error: listen EADDRINUSE :::3000
    at Object.exports._errnoException (util.js:874:11)
    at exports._exceptionWithHostPort (util.js:897:20)
    at Server._listen2 (net.js:1234:14)
    at listen (net.js:1270:10)
    at Server.listen (net.js:1366:5)
    at Object. (/var/www/html/server.js:35:8)
    at Module._compile (module.js:435:26)
    at Object.Module._extensions..js (module.js:442:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:311:12)

    1. Olá Alexsandro!

      Obrigado pela leitura e que legal que você chegou até o ponto de executar o servidor.

      Primeiramente esse erro que aparece as vezes:
      Error: listen EADDRINUSE :::3000
      pode ser por causa que o endereço IP e a porta estão ocupados e o servidor não consegue “servir” nesse endereço.
      Verifique sempre que você não executou o servidor duas vezes.
      Você também pode tentar trocar o endereço IP e porta. Lembre-se de trocar também no código do NodeMCU.

      Sobre não estar exibindo os dados na Web, você pode tentar colocar mensagens de log em ambos server.js e index.html

      Você disse que vê a localização no terminal da Raspberry certo? Deve ser essa parte do código do server.js:
      app.post('/location', function(req, res) {
      location = req.body
      io.emit('location', location);
      console.log(req.body.city) < <<<------- mensagem de log aqui exibe a cidade });

      Na seguinte parte tem várias mensagens de log comentadas(linhas 53 a 60 do server.js).
      Descomente para ver se o NodeMCU realmente está mandando os valores do sensor

      app.post('/accel', function(req, res) {
      //console.log(req.body.nodeID) < <<---descomente aqui //console.log(req.body.data.accel.accelX) <<<---descomente aqui

      Isso deve exibir os dados no terminal da Raspberry Pi.

      O próximo passo é verificar se as mensagens estão chegando ao cliente(página Web, index.html)
      Na linha 147 do index.html tem a função
      socket.on('accelData', function(accelData) {
      dentro dessa função coloque mensagens de log exibindo dados do sensor. Exemplo:
      var accelX = accelData.data.accel.accelX
      console.log(accelX) < <<--- mensagem de log com valor accelX

      Todas as mensagens de log no arquivo index.html irão aparecer no navegador web.
      Aperte F12 e clique na aba console para ter acesso ao terminal do navegador.

      Giovanni Bauermeister
  11. muito bom!!! Parabéns!!