- Erforderliche Komponenten
- 433 MHz HF-Sender- und Empfängermodul)
- Schaltplan des HF-Senders mit STM32F103C8
- Schaltplan des HF-Empfängers mit Arduino Uno
- Programmierung STM32F103C8 für die drahtlose HF-Übertragung
- Programmierung von Arduino UNO als HF-Empfänger
- Testen von STM 32-basierten HF-Sendern und -Empfängern
Das Erstellen von drahtlosen Projekten in eingebetteter Elektronik wird sehr wichtig und hilfreich, da keine durcheinandergebrachten Kabel vorhanden sind, wodurch das Gerät handlicher und tragbarer wird. Es gibt verschiedene drahtlose Technologien wie Bluetooth, WiFi, 433 MHz RF (Hochfrequenz) usw. Jede Technologie hat ihre eigenen Vor- und Nachteile wie Kosten, Entfernungs- oder Entfernungsübertragung, Geschwindigkeit oder Durchsatz usw. Heute werden wir RF-Module mit STM32 verwenden um die Daten drahtlos zu senden und zu empfangen. Wenn Sie mit STM32 Microcontroller noch nicht vertraut sind, beginnen Sie mit dem Blinken der LED mit STM32 mithilfe der Arduino IDE und überprüfen Sie alle anderen STM32-Projekte hier.
Abgesehen davon haben wir auch das RF 433Mhz Wireless Module mit anderen Mikrocontrollern verwendet, um einige drahtlos gesteuerte Projekte zu erstellen, wie zum Beispiel:
- HF-gesteuerte Haushaltsgeräte
- HF-ferngesteuerte LEDs mit Raspberry Pi
- HF-gesteuerter Roboter
- RF-Modul mit Arduino verbinden
- PIC-zu-PIC-Kommunikation mit dem RF-Modul
Hier werden wir ein 433-MHz-HF-Funkmodul mit dem STM32F103C8-Mikrocontroller verbinden. Das Projekt ist in zwei Teile gegliedert. Der Sender wird mit STM32 und der Empfänger mit Arduino UNO verbunden. Es wird unterschiedliche Schaltpläne und Skizzen sowohl für den sendenden als auch für den empfangenden Teil geben.
In diesem Lernprogramm sendet der HF-Sender zwei Werte an die Empfängerseite: die mit dem Ultraschallsensor gemessene Entfernung und den ADC-Wert des Potentiometers (0 bis 4096), der als Zahl von (0 bis 100) abgebildet wird. Der HF-Empfänger von Arduino empfängt beide Werte und druckt diese Entfernungs- und Zahlenwerte drahtlos auf dem 16x2-LCD-Display aus.
Erforderliche Komponenten
- STM32F103C8 Mikrocontroller
- Arduino UNO
- 433 MHz HF-Sender und -Empfänger
- Ultraschallsensor (HC-SR04)
- 16x2 LCD-Anzeige
- 10k Potentiometer
- Steckbrett
- Kabel anschließen
433 MHz HF-Sender- und Empfängermodul)
Pinbelegung des HF-Senders:
433 MHz HF-Sender |
Pin Beschreibung |
AMEISE |
Zum Anschließen der Antenne |
GND |
GND |
VDD |
3,3 bis 5V |
DATEN |
Hier werden die an den Empfänger zu übertragenden Daten angegeben |
Pinbelegung des HF-Empfängers:
433 MHz HF-Empfänger |
VERWENDEN |
AMEISE |
Zum Anschließen der Antenne |
GND |
GND |
VDD |
3,3 bis 5V |
DATEN |
Vom Sender zu empfangende Daten |
CE / DO |
Es ist auch ein Daten-Pin |
433 MHz Modulspezifikationen:
- Betriebsspannung des Empfängers: 3V bis 5V
- Betriebsspannung des Senders: 3V bis 5V
- Betriebsfrequenz: 433 MHz
- Übertragungsentfernung: 3 Meter (ohne Antenne) bis 100 Meter (maximal)
- Modulationstechnik: ASK (Amplitude Shift Keying)
- Datenübertragungsgeschwindigkeit: 10 Kbit / s
Schaltplan des HF-Senders mit STM32F103C8
Schaltungsverbindungen zwischen HF-Sender und STM32F103C8:
STM32F103C8 |
HF-Sender |
5V |
VDD |
GND |
GND |
PA10 |
DATEN |
NC |
AMEISE |
Stromkreisverbindungen zwischen Ultraschallsensor und STM32F103C8:
STM32F103C8 |
Ultraschallsensor (HC-SR04) |
5V |
VCC |
PB1 |
Trig |
PB0 |
Echo |
GND |
GND |
Ein 10k-Potentiometer ist mit dem STM32F103C8 verbunden, um den ADC-Pin PA0 des STM32 mit einem analogen Eingangswert (0 bis 3,3 V) zu versorgen.
Schaltplan des HF-Empfängers mit Arduino Uno
Schaltungsverbindungen zwischen HF-Empfänger und Arduino UNO:
Arduino UNO |
RF-Empfänger |
5V |
VDD |
GND |
GND |
11 |
DATEN |
NC |
AMEISE |
Schaltungsverbindungen zwischen 16x2 LCD und Arduino UNO:
LCD-Pin-Name |
Arduino UNO Pin Name |
Boden (Gnd) |
Boden (G) |
VCC |
5V |
VEE |
Pin von der Mitte des Potentiometers für Kontrast |
Register Select (RS) |
2 |
Lesen / Schreiben (RW) |
Boden (G) |
Aktivieren (EN) |
3 |
Datenbit 4 (DB4) |
4 |
Datenbit 5 (DB5) |
5 |
Datenbit 6 (DB6) |
6 |
Datenbit 7 (DB7) |
7 |
LED positiv |
5V |
LED negativ |
Boden (G) |
Die Codierung wird nachstehend kurz erläutert. Es wird zwei Teile der Skizze geben, wobei der erste Teil der Senderabschnitt und der andere der Empfängerabschnitt sein wird. Alle Skizzendateien und Arbeitsvideos finden Sie am Ende dieses Tutorials. Um mehr über die Schnittstelle des RF-Moduls mit Arduino Uno zu erfahren, folgen Sie dem Link.
Programmierung STM32F103C8 für die drahtlose HF-Übertragung
STM32F103C8 kann mit Arduino IDE programmiert werden. Ein FTDI-Programmierer oder ST-Link wird nicht benötigt, um den Code auf STM32F103C8 hochzuladen. Schließen Sie einfach den PC über den USB-Anschluss des STM32 an und starten Sie die Programmierung mit der ARDUINO IDE. Sie können lernen, wie Sie Ihren STM32 in Arduino IDE programmieren, indem Sie dem Link folgen.
Im Senderbereich wird die Entfernung des Objekts in 'cm' mit einem Ultraschallsensor gemessen und der Zahlenwert von (0 bis 100) mit einem Potentiometer eingestellt, das über einen mit STM32 verbundenen HF-Sender übertragen wird.
Zunächst ist die Radiohead-Bibliothek enthalten, die Sie hier herunterladen können. Da diese Bibliothek die ASK (Amplitude Shift Keying Technique) zum Senden und Empfangen von Daten verwendet. Dies macht die Programmierung sehr einfach. Sie können die Bibliothek in die Skizze aufnehmen, indem Sie unter Skizze-> Bibliothek einschließen-> ZIP-Bibliothek hinzufügen gehen.
#einschließen
Wie in diesem Tutorial auf der Senderseite wird ein Ultraschallsensor verwendet, um die Entfernung zu messen, sodass die Trigger- und Echostifte definiert werden.
#define trigPin PB1 #define echoPin PB0
Als nächstes wird der Objektname für die RH_ASK-Bibliothek als rf_driver mit den Parametern Geschwindigkeit (2000), RX-Pin (PA9) und TX-Pin (PA10) festgelegt.
RH_ASK rf_driver (2000, PA9, PA10);
Als nächstes wird die in diesem Programm benötigte Strings-Variable deklariert.
String send_number; String send_distance; String übertragen;
Als nächstes wird im void setup () das Objekt für RH_ASK rf_driver initialisiert.
rf_driver.init ();
Danach wird der Trigger-Pin als OUTPUT-Pin und der PA0 (mit Potentiometer verbunden) und der Echo-Pin als INPUT-Pin gesetzt. Die serielle Kommunikation beginnt mit einer Baudrate von 9600.
Serial.begin (9600); PinMode (PA0, INPUT); pinMode (echoPin, INPUT); pinMode (trigPin, OUTPUT);
Als nächstes wird in der Hohlraumschleife () zuerst der Potentiometerwert, der die analoge Eingangsspannung ist, in einen digitalen Wert umgewandelt (ADC-Wert wird gefunden). Da der ADC von STM32 eine 12-Bit-Auflösung hat. Der digitale Wert variiert also von (0 bis 4096), der in (0 bis 100) abgebildet wird.
int analoginput = analogRead (PA0); int pwmvalue = map (Analogeingang, 0,4095,0,100);
Als nächstes wird die Entfernung unter Verwendung eines Ultraschallsensors gemessen, indem der Trigger mit einer Verzögerung von 2 Mikrosekunden hoch und niedrig eingestellt wird.
digitalWrite (trigPin, LOW); delayMicroseconds (2); digitalWrite (trigPin, HIGH); delayMicroseconds (10); digitalWrite (trigPin, LOW);
Der Echo-Pin erfasst die reflektierte Welle zurück, dh die Zeitdauer, in der die ausgelöste Welle zurückreflektiert wird, wird zur Berechnung der Entfernung des Objekts mithilfe der Formel verwendet. Erfahren Sie mehr darüber, wie der Ultraschallsensor die Entfernung berechnet, indem Sie dem Link folgen.
lange Dauer = pulsIn (echoPin, HIGH); Schwebedistanz = Dauer * 0,034 / 2;
Jetzt werden sowohl die gemessene Datennummer als auch die gemessene Entfernung in Zeichenfolgendaten konvertiert und in entsprechenden Zeichenfolgenvariablen gespeichert.
Transmit_Number = String (pwmvalue); Transmit_distance = String (Entfernung);
Beide Zeichenfolgen werden als eine Zeile hinzugefügt und in der Zeichenfolge "Senden" und "Komma" gespeichert, um zwei Zeichenfolgen zu trennen.
Transmit = Transmit_pwm + "," + Transmit_distance;
Die Sendezeichenfolge wird in ein Zeichenarray konvertiert.
const char * msg = send.c_str ();
Die Daten werden übertragen und warten, bis sie gesendet werden.
rf_driver.send ((uint8_t *) msg, strlen (msg)); rf_driver.waitPacketSent ();
Die gesendeten Zeichenfolgendaten werden auch im seriellen Monitor angezeigt.
Serial.println (msg);
Programmierung von Arduino UNO als HF-Empfänger
Arduino UNO wird mit der Arduino IDE programmiert. Im Empfängerabschnitt werden die Daten, die vom Senderabschnitt gesendet und vom HF-Empfängermodul empfangen werden, und die empfangenen String-Daten in entsprechende Daten (Entfernung und Nummer) aufgeteilt und im 16x2-LCD-Display angezeigt.
Sehen wir uns kurz die Codierung des Empfängers an:
Wie im Senderabschnitt ist zuerst die RadiohHead-Bibliothek enthalten. Da diese Bibliothek die ASK (Amplitude Shift Keying Technique) zum Senden und Empfangen von Daten verwendet. Dies macht die Programmierung sehr einfach.
#einschließen
Da hier ein LCD-Display verwendet wird, ist auch die Flüssigkristallbibliothek enthalten.
#einschließen
Die mit Arduino UNO verbundenen 16x2-LCD-Anzeigestifte werden mit lcd als Objekt angegeben und deklariert.
LiquidCrystal lcd (2,3,4,5,6,7);
Als nächstes werden die String-Datenvariablen zum Speichern von String-Daten deklariert.
String str_receive; String str_number; String str_distance;
Das Objekt für die Radiohead-Bibliothek wird deklariert.
RH_ASK rf;
Jetzt im void-Setup () wird die LCD-Anzeige in den 16x2-Modus versetzt und eine Begrüßungsnachricht wird angezeigt und gelöscht.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("RF mit STM32"); Verzögerung (5000); lcd.clear ();
Danach wird das RF- Objekt initialisiert.
rf.init ();
In der void-Schleife () wird der Array-Puffer mit der Größe 7 deklariert. Da die vom Sender gesendeten Daten 7 enthalten, einschließlich des ",". Ändern Sie dies also entsprechend den Daten, die übertragen werden sollen.
uint8_t buf; uint8_t buflen = sizeof (buf);
Wenn die Zeichenfolge am HF-Empfängermodul verfügbar ist, überprüft die if-Funktion die Größe und wird ausgeführt. Mit rf.recv () werden Daten empfangen.
if (rf.recv (buf, & buflen))
Der Buf hat die empfangene Zeichenfolge, sodass die empfangene Zeichenfolge in einer Zeichenfolgenvariablen str_receive gespeichert wird.
str_receive = String ((char *) buf);
Diese for- Schleife wird verwendet, um die empfangene Zeichenfolge in zwei Teile zu teilen, wenn sie das ',' zwischen zwei Zeichenfolgen erkennt.
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); Unterbrechung; }}
Zwei Zeichenarrays für zwei Werte werden deklariert, und die in zwei Teile geteilte Zeichenfolge wird in einem respektierten Array gespeichert, indem die Zeichenfolge in ein Zeichenarray konvertiert wird.
char numberstring; char distancestring; str_distance.toCharArray (distancestring, 3); str_number.toCharArray (numberstring, 3);
Konvertieren Sie anschließend das Zeichenarray mit atoi () in eine Ganzzahl.
int distance = atoi (distancestring); int number = atoi (Zahlenfolge);
Nach der Umrechnung in ganzzahlige Werte werden die Werte Abstand und Zahl im 16x2 LCD-Display angezeigt
lcd.setCursor (0,0); lcd.print ("Number:"); lcd.print (Nummer); lcd.setCursor (0,1); lcd.print ("Entfernung:"); lcd.print (Entfernung); lcd.print ("cm");
Nach dem Hochladen der beiden Codes, dh Sender und Empfänger im STM32 bzw. Arduino UNO, werden die mit dem STM32 gemessenen Daten wie Anzahl und Objektentfernung über den HF-Sender an den HF-Empfänger übertragen und die empfangenen Werte werden drahtlos auf dem LCD-Display angezeigt.
Testen von STM 32-basierten HF-Sendern und -Empfängern
1. Wenn die Zahl bei 0 und der Abstand des Objekts bei 6 cm liegt.
2. Wenn Nummer 47 und Objektabstand 3 cm betragen.