- Componente necesare
- 433Mhz Modul de emițător și receptor RF)
- Schema de circuit a emițătorului RF cu STM32F103C8
- Schema circuitului receptorului RF cu Arduino Uno
- Programare STM32F103C8 pentru transmisie RF wireless
- Programarea Arduino UNO ca receptor RF
- Testarea emițătorului și receptorului RF bazat pe STM 32
Realizarea de proiecte wireless în electronică încorporată devine foarte importantă și utilă, deoarece nu există fire amestecate peste tot, ceea ce face ca dispozitivul să fie mai la îndemână și mai portabil. Există diverse tehnologii fără fir, cum ar fi Bluetooth, WiFi, RF (frecvență radio) de 433 MHz etc. Fiecare tehnologie are propriile sale avantaje și dezavantaje, cum ar fi transferul de cost, distanță sau distanță, viteză sau viteză etc. Astăzi vom folosi modulul RF cu STM32 pentru a trimite și primi datele fără fir. Dacă sunteți nou în microcontrolerul STM32, începeți cu LED-ul intermitent cu STM32 folosind Arduino IDE și verificați toate celelalte proiecte STM32 aici.
În afară de aceasta, am utilizat și modulul RF 433Mhz fără fir cu alte microcontrolere pentru a construi unele proiecte controlate fără fir, cum ar fi:
- Electrocasnice controlate RF
- LED-uri cu telecomandă RF folosind Raspberry Pi
- Robot controlat RF
- Interfațarea modulului RF cu Arduino
- Comunicarea PIC la PIC utilizând modulul RF
Aici vom interfața un modul fără fir RF de 433 MHz cu microcontroler STM32F103C8. Proiectul este împărțit în două părți. Transmițătorul va fi interfațat cu STM32, iar receptorul va fi interfațat cu Arduino UNO. Vor exista diferite schemă de circuit și schițe atât pentru transmiterea cât și pentru partea de recepție.
În acest tutorial, Transmițătorul RF trimite două valori către partea receptorului: distanța măsurată utilizând senzorul cu ultrasunete și valoarea potențometrului ADC (0 la 4096) care este mapată ca număr de la (0 la 100). Receptorul RF de Arduino primește atât valorile și imprimă aceste distanțe și numărul de valori în afișaj LCD 16x2 fără fir.
Componente necesare
- Microcontroler STM32F103C8
- Arduino UNO
- Transmițător și receptor RF de 433 MHz
- Senzor cu ultrasunete (HC-SR04)
- Afișaj LCD 16x2
- Potențiometru 10k
- Breadboard
- Conectarea firelor
433Mhz Modul de emițător și receptor RF)
Pinout transmițător RF:
Transmițător RF de 433 MHz |
Descrierea pinului |
FURNICĂ |
Pentru conectarea antenei |
GND |
GND |
VDD |
3,3 până la 5V |
DATE |
Datele care trebuie transmise către receptor sunt date aici |
Pinout receptor RF:
Receptor RF de 433 MHz |
UTILIZARE |
FURNICĂ |
Pentru conectarea antenei |
GND |
GND |
VDD |
3,3 până la 5V |
DATE |
Datele care urmează să fie primite de la emițător |
CE / DO |
Este, de asemenea, un pin de date |
Specificații modul 433 MHz:
- Tensiunea de funcționare a receptorului: 3V la 5V
- Tensiunea de funcționare a emițătorului: 3V la 5V
- Frecvența de funcționare: 433 MHz
- Distanță de transmisie: 3 metri (fără antenă) până la 100 de metri (maxim)
- Tehnica de modulare: ASK (tastare de amplitudine)
- Viteza de transmitere a datelor: 10Kbps
Schema de circuit a emițătorului RF cu STM32F103C8
Conexiuni de circuit între emițător RF și STM32F103C8:
STM32F103C8 |
Transmițător RF |
5V |
VDD |
GND |
GND |
PA10 |
DATE |
NC |
FURNICĂ |
Conexiuni de circuit între senzorul cu ultrasunete și STM32F103C8:
STM32F103C8 |
Senzor cu ultrasunete (HC-SR04) |
5V |
VCC |
PB1 |
Trig |
PB0 |
Ecou |
GND |
GND |
Un potențiometru de 10k este conectat cu STM32F103C8 pentru a furniza valoarea analogică de intrare (0 la 3,3V) pinului ADC PA0 al STM32.
Schema circuitului receptorului RF cu Arduino Uno
Conexiuni de circuit între receptorul RF și Arduino UNO:
Arduino UNO |
Receptor RF |
5V |
VDD |
GND |
GND |
11 |
DATE |
NC |
FURNICĂ |
Conexiuni de circuit între LCD 16x2 și Arduino UNO:
Numele pinului LCD |
Arduino UNO Pin Name |
Teren (Gnd) |
Teren (G) |
VCC |
5V |
VEE |
Pin din Centrul potențiometrului pentru contrast |
Selectare înregistrare (RS) |
2 |
Citire / Scriere (RW) |
Teren (G) |
Activați (EN) |
3 |
Bit de date 4 (DB4) |
4 |
Bit de date 5 (DB5) |
5 |
Bit de date 6 (DB6) |
6 |
Bit de date 7 (DB7) |
7 |
LED pozitiv |
5V |
LED negativ |
Teren (G) |
Codificarea va fi explicată pe scurt mai jos. Vor fi două părți ale schiței în care prima parte va fi secțiunea emițător și alta va fi secțiunea receptor. Toate fișierele de schițe și videoclipurile de lucru vor fi date la sfârșitul acestui tutorial. Pentru a afla mai multe despre interfața modulului RF cu Arduino Uno, urmați linkul.
Programare STM32F103C8 pentru transmisie RF wireless
STM32F103C8 poate fi programat folosind Arduino IDE. Nu este necesar un programator FTDI sau ST-Link pentru a încărca codul în STM32F103C8. Pur și simplu conectați-vă la computer prin portul USB al STM32 și începeți programarea cu ARDUINO IDE. Puteți învăța Programarea STM32 în Arduino IDE urmând linkul.
În secțiunea transmițătorului, distanța obiectului în „cm” este măsurată cu ajutorul senzorului cu ultrasunete și valoarea numărului de la (0 la 100) setată utilizând potențiometrul care este transmis prin transmițătorul RF interfațat cu STM32.
Mai întâi este inclusă biblioteca Radiohead, care poate fi descărcată de aici. Deoarece această bibliotecă folosește ASK (Amplitude Shift Keying Technique) pentru a transmite și primi date. Acest lucru face programarea foarte ușoară. Puteți include biblioteca în schiță accesând Sketch-> include library-> Add.zip library.
#include
Ca și în acest tutorial în partea transmițătorului, un senzor cu ultrasunete este utilizat pentru a măsura distanța, astfel încât să fie definite declanșatorul și ecoul.
#define trigPin PB1 #define echoPin PB0
Apoi numele obiectului pentru biblioteca RH_ASK este setat ca rf_driver cu parametrii precum viteza (2000), pinul RX (PA9) și pinul TX (PA10).
RH_ASK rf_driver (2000, PA9, PA10);
În continuare sunt declarate variabila Strings necesară în acest program.
String transmit_number; String transmit_distance; Transmiterea șirului;
Apoi în setarea nulă (), se inițializează obiectul pentru RH_ASK rf_driver.
rf_driver.init ();
După aceea, pinul de declanșare este setat ca pin OUTPUT și PA0 (conectat la potențiometru) și pinul ecou este setat ca pin INPUT. Comunicarea în serie începe cu o rată de transmisie de 9600.
Serial.begin (9600); pinMode (PA0, INPUT); pinMode (echoPin, INPUT); pinMode (trigPin, OUTPUT);
Apoi în bucla de gol (), în primul rând valoarea potențiometrului care este intrarea Tensiunea analogică este convertită în valoare digitală (se găsește valoarea ADC). Deoarece ADC-ul STM32 are o rezoluție de 12 biți. Deci, valoarea digitală variază de la (0 la 4096), care este mapată în (0 la 100).
int analoginput = analogRead (PA0); int pwmvalue = hartă (analoginput, 0,4095,0,100);
Apoi distanța este măsurată folosind senzorul cu ultrasunete prin setarea declanșatorului ridicat și scăzut cu o întârziere de 2 microsecunde.
digitalWrite (trigPin, LOW); delayMicroseconds (2); digitalWrite (trigPin, HIGH); delayMicroseconds (10); digitalWrite (trigPin, LOW);
Știftul de ecou detectează unda reflectată înapoi, adică durata în care unda declanșată este reflectată înapoi, este utilizată în calcularea distanței obiectului folosind formula. Aflați mai multe despre modul în care senzorul cu ultrasunete calculează distanța, urmând linkul.
lungă durată = pulseIn (echoPin, HIGH); distanta de plutire = durata * 0,034 / 2;
Acum, atât numărul de date cât și distanța măsurată sunt convertite în date șir și stocate în variabilele șir respective.
transmit_number = String (pwmvalue); transmit_distance = String (distanță);
Ambele șiruri sunt adăugate ca o singură linie și stocate într-un șir numit transmit și virgulă „,” este utilizată pentru a separa două șiruri.
transmite = transmite_pwm + "," + transmite_distanță;
Șirul de transmisie este convertit în matrice de caractere.
const char * msg = transmit.c_str ();
Datele sunt transmise și așteptați până când sunt trimise.
rf_driver.send ((uint8_t *) msg, strlen (msg)); rf_driver.waitPacketSent ();
Datele șirului trimise sunt afișate și în Monitorul serial.
Serial.println (msg);
Programarea Arduino UNO ca receptor RF
Arduino UNO este programat folosind Arduino IDE. În secțiunea receptor, datele transmise de la secțiunea emițător și primite de modulul receptorului RF și datele șirului primite sunt împărțite în date respective (distanță și număr) și afișate pe afișajul LCD 16x2.
Să vedem codul receptorului pe scurt:
La fel ca în secțiunea emițător, prima bibliotecă RadiohHead este inclusă. Deoarece această bibliotecă folosește ASK (Amplitude Shift Keying Technique) pentru a transmite și primi date. Acest lucru face programarea foarte ușoară.
#include
Deoarece ecranul LCD este utilizat aici, este inclusă și biblioteca cu cristale lichide.
#include
Și pinii de afișaj LCD de 16x2 conectați cu Arduino UNO sunt specificați și declarați utilizând lcd ca obiect.
LiquidCrystal lcd (2,3,4,5,6,7);
În continuare sunt declarate variabilele de date șir pentru a stoca date șir.
String str_receive; String str_number; String str_distance;
Obiectul pentru biblioteca Radiohead este declarat.
RH_ASK rf;
Acum, în setarea nulă (), Afișajul LCD este setat în modul 16x2 și un mesaj de întâmpinare este afișat și șters.
lcd.inceput (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print („RF cu STM32”); întârziere (5000); lcd.clear ();
După aceea, obiectul rf este inițializat.
rf.init ();
Acum, în bucla de gol (), buf-ul Array este declarat cu dimensiunea de 7. Deoarece datele trimise de la transmițător au 7, inclusiv „,”. Deci, schimbați acest lucru în funcție de datele care urmează să fie transmise.
uint8_t buf; uint8_t buflen = sizeof (buf);
Dacă șirul este disponibil la modulul receptor RF, funcția if verifică dimensiunea și se execută. Rf.recv () este utilizat pentru a primi date.
if (rf.recv (buf și buflen))
BUF are șirul recepționat astfel încât șir primit apoi este stocată într - un str_receive variabilă șir.
str_receive = String ((char *) buf);
Această buclă for este utilizată pentru a împărți șirul primit în două dacă detectează „,” între două șiruri.
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); pauză; }
Sunt declarate două matrice de caractere pentru două valori și șirul care este împărțit în două este stocat într-o matrice respectată prin conversia șirului în matrice de caractere.
șir de numere de caractere; char distancestring; str_distance.toCharArray (distancestring, 3); str_number.toCharArray (șir de numere, 3);
După aceea convertiți matricea de caractere în număr întreg folosind atoi ()
int distance = atoi (distancestring); int number = atoi (numberstring);
După convertirea în valori întregi, valorile distanței și numărului sunt afișate pe afișajul LCD 16x2
lcd.setCursor (0,0); lcd.print ("Număr:"); lcd.print (număr); lcd.setCursor (0,1); lcd.print ("Distanță:"); lcd.print (distanță); lcd.print ("cm");
După încărcarea atât a codurilor, respectiv a emițătorului, cât și a receptorului în STM32 și, respectiv, Arduino UNO, datele precum numărul și distanța obiectelor măsurate folosind STM32 sunt transmise receptorului RF prin intermediul transmițătorului RF, iar valorile primite sunt afișate fără fir pe ecranul LCD.
Testarea emițătorului și receptorului RF bazat pe STM 32
1. Când numărul la 0 și distanța obiectului este la 6cm.
2. Când numărul 47 și distanța obiectului sunt la 3cm.