- Componenti richiesti
- Modulo trasmettitore e ricevitore RF 433 Mhz)
- Schema del circuito del trasmettitore RF con STM32F103C8
- Schema del circuito del ricevitore RF con Arduino Uno
- Programmazione STM32F103C8 per trasmissione RF wireless
- Programmazione di Arduino UNO come ricevitore RF
- Test del trasmettitore e del ricevitore RF basati su STM 32
Realizzare progetti wireless nell'elettronica incorporata diventa molto importante e utile in quanto non ci sono cavi confusi dappertutto che rendono il dispositivo più maneggevole e portatile. Esistono varie tecnologie wireless come Bluetooth, WiFi, 433 MHz RF (radiofrequenza) ecc. Ogni tecnologia ha i suoi vantaggi e svantaggi come il costo, la distanza o il trasferimento di distanza, la velocità o il rendimento ecc. Oggi utilizzeremo il modulo RF con STM32 per inviare e ricevere i dati in modalità wireless. Se non conosci il microcontrollore STM32, inizia con il LED lampeggiante con STM32 utilizzando l'IDE di Arduino e controlla tutti gli altri progetti STM32 qui.
Oltre a questo, abbiamo anche utilizzato il modulo wireless RF 433Mhz con altri microcontrollori per costruire alcuni progetti controllati senza fili, come:
- Elettrodomestici a controllo RF
- LED telecomandati RF utilizzando Raspberry Pi
- Robot controllato da RF
- Interfacciamento del modulo RF con Arduino
- Comunicazione da PIC a PIC tramite modulo RF
Qui interfacciamo un modulo wireless RF a 433 MHz con il microcontrollore STM32F103C8. Il progetto è diviso in due parti. Il trasmettitore sarà interfacciato con STM32 e il ricevitore sarà interfacciato con Arduino UNO. Ci saranno diversi schemi circuitali e schizzi sia per la trasmissione che per la ricezione.
In questo tutorial, il trasmettitore RF invia due valori al lato del ricevitore: la distanza misurata utilizzando il sensore a ultrasuoni e il valore ADC del potenziometro (da 0 a 4096) che è mappato come numero da (0 a 100). Il ricevitore RF di Arduino riceve entrambi i valori e stampa quei valori di distanza e numero nel display LCD 16x2 in modalità wireless.
Componenti richiesti
- Microcontrollore STM32F103C8
- Arduino UNO
- Trasmettitore e ricevitore RF 433 Mhz
- Sensore a ultrasuoni (HC-SR04)
- Display LCD 16x2
- Potenziometro 10k
- Breadboard
- Collegamento dei cavi
Modulo trasmettitore e ricevitore RF 433 Mhz)
Pinout trasmettitore RF:
Trasmettitore RF 433 Mhz |
Descrizione pin |
FORMICA |
Per collegare l'antenna |
GND |
GND |
VDD |
Da 3,3 a 5 V. |
DATI |
I dati da trasmettere al ricevitore sono forniti qui |
Pinout ricevitore RF:
Ricevitore RF 433 Mhz |
USO |
FORMICA |
Per collegare l'antenna |
GND |
GND |
VDD |
Da 3,3 a 5 V. |
DATI |
Dati da ricevere dal trasmettitore |
CE / DO |
È anche un pin dati |
Specifiche del modulo 433 MHz:
- Tensione di funzionamento del ricevitore: da 3 V a 5 V.
- Tensione di funzionamento del trasmettitore: da 3 V a 5 V.
- Frequenza operativa: 433 MHz
- Distanza di trasmissione: da 3 metri (senza antenna) a 100 metri (massimo)
- Tecnica di modulazione: ASK (Amplitude shift keying)
- Velocità di trasmissione dati: 10 Kbps
Schema del circuito del trasmettitore RF con STM32F103C8
Collegamenti del circuito tra trasmettitore RF e STM32F103C8:
STM32F103C8 |
Trasmettitore RF |
5V |
VDD |
GND |
GND |
PA10 |
DATI |
NC |
FORMICA |
Collegamenti del circuito tra sensore a ultrasuoni e STM32F103C8:
STM32F103C8 |
Sensore a ultrasuoni (HC-SR04) |
5V |
VCC |
PB1 |
Trig |
PB0 |
Eco |
GND |
GND |
Un potenziometro da 10k è collegato all'STM32F103C8 per fornire un valore analogico di ingresso (da 0 a 3,3V) al pin ADC PA0 di STM32.
Schema del circuito del ricevitore RF con Arduino Uno
Collegamenti del circuito tra ricevitore RF e Arduino UNO:
Arduino UNO |
Ricevitore RF |
5V |
VDD |
GND |
GND |
11 |
DATI |
NC |
FORMICA |
Collegamenti del circuito tra LCD 16x2 e Arduino UNO:
Nome pin LCD |
Nome pin di Arduino UNO |
Terra (Gnd) |
Terra (G) |
VCC |
5V |
VEE |
Pin dal centro del potenziometro per il contrasto |
Seleziona registro (RS) |
2 |
Lettura / scrittura (RW) |
Terra (G) |
Abilita (EN) |
3 |
Bit di dati 4 (DB4) |
4 |
Bit di dati 5 (DB5) |
5 |
Bit di dati 6 (DB6) |
6 |
Bit di dati 7 (DB7) |
7 |
LED positivo |
5V |
LED negativo |
Terra (G) |
La codifica verrà spiegata brevemente di seguito. Ci saranno due parti dello schizzo in cui la prima parte sarà la sezione del trasmettitore e un'altra sarà la sezione del ricevitore. Tutti i file di schizzo e il video di lavoro verranno forniti alla fine di questo tutorial. Per saperne di più sull'interfacciamento del modulo RF con Arduino Uno, segui il link.
Programmazione STM32F103C8 per trasmissione RF wireless
STM32F103C8 può essere programmato utilizzando Arduino IDE. Non è necessario un programmatore FTDI o ST-Link per caricare il codice su STM32F103C8. Basta collegarsi al PC tramite la porta USB di STM32 e avviare la programmazione con ARDUINO IDE. Puoi imparare a programmare il tuo STM32 nell'IDE di Arduino seguendo il link.
Nella sezione trasmettitore la distanza dell'oggetto in 'cm' viene misurata tramite sensore ad ultrasuoni e il valore numerico da (0 a 100) impostato tramite potenziometro che viene trasmesso tramite trasmettitore RF interfacciato con STM32.
Per prima cosa è inclusa la libreria dei Radiohead, che può essere scaricata da qui. Poiché questa libreria utilizza ASK (Amplitude Shift Keying Technique) per trasmettere e ricevere dati. Questo rende la programmazione molto semplice. Puoi includere la libreria nello schizzo andando in Sketch-> includi libreria-> Aggiungi libreria.zip.
#includere
Come in questo tutorial, sul lato trasmettitore viene utilizzato un sensore a ultrasuoni per misurare la distanza in modo da definire i pin di attivazione e di eco.
#define trigPin PB1 #define echoPin PB0
Successivamente il nome dell'oggetto per la libreria RH_ASK è impostato come rf_driver con i parametri come velocità (2000), RX pin (PA9) e TX pin (PA10).
RH_ASK rf_driver (2000, PA9, PA10);
Successivamente vengono dichiarate le variabili Strings necessarie in questo programma.
String trasmissione_number; String trasmissione_distanza; Trasmissione di stringhe;
Successivamente, in void setup (), l'oggetto per RH_ASK rf_driver viene inizializzato.
rf_driver.init ();
Dopodiché il pin trigger viene impostato come pin OUTPUT e il pin PA0 (collegato al potenziometro) e il pin eco è impostato come pin INPUT. La comunicazione seriale inizia alla velocità di trasmissione di 9600.
Serial.begin (9600); pinMode (PA0, INPUT); pinMode (echoPin, INPUT); pinMode (trigPin, OUTPUT);
Successivamente, nel loop void (), prima il valore del potenziometro che è l'ingresso La tensione analogica viene convertito in valore digitale (viene trovato il valore ADC). Poiché l'ADC di STM32 ha una risoluzione a 12 bit. Quindi, il valore digitale varia da (0 a 4096) che è mappato in (da 0 a 100).
int analoginput = analogRead (PA0); int pwmvalue = map (analoginput, 0,4095,0,100);
Successivamente la distanza viene misurata utilizzando un sensore a ultrasuoni impostando il trigger alto e basso con un ritardo di 2 microsecondi.
digitalWrite (trigPin, LOW); delayMicroseconds (2); digitalWrite (trigPin, HIGH); delayMicroseconds (10); digitalWrite (trigPin, LOW);
Il perno dell'eco rileva l'onda riflessa, ovvero la durata del tempo in cui l'onda innescata viene riflessa viene utilizzata nel calcolo della distanza dell'oggetto utilizzando la formula. Ulteriori informazioni su come il sensore a ultrasuoni calcola la distanza, seguendo il collegamento.
lunga durata = pulseIn (echoPin, HIGH); distanza flottante = durata * 0,034 / 2;
Ora sia il numero di dati che la distanza misurata vengono convertiti in dati stringa e memorizzati nelle rispettive variabili stringa.
trasmissione_number = String (pwmvalue); trasmissione_distanza = Stringa (distanza);
Entrambe le stringhe vengono aggiunte come una riga e memorizzate nella stringa chiamata trasmissione e la virgola "," viene utilizzata per separare due stringhe.
trasmissione = trasmissione_pwm + "," + trasmissione_distanza;
La stringa di trasmissione viene convertita in un array di caratteri.
const char * msg = trasmissione.c_str ();
I dati vengono trasmessi e attendono finché non vengono inviati.
rf_driver.send ((uint8_t *) msg, strlen (msg)); rf_driver.waitPacketSent ();
I dati della stringa inviati vengono visualizzati anche nel monitor seriale.
Serial.println (msg);
Programmazione di Arduino UNO come ricevitore RF
Arduino UNO è programmato utilizzando l'IDE di Arduino. Nella sezione ricevitore i dati trasmessi dalla sezione trasmettitore e ricevuti dal modulo ricevitore RF e i dati della stringa ricevuti vengono suddivisi in rispettivi dati (distanza e numero) e visualizzati nel display LCD 16x2.
Vediamo in breve la codifica del ricevitore:
Come nella sezione trasmettitore prima è inclusa la libreria RadiohHead. Poiché questa libreria utilizza ASK (Amplitude Shift Keying Technique) per trasmettere e ricevere dati. Questo rende la programmazione molto semplice.
#includere
Poiché qui viene utilizzato il display LCD, è inclusa anche la libreria liquidcrystal.
#includere
E i pin del display LCD 16x2 collegati ad Arduino UNO sono specificati e dichiarati utilizzando lcd come oggetto.
LiquidCrystal lcd (2,3,4,5,6,7);
Successivamente vengono dichiarate le variabili di dati stringa per memorizzare i dati stringa.
String str_receive; String str_number; String str_distance;
L'oggetto per la libreria Radiohead viene dichiarato.
RH_ASK rf;
Ora nel setup void (), il display LCD è impostato in modalità 16x2 e viene visualizzato e cancellato un messaggio di benvenuto.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("RF con STM32"); ritardo (5000); lcd.clear ();
Dopodiché, l' oggetto rf viene inizializzato.
rf.init ();
Ora nel void loop (), il buf Array è dichiarato con dimensione 7. Poiché i dati inviati dal trasmettitore hanno 7 compreso il ",". Quindi, modificalo in base ai dati che devono essere trasmessi.
uint8_t buf; uint8_t buflen = sizeof (buf);
Se la stringa è disponibile nel modulo ricevitore rf, la funzione if controlla la dimensione e viene eseguita. Il rf.recv () viene utilizzato per ricevere i dati.
if (rf.recv (buf, & buflen))
Il buf ha la stringa ricevuta, quindi la stringa ricevuta viene memorizzata in una variabile stringa str_receive .
str_receive = String ((char *) buf);
Questo ciclo for viene utilizzato per dividere la stringa ricevuta in due se rileva il "," tra due stringhe.
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); rompere; }
Vengono dichiarati due array di caratteri per due valori e la stringa divisa in due viene archiviata in un array rispettato convertendo la stringa in un array di caratteri.
char numbertring; char distancestring; str_distance.toCharArray (distancestring, 3); str_number.toCharArray (numbertring, 3);
Dopodiché converti l'array di caratteri in numero intero usando atoi ()
int distanza = atoi (distancestring); int numero = atoi (stringa numerica);
Dopo la conversione in valori interi, i valori distanza e numero vengono visualizzati nel display LCD 16x2
lcd.setCursor (0,0); lcd.print ("Numero:"); lcd.print (numero); lcd.setCursor (0,1); lcd.print ("Distanza:"); lcd.print (distanza); lcd.print ("cm");
Dopo aver caricato entrambi i codici, ovvero trasmettitore e ricevitore, rispettivamente nell'STM32 e nell'Arduino UNO, i dati come il numero e la distanza dell'oggetto misurati utilizzando l'STM32 vengono trasmessi al ricevitore RF tramite il trasmettitore RF ei valori ricevuti vengono visualizzati nel display LCD in modalità wireless.
Test del trasmettitore e del ricevitore RF basati su STM 32
1. Quando il numero è 0 e la distanza dell'oggetto è 6 cm.
2. Quando il numero 47 e la distanza dell'oggetto è a 3 cm.