sexta-feira, 23 de setembro de 2016

Programando a Blue Pill (STM32F103C8T6) pela porta USB usando a IDE Arduino

Boa noite, garotada!



Alguns de vocês já devem ter visto uma plaquinha assim rolando pelo Mercado Livre e outros buracos da Internet. Ela é uma plaquinha com um microcontrolador com arquitetura ARM, 64kb de memória flash e várias outras características legais, além de ser relativamente barata. Ela possui 4 pinos para você programá-la com um ST-LINK V2 genérico, mas você sabia que também é possível programá-la diretamente pelo conector USB que existe na própria plaquinha, usando a IDE Arduino?

Para isso você precisa fazer duas coisas:

1- Colocar os arquivos de suporte da plataforma dentro da pasta hardware da pasta da sua IDE Arduino, instalar as placas "Arduino SAM" no gerenciador de placas e instalar o driver da placa Maple Mini. Como o chip STM32F103 utiliza uma arquitetura diferente da AVR, o compilador padrão (avr-gcc) não vai servir, e é por isso que você instala as placas "Arduino SAM" no gerenciado de placas: esse procedimento realiza o download e instalação do compilador de ARM arm-gcc.

Os arquivos de suporte podem ser obtidos aqui, baixando o galho master inteiro do projeto como arquivo ZIP: https://github.com/rogerclarkmelbourne/Arduino_STM32



A versão mais recente da IDE Arduino (1.6.11 no momento em que este post é escrito) aceita os arquivos de suporte sem problema algum, porém algunas versões (depois da 1.6.5 e antes da 1.6.11) podem não exibir as placas novas no gerenciador de placas.


Descompacte o arquivo Arduino_STM32-master e coloque o conteúdo dele dentro da pasta hardware da sua IDE Arduino.
Selecione a opção "Arduino SAM Boards (32-bits ARM Cortex-M3)" e mande a IDE fazer a instalação. É um download razoável, algo como 100 mbs.
Para instalar o driver que permite o Windows reconhecer a plaquinha quando está em modo DFU (Device Firmware Update, que é o protocolo utilizado para fazer o upload do programa para ela, que é o mesmo protocolo utilizado para fazer o upload de um programa compilado para o Arduino Leonardo), você deve rodar o arquivo install_drivers.bat que vem com os arquivos de suporte da plataforma STM32duino. Depois que você instalar os drivers, a sua placa poderá ser reconhecida como dispositivo em modo DFU sempre que for resetada, permitindo que o programa compilado seja transferido para ela.



Com o driver instalado, arquivos de suporte colocado na pasta /hardware, você já pode programar a sua plaquinha. Para isso, você deve configurar a sua IDE da seguinte forma:


Pronto! Agora você consegue programar a sua placa usando a IDE Arduino, sem precisar de qualquer adaptador ou programador externo. A programação é realizada reiniciando a placa por um pulso na linha D- e enviando o programa compilado em .bin com o dfu-util. Note que às vezes o programa que realiza o upload não consegue reiniciar a placa por software. Neste caso, você deve reiniciar a placa manualmente, apertando o botãozinho de reset quando aparecer a mensagem "Searching for DFU device [1EAF:0003]...".

Observação importante: esta placa pode ser reconhecida não só como um dispositivo de comunicação serial, mas também como dispositivo HID (teclado, joystick e mouse), dispositivo MIDI (você escolhe o tipo de dispositivo na configuração USB Type) ou como nenhum dispositivo (por algum erro de programação, porque você escolheu um chip diferente na hora de fazer o upload, etc...). Neste caso, você também precisará resetar a placa manualmente para colocá-la novamente em modo DFU e poder fazer upload do programa compilado para o chip!

Normalmente o uploader é capaz de reiniciar a placa. Caso isso não aconteça, será exibida uma mensagem dizendo que ele não conseguiu encontrar o dispositivo em modo DFU. Isso indica que você precisará reiniciar a placa manualmente, apertando no botãozinho de reset que ela tem.
Quando o uploader reconhece a placa em modo DFU, aparece essa mensagem, o upload é feito e a placa é reiniciada novamente, executando o programa.

Isso tudo também pode ser feito no Linux, mas o procedimento é diferente. Abordarei esse tema específico em outra postagem. A vantagem de usar o Linux é que a compilação é muito mais rápida, e o upload é praticamente instantâneo.

Parece complicado, mas é simples! Observem a apertada do botão de reset em ação:

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


2- Você precisa, obviamente, de uma plaquinha dessas! Mas não é só isso. Elas possuem um resistor Pull-Up no pino PA12 (que está conectado à linha D- do barramento USB) de valor "incorreto", que pode permitir ou não que o chip seja reconhecido pelo seu computador. Isso pode ser corrigido de duas formas: você pode colocar um resistor de 1k5 entre o 3v3 da plaquinha e o pino PA12, ou substituir o resistor R10 por um resistor de 1.5k. Você só precisa fazer isso se a sua placa vier com um resistor de 10k marcado com "R10".

Ainda não cheguei a receber nenhuma placa desse modelo que viesse com o bendito resistor de 1.5k no pino PA12, então eu simplesmente troco o resistor errado pelo correto em todas as placas que chegam para mim. Feito isso, é hora de gravar o bootloader STM32duino (que é uma derivação do Maple Mini, se eu não me engano) no microcontrolador usando um ST-LINK ou um adaptador USB-Serial. Pra fazer isso você precisa colocar o STM32 no modo bootloader serial, e então fazer a gravação do bootloader novo (generic_boot20_pc13.bin) usando o ST-Link Utility ou o Flash Loader Demonstrator, sendo que ambos os programas você consegue baixar no site da ST (vou colocar o link dos dois no final do post de qualquer forma).

Para quem não quer ter o trabalho de dessoldar/soldar um resistor 0603, este que vos escreve vende essa plaquinha já com o resistor trocado e com o bootloader STM32duino/Maple Mini gravado, bastando que você faça a primeira parte deste post ( Link do anúncio no Mercado Livre aqui. No momento em que este post é escrito o anúncio está pausado pois ainda estou esperando o Correio entregar o último lote que eu encomendei para realizar a conversão...). Assim que este último lote chegar, escreverei uma postagem ensinando a fazer troca do resistor.


Links úteis:

  • Flash Loader Demonstrator: http://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-programmers/flasher-stm32.html
  • ST-Link Utility: http://www.st.com/content/st_com/en/products/embedded-software/development-tool-software/stsw-link004.html
  • Bootloader Stm32duino 2.0 para a plaquinha Blue Pill (generic_boot20_pc13.bin) pode ser baixado entre estes arquivos: https://github.com/rogerclarkmelbourne/STM32duino-bootloader/tree/master/STM32F1/binaries

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