banner

Ir para o Forum

Fácil, extremamente fácil de programar!



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);
    }
}





Faça o download dos arquivos:




2 comentários:

  1. O problema que vejo em tudo isso é o das comunidades, que não podem ser dispersas como uma pessoa pode fazer individualmente.
    Para 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.

    ResponderExcluir

Tecnologia do Blogger.