30 de julho de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Laboratório Maker 05: MPU6050 no Serial Studio

MPU6050 no Serial Studio

No primeiro artigo do Laboratório Maker 05 vimos o Serial Studio, que além de plotar gráficos em um dashboard, ainda tem alguns widgets para análise de outros sensores com funções específicas. Nesse artigo (que será bastante breve) veremos como colocar o MPU6050 no Serial Studio para monitorar o giroscópio e o acelerômetro.

MPU6050 no Serial Studio

Primeiramente, precisamos definir o arquivo json contendo todas as informações para gerar o widget. O MPU6050 tem temperatura também, daria pra colocar mais um widget, mas esses são legais demais pra misturar com uma barra de temperatura.

mpu6050.json

O nome do arquivo pode ser qualquer coisa. Só não testei se o programa considera a extensão, mas isso você mesmo pode testar se tiver interesse em saber. Particularmente acho que a extensão deve corresponder ao conteúdo para sabermos de que se trata um arquivo sem precisar editá-lo previamente.

Nesse arquivo (que chamei de mpu6050.json) dispus a seguinte estrutura:

{
   "t":"%1",
   "g":[
         {
         "t":"Giroscopio",
         "w":"gyro",
         "d":[
               {
                   "t":"X",
                   "v":"%2",
                   "u":"°",
                   "g":true,
                   "w":"yaw"
               },
               {
                   "t":"Y",
                   "v": "%3",
                   "u":"°",
                   "g":true,
                   "w": "roll"
               },
               {
                   "t":"Z",
                   "v":"%4",
                   "u":"°",
                   "g":true,
                   "w":"pitch"
               }
             ]
          },
          {
          "t":"Acelerometro",
          "w":"accelerometer",
          "d":[
                 {
                 "t":"X",
                 "v":"%5",
                 "g":true,
                 "w":"x"
                 },
                 {
                 "t":"Y",
                 "v":"%6",
                 "g":true,
                 "w":"y"
                 },
                 {
                 "t":"Z",
                 "v":"%7",
                 "g":true,
                 "w":"z"
                 }
              ]
          }
       ]
}

Se não leu o primeiro artigo da série, sugiro que o faça, pois nele está detalhado o que representa cada parte da estrutura. Se já leu, deve se lembrar que temos a possibilidade de escrever o json na MCU ou podemos simplesmente formatar uma string para imprimir na serial e tratar cada campo dessa string através desse arquivo json local. Eu prefiro a segunda opção porque assim fica fácil de fazer debug em MCUs sem ter que incluir biblioteca e modificar código; bastará compor uma string e pronto!

No artigo anterior também vimos que cada campo é posicional e podemos definir no arquivo json local qual campo representa o quê. Vimos também quais são os campos obrigatórios, mas não significa que o valor de todos os campos devam vir da MCU. Por exemplo, no arquivo acima estou definindo alguns títulos diretamente no arquivo json.

Código para o MPU6050 no Serial Studio com ESP32

Estou utilizando o MPU6050 no Serial Studio com ESP32, na placa de desenvolvimento da CurtoCircuito, cuja placa já escrevi alguns outros artigos, começando por essa introdução. Gosto demais dessa placa porque posso trocar o processador e manter um firmware que usarei novamente em outro artigo, poupando o trabalho de gravar novamente o sketch. Mas essa placa tem outro propósito também, que é gravar vários ESP32 previamente à soldagem em uma placa de produto que, por exemplo, não tenha um conversor USB-serial.

O código que usei é meramente uma cópia do sketch de exemplo, adicionando uma string formatada para o Serial Studio. Por isso que digo: melhor usar o json localmente.

#include <Arduino.h>
#include "Wire.h"
#include <MPU6050_light.h>

MPU6050 *mpu;

long timer = 0;

void setup() {
  Serial.begin(9600);
  Wire.begin(21,22);

  mpu = new MPU6050(Wire);
  
  byte status = mpu->begin();
  Serial.print(F("MPU6050 status: "));
  Serial.println(status);
  
  Serial.println(F("Calculating offsets, do not move MPU6050"));
  delay(1000);
  mpu->calcOffsets(true,true); 
  Serial.println("Done!\n");
  
}

void loop() {
  mpu->update();

  if(millis() - timer > 1500){ 
    String msg = "/*MPU6060," + String(mpu->getGyroX()) + "," + String(mpu->getGyroY()) + "," + String(mpu->getGyroZ()) + "," + mpu->getAccX() + "," + mpu->getAccY() + "," + mpu->getAccZ() + "*/";
    Serial.println(msg);
    timer = millis();
  }

}

Lembre-se de instalar a biblioteca MPU6050_light se for utilizar esse código “e” principalmente se for utilizar o MPU6050 com ESP32.

Repare que a única linhas adicionada foi a string:

String msg = "/*MPU6060," + String(mpu->getGyroX()) + "," + String(mpu->getGyroY()) + "," + String(mpu->getGyroZ()) + "," + mpu->getAccX() + "," + mpu->getAccY() + "," + mpu->getAccZ() + "*/";

Tenho certeza que se leu o primeiro artigo relacionado, saberá como carregar o arquivo json. A nova versão do Serial Studio não conecta mais automaticamente ao selecionar a porta, agora temos o botão de conexão no canto superior direito. Se não houver erros na estrutura do arquivo json, será carregado o gráfico de linhas de cada componente. Então clicamos no botão widget para ver o horizonte artificial e o medidor do acelerômetro. O resultado deve ser semelhante ao da imagem em destaque.

Com esse exemplo já temos material o suficiente para fazer outras personalizações do Serial Studio, basta agora ler o primeiro artigo e fazer suas próprias implementações com outros sensores também.

Até a próxima!

Autor: Djames Suhanko

Revisão: Ricardo Amaral de Andrade