Hoje vou falar para vocês do
Núcleo do STM32, o L476RG, que é aquele “cara” Ultra Low Power, que você vê à
esquerda de imagem. Ele me lembra de uma música do Jota Quest, que inclusive
utilizei no título deste vídeo: “Fácil, extremamente fácil, pra você e eu e
todo mundo... PROGRAMAR”. Esse dispositivo possui duas barras de pinos Fêmea, uma
de cada lado, que nada mais são que os conectores para o shield do arduino.
Quer coisa melhor do que isso?
Em minha opinião, a STMicroelectronics
fez isso no seu Kit de Desenvolvimento porque sabe que quem usa esse chip é
profissional e, mais do que isso, essa empresa está indo cada vez mais pro lado
do arduino. E isso também vale para outros diversos kits profissionais da STMicroelectronics.
Enfim, falando do nosso
projeto de hoje, vamos usar, além do L476RG, dois sensores DS18b20. Vamos,
portanto, efetuar uma montagem simples usando o L476RG, importar uma biblioteca
no ambiente MBED, além de criar um programa no ambiente MBED e obter dados do
L476RG via USB/Serial.
Já falei um pouco sobre o L476RG
neste vídeo: A MANEIRA MAIS FÁCIL DE PROGRAMAR UM MICROCONTROLADOR, no qual eu
mostro como configurar o ambiente MBED, que é on-line.
Destaque: Pessoal, alguns seguidores estão me perguntando se o STM32 substitui o ESP32. Digo uma coisa: não substitui e nem poderia, pois são duas coisas completamente diferentes.
Esse chip STM32 é um microcontrolador, ou melhor, ele não é um “agregado de coisas” como é o ESP32. Então, o nome pode ser parecido, mas, um não tem nada a ver com o outro. Ou seja, o STM32 é um microcontrolador de uso geral, como um PIC, um Atmel, por exemplo.
O STM32F476RG é vendido
somente no site da STMicroeletronics, para pessoas jurídicas. Mas, o
STM32F411RE pode ser facilmente encontrado aqui neste link:
https://bit.ly/2kXXKKr. Ele também funciona com MBED.
Recursos usados
1 Núcleo L476RG
2 sensores DS18b20 (usamos os
módulos à prova d’água comuns no mercado)
1 resistor de 4k7
Mini protoboard
Jumpers para conexão
Montagem
Vamos inicialmente realizar a
montagem usando um dos sensores de temperatura.
Sua alimentação será de 5V.
Um resistor de 4k7 será usado
para fazer um pull-up na linha de dados (1-Wire).
Faremos a leitura dos dados
usando o pino A0.
Novo programa no MBED
Depois de ter sua conta
configurada no MBED e acessá-lo, vamos criar um novo programa. Para isso,
clique com o botão direito em “My Programs” e selecione “New Program...”.
Confirme se a “Plataform” está
de acordo com a placa que está utilizando.
Clicamos agora em “Template” .
. .
Vamos criar um programa
baseado no exemplo “Display a message on PC using UART”.
Coloque o nome do programa em
“Program Name”.
Marque a opção “Update this
program and libraries to latest revision”.
Uma nova pasta para seu
programa será criada, já incluindo a biblioteca padrão do MBED e com o arquivo
main.cpp.
Pode-se utilizá-lo para testar
se tudo está funcionando bem. Para isso, basta compilá-lo e copiá-lo para a
plataforma.
Usando um terminal serial de
sua preferência, será possível receber as seguintes mensagens.
Importando a biblioteca do DS18b20
Como existem várias versões de
bibliotecas para o Ds18b20, vamos importar usando uma url para que seu exemplo
use a mesma biblioteca.
Novo programa no MBED
No campo “Source URL” preencha
com: https://os.mbed.com/users/Sissors/code/DS1820/
e clique em importar.
Deverá aparecer na pasta de
seu programa a biblioteca DS1820.
Código fonte
Includes
Iniciamos incluindo as
bibliotecas necessárias.
#include "mbed.h" //inclusão da biblioteca padrão do MBED #include "DS1820.h" //inclusão da biblioteca do sensor DS1820
Definimos constantes que
representarão os pinos utilizados.
Note que o DS18b20 é um sensor
com comunicação 1-WIRE. Por este motivo usamos a biblioteca que lidará com todo
o protocolo de comunicação com os dispositivos. Isto inclui a identificação de
cada dispositivo até os comandos de leitura.
#define PINO_DE_DADOS A0 //define o pino para leitura dos dados #define MAX_SENSORES 16 //define o número máximo para o vetor de sensores
Criamos um vetor que apontará
para cada um dos 16 possíveis dispositivos ligados à linha de dados.
DS1820* sensor[MAX_SENSORES]; //cria um vetor com 16 posições para os sensores
Iniciamos o método main(), onde, utilizando o método “unassignedProbe()” contido na biblioteca DS1820, procuramos por todos os dispositivos disponíveis na linha de comunicação.
Preenchemos o vetor sensor[]
com as instâncias que representarão cada um dos sensores disponíveis.
Fazemos isso até que o último
seja encontrado ou até atingirmos o máximo de 16 sensores.
int main() { int encontrados = 0; while(DS1820::unassignedProbe(PINO_DE_DADOS)) { //inicia a procura por sensores sensor[encontrados] = new DS1820(PINO_DE_DADOS); //cria uma instancia para o sensor encontrado encontrados++; if (encontrados == MAX_SENSORES) //verifica se atingiu o máximo de sensores break; }
Enviamos o número de sensores
encontrados na linha.
printf("Dispositivos encontrado(s): %d \r\n\n", encontrados);
Iniciamos um loop infinito,
solicitando que todos os sensores disponíveis calculem a suas respectivas
temperaturas e, em seguida, iteramos pelo vetor de sensores enviando as
leituras obtidas.
printf("Dispositivos encontrado(s): %d \r\n\n", encontrados); while(1) { sensor[0]->convertTemperature(true, DS1820::all_devices); //solicita a leitura de temperatura para todos os dispositivos encontrados for (int i = 0; i<encontrados; i++) //itera por todos os dispositivos . . . printf("Sensor %d: %3.1foC\r\n", i, sensor[i]->temperature()); // . . . e retorna a temperatura printf("\r\n"); wait(1); }
Dados recebidos
Utilizando um único sensor,
obtemos a seguinte saída serial.
Incluindo mais sensores
Para testar o código,
introduzimos mais um sensor na linha de comunicação, simplesmente ligando-o em
paralelo com o primeiro sensor.
Lembre-se de desligar a
montagem antes de conectar novos sensores.
Ao reiniciar a montagem,
obtivemos a seguinte saída, sem nenhuma alteração no código fonte.
Código fonte completo:
#include "mbed.h" //inclusão da biblioteca padrão do MBED #include "DS1820.h" //inclusão da biblioteca do sensor DS1820 #define PINO_DE_DADOS A0 //define o pino para leitura dos dados #define MAX_SENSORES 16 //define o número máximo para o vetor de sensores DS1820* sensor[MAX_SENSORES]; //cria um vetor com 16 posições para os sensores int main() { int encontrados = 0; while(DS1820::unassignedProbe(PINO_DE_DADOS)) { //inicia a procura por sensores sensor[encontrados] = new DS1820(PINO_DE_DADOS); //cria uma instancia para o sensor encontrado encontrados++; if (encontrados == MAX_SENSORES) //verifica se atingiu o máximo de sensores break; } printf("Dispositivos encontrado(s): %d \r\n\n", encontrados); while(1) { sensor[0]->convertTemperature(true, DS1820::all_devices); //solicita a leitura de temperatura para todos os dispositivos encontrados for (int i = 0; i<encontrados; i++) //itera por todos os dispositivos . . . printf("Sensor %d: %3.1foC\r\n", i, sensor[i]->temperature()); // . . . e retorna a temperatura printf("\r\n"); wait(1); } }
1 Comentários
O problema que vejo em tudo isso é o das comunidades, que não podem ser dispersas como uma pessoa pode fazer individualmente.
ResponderExcluirPara a comunidade de criadores (DIY), acho que é melhor usar etapas de acordo com a necessidade e o preço. Arduino, Raspberry Pi, ESP32, "no presente momento" são três modelos bem diferenciados para uso geral e bem documentados. Há muitos outros que estão fora do jogo, mesmo que sejam melhores.