- Componentes requeridos
- Módulo transmisor y receptor RF de 433 Mhz)
- Diagrama de circuito del transmisor de RF con STM32F103C8
- Diagrama de circuito del receptor de RF con Arduino Uno
- Programación de STM32F103C8 para transmisión RF inalámbrica
- Programación de Arduino UNO como receptor de RF
- Prueba de transmisor y receptor de RF basado en STM 32
Hacer proyectos inalámbricos en electrónica integrada se vuelve muy importante y útil, ya que no hay cables desordenados que hacen que el dispositivo sea más práctico y portátil. Existen varias tecnologías inalámbricas como Bluetooth, WiFi, RF de 433 MHz (radiofrecuencia), etc. Cada tecnología tiene sus propias ventajas y desventajas, como el costo, la distancia o la transferencia de rango, la velocidad o el rendimiento, etc. Hoy usaremos el módulo de RF con STM32 para enviar y recibir los datos de forma inalámbrica. Si es nuevo en el microcontrolador STM32, comience con LED parpadeante con STM32 usando Arduino IDE y verifique todos los demás proyectos STM32 aquí.
Aparte de esto, también hemos utilizado el módulo inalámbrico RF 433Mhz con otros microcontroladores para construir algunos proyectos controlados de forma inalámbrica, como:
- Electrodomésticos controlados por RF
- LED de RF controlados a distancia con Raspberry Pi
- Robot controlado por RF
- Interfaz del módulo de RF con Arduino
- Comunicación PIC a PIC mediante módulo RF
Aquí conectaremos un módulo inalámbrico RF de 433MHz con el microcontrolador STM32F103C8. El proyecto se divide en dos partes. El transmisor estará interconectado con STM32 y el receptor estará interconectado con Arduino UNO. Habrá diferentes diagramas de circuito y bocetos tanto para la transmisión como para la recepción.
En este tutorial, el transmisor de RF envía dos valores al lado del receptor: la distancia medida con el sensor ultrasónico y el valor ADC del potenciómetro (0 a 4096) que se asigna como un número de (0 a 100). El receptor de RF de Arduino recibe ambos valores e imprime esos valores de distancia y número en una pantalla LCD de 16x2 de forma inalámbrica.
Componentes requeridos
- Microcontrolador STM32F103C8
- Arduino UNO
- Transmisor y receptor RF de 433 Mhz
- Sensor ultrasónico (HC-SR04)
- Pantalla LCD 16x2
- Potenciómetro 10k
- Tablero de circuitos
- Conexión de cables
Módulo transmisor y receptor RF de 433 Mhz)
Configuración de pines del transmisor de RF:
Transmisor RF 433Mhz |
Pin Descripción |
HORMIGA |
Para conectar antena |
GND |
GND |
VDD |
3.3 hasta 5V |
DATOS |
Los datos que se transmitirán al receptor se proporcionan aquí |
Configuración de pines del receptor de RF:
Receptor RF 433Mhz |
UTILIZAR |
HORMIGA |
Para conectar antena |
GND |
GND |
VDD |
3.3 hasta 5V |
DATOS |
Datos que se recibirán del transmisor |
CE / DO |
También es un pin de datos |
Especificaciones del módulo de 433 MHz:
- Voltaje de funcionamiento del receptor: 3 V a 5 V
- Voltaje de funcionamiento del transmisor: 3 V a 5 V
- Frecuencia de funcionamiento: 433 MHz
- Distancia de transmisión: 3 metros (sin antena) a 100 metros (máximo)
- Técnica de modulación: ASK (Modulación por desplazamiento de amplitud)
- Velocidad de transmisión de datos: 10 Kbps
Diagrama de circuito del transmisor de RF con STM32F103C8
Conexiones de circuito entre el transmisor de RF y el STM32F103C8:
STM32F103C8 |
Transmisor de RF |
5V |
VDD |
GND |
GND |
PA10 |
DATOS |
CAROLINA DEL NORTE |
HORMIGA |
Conexiones de circuito entre el sensor ultrasónico y STM32F103C8:
STM32F103C8 |
Sensor ultrasónico (HC-SR04) |
5V |
VCC |
PB1 |
Trigonometría |
PB0 |
Eco |
GND |
GND |
Un potenciómetro de 10k está conectado con el STM32F103C8 para proporcionar un valor analógico de entrada (0 a 3.3V) al pin PA0 del ADC del STM32.
Diagrama de circuito del receptor de RF con Arduino Uno
Conexiones de circuito entre el receptor de RF y Arduino UNO:
Arduino UNO |
Receptor de RF |
5V |
VDD |
GND |
GND |
11 |
DATOS |
CAROLINA DEL NORTE |
HORMIGA |
Conexiones de circuito entre LCD 16x2 y Arduino UNO:
Nombre del pin LCD |
Nombre de pin de Arduino UNO |
Tierra (Gnd) |
Tierra (G) |
VCC |
5V |
VEE |
Pin del centro del potenciómetro para contraste |
Registro Seleccionar (RS) |
2 |
Lectura / escritura (RW) |
Tierra (G) |
Habilitar (EN) |
3 |
Bit de datos 4 (DB4) |
4 |
Bit de datos 5 (DB5) |
5 |
Bit de datos 6 (DB6) |
6 |
Bit de datos 7 (DB7) |
7 |
LED positivo |
5V |
LED negativo |
Tierra (G) |
La codificación se explicará brevemente a continuación. Habrá dos partes del boceto donde la primera parte será la sección del transmisor y la otra será la sección del receptor. Todos los archivos de bocetos y videos de trabajo se darán al final de este tutorial. Para obtener más información sobre la interfaz del módulo de RF con Arduino Uno, siga el enlace.
Programación de STM32F103C8 para transmisión RF inalámbrica
STM32F103C8 se puede programar usando Arduino IDE. No se necesita un programador FTDI o ST-Link para cargar el código en STM32F103C8. Simplemente conéctelo a la PC a través del puerto USB de STM32 y comience a programar con ARDUINO IDE. Puede aprender a programar su STM32 en Arduino IDE siguiendo el enlace.
En la sección del transmisor, la distancia del objeto en 'cm' se mide usando un sensor ultrasónico y el valor numérico de (0 a 100) se establece usando un potenciómetro que se transmite a través de un transmisor de RF conectado con STM32.
Primero se incluye la biblioteca de Radiohead, se puede descargar desde aquí. Como esta biblioteca utiliza ASK (técnica de manipulación por desplazamiento de amplitud) para transmitir y recibir datos. Esto hace que la programación sea muy sencilla. Puede incluir la biblioteca en el croquis yendo a Sketch-> incluir biblioteca-> Agregar biblioteca.zip.
#incluir
Al igual que en este tutorial en el lado del transmisor, se usa un sensor ultrasónico para medir la distancia, de modo que se definen los pines de disparo y eco.
#define trigPin PB1 #define echoPin PB0
A continuación, el nombre del objeto para la biblioteca RH_ASK se establece como rf_driver con los parámetros como velocidad (2000), pin RX (PA9) y pin TX (PA10).
RH_ASK rf_driver (2000, PA9, PA10);
A continuación, se declara la variable Strings necesaria en este programa.
String transmit_number; String transmit_distance; Transmisión de cadena;
A continuación, en la configuración void (), se inicializa el objeto para RH_ASK rf_driver.
rf_driver.init ();
Después de eso, el pin de disparo se establece como pin de SALIDA y el pin PA0 (conectado al potenciómetro) y el pin de eco se establece como pin de ENTRADA. La comunicación en serie comienza a una velocidad de 9600 baudios.
Serial.begin (9600); pinMode (PA0, ENTRADA); pinMode (echoPin, INPUT); pinMode (trigPin, SALIDA);
A continuación, en el bucle vacío (), primero el valor del potenciómetro que es el voltaje analógico de entrada se convierte en valor digital (se encuentra el valor ADC). Como el ADC de STM32 tiene una resolución de 12 bits. Entonces, el valor digital varía de (0 a 4096) que se asigna a (0 a 100).
int entrada analógica = lectura analógica (PA0); int pwmvalue = map (entrada analógica, 0,4095,0,100);
A continuación, se mide la distancia utilizando un sensor ultrasónico configurando el disparador alto y bajo con un retraso de 2 microsegundos.
digitalWrite (trigPin, BAJO); delayMicroseconds (2); digitalWrite (trigPin, HIGH); delayMicroseconds (10); digitalWrite (trigPin, BAJO);
El pin de eco detecta la onda reflejada hacia atrás, que es el tiempo que la onda activada se refleja de vuelta y se usa para calcular la distancia del objeto usando la fórmula. Obtenga más información sobre cómo el sensor ultrasónico calcula la distancia siguiendo el enlace.
larga duración = pulseIn (echoPin, HIGH); distancia de flotación = duración * 0.034 / 2;
Ahora, tanto el número de datos como la distancia medida se convierten en datos de cadena y se almacenan en las respectivas variables de cadena.
transmit_number = String (pwmvalue); transmit_distance = String (distancia);
Tanto la cadena se agrega como una línea y se almacena en una cadena llamada transmitir y la coma "," se usa para separar dos cadenas.
transmitir = transmitir_pwm + "," + transmitir_distancia;
La cadena de transmisión se convierte en una matriz de caracteres.
const char * msg = transmitir.c_str ();
Los datos se transmiten y esperan a que se envíen.
rf_driver.send ((uint8_t *) msg, strlen (msg)); rf_driver.waitPacketSent ();
Los datos de cadena enviados también se muestran en Serial Monitor.
Serial.println (msg);
Programación de Arduino UNO como receptor de RF
Arduino UNO se programa utilizando el IDE de Arduino. En la sección del receptor, los datos que se transmiten desde la sección del transmisor y reciben el módulo receptor de RF y los datos de cadena recibidos se dividen en los datos respectivos (distancia y número) y se muestran en la pantalla LCD de 16x2.
Veamos brevemente la codificación del receptor:
Como en la sección de transmisores, primero se incluye la biblioteca RadiohHead. Como esta biblioteca utiliza ASK (técnica de modulación por desplazamiento de amplitud) para transmitir y recibir datos. Esto hace que la programación sea muy sencilla.
#incluir
Como aquí se utiliza la pantalla LCD, también se incluye la biblioteca de cristal líquido.
#incluir
Y los pines de pantalla LCD de 16x2 conectados con Arduino UNO se especifican y declaran utilizando lcd como objeto.
LiquidCrystal lcd (2,3,4,5,6,7);
A continuación, se declaran las variables de datos de cadena para almacenar datos de cadena.
String str_receive; String str_number; String str_distance;
Se declara el objeto de la biblioteca Radiohead.
RH_ASK rf;
Ahora en la configuración de anulación (), la pantalla LCD está configurada en modo 16x2 y se muestra y borra un mensaje de bienvenida.
lcd.begin (16,2); lcd.print ("RESUMEN DEL CIRCUITO"); lcd.setCursor (0,1); lcd.print ("RF con STM32"); retraso (5000); lcd.clear ();
Después de eso, se inicializa el objeto rf .
rf.init ();
Ahora, en el bucle void (), el Array buf se declara con un tamaño de 7. Como los datos enviados desde el transmisor tienen 7 incluyendo el ",". Por lo tanto, cambie esto de acuerdo con los datos que se transmitirán.
uint8_t buf; uint8_t buflen = tamaño de (buf);
Si la cadena está disponible en el módulo receptor de rf, la función if comprueba el tamaño y se ejecuta. El rf.recv () se usa para recibir datos.
si (rf.recv (buf y buflen))
El buf tiene la cadena recibida, entonces la cadena recibida se almacena en una variable de cadena str_receive .
str_receive = String ((char *) buf);
Este bucle for se usa para dividir la cadena recibida en dos si detecta el ',' entre dos cadenas.
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); romper; }
Se declaran dos matrices de caracteres para dos valores y la cadena que se divide en dos se almacena en una matriz respetada convirtiendo la cadena en una matriz de caracteres.
cadena numérica de caracteres; char distancetring; str_distance.toCharArray (distancetring, 3); str_number.toCharArray (cadena de números, 3);
Después de eso, convierta la matriz de caracteres en un número entero usando atoi ()
int distancia = atoi (cadena de distancias); int número = atoi (cadena de números);
Después de convertir en valores enteros, los valores de distancia y número se muestran en la pantalla LCD de 16x2
lcd.setCursor (0,0); lcd.print ("Número:"); lcd.print (número); lcd.setCursor (0,1); lcd.print ("Distancia:"); lcd.print (distancia); lcd.print ("cm");
Después de cargar los códigos, es decir, el transmisor y el receptor en el STM32 y Arduino UNO respectivamente, los datos como el número y la distancia del objeto medidos con el STM32 se transmiten al receptor de RF a través del transmisor de RF y los valores recibidos se muestran en la pantalla LCD de forma inalámbrica.
Prueba de transmisor y receptor de RF basado en STM 32
1. Cuando el número está en 0 y la distancia del objeto es de 6 cm.
2. Cuando el número 47 y la distancia del objeto es de 3 cm.