- Απαιτούμενα στοιχεία
- Μονάδα πομπού και δέκτη RF 433Mhz)
- Διάγραμμα κυκλώματος πομπού RF με STM32F103C8
- Διάγραμμα κυκλώματος δέκτη RF με Arduino Uno
- Προγραμματισμός STM32F103C8 για ασύρματη μετάδοση RF
- Προγραμματισμός του Arduino UNO ως δέκτη RF
- Δοκιμή πομπού και δέκτη RF με βάση STM 32
Η κατασκευή ασύρματων έργων σε ενσωματωμένα ηλεκτρονικά γίνεται πολύ σημαντική και χρήσιμη, καθώς δεν υπάρχουν σύγχυση καλωδίων που καθιστούν τη συσκευή πιο πρακτική και φορητή. Υπάρχουν διάφορες ασύρματες τεχνολογίες όπως Bluetooth, WiFi, 433 MHz RF (Ραδιοσυχνότητα) κ.λπ. Κάθε τεχνολογία έχει τα δικά της πλεονεκτήματα και μειονεκτήματα, όπως κόστος, μεταφορά απόστασης ή εμβέλειας, ταχύτητα ή απόδοση κ.λπ. Σήμερα θα χρησιμοποιήσουμε μονάδα RF με STM32 για αποστολή και λήψη δεδομένων ασύρματα. Εάν είστε νέοι στο STM32 Microcontroller, ξεκινήστε με το Blinking LED με STM32 χρησιμοποιώντας το Arduino IDE και ελέγξτε όλα τα άλλα έργα STM32 εδώ.
Εκτός από αυτό, χρησιμοποιήσαμε επίσης την ασύρματη μονάδα RF 433Mhz με άλλους μικροελεγκτές για την κατασκευή ορισμένων ασύρματων ελεγχόμενων έργων, όπως:
- Οικιακές συσκευές ελεγχόμενες με RF
- RF τηλεχειριστήρια LED που χρησιμοποιούν Raspberry Pi
- Ρομπότ ελεγχόμενο με RF
- Διασύνδεση μονάδας RF με Arduino
- PIC to PIC Επικοινωνία χρησιμοποιώντας RF Module
Εδώ θα συνδέσουμε μια ασύρματη μονάδα RF 433MHz με μικροελεγκτή STM32F103C8. Το έργο χωρίζεται σε δύο μέρη. Ο πομπός θα διασυνδεθεί με STM32 και ο δέκτης θα διασυνδεθεί με το Arduino UNO. Θα υπάρξει διαφορετικό διάγραμμα κυκλώματος και σκίτσα και για τα δύο μέρη μετάδοσης καθώς και για λήψη.
Σε αυτό το σεμινάριο, ο πομπός RF στέλνει δύο τιμές στην πλευρά του δέκτη: την απόσταση που μετράται χρησιμοποιώντας τον αισθητήρα υπερήχων και την τιμή ποτενσιόμετρου ADC (0 έως 4096) που αντιστοιχίζεται ως αριθμός από (0 έως 100). Ο δέκτης RF του Arduino λαμβάνει τόσο τις τιμές όσο και εκτυπώνει αυτές τις τιμές απόστασης και αριθμού σε οθόνη LCD 16x2 ασύρματα.
Απαιτούμενα στοιχεία
- Μικροελεγκτής STM32F103C8
- Arduino UNO
- Πομπός & δέκτης RF 433Mhz
- Αισθητήρας υπερήχων (HC-SR04)
- Οθόνη LCD 16x2
- Ποτενσιόμετρο 10k
- Ψωμί
- Σύνδεση καλωδίων
Μονάδα πομπού και δέκτη RF 433Mhz)
Καρφίτσα πομπού RF:
Πομπός 433Mhz RF |
Περιγραφή καρφίτσας |
ΜΥΡΜΗΓΚΙ |
Για σύνδεση κεραίας |
GND |
GND |
VDD |
3.3 έως 5V |
ΔΕΔΟΜΕΝΑ |
Τα δεδομένα που πρέπει να μεταδοθούν στον δέκτη δίνονται εδώ |
Pinout δέκτη RF:
Δέκτης RF 433Mhz |
ΧΡΗΣΗ |
ΜΥΡΜΗΓΚΙ |
Για σύνδεση κεραίας |
GND |
GND |
VDD |
3.3 έως 5V |
ΔΕΔΟΜΕΝΑ |
Δεδομένα που θα ληφθούν από τον πομπό |
CE / DO |
Είναι επίσης μια καρφίτσα δεδομένων |
Προδιαγραφές μονάδας 433 MHz:
- Τάση λειτουργίας δέκτη: 3V έως 5V
- Τάση λειτουργίας πομπού: 3V έως 5V
- Συχνότητα λειτουργίας: 433 MHz
- Απόσταση μετάδοσης: 3 μέτρα (χωρίς κεραία) έως 100 μέτρα (μέγιστο)
- Τεχνική διαμόρφωσης: ASK (Amplitude shift keying)
- Ταχύτητα μετάδοσης δεδομένων: 10Kbps
Διάγραμμα κυκλώματος πομπού RF με STM32F103C8
Συνδέσεις κυκλώματος μεταξύ πομπού RF & STM32F103C8:
STM32F103C8 |
Πομπός RF |
5V |
VDD |
GND |
GND |
PA10 |
ΔΕΔΟΜΕΝΑ |
ΝΚ |
ΜΥΡΜΗΓΚΙ |
Συνδέσεις κυκλώματος μεταξύ υπερήχων αισθητήρα & STM32F103C8:
STM32F103C8 |
Αισθητήρας υπερήχων (HC-SR04) |
5V |
VCC |
PB1 |
Κομψός |
PB0 |
Ηχώ |
GND |
GND |
Ένα ποτενσιόμετρο 10k συνδέεται με το STM32F103C8 για να παρέχει αναλογική τιμή εισόδου (0 έως 3.3V) στον πείρο ADC PA0 του STM32.
Διάγραμμα κυκλώματος δέκτη RF με Arduino Uno
Συνδέσεις κυκλώματος μεταξύ δέκτη RF και Arduino UNO:
Arduino UNO |
Δέκτης RF |
5V |
VDD |
GND |
GND |
11 |
ΔΕΔΟΜΕΝΑ |
ΝΚ |
ΜΥΡΜΗΓΚΙ |
Συνδέσεις κυκλώματος μεταξύ 16x2 LCD & Arduino UNO:
Όνομα Pin LCD |
Όνομα Pin Arduino UNO |
Έδαφος (Gnd) |
Έδαφος (G) |
VCC |
5V |
VEE |
Καρφίτσωμα από το Κέντρο Ποτενσιόμετρου για Αντίθεση |
Εγγραφή Επιλογή (RS) |
2 |
Ανάγνωση / εγγραφή (RW) |
Έδαφος (G) |
Ενεργοποίηση (EN) |
3 |
Bit δεδομένων 4 (DB4) |
4 |
Bit δεδομένων 5 (DB5) |
5 |
Bit δεδομένων 6 (DB6) |
6 |
Bit δεδομένων 7 (DB7) |
7 |
Θετικό LED |
5V |
Αρνητικό LED |
Έδαφος (G) |
Η κωδικοποίηση θα εξηγηθεί εν συντομία παρακάτω. Θα υπάρχουν δύο μέρη του σκίτσου όπου το πρώτο μέρος θα είναι τμήμα πομπού και ένα άλλο θα είναι τμήμα δέκτη. Όλα τα αρχεία σκίτσων και το βίντεο εργασίας θα δοθούν στο τέλος αυτού του σεμιναρίου. Για να μάθετε περισσότερα σχετικά με τη διασύνδεση της μονάδας RF με το Arduino Uno, ακολουθήστε τον σύνδεσμο.
Προγραμματισμός STM32F103C8 για ασύρματη μετάδοση RF
Το STM32F103C8 μπορεί να προγραμματιστεί χρησιμοποιώντας το Arduino IDE. Δεν απαιτείται προγραμματιστής FTDI ή ST-Link για να ανεβάσετε τον κωδικό στο STM32F103C8. Απλώς συνδεθείτε στον υπολογιστή μέσω θύρας USB του STM32 και ξεκινήστε τον προγραμματισμό με το ARDUINO IDE. Μπορείτε να μάθετε τον προγραμματισμό του STM32 σας στο Arduino IDE ακολουθώντας τον σύνδεσμο.
Στην ενότητα πομπού η απόσταση του αντικειμένου σε «cm» μετριέται χρησιμοποιώντας αισθητήρα υπερήχων και η τιμή του αριθμού από (0 έως 100) ορίζεται χρησιμοποιώντας ποτενσιόμετρο που μεταδίδεται μέσω πομπού RF διασυνδεδεμένου με STM32.
Πρώτα περιλαμβάνεται η βιβλιοθήκη Radiohead, μπορείτε να το κατεβάσετε από εδώ. Καθώς αυτή η βιβλιοθήκη χρησιμοποιεί το ASK (Amplitude Shift Keying Technique) για τη μετάδοση και τη λήψη δεδομένων. Αυτό καθιστά τον προγραμματισμό πολύ εύκολο. Μπορείτε να συμπεριλάβετε βιβλιοθήκη στο σκίτσο μεταβαίνοντας στο Σκίτσο-> συμπερίληψη βιβλιοθήκης-> Προσθήκη βιβλιοθήκης.zip.
#περιλαμβάνω
Όπως σε αυτό το σεμινάριο στην πλευρά του πομπού χρησιμοποιείται ένας αισθητήρας υπερήχων για τη μέτρηση της απόστασης, έτσι ώστε να καθορίζονται οι ακίδες και η ακίδα ηχούς.
# καθορισμός trigPin PB1 # καθορισμός echoPin PB0
Στη συνέχεια το όνομα του αντικειμένου για τη βιβλιοθήκη RH_ASK ορίζεται ως rf_driver με τις παραμέτρους όπως η ταχύτητα (2000), ο πείρος RX (PA9) και ο πείρος TX (PA10).
RH_ASK rf_driver (2000, PA9, PA10);
Στη συνέχεια δηλώνονται οι μεταβλητές Strings που απαιτούνται σε αυτό το πρόγραμμα.
Συμβολοσειρά transmit_number; Συμβολοσειρά μετάδοση_ απόσταση; Μετάδοση συμβολοσειράς;
Στη συνέχεια, στην κενή ρύθμιση (), το αντικείμενο για RH_ASK rf_driver αρχικοποιείται.
rf_driver.init ();
Μετά από αυτό ο πείρος σκανδάλης ορίζεται ως πείρος OUTPUT και ο PA0 (συνδεδεμένος στο ποτενσιόμετρο) και ο πείρος ηχούς ορίζεται ως πείρος INPUT. Η σειριακή επικοινωνία ξεκινά με ρυθμό baud 9600.
Serial.begin (9600); pinMode (PA0, INPUT); pinMode (echoPin, INPUT); pinMode (trigPin, OUTPUT);
Στη συνέχεια στον κενό βρόχο (), πρώτα η τιμή ποτενσιόμετρου που είναι η αναλογική τάση εισόδου μετατρέπεται σε ψηφιακή τιμή (βρέθηκε η τιμή ADC). Καθώς το ADC του STM32 έχει ανάλυση 12-bit. Έτσι, η ψηφιακή τιμή κυμαίνεται από (0 έως 4096) η οποία αντιστοιχεί σε (0 έως 100).
int analoginput = analogRead (PA0); int pwmvalue = χάρτης (analoginput, 0,4095,0,100);
Στη συνέχεια μετράται η απόσταση χρησιμοποιώντας αισθητήρα υπερήχων ρυθμίζοντας τη σκανδάλη υψηλή και χαμηλή με καθυστέρηση 2 μικροδευτερόλεπτα.
digitalWrite (trigPin, LOW); καθυστέρηση Μικροδευτερόλεπτα (2); digitalWrite (trigPin, HIGH); καθυστέρηση Μικροδευτερόλεπτα (10); digitalWrite (trigPin, LOW);
Ο πείρος ηχούς ανιχνεύει το ανακλώμενο κύμα πίσω, δηλαδή η χρονική διάρκεια που το ενεργοποιημένο κύμα ανακλάται πίσω χρησιμοποιείται για τον υπολογισμό της απόστασης του αντικειμένου χρησιμοποιώντας τον τύπο. Μάθετε περισσότερα πώς ο αισθητήρας υπερήχων υπολογίζει την απόσταση, ακολουθώντας τον σύνδεσμο.
μεγάλη διάρκεια = pulseIn (echoPin, HIGH); απόσταση πλωτήρα = διάρκεια * 0,034 / 2;
Τώρα τόσο ο αριθμός δεδομένων όσο και η απόσταση που μετρώνται μετατρέπονται σε δεδομένα συμβολοσειράς και αποθηκεύονται σε αντίστοιχες μεταβλητές συμβολοσειρών.
transmit_number = String (pwmvalue); transmit_distance = String (απόσταση);
Και η συμβολοσειρά προστίθεται ως μία γραμμή και αποθηκεύεται σε συμβολοσειρά που ονομάζεται transmit και κόμμα "," χρησιμοποιείται για να διαχωρίσει δύο χορδές.
transmit = transmit_pwm + "," + transmit_distance;
Η συμβολοσειρά μετάδοσης μετατρέπεται σε πίνακα χαρακτήρων.
const char * msg = transmit.c_str ();
Τα δεδομένα διαβιβάζονται και περιμένετε μέχρι να σταλούν.
rf_driver.send ((uint8_t *) msg, strlen (msg)); rf_driver.waitPacketSent ();
Τα δεδομένα συμβολοσειράς που αποστέλλονται εμφανίζονται επίσης στο Serial Monitor.
Serial.println (msg);
Προγραμματισμός του Arduino UNO ως δέκτη RF
Το Arduino UNO είναι προγραμματισμένο χρησιμοποιώντας το Arduino IDE. Στην ενότητα δέκτη τα δεδομένα που μεταδίδονται από την ενότητα πομπού και λαμβάνονται από τη μονάδα δέκτη RF και τα δεδομένα συμβολοσειράς που λαμβάνονται χωρίζονται σε αντίστοιχα δεδομένα (απόσταση και αριθμός) και εμφανίζονται στην οθόνη LCD 16x2.
Ας δούμε εν συντομία την κωδικοποίηση του δέκτη:
Όπως στην ενότητα πομπού περιλαμβάνεται πρώτα η βιβλιοθήκη RadiohHead. Καθώς αυτή η βιβλιοθήκη χρησιμοποιεί το ASK (Amplitude Shift Keying Technique) για τη μετάδοση και τη λήψη δεδομένων. Αυτό καθιστά τον προγραμματισμό πολύ εύκολο.
#περιλαμβάνω
Καθώς η οθόνη LCD χρησιμοποιείται εδώ, έτσι περιλαμβάνεται και η βιβλιοθήκη liquidcrystal.
#περιλαμβάνω
Και οι καρφίτσες οθόνης LCD 16x2 που συνδέονται με το Arduino UNO καθορίζονται και δηλώνονται χρησιμοποιώντας το lcd ως αντικείμενο.
LiquidCrystal lcd (2,3,4,5,6,7);
Στη συνέχεια δηλώνονται οι μεταβλητές δεδομένων συμβολοσειράς για την αποθήκευση δεδομένων συμβολοσειρών.
String str_receive; Συμβολοσειρά str_number; Συμβολοσειρά str_distance;
Το αντικείμενο για τη βιβλιοθήκη Radiohead δηλώνεται.
RH_ASK rf;
Τώρα στην κενή ρύθμιση (), Η οθόνη LCD έχει ρυθμιστεί σε λειτουργία 16x2 και εμφανίζεται ένα μήνυμα καλωσορίσματος και διαγράφεται.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("RF με STM32"); καθυστέρηση (5000) lcd.clear ();
Μετά από αυτό, το αντικείμενο rf αρχικοποιείται.
rf.init ();
Τώρα στον κενό βρόχο (), το Array buf δηλώνεται με μέγεθος ως 7. Καθώς τα δεδομένα που αποστέλλονται από τον πομπό έχουν 7, συμπεριλαμβανομένου του "," Έτσι, αλλάξτε αυτό σύμφωνα με τα δεδομένα που πρόκειται να μεταδοθούν.
uint8_t buf; uint8_t buflen = sizeof (buf);
Εάν η συμβολοσειρά είναι διαθέσιμη στη μονάδα δέκτη rf, η συνάρτηση if ελέγχει το μέγεθος και εκτελείται. Το rf.recv () χρησιμοποιείται για τη λήψη δεδομένων.
εάν (rf.recv (buf, & buflen))
Το buf έχει τη ληφθείσα συμβολοσειρά, οπότε η ληφθείσα συμβολοσειρά αποθηκεύεται σε μια μεταβλητή συμβολοσειράς str_receive .
str_receive = String ((char *) buf);
Αυτό για το βρόχο χρησιμοποιείται για να χωρίσει τη λαμβανόμενη συμβολοσειρά σε δύο εάν ανιχνεύσει το ',' ανάμεσα σε δύο χορδές.
για (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); Διακοπή; }
Δύο πίνακες char για δύο τιμές δηλώνονται και η συμβολοσειρά που χωρίζεται σε δύο αποθηκεύεται σε σεβαστό πίνακα μετατρέποντας συμβολοσειρά σε πίνακα χαρακτήρων.
char numbertring; char αποστασιοποιητικό; str_distance.toCharArray (αποστασιοποιημένο, 3); str_number.toCharArray (αριθμοί, 3);
Μετά από αυτό μετατρέψτε τον πίνακα χαρακτήρων σε ακέραιο χρησιμοποιώντας atoi ()
int απόσταση = atoi (απομακρυσμένη); int number = atoi (αριθμοί)
Μετά τη μετατροπή σε ακέραιες τιμές, η απόσταση και ο αριθμός εμφανίζονται στην οθόνη LCD 16x2
lcd.setCursor (0,0); lcd.print ("Αριθμός:"); lcd.print (αριθμός); lcd.setCursor (0,1); lcd.print ("Απόσταση:"); lcd.print (απόσταση); lcd.print ("cm");
Μετά τη μεταφόρτωση και των δύο κωδικών, δηλαδή πομπού και δέκτη στο STM32 και στο Arduino UNO αντίστοιχα, τα δεδομένα όπως ο αριθμός και η απόσταση αντικειμένου που μετρήθηκαν χρησιμοποιώντας το STM32 μεταδίδονται στον δέκτη RF μέσω RF πομπό και οι ληφθείσες τιμές εμφανίζονται στην οθόνη LCD ασύρματα.
Δοκιμή πομπού και δέκτη RF με βάση STM 32
1. Όταν ο αριθμός στο 0 και η απόσταση του αντικειμένου είναι στα 6cm.
2. Όταν ο αριθμός 47 και η απόσταση του αντικειμένου είναι 3cm.