- Komponenter krävs
- 433Mhz RF-sändare och mottagarmodul)
- Kretsschema för RF-sändare med STM32F103C8
- Kretsschema för RF-mottagare med Arduino Uno
- Programmering STM32F103C8 för trådlös RF-sändning
- Programmerar Arduino UNO som RF-mottagare
- Testar STM 32-baserad RF-sändare och mottagare
Att göra trådlösa projekt i inbäddad elektronik blir väldigt viktigt och användbart eftersom det inte finns några virvlar överallt som gör enheten mer praktisk och bärbar. Det finns olika trådlösa tekniker som Bluetooth, WiFi, 433 MHz RF (Radio Frequency) etc. Varje teknik har sina egna fördelar och nackdelar som kostnad, distans- eller områdesöverföring, hastighet eller genomströmning etc. Idag kommer vi att använda RF-modul med STM32 för att skicka och ta emot data trådlöst. Om du är ny på STM32 Microcontroller, börja med att blinka LED med STM32 med Arduino IDE och kontrollera alla andra STM32-projekt här.
Bortsett från detta har vi också använt RF 433Mhz Wireless Module med andra mikrokontroller för att bygga några trådlösa kontrollerade projekt, till exempel:
- RF-kontrollerade hushållsapparater
- RF-fjärrstyrda lysdioder med Raspberry Pi
- RF-kontrollerad robot
- Gränssnitts RF-modul med Arduino
- PIC till PIC-kommunikation med RF-modul
Här kommer vi att ansluta en 433MHz RF trådlös modul med STM32F103C8 mikrokontroller. Projektet är uppdelat i två delar. Den Sändaren kommer att samverka med STM32 och mottagaren kommer att samverka med Arduino UNO. Det kommer att finnas olika kretsscheman och skisser för både sändande och mottagande del.
I den här självstudien skickar RF-sändaren två värden till mottagarsidan: avståndet uppmätt med ultraljudssensor och potentiometern ADC-värde (0 till 4096) som mappas som nummer från (0 till 100). Den RF-mottagaren av Arduino emot både värderingar och utskrifter de avstånd och antal värden i 16x2 LCD-skärm trådlöst.
Komponenter krävs
- STM32F103C8 Microcontroller
- Arduino UNO
- 433Mhz RF-sändare och mottagare
- Ultraljudsensor (HC-SR04)
- 16x2 LCD-skärm
- 10k potentiometer
- Bakbord
- Anslutande ledningar
433Mhz RF-sändare och mottagarmodul)
RF-sändarens pinout:
433Mhz RF-sändare |
Stiftbeskrivning |
MYRA |
För anslutning av antenn |
GND |
GND |
VDD |
3,3 till 5V |
DATA |
Data som ska överföras till mottagaren ges här |
RF-mottagare Pinout:
433Mhz RF-mottagare |
ANVÄNDA SIG AV |
MYRA |
För anslutning av antenn |
GND |
GND |
VDD |
3,3 till 5V |
DATA |
Uppgifter som ska tas emot från sändaren |
CE / DO |
Det är också en datapinne |
433 MHz modulspecifikationer:
- Mottagarens driftspänning: 3V till 5V
- Sändarens driftspänning: 3V till 5V
- Arbetsfrekvens: 433 MHz
- Sändningsavstånd: 3 meter (utan antenn) till 100 meter (maximalt)
- Moduleringsteknik: ASK (Amplitude shift keying)
- Dataöverföringshastighet: 10 Kbps
Kretsschema för RF-sändare med STM32F103C8
Kretsanslutningar mellan RF-sändare och STM32F103C8:
STM32F103C8 |
RF-sändare |
5V |
VDD |
GND |
GND |
PA10 |
DATA |
NC |
MYRA |
Kretsanslutningar mellan ultraljudssensor och STM32F103C8:
STM32F103C8 |
Ultraljudsensor (HC-SR04) |
5V |
VCC |
PB1 |
Trig |
PB0 |
Eko |
GND |
GND |
En 10k potentiometer är ansluten till STM32F103C8 för att ge ingångens analoga värde (0 till 3,3V) till ADC-stiftet PA0 på STM32.
Kretsschema för RF-mottagare med Arduino Uno
Kretsförbindelser mellan RF-mottagare och Arduino UNO:
Arduino UNO |
RF-mottagare |
5V |
VDD |
GND |
GND |
11 |
DATA |
NC |
MYRA |
Kretsförbindelser mellan 16x2 LCD och Arduino UNO:
LCD-stiftnamn |
Arduino UNO PIN-namn |
Mark (GND) |
Mark (G) |
VCC |
5V |
VEE |
Stift från Center of Potentiometer för kontrast |
Registrera Välj (RS) |
2 |
Läs / skriv (RW) |
Mark (G) |
Aktivera (EN) |
3 |
Databit 4 (DB4) |
4 |
Databit 5 (DB5) |
5 |
Databit 6 (DB6) |
6 |
Databit 7 (DB7) |
7 |
LED-positiv |
5V |
LED Negativ |
Mark (G) |
Kodningen kommer att förklaras i korthet nedan. Det kommer att finnas två delar av skissen där den första delen kommer att vara sändaravsnitt och en annan kommer att vara mottagaravsnitt. Alla skissfiler och arbetsvideo kommer att ges i slutet av denna handledning. För att lära dig mer om gränssnitt mellan RF-modul och Arduino Uno, följ länken.
Programmering STM32F103C8 för trådlös RF-sändning
STM32F103C8 kan programmeras med Arduino IDE. En FTDI-programmerare eller ST-Link behövs inte för att ladda upp koden till STM32F103C8. Anslut bara till PC via USB-porten på STM32 och börja programmera med ARDUINO IDE. Du kan lära dig att programmera din STM32 i Arduino IDE genom att följa länken.
I sändarsektionen mäts objektets avstånd i 'cm' med ultraljudssensor och talvärdet från (0 till 100) ställs in med potentiometer som sänds via RF-sändare som är gränssnitt med STM32.
Först ingår Radiohead-biblioteket, det kan laddas ner härifrån. Eftersom detta bibliotek använder ASK (Amplitude Shift Keying Technique) för att sända och ta emot data. Detta gör programmeringen väldigt enkel. Du kan inkludera bibliotek i skiss genom att gå in i Skiss-> inkludera bibliotek-> Lägg till.zip-bibliotek.
#omfatta
Som i denna handledning på sändarsidan används en ultraljudssensor för att mäta avståndet så att avtryckaren och ekostiften definieras.
#define trigPin PB1 #define echoPin PB0
Därefter ställs objektnamnet för RH_ASK-biblioteket in som rf_driver med parametrar som hastighet (2000), RX-stift (PA9) och TX-stift (PA10).
RH_ASK rf_driver (2000, PA9, PA10);
Därefter deklareras strängvariabeln som behövs i detta program.
Sträng överför_nummer; Strängöverföringsavstånd; Strängöverföring;
Nästa i tomrumsinställningen () initialiseras objektet för RH_ASK rf_driver.
rf_driver.init ();
Därefter ställs utlösarstiftet in som OUTPUT-stift och PA0 (ansluten till potentiometer) och ekostiftet är inställt som INPUT-stift. Seriekommunikation börjar med överföringshastighet 9600.
Serial.begin (9600); pinMode (PA0, INPUT); pinMode (echoPin, INPUT); pinMode (trigPin, OUTPUT);
Nästa i tomrumsslingan (), först potentiometervärdet som är ingången Analog spänning omvandlas till digitalt värde (ADC-värde hittas). Eftersom ADC för STM32 har 12-bitars upplösning. Så det digitala värdet varierar från (0 till 4096) som mappas till (0 till 100).
int analoginput = analogRead (PA0); int pwmvalue = karta (analog ingång, 0,4095,0,100);
Därefter mäts avståndet med ultraljudssensor genom att sätta avtryckaren högt och lågt med en fördröjning på 2 mikrosekunder.
digitalWrite (trigPin, LOW); delayMicroseconds (2); digitalWrite (trigPin, HIGH); delayMicroseconds (10); digitalWrite (trigPin, LOW);
Ekotappen känner av den reflekterade vågen tillbaka, det vill säga den tidslängd som utlöst våg reflekteras tillbaka används för att beräkna avståndet för objektet med formeln. Läs mer om hur ultraljudssensorn beräknar avstånd genom att följa länken.
lång varaktighet = pulseIn (echoPin, HIGH); flytavstånd = varaktighet * 0,034 / 2;
Nu konverteras både datanumret och det uppmätta avståndet till strängdata och lagras i respektive strängvariabler.
transmit_number = Sträng (pwmvärde); transmit_distance = Sträng (avstånd);
Både strängen läggs till som en rad och lagras i sträng som kallas sänd och kommatecken "," används för att separera två strängar.
sänd = sänd_pwm + "," + sändningsavstånd;
Sändsträngen omvandlas till teckenuppsättning.
const char * msg = transmit.c_str ();
Uppgifterna överförs och vänta tills de skickas.
rf_driver.send ((uint8_t *) msg, strlen (msg)); rf_driver.waitPacketSent ();
Strängdata som skickas visas också i Serial Monitor.
Serial.println (msg);
Programmerar Arduino UNO som RF-mottagare
Arduino UNO är programmerad med hjälp av Arduino IDE. I mottagaravsnittet delas data som sänds från sändarsektionen och tas emot av RF-mottagarmodulen och den mottagna strängdata i respektive data (avstånd och nummer) och visas på 16x2 LCD-skärmen.
Låt oss se mottagarens kodning i korthet:
Precis som i sändarsektionen ingår RadiohHead-biblioteket. Eftersom detta bibliotek använder ASK (Amplitude Shift Keying Technique) för att sända och ta emot data. Detta gör programmeringen väldigt enkel.
#omfatta
Eftersom LCD-skärm används här så ingår också liquidcrystal-biblioteket.
#omfatta
Och 16x2 LCD-skärmstift som är anslutna till Arduino UNO specificeras och förklaras med LCD som objekt.
LiquidCrystal lcd (2,3,4,5,6,7);
Därefter deklareras strängdatavariablerna för att lagra strängdata.
Sträng str_receive; Sträng str_nummer; Sträng str_distance;
Objektet för Radiohead-biblioteket deklareras.
RH_ASK rf;
Nu i tomrumsinställningen () är LCD-skärmen inställd i 16x2-läge och ett välkomstmeddelande visas och rensas.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("RF med STM32"); fördröjning (5000); lcd.clear ();
Därefter initialiseras rf- objektet.
rf.init ();
Nu i tomrummet () förklaras Array-buf med storlek som 7. Eftersom data som skickas från sändaren har 7 inklusive ",". Så ändra detta enligt de data som ska överföras.
uint8_t buf; uint8_t buflen = sizeof (buf);
Om strängen är tillgänglig på rf-mottagarmodulen kontrollerar if-funktionen storleken och den körs. Den rf.recv () används för att ta emot data.
if (rf.recv (buf, & buflen))
Den buf har den mottagna strängen så då fick sträng lagras i en str_receive strängvariabel.
str_receive = String ((char *) buf);
Detta för loop används för att dela den mottagna strängen i två om den upptäcker '', '' mellan två strängar.
för (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); ha sönder; }
Två teckenarrayer för två värden deklareras och strängen som delas i två lagras i respekterad matris genom att konvertera sträng till teckenmatris.
char nummersträng; röding distancestring; str_distance.toCharArray (distancestring, 3); str_number.toCharArray (nummersträng, 3);
Därefter konverterar teckenuppsättningen till heltal med atoi ()
int avstånd = atoi (distancestring); int antal = atoi (nummersträng);
Efter konvertering till heltal visas värdena avstånd och antal i 16x2 LCD-display
lcd.setCursor (0,0); lcd.print ("Number:"); lcd.print (nummer); lcd.setCursor (0,1); lcd.print ("Distance:"); lcd.print (avstånd); lcd.print ("cm");
Efter att ha laddat upp både koder, dvs sändare och mottagare i STM32 respektive Arduino UNO, överförs data som antal och objektavstånd uppmätt med STM32 till RF-mottagaren via RF-sändare och de mottagna värdena visas trådlöst på LCD-skärmen.
Testar STM 32-baserad RF-sändare och mottagare
1. När siffran är 0 och objektets avstånd är 6 cm.
2. När nummer 47 och objektets avstånd är 3 cm.