- Επισκόπηση STM32F103C8 I2C
- Καρφίτσες I2C στο STM32F103C8
- Καρφίτσες I2C στο Arduino
- Απαιτούμενα στοιχεία
- Διάγραμμα κυκλώματος και συνδέσεις
- Προγραμματισμός I2C σε STM32
- Εξήγηση προγραμματισμού Master STM32
- Επεξήγηση προγραμματισμού Slave Arduino
Στα προηγούμενα μαθήματά μας, έχουμε μάθει για την επικοινωνία SPI και I2C μεταξύ δύο πινάκων Arduino. Σε αυτό το σεμινάριο θα αντικαταστήσουμε μια πλακέτα Arduino με την πλακέτα Blue Pill που είναι STM32F103C8 και θα επικοινωνήσουμε με την πλακέτα Arduino χρησιμοποιώντας δίαυλο I2C.
Το STM32 έχει περισσότερα χαρακτηριστικά από ό, τι το Arduino board. Επομένως, θα ήταν υπέροχο να μάθουμε για την επικοινωνία μεταξύ STM32 και Arduino χρησιμοποιώντας το λεωφορείο SPI & I2C. Σε αυτό το σεμινάριο, θα χρησιμοποιήσουμε το δίαυλο I2C για επικοινωνία μεταξύ Arduino και STM32F103C8 και θα μάθουμε για το λεωφορείο SPI στο επόμενο σεμινάριο. Για να μάθετε περισσότερα σχετικά με την πλακέτα STM32, ελέγξτε άλλα έργα STM32.
Επισκόπηση STM32F103C8 I2C
Συγκρίνοντας το I2C (Inter Integrated Circuits) στην πλακέτα Blue Pill STM32F103C8 με το Arduino Uno, τότε θα δούμε ότι το Arduino διαθέτει μικροελεγκτή ATMEGA328 και STM32F103C8 έχει ARM Cortex-M3 σε αυτό. Το STM32 έχει δύο I2C bus ενώ το Arduino Uno έχει μόνο ένα I2C bus και το STM32 είναι ταχύτερο από το Arduino.
Για να μάθετε περισσότερα σχετικά με την επικοινωνία I2C, ανατρέξτε στα προηγούμενα άρθρα μας
- Πώς να χρησιμοποιήσετε το I2C στο Arduino: Επικοινωνία μεταξύ δύο πινάκων Arduino
- Επικοινωνία I2C με μικροελεγκτή PIC PIC16F877
- Διασύνδεση LCD 16X2 με ESP32 χρησιμοποιώντας I2C
- Επικοινωνία I2C με MSP430 Launchpad
- Διασύνδεση LCD με NodeMCU χωρίς χρήση I2C
- Τρόπος χειρισμού πολλαπλών επικοινωνιών (I2C SPI UART) σε ένα πρόγραμμα arduino
Καρφίτσες I2C στο STM32F103C8
SDA: PB7 ή PB9, PB11.
SCL: PB6 ή PB8, PB10.
Καρφίτσες I2C στο Arduino
SDA: Καρφίτσα A4
SCL: Καρφίτσα A5
Απαιτούμενα στοιχεία
- STM32F103C8
- Arduino Uno
- LED (2 Nos)
- Κουμπί Push (2-Nos)
- Αντιστάσεις (4-Nos)
- Ψωμί
- Σύνδεση καλωδίων
Διάγραμμα κυκλώματος και συνδέσεις
Ο παρακάτω πίνακας δείχνει τη σύνδεση μεταξύ STM32 Blue Pill και Arduino Uno για τη χρήση του διαύλου I2C. Απαιτεί μόνο δύο καλώδια.
STM32F103C8 |
Arduino |
Περιγραφή καρφίτσας |
Β7 |
Α4 |
SDA |
Β6 |
Α5 |
SCL |
GND |
GND |
Εδαφος |
Σπουδαίος
- Μην ξεχάσετε να συνδέσετε το Arduino GND και το STM32F103C8 GND.
- Στη συνέχεια, συνδέστε μια αντίσταση τραβήγματος προς τα κάτω των 10k στους ακροδέκτες του κουμπιού και της δύο πλακέτας ξεχωριστά.
Σε αυτό το σεμινάριο STM32 I2C θα διαμορφώσουμε το STM32F103C8 ως Master και το Arduino ως Slave. Και οι δύο πλακέτες είναι τοποθετημένες ξεχωριστά με LED και μπουτόν.
Για να δείξουμε την επικοινωνία I2C στο STM32, ελέγχουμε το κύριο STM32 LED χρησιμοποιώντας την τιμή του κουμπιού Slave Arduino και ελέγχουμε το Slave Arduino LED χρησιμοποιώντας την τιμή του πλήκτρου master STM32F103C8. Αυτές οι τιμές αποστέλλονται μέσω διαύλου επικοινωνίας I2C.
Προγραμματισμός I2C σε STM32
Ο προγραμματισμός είναι παρόμοιος με τον κωδικό Arduino. Το ίδιο
Αυτό το σεμινάριο έχει δύο προγράμματα ένα για το master STM32 και άλλο για το slave Arduino. Πλήρη προγράμματα και για τις δύο πλευρές δίνονται στο τέλος αυτού του έργου με ένα βίντεο επίδειξης.
Εξήγηση προγραμματισμού Master STM32
Στο Master STM32 ας δούμε τι συμβαίνει:
1. Πρώτα απ 'όλα πρέπει να συμπεριλάβουμε τη βιβλιοθήκη Wire και τη βιβλιοθήκη softwire για τη χρήση λειτουργιών επικοινωνίας I2C στο STM32F103C8.
#περιλαμβάνω
2. Σε άκυρη ρύθμιση ()
- Ξεκινάμε τη σειριακή επικοινωνία στο Baud Rate 9600.
Serial.begin (9600);
- Στη συνέχεια ξεκινάμε την επικοινωνία I2C στο pin (B6, B7)
Wire.begin ();
3. Σε βρόχο Void ()
- Πρώτα λαμβάνουμε τα δεδομένα από το Slave Arduino, έτσι χρησιμοποιούμε requestFrom () με τη διεύθυνση slave 8 και ζητάμε ένα byte.
Wire.requestFrom (8,1);
Η ληφθείσα τιμή διαβάζεται χρησιμοποιώντας το Wire.read ()
byte a = Wire.read ();
- Ανάλογα με την ληφθείσα τιμή από το slave, το Master LED είναι ΕΝΕΡΓΟΠΟΙΗΜΕΝΟ ή ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ χρησιμοποιώντας ψηφιακό γράψιμο στον ακροδέκτη PA1 και χρησιμοποιείται επίσης σειριακή εκτύπωση για την εκτύπωση της τιμής στη σειριακή οθόνη
εάν (a == 1) { digitalWrite (LED, HIGH); Serial.println ("Master LED ON"); } αλλιώς { digitalWrite (LED, LOW); Serial.println ("Master LED OFF"); }
- Στη συνέχεια πρέπει να διαβάσουμε την κατάσταση του πείρου PA0 που είναι το κύριο πλήκτρο STM32.
int pinvalue = digitalRead (κουμπάκι);
- Στη συνέχεια, στείλτε την τιμή pin σύμφωνα με τη λογική, οπότε χρησιμοποιούμε το if condition και μετά ξεκινάμε τη μετάδοση με slave arduino με 8 ως διεύθυνση και μετά γράφουμε την τιμή σύμφωνα με την τιμή εισαγωγής του κουμπιού.
αν (pinvalue == HIGH) { x = 1; } αλλιώς { x = 0; } Wire.beginTransmission (8); Wire.write (x); Wire.endTransmission ();
Επεξήγηση προγραμματισμού Slave Arduino
1. Πρώτα απ 'όλα πρέπει να συμπεριλάβουμε τη βιβλιοθήκη Wire για τη χρήση λειτουργιών επικοινωνίας I2C.
#περιλαμβάνω
2. Σε άκυρη ρύθμιση ()
- Ξεκινάμε τη σειριακή επικοινωνία στο Baud Rate 9600.
Serial.begin (9600);
- Στη συνέχεια ξεκινήστε την επικοινωνία I2C στην καρφίτσα (A4, A5) με τη διεύθυνση slave ως 8. Εδώ είναι σημαντικό να καθορίσετε τη διεύθυνση slave.
Wire.begin (8);
Στη συνέχεια πρέπει να καλέσουμε τη συνάρτηση Wire.onReceive όταν ο Slave λαμβάνει τιμή από τον κύριο και την κλήση συνάρτησης Wire.onRequest όταν η τιμή Master ζητά από το Slave.
Wire.onReceive (ReceiveEvent); Wire.onRequest (requestEvent);
3. Στη συνέχεια έχουμε δύο λειτουργίες μία για συμβάν αίτησης και μία για συμβάν λήψης
Για αίτημα Εκδήλωση
Όταν η τιμή αιτήματος Master STM32 από το slave, αυτή η συνάρτηση θα εκτελεστεί. Αυτή η λειτουργία παίρνει την τιμή εισόδου από το κουμπί Slave Arduino και στέλνει ένα byte (1 ή 0) στο Master STM32 σύμφωνα με την τιμή του κουμπιού χρησιμοποιώντας το Wire.write ().
void requestEvent () { int value = digitalRead (buttonpin); αν (τιμή == ΥΨΗΛΟΣ) { x = 1; } αλλιώς { x = 0; } Wire.write (x); }
Για λήψη συμβάντος
Όταν ο Master στέλνει δεδομένα σε slave με διεύθυνση slave (8), αυτή η λειτουργία θα εκτελεστεί. Αυτή η συνάρτηση διαβάζει την ληφθείσα τιμή από τον κύριο και αποθηκεύστε σε μια μεταβλητή τύπου byte και στη συνέχεια χρησιμοποιήστε εάν λογική για να ενεργοποιήσετε ή να απενεργοποιήσετε το slave LED ανάλογα με την τιμή που λαμβάνετε. Εάν η τιμή λήψης είναι 1 τότε το LED ανάβει και για 0 LED ανάβει
void ReceEvent (int howMany) { byte a = Wire.read (); εάν (a == 1) { digitalWrite (LED, HIGH); Serial.println ("Slave LED ON"); } αλλιώς { digitalWrite (LED, LOW); Serial.println ("Slave LED OFF"); } καθυστέρηση (500) }
Παραγωγή
1. Όταν πατάμε το κουμπί στο Master STM32, το LED που είναι συνδεδεμένο στο Slave Ardiono ανάβει (Λευκό).
2. Τώρα όταν πατάμε το κουμπί ώθησης στην πλευρά Slave, το LED που είναι συνδεδεμένο στο Master ανάβει (κόκκινο) και όταν απελευθερώνεται το κουμπί LED σβήνει.
3. Όταν και τα δύο κουμπιά πιέζονται simultanewolsy, τότε και τα δύο LED ανάβουν ταυτόχρονα και παραμένουν αναμμένα μέχρι να πατηθούν τα κουμπιά
Έτσι λοιπόν λαμβάνει χώρα η επικοινωνία I2C στο STM32. Τώρα μπορείτε να συνδέσετε οποιονδήποτε αισθητήρα I2C με την πλακέτα STM32.
Η πλήρης κωδικοποίηση για Master STM32 και Slave Arduino δίνεται παρακάτω με ένα βίντεο επίδειξης