- Tổng quan về I2C STM32F103C8
- Chân I2C trong STM32F103C8
- Các chân I2C trong Arduino
- Thành phần bắt buộc
- Sơ đồ mạch và kết nối
- Lập trình I2C trong STM32
- Giải thích lập trình Master STM32
- Giải thích lập trình Slave Arduino
Trong các bài hướng dẫn trước đây, chúng ta đã tìm hiểu về giao tiếp SPI và I2C giữa hai bo mạch Arduino. Trong hướng dẫn này, chúng tôi sẽ thay thế một bảng Arduino bằng bảng Blue Pill là STM32F103C8 và sẽ giao tiếp với bảng Arduino bằng bus I2C.
STM32 có nhiều tính năng hơn board Arduino. Vì vậy, sẽ thật tuyệt khi tìm hiểu về giao tiếp giữa STM32 và Arduino bằng cách sử dụng bus SPI & I2C. Trong hướng dẫn này, chúng ta sẽ sử dụng bus I2C để giao tiếp giữa Arduino và STM32F103C8, và sẽ tìm hiểu về bus SPI trong hướng dẫn tiếp theo. Để biết thêm về bảng STM32, hãy kiểm tra các dự án STM32 khác.
Tổng quan về I2C STM32F103C8
So sánh I2C (Inter Integrated Circuits) trong bảng STM32F103C8 Blue Pill với Arduino Uno, chúng ta sẽ thấy rằng Arduino có vi điều khiển ATMEGA328 trong đó, và STM32F103C8 có ARM Cortex-M3 trong đó. STM32 có hai bus I2C trong khi Arduino Uno chỉ có một bus I2C và STM32 nhanh hơn Arduino.
Để tìm hiểu thêm về giao tiếp I2C, hãy tham khảo các bài viết trước của chúng tôi
- Cách sử dụng I2C trong Arduino: Giao tiếp giữa hai Bo mạch Arduino
- Giao tiếp I2C với Vi điều khiển PIC PIC16F877
- Giao diện LCD 16X2 với ESP32 sử dụng I2C
- Giao tiếp I2C với MSP430 Launchpad
- Giao diện LCD với NodeMCU mà không cần sử dụng I2C
- Cách xử lý đa giao tiếp (I2C SPI UART) trong một chương trình của arduino
Chân I2C trong STM32F103C8
SDA: PB7 hoặc PB9, PB11.
SCL: PB6 hoặc PB8, PB10.
Các chân I2C trong Arduino
SDA: chân A4
SCL: chân A5
Thành phần bắt buộc
- STM32F103C8
- Arduino Uno
- LED (2-Nos)
- Nút nhấn (2-Nos)
- Điện trở (4-Nos)
- Breadboard
- Kết nối dây
Sơ đồ mạch và kết nối
Bảng sau đây cho thấy kết nối giữa STM32 Blue Pill và Arduino Uno để sử dụng bus I2C. Nó chỉ yêu cầu hai dây.
STM32F103C8 |
Arduino |
Ghim Mô tả |
B7 |
A4 |
SDA |
B6 |
A5 |
SCL |
GND |
GND |
Đất |
Quan trọng
- Đừng quên kết nối Arduino GND và STM32F103C8 GND với nhau.
- Sau đó, kết nối một điện trở kéo xuống 10k với các chân nút nhấn của cả hai bảng riêng biệt.
Trong hướng dẫn STM32 I2C này, chúng ta sẽ cấu hình STM32F103C8 làm Master và Arduino làm Slave. Cả hai bảng đều được gắn đèn LED & nút nhấn riêng biệt.
Để chứng minh giao tiếp I2C trong STM32, chúng tôi điều khiển đèn LED STM32 chính bằng cách sử dụng giá trị nút nhấn Arduino phụ và điều khiển đèn LED Arduino phụ bằng cách sử dụng giá trị nút nhấn STM32F103C8 chính. Các giá trị này được gửi qua bus giao tiếp I2C.
Lập trình I2C trong STM32
Lập trình tương tự như mã Arduino. Giống nhau
Hướng dẫn này có hai chương trình một cho STM32 chính và một cho Arduino nô lệ. Các chương trình hoàn chỉnh cho cả hai bên được đưa ra ở cuối dự án này với một Video trình diễn.
Giải thích lập trình Master STM32
Trong Master STM32, hãy xem điều gì đang xảy ra:
1. Trước hết chúng ta cần bao gồm thư viện Wire và thư viện softwire để sử dụng các chức năng giao tiếp I2C trong STM32F103C8.
#include
2. Trong thiết lập void ()
- Chúng tôi bắt đầu giao tiếp nối tiếp với tốc độ truyền 9600.
Serial.begin (9600);
- Tiếp theo, chúng tôi bắt đầu giao tiếp I2C tại pin (B6, B7)
Wire.begin ();
3. Trong vòng lặp Void ()
- Đầu tiên, chúng tôi lấy dữ liệu từ Slave Arduino, vì vậy chúng tôi sử dụng requestFrom () với địa chỉ slave 8 và chúng tôi yêu cầu một byte.
Wire.requestFrom (8,1);
Giá trị nhận được được đọc bằng Wire.read ()
byte a = Wire.read ();
- Tùy theo giá trị nhận được từ nô lệ Master LED được bật ON hoặc OFF bằng cách sử dụng digitalwrite tại pin PA1 và cũng in nối tiếp được sử dụng để in giá trị trong màn hình nối tiếp
if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("BẬT LED chính"); } else { digitalWrite (LED, THẤP); Serial.println ("LED chính TẮT"); }
- Tiếp theo chúng ta cần đọc trạng thái của chân PA0 đó là nút nhấn master STM32.
int pinvalue = digitalRead (nút bấm);
- Tiếp theo gửi giá trị pin theo logic, vì vậy chúng tôi sử dụng điều kiện if và sau đó bắt đầu truyền với arduino nô lệ với địa chỉ là 8 và sau đó ghi giá trị theo giá trị đầu vào của nút nhấn.
if (pinvalue == HIGH) { x = 1; } else { x = 0; } Wire.beginTransmission (8); Wire.write (x); Wire.endTransmission ();
Giải thích lập trình Slave Arduino
1. Trước hết chúng ta cần bao gồm thư viện Wire để sử dụng các chức năng giao tiếp I2C.
#include
2. Trong thiết lập void ()
- Chúng tôi bắt đầu giao tiếp nối tiếp với tốc độ truyền 9600.
Serial.begin (9600);
- Tiếp theo, bắt đầu giao tiếp I2C tại chân (A4, A5) với địa chỉ phụ là 8. Ở đây, điều quan trọng là chỉ định địa chỉ phụ.
Wire.begin (8);
Tiếp theo chúng ta cần gọi hàm Wire.onReceive khi Slave nhận giá trị từ master và gọi hàm Wire.onRequest khi Master yêu cầu giá trị từ Slave.
Wire.onReceive (nhậnEvent); Wire.onRequest (requestEvent);
3. Tiếp theo chúng ta có hai chức năng một cho sự kiện yêu cầu và một cho sự kiện nhận
Đối với sự kiện yêu cầu
Khi Master STM32 yêu cầu giá trị từ slave, chức năng này sẽ thực thi. Hàm này lấy giá trị đầu vào từ nút nhấn Slave Arduino và gửi một byte (1 hoặc 0) đến Master STM32 theo giá trị nút nhấn bằng cách sử dụng Wire.write ().
void requestEvent () { int value = digitalRead (nút bấm); if (giá trị == CAO) { x = 1; } else { x = 0; } Wire.write (x); }
Đối với sự kiện nhận
Khi Master gửi dữ liệu đến slave với địa chỉ slave (8), hàm này sẽ thực thi. Hàm này đọc giá trị nhận được từ chính và lưu trữ trong một biến kiểu byte và sau đó sử dụng logic if để BẬT hoặc TẮT LED phụ thuộc vào giá trị nhận được. Nếu giá trị nhận được là 1 thì LED BẬT và đối với 0 LED TẮT.
void getEvent (int howMany) { byte a = Wire.read (); if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("Slave LED ON"); } else { digitalWrite (LED, THẤP); Serial.println ("TẮT LED nô lệ"); } delay (500); }
Đầu ra
1. Khi chúng ta nhấn nút nhấn ở Master STM32, đèn LED kết nối với Slave Ardiono sẽ BẬT (Trắng).
2. Bây giờ khi chúng ta nhấn nút nhấn ở phía Slave, đèn LED kết nối với Master sẽ BẬT (Màu đỏ) và khi nút được thả ra, đèn LED sẽ TẮT.
3. Khi nhấn đồng thời cả hai nút nhấn, thì cả hai đèn LED phát sáng cùng một lúc và vẫn BẬT cho đến khi nhấn các nút
Vì vậy, đây là cách giao tiếp I2C diễn ra trong STM32. Bây giờ bạn có thể giao tiếp bất kỳ cảm biến I2C nào với bảng STM32.
Mã hóa hoàn chỉnh cho Master STM32 và Slave Arduino được cung cấp bên dưới với một video trình diễn