Nhiều lúc chúng ta muốn chia sẻ khối lượng công việc của một Arduino với một Arduino khác. Hoặc có thể chúng ta muốn nhiều chân digital hoặc analog thì I2C là giải pháp tốt nhất.
I2C là giao thức thường được sử dụng để giao tiếp giữa các linh kiện trên bo mạch chủ trong máy ảnh và trong bất kỳ hệ thống điện tử nhúng nào.
Trong bài này chúng ta sẽ tạo một bus I2C bằng hai arduino. Chúng ta sẽ lập trình một arduino chủ để ra lệnh cho arduino slave khác nhấp nháy đèn LED của nó một hoặc hai lần tùy thuộc vào giá trị nhận được.
Để làm điều này, chúng ta cần các thành phần sau:
2 arduino
Cáp jumper
Cách kết nối
Thực hiện theo các bước sau để kết nối hai Arduino Uno bằng I2C:
Nối các chân A4 và A5 trên một Arduino với các chân tương tự trên Arduino kia.
Dòng GND phải chung cho cả 2 Arduino. Nối nó với một jumper.
Chú ý không được nối Arduino 5 V và 3,3 V với nhau. Tuy không ảnh hưởng Arduino 5V, nhưng chắc chắn sẽ ảnh hưởng đến Arduino 3,3V.
Code
Đoạn code sau được chia thành hai phần: code chủ và code slave, chạy trên hai Arduino khác nhau. Đầu tiên là code chủ:
Và đây là code slave diễn giải các ký tự được gửi từ chủ:
Đầu tiên, chúng ta hãy nhìn vào chủ. Chúng ta cần thêm thư viện Wire.h :
Sau đó, trong phần thiết lập, chúng ta bắt đầu bus I2C bằng cách sử dụng hàm Wire.begin (). Nếu không có đối số được cung cấp trong hàm, Arduino này sẽ là bo chủ.
Cuối cùng, chúng ta gửi một ký tự x, nằm trong khoảng từ 0 đến 5. Chúng ta sử dụng các hàm sau để bắt đầu truyền đến thiết bị có địa chỉ 9, viết ký tự và sau đó dừng truyền:
Tiếp theo là Arduino slave. Chúng ta cũng thêm thư viện Wire.h, nhưng bắt đầu bus I2C bằng cách sử dụng Wire.begin (9). Số trong đối số là địa chỉ chúng ta muốn sử dụng cho Arduino. Tất cả các thiết bị có địa chỉ 9 sẽ nhận được tín hiệu truyền.
Bây giờ chúng ta cần phản ứng khi nhận được tín hiệu truyền I2C. Hàm sau sẽ thêm chức năng kích hoạt bất cứ khi nào nhận được ký tự. Có nghĩa là bất cứ khi nào Arduino nhận được một ký tự trên I2C, nó sẽ chạy chức năng mà chúng ta bảo nó chạy:
Và đây là hàm. Ở đây, chúng ta chỉ cần lưu trữ giá trị của ký tự nhận được:
Trong loop(), chúng ta chỉ cần diễn giải ký tự đó để nháy đèn LED tích hợp ở các tốc độ khác nhau tùy thuộc vào ký tự nhận được.
Tìm hiểu thêm về I2C
Chúng ta đi sơ qua phần lý thuyết, I2C cần hai dòng digital: Dòng dữ liệu nối tiếp (SDA) để truyền dữ liệu và Dòng clock nối tiếp (SCL) để giữ clock. Mỗi kết nối I2C có một chủ và nhiều slave. Một chủ có thể viết lên slave và yêu cầu slave cung cấp dữ liệu, nhưng không một slave nào có thể trực tiếp viết cho chủ hoặc cho một slave khác. Mỗi slave có một địa chỉ duy nhất trên bus và chủ cần biết địa chỉ của từng slave mà nó muốn truy cập.
Mỗi bus I2C có thể hỗ trợ tới 112 thiết bị. Tất cả các thiết bị cần chia sẻ GND. Tốc độ khoảng 100 kb / s không quá nhanh nhưng vẫn đáng kể và hữu dụng. Có thể có nhiều hơn một chủ trên bus, nhưng nó rất phức tạp và thường ít được sử dụng.
Rất nhiều cảm biến sử dụng I2C để liên lạc, điển hình là dụng cụ đo quán tính, áp kế,
cảm biến nhiệt độ, và một số sonar. Cần nhớ rằng I2C không sử dụng cho cáp dài. Chỉ cần cáp dài 2 mét đã gặp vấn đề.
I2C là một giao thức truyền dẫn phức tạp, nhưng nó rất hữu ích. Tất cả Arduino đều có thể dùng được, với một vài khác biệt ở chân:
Các chân I2C của bo
Uno, Pro Mini A4 (SDA), A5 (SCL)
Mega, Due 20 (SDA), 21 (SCL)
Leonardo, Yun 2 (SDA), 3 (SCL)
Kết nối nhiều thiết bị
Nếu chúng ta cần kết nối nhiều hơn hai thiết bị trên một bus I2C, chúng ta chỉ cần kết nối tất cả các dòng SDA và SCL lại với nhau. Chúng ta sẽ cần địa chỉ của mọi slave được giải quyết từ Arduino chính.
Hotline: 0979 466 469