- Componentes necessários
- Módulo Receptor e Transmissor RF 433Mhz)
- Diagrama de Circuito do Transmissor RF com STM32F103C8
- Diagrama de circuito do receptor RF com Arduino Uno
- Programação STM32F103C8 para transmissão RF sem fio
- Programando Arduino UNO como receptor RF
- Testando transmissor e receptor de RF baseado em STM 32
Fazer projetos sem fio em eletrônicos embarcados torna-se muito importante e útil, pois não há fios desordenados, o que torna o dispositivo mais prático e portátil. Existem várias tecnologias sem fio, como Bluetooth, Wi-Fi, 433 MHz RF (Rádio Frequência) etc. Cada tecnologia tem suas próprias vantagens e desvantagens, tais como custo, distância ou transferência de alcance, velocidade ou débito etc. Hoje vamos usar módulo de RF com STM32 para enviar e receber os dados sem fio. Se você é novo no microcontrolador STM32, comece com LED piscando com STM32 usando Arduino IDE e verifique todos os outros projetos STM32 aqui.
Além disso, também usamos o módulo sem fio RF 433Mhz com outros microcontroladores para construir alguns projetos controlados sem fio, como:
- Eletrodomésticos controlados por RF
- LEDs RF com controle remoto usando Raspberry Pi
- Robô controlado por RF
- Interface do módulo RF com Arduino
- Comunicação PIC para PIC usando Módulo RF
Aqui faremos a interface de um módulo sem fio RF de 433 MHz com o microcontrolador STM32F103C8. O projeto está dividido em duas partes. O transmissor terá interface com o STM32 e o receptor com o Arduino UNO. Haverá diferentes diagramas de circuito e esboços para a parte transmissora e receptora.
Neste tutorial, o transmissor de RF envia dois valores para o lado do receptor: a distância medida usando o sensor ultrassônico e o valor ADC do potenciômetro (0 a 4096), que é mapeado como um número de (0 a 100). O receptor RF do Arduino recebe ambos os valores e imprime esses valores de distância e número em um display LCD 16x2 sem fio.
Componentes necessários
- Microcontrolador STM32F103C8
- Arduino UNO
- Transmissor e receptor RF 433Mhz
- Sensor Ultrassônico (HC-SR04)
- Visor LCD 16x2
- Potenciômetro de 10k
- Tábua de pão
- Fios de conexão
Módulo Receptor e Transmissor RF 433Mhz)
Pinagem do transmissor RF:
Transmissor RF 433Mhz |
Descrição do pino |
FORMIGA |
Para conectar a antena |
GND |
GND |
VDD |
3,3 a 5V |
DADOS |
Os dados a serem transmitidos ao receptor são fornecidos aqui |
Pinagem do receptor RF:
Receptor RF 433Mhz |
USAR |
FORMIGA |
Para conectar a antena |
GND |
GND |
VDD |
3,3 a 5V |
DADOS |
Dados a serem recebidos do transmissor |
CE / DO |
Também é um pino de dados |
Especificações do módulo de 433 MHz:
- Tensão de operação do receptor: 3V a 5V
- Tensão de operação do transmissor: 3V a 5V
- Frequência de operação: 433 MHz
- Distância de transmissão: 3 metros (sem antena) a 100 metros (máximo)
- Técnica de modulação: ASK (manipulação de mudança de amplitude)
- Velocidade de transmissão de dados: 10Kbps
Diagrama de Circuito do Transmissor RF com STM32F103C8
Conexões de circuito entre o transmissor RF e STM32F103C8:
STM32F103C8 |
Transmissor RF |
5V |
VDD |
GND |
GND |
PA10 |
DADOS |
NC |
FORMIGA |
Conexões de circuito entre sensor ultrassônico e STM32F103C8:
STM32F103C8 |
Sensor Ultrassônico (HC-SR04) |
5V |
VCC |
PB1 |
Trig |
PB0 |
Eco |
GND |
GND |
Um potenciômetro de 10k é conectado ao STM32F103C8 para fornecer um valor analógico de entrada (0 a 3,3 V) para o pino ADC PA0 do STM32.
Diagrama de circuito do receptor RF com Arduino Uno
Conexões de circuito entre receptor de RF e Arduino UNO:
Arduino UNO |
Receptor RF |
5V |
VDD |
GND |
GND |
11 |
DADOS |
NC |
FORMIGA |
Conexões de circuito entre LCD 16x2 e Arduino UNO:
Nome do pino LCD |
Nome do Pin do Arduino UNO |
Ground (Gnd) |
Solo (G) |
VCC |
5V |
VEE |
Pino do centro do potenciômetro para contraste |
Register Select (RS) |
2 |
Leitura / Escrita (RW) |
Solo (G) |
Habilitar (EN) |
3 |
Dados Bit 4 (DB4) |
4 |
Bit de dados 5 (DB5) |
5 |
Bit de dados 6 (DB6) |
6 |
Dados Bit 7 (DB7) |
7 |
LED positivo |
5V |
LED negativo |
Solo (G) |
A codificação será explicada resumidamente a seguir. Haverá duas partes do esboço, onde a primeira parte será a seção do transmissor e a outra será a seção do receptor. Todos os arquivos de esboço e vídeo de trabalho serão fornecidos no final deste tutorial. Para saber mais sobre a interface do módulo RF com o Arduino Uno, siga o link.
Programação STM32F103C8 para transmissão RF sem fio
STM32F103C8 pode ser programado usando Arduino IDE. Não é necessário um programador FTDI ou ST-Link para fazer upload do código para STM32F103C8. Basta conectar ao PC via porta USB do STM32 e começar a programar com ARDUINO IDE. Você pode aprender a programar seu STM32 no Arduino IDE seguindo o link.
Na seção do transmissor, a distância do objeto em 'cm' é medida usando um sensor ultrassônico e o valor numérico de (0 a 100) definido usando um potenciômetro que é transmitido por meio de um transmissor de RF com interface com STM32.
Primeiro, a biblioteca Radiohead é incluída, ela pode ser baixada aqui. Como esta biblioteca usa o ASK (Amplitude Shift Keying Technique) para transmitir e receber dados. Isso torna a programação muito fácil. Você pode incluir a biblioteca no esboço acessando Sketch-> incluir biblioteca-> Adicionar biblioteca.zip.
#incluir
Como neste tutorial, no lado do transmissor, um sensor ultrassônico é usado para medir a distância para que os pinos de disparo e eco sejam definidos.
#define trigPin PB1 #define echoPin PB0
Em seguida, o nome do objeto para a biblioteca RH_ASK é definido como rf_driver com os parâmetros como velocidade (2000), pino RX (PA9) e pino TX (PA10).
RH_ASK rf_driver (2000, PA9, PA10);
Em seguida, as variáveis Strings necessárias neste programa são declaradas.
String transmit_number; String transmit_distance; String transmitir;
Em seguida, no void setup (), o objeto para RH_ASK rf_driver é inicializado.
rf_driver.init ();
Depois disso, o pino de disparo é definido como pino de SAÍDA e o PA0 (conectado ao potenciômetro) e o pino de eco são definidos como pino de ENTRADA. A comunicação serial é iniciada na taxa de transmissão de 9600.
Serial.begin (9600); pinMode (PA0, INPUT); pinMode (echoPin, INPUT); pinMode (trigPin, OUTPUT);
Em seguida, no loop vazio (), primeiro o valor do potenciômetro que é a tensão analógica de entrada é convertido em valor digital (o valor ADC é encontrado). Já o ADC do STM32 possui resolução de 12 bits. Portanto, o valor digital varia de (0 a 4096) que é mapeado em (0 a 100).
int analoginput = analogRead (PA0); int pwmvalue = map (analoginput, 0,4095,0,100);
Em seguida, a distância é medida usando o sensor ultrassônico, definindo o gatilho alto e baixo com um atraso de 2 microssegundos.
digitalWrite (trigPin, LOW); atrasoMicrosegundos (2); digitalWrite (trigPin, HIGH); delayMicroseconds (10); digitalWrite (trigPin, LOW);
O pino de eco detecta a onda refletida de volta, ou seja, o tempo durante o qual a onda disparada é refletida de volta é usado no cálculo da distância do objeto usando a fórmula. Saiba mais como o sensor ultrassônico calcula a distância, seguindo o link.
longa duração = pulseIn (echoPin, HIGH); distância de flutuação = duração * 0,034 / 2;
Agora, o número de dados e a distância medida são convertidos em dados de string e armazenados nas respectivas variáveis de string.
transmit_number = String (pwmvalue); transmit_distance = String (distância);
A string é adicionada como uma linha e armazenada em uma string chamada transmit e a vírgula “,” é usada para separar duas strings.
transmitir = transmit_pwm + "," + transmit_distance;
A sequência de transmissão é convertida em matriz de caracteres.
const char * msg = transmit.c_str ();
Os dados são transmitidos e aguardam até que sejam enviados.
rf_driver.send ((uint8_t *) msg, strlen (msg)); rf_driver.waitPacketSent ();
Os dados da string enviados também são exibidos no Monitor Serial.
Serial.println (msg);
Programando Arduino UNO como receptor RF
O Arduino UNO é programado usando o IDE do Arduino. Na seção do receptor, os dados que são transmitidos da seção do transmissor e recebidos pelo módulo receptor de RF e os dados da string recebidos são divididos nos respectivos dados (distância e número) e exibidos no display LCD 16x2.
Vamos ver a codificação do receptor resumidamente:
Como na seção do transmissor, primeiro a biblioteca RadiohHead está incluída. Como esta biblioteca usa o ASK (Amplitude Shift Keying Technique) para transmitir e receber dados. Isso torna a programação muito fácil.
#incluir
Como o display LCD é usado aqui, a biblioteca de cristal líquido também está incluída.
#incluir
E os pinos da tela LCD 16x2 conectados ao Arduino UNO são especificados e declarados usando lcd como objeto.
LiquidCrystal lcd (2,3,4,5,6,7);
Em seguida, as variáveis de dados String para armazenar dados de string são declaradas.
String str_receive; String str_number; String str_distance;
O objeto para a biblioteca Radiohead é declarado.
RH_ASK rf;
Agora na configuração vazia (), o display LCD é configurado no modo 16x2 e uma mensagem de boas-vindas é exibida e apagada.
lcd.begin (16,2); lcd.print ("CIRCUITO DIGEST"); lcd.setCursor (0,1); lcd.print ("RF com STM32"); atraso (5000); lcd.clear ();
Depois disso, o objeto rf é inicializado.
rf.init ();
Agora, no loop void (), o Array buf é declarado com tamanho de 7. Como os dados enviados do transmissor têm 7 incluindo o “,”. Portanto, altere de acordo com os dados que serão transmitidos.
uint8_t buf; uint8_t buflen = sizeof (buf);
Se a string estiver disponível no módulo receptor rf, a função if verifica o tamanho e executa. O rf.recv () é usado para receber dados.
if (rf.recv (buf, & buflen))
O buf tem a string recebida, então a string recebida é armazenada em uma variável de string str_receive .
str_receive = String ((char *) buf);
Isto para loop é usado para dividir a string recebeu em dois se detectar os '' em-entre duas cordas.
for (int i = 0; i <str_receive.length (); i ++) { if (str_receive.substring (i, i + 1) == ",") { str_number = str_receive.substring (0, i); str_distance = str_receive.substring (i + 1); pausa; }
Duas matrizes de caracteres para dois valores são declaradas e a String que é dividida em duas é armazenada na matriz respeitada, convertendo a string em uma matriz de caracteres.
char numbertring; char distancestring; str_distance.toCharArray (distancestring, 3); str_number.toCharArray (numbertring, 3);
Depois disso, converta o array de caracteres em inteiro usando atoi ()
distância interna = atoi (cadeia de distância); número int = atoi (cadeia de números);
Depois de converter em valores inteiros, os valores de distância e número são exibidos no display LCD 16x2
lcd.setCursor (0,0); lcd.print ("Número:"); lcd.print (número); lcd.setCursor (0,1); lcd.print ("Distância:"); lcd.print (distância); lcd.print ("cm");
Depois de carregar os códigos, ou seja, transmissor e receptor no STM32 e no Arduino UNO, respectivamente, os dados como número e distância do objeto medidos usando o STM32 são transmitidos para o receptor de RF via transmissor de RF e os valores recebidos são exibidos no display LCD sem fio.
Testando transmissor e receptor de RF baseado em STM 32
1. Quando o número é 0 e a distância do objeto é 6cm.
2. Quando o número 47 e a distância do objeto estiverem a 3 cm.