sexta-feira, 23 de setembro de 2016

MPU6050 no Maple Mini + Exibição dos dados na interface feita em Processing

No post anterior eu mostrei como enviar dados pela porta serial sem precisar fazer qualquer interpretação de texto e exibir esses dados em uma interface em um sketch de Processing. Usando aquela mesma interface, eu vou exibir dados extraídos de um acelerômetro/giroscópio MPU6050 ligado em um Maple Mini. Pra fazer a comunicação entre o Maple Mini e o MPU6050 eu não usei nenhuma biblioteca além da HardWire.h, que permite que você utilize as duas interfaces i2c da plaquinha separadamente. A comunicação com o MPU6050 é feita basicamente escrevendo em registradores para enviar comandos e requisitando os dados depois.

O programa inclui ainda uma forma bem rudimentar de calibrar o MPU6050. Internamente, é como se o MPU6050 tivesse 6 "molas", e as propriedades elétricas (como resistividade) dessas micro-molas mudam conforme o módulo é acelerado/girado. Como são estruturas microscópicas, já dá pra imaginar o inferno que é produzi-las de maneira consistente. Por isso mesmo é preciso realizar a calibração do módulo. Esse procedimento é realizado enviando valores de offset de cada componente do acelerômetro e giroscópio para o módulo até que, estando em repouso, ele informe apenas a aceleração da gravidade e só um pouquinho de ruído. Há outros "defeitinhos" deste CI que precisam ser contornados, mas só abordarei esse assunto mais pra frente.

Enfim, eis o código:

Depois que a plaquinha está ligada no MPU6050 e enviando os dados pela porta serial, a interface no Processing fica desse jeito:

Displaying data from mpu6050 accelerometer in processing #arduino

Um vídeo publicado por Ruy Jorje (@ruyjorje) em

É isso aí! O próximo post vai ser sobre como enviar as informações do MPU6050 através de um módulo NRF24L01+, empregando uma técnica parecida para transmitir os dados em modo binário!

quarta-feira, 21 de setembro de 2016

Enviando informações pela porta serial em modo binário

Este exemplo é um programa em duas partes: uma é um programa que roda em um Arduino/Maple Mini, e a outra é um programa que roda em Processing. A parte legal do Processing é que você pode baixar a "IDE" dele, programar e executar o seu programa imediatamente, sem ficar escolhendo compilador nem escrevendo makefile. Na verdade ele roda por cima do Java, mas você não precisa se preocupar com nenhuma dessas coisas.

Vou só colocar o código aqui, porque ele é simples e é praticamente auto-explicativo.

Programa que vai rodar no Arduino/Maple Mini:


Programa que vai rodar no Processing:


A técnica utilizada é bem simples: todos os dados estão dentro de um struct, que por sua vez está dentro de um union. Como esse struct tem um tamanho fixo (28 bytes), o meu sistema mestre (rodando no processing) sempre recebe uma estrutura de dados correta, e é só transformar os bytes novamente em floats.
A seguir, duas demonstrações. Uma rodando em um Arduino, e a outra em um Maple Mini, transmitindo dados obtidos a partir de um MPU6050.

Reading data from #arduino in Processing

Um vídeo publicado por Ruy Jorje (@ruyjorje) em


Displaying data from mpu6050 accelerometer in processing #arduino

Um vídeo publicado por Ruy Jorje (@ruyjorje) em

domingo, 17 de julho de 2016

Usando o RTC interno do STM32f103c8t6


Alguns de vocês já devem ter visto essa plaquinha pela internet. À primeira vista parece um Arduino Nano ou coisa parecida, mas se você prestar atenção, descobrirá que o mcu nela encontrado, além de ser muito mais rápido que os Atmega8/168/328, rodando a 72mhz, ter mais memória FLASH do que eles (64k vs 32, 16 e 8) também possui uma série de características muito interessantes, tais como:


  • Bootloader serial permanente (você pode programá-la com qualquer conversor USB-Serial)
  • Funciona em tensões entre 2.0 e 3.6v (ou seja, se você pode alimentá-lo com uma única bateria de lítio)
  • 2 interfaces I2C
  • 3 interfaces USART
  • 2 interfaces SPI
  • Interface USB 2.0 nativa
E outras, das quais o RTC interno se mostra como um recurso interessantíssimo porque basta adicionar uma bateria de lítio ou um supercapacitor ao circuito para que você tenha um dispositivo que saiba que horas são mesmo estando desligado. Para o povo arduineiro, essa tarefa é rotineiramente realizada usando algum módulo RTC externo (como o DS1302, DS1307 e etc), que nesse caso é desnecessário, pois a ST colocou um no próprio MCU!

Tem algum datasheet da ST que explica  exatamente quais registradores devem ser escritos/lidos para que você possa utilizar o RTC, mas o que eu vou fazer aqui é o jeito mais fácil de descobrir essa funcionalidade: pegando um código pronto e adaptando-o de maneira muito sutil. O código em questão é um exemplo que vem com o pacote stm32duino: ele se chama Test_RTClock, e nada mais é do que um pequeno exemplo de utilização da biblioteca RTClock.h (também inclusa no pacote stm32duino).

Para este código funcionar, você precisará de uma bateria de lítio de 3v com o positivo ligado no pino VBAT do seu STM32. Na plaquinha azul (conhecida como bluepill), este pino é identificado com a sigla "VB".  Também é necessário ter instalada a biblioteca Time, para converter o tempo retornado pelo RTC do STM32 (que é o número de segundos que se passou desde algum dia na década de 70) em uma data humanamente legível. É só isso! Nenhum outro componente externo é necessário, além da própria bateria. Note que, para que o seu STM32 seja reconhecido pelo Windows é preciso que ele tenha um resistor pull-up de 1k5 no pino PA12 e que o driver que vem com o pacote stm32duino esteja instalado, mas isso será assunto de outra postagem.

Edit: me parece que o cristal que vem com essa placa é de qualquer frequência, menos 32.768 hkz. Depois de mais ou menos uma hora, o reloginho já estava meia hora atrasado. Modificando o código pra mostrar quantos milisegundos haviam se passado entre uma exibição e a outra, percebi que o valor variava entre 1500 e 2000 (!). O jeito foi colocar um cristal de 32.768 khz adicional entre os pinos C14 e C15. Magicamente, o período de tempo entre uma exibição e outra caiu para 1000 milisegundos exatos, e o relógio passou a funcionar precisamente.





Veja aqui o RTC em ação: