- Componenten vereist
- 433Mhz RF-zender- en ontvangermodule)
- Schakelschema van RF-zender met STM32F103C8
- Schakelschema van RF-ontvanger met Arduino Uno
- Programmering STM32F103C8 voor draadloze RF-transmissie
- Programmeren van Arduino UNO als RF-ontvanger
- Testen van op STM 32 gebaseerde RF-zender en ontvanger
Het maken van draadloze projecten in ingebedde elektronica wordt erg belangrijk en nuttig omdat er geen door elkaar gehusselde draden zijn, wat het apparaat handiger en draagbaarder maakt. Er zijn verschillende draadloze technologieën zoals Bluetooth, WiFi, 433 MHz RF (Radiofrequentie) enz. Elke technologie heeft zijn eigen voor- en nadelen zoals kosten, overdracht van afstand of bereik, snelheid of doorvoer enz. Vandaag zullen we RF-module gebruiken met STM32 om de gegevens draadloos te verzenden en te ontvangen. Als je nieuw bent bij STM32 Microcontroller, begin dan met Knipperende LED met STM32 met Arduino IDE en bekijk alle andere STM32-projecten hier.
Afgezien hiervan hebben we ook de RF 433Mhz Wireless Module gebruikt met andere microcontrollers om een aantal draadloos bestuurde projecten te bouwen, zoals:
- RF-gestuurde huishoudelijke apparaten
- RF-afstandsbediende LED's met Raspberry Pi
- RF-gestuurde robot
- Koppeling van RF-module met Arduino
- PIC naar PIC-communicatie met behulp van RF-module
Hier zullen we een 433 MHz RF draadloze module verbinden met STM32F103C8 microcontroller. Het project is opgedeeld in twee delen. De zender zal worden gekoppeld aan STM32 en de ontvanger zal worden gekoppeld aan Arduino UNO. Er zullen verschillende schakelschema's en schetsen zijn voor zowel het verzendende als het ontvangende gedeelte.
In deze tutorial verzendt de RF-zender twee waarden naar de ontvangerzijde: de afstand gemeten met behulp van een ultrasone sensor en de potentiometer ADC-waarde (0 tot 4096) die wordt toegewezen als een getal van (0 tot 100). De RF-ontvanger van Arduino ontvangt zowel de waarden en print die afstands- en getalswaarden draadloos in een 16x2 LCD-display.
Componenten vereist
- STM32F103C8 Microcontroller
- Arduino UNO
- 433Mhz RF-zender en -ontvanger
- Ultrasone sensor (HC-SR04)
- 16x2 LCD-scherm
- 10k Potentiometer
- Breadboard
- Verbindingsdraden
433Mhz RF-zender- en ontvangermodule)
RF-zender Pinout:
433Mhz RF-zender |
Pin Beschrijving |
MIER |
Voor het aansluiten van antenne |
GND |
GND |
VDD |
3.3 tot 5V |
GEGEVENS |
De gegevens die naar de ontvanger moeten worden verzonden, worden hier gegeven |
Pinout RF-ontvanger:
433Mhz RF-ontvanger |
GEBRUIK |
MIER |
Voor het aansluiten van antenne |
GND |
GND |
VDD |
3.3 tot 5V |
GEGEVENS |
Gegevens die van de zender moeten worden ontvangen |
CE / DO |
Het is ook een datapin |
433 MHz Module Specificaties:
- Bedrijfsspanning ontvanger: 3V tot 5V
- Bedrijfsspanning zender: 3V tot 5V
- Bedrijfsfrequentie: 433 MHz
- Transmissieafstand: 3 meter (zonder antenne) tot 100 meter (maximum)
- Modulatietechniek: ASK (Amplitude shift keying)
- Gegevensoverdrachtsnelheid: 10 Kbps
Schakelschema van RF-zender met STM32F103C8
Circuitverbindingen tussen RF-zender en STM32F103C8:
STM32F103C8 |
RF-zender |
5V |
VDD |
GND |
GND |
PA10 |
GEGEVENS |
NC |
MIER |
Circuitverbindingen tussen ultrasone sensor en STM32F103C8:
STM32F103C8 |
Ultrasone sensor (HC-SR04) |
5V |
VCC |
PB1 |
Trig |
PB0 |
Echo |
GND |
GND |
Een 10k-potentiometer is verbonden met de STM32F103C8 om analoge ingangswaarde (0 tot 3,3V) te leveren aan de ADC-pin PA0 van STM32.
Schakelschema van RF-ontvanger met Arduino Uno
Circuitverbindingen tussen RF-ontvanger en Arduino UNO:
Arduino UNO |
RF-ontvanger |
5V |
VDD |
GND |
GND |
11 |
GEGEVENS |
NC |
MIER |
Circuitverbindingen tussen 16x2 LCD & Arduino UNO:
Naam LCD-pincode |
Arduino UNO Pin-naam |
Grond (Gnd) |
Aarde (G) |
VCC |
5V |
VEE |
Pin van midden van potentiometer voor contrast |
Registreren Select (RS) |
2 |
Lezen / schrijven (RW) |
Aarde (G) |
Inschakelen (EN) |
3 |
Gegevensbit 4 (DB4) |
4 |
Gegevensbit 5 (DB5) |
5 |
Gegevensbit 6 (DB6) |
6 |
Gegevensbit 7 (DB7) |
7 |
LED Positief |
5V |
LED negatief |
Aarde (G) |
De codering wordt hieronder kort toegelicht. Er zullen twee delen van de schets zijn waarbij het eerste deel een zendergedeelte zal zijn en een ander deel een ontvangergedeelte. Alle schetsbestanden en werkvideo worden aan het einde van deze tutorial gegeven. Volg de link voor meer informatie over het koppelen van een RF-module met Arduino Uno.
Programmering STM32F103C8 voor draadloze RF-transmissie
STM32F103C8 kan worden geprogrammeerd met Arduino IDE. Een FTDI-programmeur of ST-Link is niet nodig om de code naar STM32F103C8 te uploaden. Maak eenvoudig verbinding met de pc via de USB-poort van STM32 en begin met programmeren met ARDUINO IDE. U kunt leren uw STM32 programmeren in Arduino IDE door de link te volgen.
In het zendgedeelte wordt de afstand van het object in 'cm' gemeten met behulp van een ultrasone sensor en de getalswaarde van (0 tot 100) ingesteld met een potentiometer die wordt verzonden via een RF-zender die is gekoppeld aan STM32.
Eerst is de Radiohead-bibliotheek inbegrepen, deze kan hier worden gedownload. Omdat deze bibliotheek de ASK (Amplitude Shift Keying Technique) gebruikt om gegevens te verzenden en ontvangen. Dit maakt het programmeren erg gemakkelijk. U kunt een bibliotheek in de schets opnemen door naar Sketch-> bibliotheek opnemen->.zip-bibliotheek toevoegen te gaan.
# omvatten
Net als in deze tutorial wordt aan de zenderzijde een ultrasone sensor gebruikt om de afstand te meten, zodat de trigger- en echopinnen worden gedefinieerd.
#define trigPin PB1 #define echoPin PB0
Vervolgens wordt de objectnaam voor de RH_ASK-bibliotheek ingesteld als rf_driver met de parameters zoals snelheid (2000), RX-pin (PA9) en TX-pin (PA10).
RH_ASK rf_driver (2000, PA9, PA10);
Vervolgens wordt de Strings-variabele die nodig is in dit programma gedeclareerd.
String transmit_number; String transmit_distance; String verzenden;
Vervolgens wordt in de void setup () het object voor RH_ASK rf_driver geïnitialiseerd.
rf_driver.init ();
Daarna wordt de triggerpin ingesteld als OUTPUT-pin en wordt de PA0 (verbonden met potentiometer) en echo-pin ingesteld als INPUT-pin. Seriële communicatie begint met een baudrate van 9600.
Serial.begin (9600); pinMode (PA0, INPUT); pinMode (echoPin, INPUT); pinMode (trigPin, OUTPUT);
Vervolgens in de lege lus (), eerst de potentiometerwaarde die de ingang is Analoge spanning wordt omgezet in digitale waarde (ADC-waarde wordt gevonden). Omdat de ADC van STM32 een 12-bits resolutie heeft. De digitale waarde varieert dus van (0 tot 4096) die wordt toegewezen aan (0 tot 100).
int analoginput = analogRead (PA0); int pwmvalue = map (analoginput, 0,4095,0,100);
Vervolgens wordt de afstand gemeten met een ultrasone sensor door de trigger hoog en laag in te stellen met een vertraging van 2 microseconden.
digitalWrite (trigPin, LOW); delayMicroseconds (2); digitalWrite (trigPin, HIGH); delayMicroseconds (10); digitalWrite (trigPin, LOW);
De echopin neemt de gereflecteerde golf terug, dat wil zeggen de tijdsduur dat de getriggerde golf terug wordt gereflecteerd, wordt gebruikt bij het berekenen van de afstand van het object met behulp van de formule. Lees meer over hoe de ultrasone sensor de afstand berekent door de link te volgen.
lange duur = pulseIn (echoPin, HIGH); zweefafstand = duur * 0,034 / 2;
Nu worden zowel het datanummer als de gemeten afstand omgezet in stringdata en opgeslagen in respectievelijke stringvariabelen.
transmit_number = String (pwmvalue); transmit_distance = String (afstand);
Zowel de string wordt als één regel toegevoegd en opgeslagen in de string genaamd transmit en komma "," wordt gebruikt om twee strings te scheiden.
transmit = transmit_pwm + "," + transmit_distance;
De verzonden reeks wordt omgezet in een tekenreeks.
const char * msg = transmit.c_str ();
De gegevens worden verzonden en wachten tot ze zijn verzonden.
rf_driver.send ((uint8_t *) msg, strlen (msg)); rf_driver.waitPacketSent ();
De verzonden stringgegevens worden ook weergegeven in de seriële monitor.
Serial.println (msg);
Programmeren van Arduino UNO als RF-ontvanger
Arduino UNO wordt geprogrammeerd met behulp van de Arduino IDE. In het ontvangergedeelte worden de gegevens die worden verzonden vanuit het zendgedeelte en ontvangen door de RF-ontvangermodule en de ontvangen stringgegevens opgesplitst in respectievelijke gegevens (afstand en nummer) en weergegeven op het 16x2 LCD-scherm.
Laten we de codering van de ontvanger in het kort bekijken:
Net als in de zendersectie is eerst de RadiohHead-bibliotheek opgenomen. Omdat deze bibliotheek de ASK (Amplitude Shift Keying Technique) gebruikt om gegevens te verzenden en ontvangen. Dit maakt het programmeren erg gemakkelijk.
# omvatten
Omdat hier een LCD-display wordt gebruikt, is de liquidcrystal-bibliotheek ook inbegrepen.
# omvatten
En de 16x2 LCD-schermpinnen die zijn verbonden met Arduino UNO worden gespecificeerd en verklaard met lcd als object.
LiquidCrystal lcd (2,3,4,5,6,7);
Vervolgens worden de String-gegevensvariabelen om stringgegevens op te slaan gedeclareerd.
String str_receive; String str_number; String str_distance;
Het object voor de Radiohead-bibliotheek is gedeclareerd.
RH_ASK rf;
Nu in de leegte-instelling (), is het LCD-scherm ingesteld op 16x2-modus en wordt een welkomstbericht weergegeven en gewist.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("RF met STM32"); vertraging (5000); lcd.clear ();
Daarna wordt het rf- object geïnitialiseerd.
rf.init ();
Nu in de lege lus (), wordt de Array buf gedeclareerd met grootte als 7. Omdat de gegevens die vanaf de zender worden verzonden 7 hebben inclusief de ",". Wijzig dit dus volgens de gegevens die moeten worden verzonden.
uint8_t buf; uint8_t buflen = sizeof (buf);
Als de string beschikbaar is op de rf-ontvangermodule, controleert de if-functie de grootte en wordt deze uitgevoerd. De rf.recv () wordt gebruikt om gegevens te ontvangen.
if (rf.recv (buf, & buflen))
De buf heeft de ontvangen string, dus de ontvangen string wordt opgeslagen in een str_receive string variabele.
str_receive = String ((char *) buf);
Deze for- lus wordt gebruikt om de ontvangen string in tweeën te splitsen als het de ',' tussen twee strings detecteert.
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); breken; }
Twee char-arrays voor twee waarden worden gedeclareerd en de string die in tweeën is gesplitst, wordt opgeslagen in de respectieve array door string om te zetten in character-array.
char numberstring; char distancestring; str_distance.toCharArray (distancestring, 3); str_number.toCharArray (numberstring; 3);
Zet daarna de tekenreeks om in een geheel getal met atoi ()
int afstand = atoi (distancestring); int number = atoi (numberstring);
Na het omzetten in gehele getallen worden de waarden afstand en getal weergegeven in een 16x2 LCD-display
lcd.setCursor (0,0); lcd.print ("Nummer:"); lcd.print (nummer); lcd.setCursor (0,1); lcd.print ("Afstand:"); lcd.print (afstand); lcd.print ("cm");
Na het uploaden van beide codes, dwz zender en ontvanger in respectievelijk de STM32 en Arduino UNO, worden de gegevens zoals het aantal en de objectafstand gemeten met de STM32 via de RF-zender naar de RF-ontvanger verzonden en worden de ontvangen waarden draadloos op het LCD-scherm weergegeven.
Testen van op STM 32 gebaseerde RF-zender en ontvanger
1. Als het nummer op 0 staat en de afstand tot het object 6 cm is.
2. Wanneer nummer 47 en de afstand van het object 3 cm is.