Giao tiếp I2C giữa hai bảng Arduino

Giao tiếp I2C giữa hai bảng Arduino

Giới thiệu I2C

I2C có nghĩa là Giao thức truyền thông mạch tích hợp liên tục. Nó là một giao thức truyền thông nối tiếp 2 dây cho các ứng dụng truyền dữ liệu tầm ngắn. Đây là một giao thức truyền thông rất phổ biến được sử dụng trong các dự án nhúng để giao diện các cảm biến dựa trên, màn hình chữ số và mô-đun giao tiếp.

Các thiết bị muốn giao tiếp với từng kết nối thông qua bus I2C. Bus I2C hỗ trợ nhiều thiết bị nô lệ và nhiều thiết bị chính.

Nhiều Cảm biến sử dụng giao thức truyền thông nối tiếp này để truyền dữ liệu của chúng đến các bộ vi điều khiển hoặc thông qua giao thức này, các mạch phụ khác nhau có thể giao tiếp với các mạch chủ. Nó chỉ áp dụng cho việc truyền dữ liệu khoảng cách ngắn.

Chân I2C

Đặc điểm nổi bật của I2C so với SPI là nó chỉ sử dụng hai dây để thực hiện giao tiếp. Một dây là SCL (dòng đồng hồ nối tiếp) đồng bộ hóa việc truyền dữ liệu giữa các thiết bị và dây còn lại là SDA (dữ liệu nối tiếp) mang dữ liệu thực tế cần truyền. Các đường này là các đường thoát nước mở có nghĩa là chúng cần được kết nối để kéo điện trở lên nếu các thiết bị hoạt động ở mức thấp. Mỗi thiết bị phụ được kết nối với xe buýt sẽ có một địa chỉ 8-bit duy nhất.

Việc giao tiếp giữa các thiết bị cụ thể sử dụng hai dây được thực hiện bởi thực tế là mỗi thiết bị có ID hoặc địa chỉ thiết bị duy nhất của riêng mình và sử dụng địa chỉ này; Master có thể chọn bất kỳ thiết bị cụ thể nào để giao tiếp.

Thiết bị phụ

Mỗi thiết bị phụ có địa chỉ duy nhất được sử dụng để nhận dạng thiết bị trên bus. Nói cách khác, địa chỉ phụ giúp thiết bị chính gửi thông tin đến một
thiết bị nô lệ cụ thể trên bus.

Thiết bị chính

Các thiết bị chính có thể gửi và nhận thông tin. Nô lệ phản ứng với bất cứ điều gì một chủ nhân gửi. Khi gửi thông tin trên bus, chỉ cần một thiết bị duy nhất có thể gửi thông tin tại một thời điểm.

Tóm lại, chúng ta chỉ cần hai dây để truyền dữ liệu hoặc giao tiếp với các số lượng thiết bị khác nhau. Như chúng ta đều biết rằng Arduino có các chân hạn chế, I2C cho phép kết nối với nhiều thiết bị cùng một lúc. Chỉ thiếu sót là bạn không thể sử dụng giao thức này để truyền dữ liệu đường dài.

Xe buýt truyền thông I2C

Truyền dữ liệu từng chút một nối tiếp dọc theo một dây (đường SDA). Giống như SPI, I2C là đồng thời, đầu ra của các bit được đồng bộ hóa với việc kiểm tra các bit bằng tín hiệu đồng hồ được chia sẻ
giữa chủ và nô lệ.

Chân giao tiếp Arduino I2C

Đối với giao tiếp I2C, các bo mạch khác nhau của Arduino có các chân khác nhau được dành riêng dưới dạng chân SDA và SCL. Danh sách dưới đây hiển thị các số pin này trong các bảng khác nhau.

  1. Trong Arduino UNO, Chân A4 = SDA và Chân A5 = SCL

  2. Đối với Arduino = SDA và Chân 21 = SCL

  3. Trong Arduino Leonardo, Chân 2 = SDA và Chân 3 = SCL

  4. Đối với Arduino due, Chân 20 = SDA và Chân 21 = SCL, SDA1, SCL1

Hình dưới đây cho thấy các chân SDA và SCL trong Arduino UNO sẽ được sử dụng trong bài viết này.

Chân Arduino I2C

Thư viện truyền thông Arduino I2C

Thư viện "dây" được sử dụng để giao tiếp I2C trong Arduino. Sau đây là các chức năng quan trọng của thư viện này.

Wire.begin(địa chỉ)

Thư viện dây được bắt đầu bằng lệnh này và tham gia bus I2C với tư cách là chủ hoặc nô lệ. Địa chỉ là tùy chọn. Địa chỉ này bao gồm bảy bit cho các thiết bị nô lệ. Trường hợp không quy định; thiết bị tham gia xe buýt với tư cách là Master.

Wire.requestFrom (địa chỉ, số lượng)

Lệnh này được sử dụng bởi thiết bị Master để yêu cầu byte từ thiết bị phụ. Các hàm "Available ()" và "read ()" có thể được sử dụng để thu thập các byte này sau đó. "Địa chỉ" là địa chỉ của một thiết bị phụ cụ thể mà từ đó yêu cầu sẽ được thực hiện và "số lượng" chỉ định số byte được yêu cầu.

Wire.beginTransmission(địa chỉ)

Lệnh này bắt đầu truyền byte với thiết bị phụ của địa chỉ nhất định. Sau đó, các byte được truyền đi được xếp hàng đợi bằng hàm write () và các byte này được truyền bằng hàm endTransmission().

Wire.endTransmission()

Việc truyền byte được khởi tạo bằng hàm wire.beginTransmission(), được kết thúc bằng lệnh này.

Hàm này chấp nhận một đối số. Nếu đối số là TRUE, lệnh dừng được gửi sau khi truyền byte và bus I2C được tha.

Nếu đối số là FALSE, nó sẽ gửi lệnh khởi động lại sau khi truyền byte và bus không được tha và nó ngăn một thiết bị chính khác truyền giữa các tin nhắn.

Dây.Write ()

Lệnh này thực hiện một trong 2 chức năng cùng một lúc.

  1. Khi một yêu cầu được thực hiện bởi master, hàm này sẽ ghi dữ liệu từ thiết bị nô lệ.

  2. Giữa các lệnh gọi của hàm beginTransmission() và endTransmission(), lệnh này được sử dụng để xếp hàng byte để truyền.

Dây.đọc ()

Sau lệnh requestFrom (), các byte được truyền từ thiết bị nô lệ đến thiết bị chính hoặc thiết bị chính đến thiết bị nô lệ; được đọc bằng lệnh này.

Dây.available()

Hàm này trả về số byte sẵn có để truy xuất sau khi gọi hàm read(). Trong thiết bị chính, nó được gọi sau hàm requestFrom() và trong thiết bị nô lệ, nó được gọi bên trong hàm onReceive ().

Wire.onReceive (xử lý)

Điều này đăng ký một chức năng được gọi là khi truyền từ thiết bị chính được nhận bởi thiết bị phụ. Hàm được gọi là được đại diện bởi trình xử lý.

Giao tiếp I2C giữa hai bảng Arduino

Trong phần này, chúng ta sẽ thấy một code ví dụ để truyền dữ liệu giữa hai bo mạch Arduino sử dụng bus I2C. Chúng tôi sẽ định cấu hình một bảng Arduino làm thiết bị chính I2C và một bảng Arduino khác làm thiết bị nô lệ I2C. Master sẽ chuyển các số từ 0-6 theo trình tự sang thiết bị phụ. Nếu số mà thiết bị phụ nhận được nhỏ hơn 3, đèn LED được kết nối với chân D13 của Arduino nô lệ sẽ vẫn bật nếu không đèn LED vẫn tắt.

Giao tiếp I2C giữa hai Arduinos

Để xây dựng chương trình này, chúng ta cần các thành phần sau:

  • Hai Arduinos (Chủ và nô lệ)

  • LED-Thạc sĩ

  • Nô lệ LED

  • Dây kết nối

Kết nối I2C giữa hai Bảng Arduino

Hình dưới đây cho thấy các kết nối I2C giữa hai bảng Arduino. Ngoài ra, nó cho thấy kết nối của đèn LED với D13 của nô lệ Arduino. Kết nối chân cực dương của đèn LED với chân kỹ thuật số Arduino 13 thông qua điện trở giới hạn dòng điện 220 ohm. Chốt catốt sẽ được nối đất.

  1. Bên cạnh để bật giao tiếp I2C, hãy kết nối các chân I2C A4 và A5 của Arduino chính với các chân I2C của Arduino nô lệ.

  2. Sau đó, bằng cách sử dụng dây nhảy chung mặt đất của cả hai bảng Arduino.

  3. Sau khi thực hiện kết nối, hãy tải mã của cả nô lệ và chủ lên bảng Arduino.

Giao tiếp I2C giữa hai bảng Arduino mô phỏng

Bây giờ trước tiên hãy thảo luận về mã thiết bị chính Arduino.

Mã thiết bị chính Arduino I2C

Ở đây thư viện dây đã được bao gồm và biến x được bắt đầu. Giá trị của biến này sẽ được truyền đến thiết bị phụ.

#include <Wire.h>

int x = 0;

Ở đây hàm wire.begin() đã được gọi. Chi tiết có thể được tìm thấy trong phần trên. Ngoài ra bộ đệm nội bộ đã được bắt đầu.

void setup() 

{

  Wire.begin(); 

  Serial.begin(9600);

  pinMode(LED,OUTPUT);

}

Ở đây việc truyền tải đã được bắt đầu với địa chỉ nô lệ là 9. Sau đó, giá trị của x đã được xếp hàng để truyền qua bus I2C. Hàm wire.write() truyền giá trị hiện tại của 'x' trên bus I2C. Cuối cùng, giá trị của x đã được truyền đi và bus đã được tha bằng lệnh endTranmission().

Wire.beginTransmission(9);

Wire.write(x);              

Wire.endTransmission();

Giá trị của x được tăng theo bước 1 trong vòng lặp với độ trễ 200milli giây, nếu giá trị của x lớn hơn 6, giá trị này được đặt lại về 0 và một lần nữa tăng từ 0.

x++;

if (x > 6) 

  {

    x = 0;

  }

delay(200);

Hoàn thành mã Arduino chính

#include <Wire.h>

int LED=13;

int x = 0;

 

void setup() 

{

  Wire.begin(); 

  Serial.begin(9600);

  pinMode(LED,OUTPUT);

}

 

void loop() 

{

  Wire.beginTransmission(9);

  Wire.write(x);              

  Wire.endTransmission();

 

  x++;

  if (x > 6) 

  {

    x = 0;

  }

  delay(200);

}

Mã thiết bị nô lệ Arduino I2C

Đầu tiên, chúng tôi xác định tên tượng trưng cho chân D13 của Arduino. Chân D13 sẽ bật và tắt tùy thuộc vào giá trị nhận được từ thiết bị chính. Ngoài ra, chúng ta khai báo và khởi tạo một biến x bằng không. Biến x này sẽ được sử dụng để lưu trữ giá trị nhận được từ một Arduino chính.

#include <Wire.h> // add i2c library 

int LED = 13;

int x = 0;

Bên trong chức năng thiết lập, đặt chân LED làm chân ouput bằng chức năng pinMode (). Cũng đặt địa chỉ nô lệ của Arduino thành 9.

 pinMode(LED, OUTPUT);

 Wire.begin(9); 

 Wire.onReceive(receiveEvent);

 Serial.begin(9600);

Khai báo và gọi hàm đã được thực hiện như được định nghĩa trong phần trên. Tại đây hàm receiveEvent () đã được đăng ký bằng cách gọi hàm onReceive(handler).

void receiveEvent(int bytes) 

{

  x = Wire.read();

}

Hàm reciveEvent () này đã được định nghĩa ở đây. Nó đọc giá trị từ 1 đến 6 sẽ được gửi bởi thiết bị chính; và sau đó lưu trữ giá trị này trong biến x đã được khai báo trong chức năng thiết lập của chương trình.

void loop() 

{

  if (x <= 3) 

  {

    digitalWrite(LED, HIGH);

  }

  else 

  {

    digitalWrite(LED, LOW);

  }

}

Nếu giá trị của x nhận được từ thiết bị chính nhỏ hơn hoặc bằng 3, đèn LED ở chân 13 được đặt để BẬT và nếu giá trị của x lớn hơn 3, đèn LED ở chân 13 được đặt để TẮT.

Hoàn thành mã thiết bị nô lệ

#include <Wire.h>

int LED = 13;

int x = 0;

 

void setup() 

{

  pinMode (LED, OUTPUT);

  Wire.begin(9); 

  Wire.onReceive(receiveEvent);

  Serial.begin(9600);

}

 

void receiveEvent(int bytes) 

{

  x = Wire.read();

}

 

void loop() 

{

  if (x <= 3) 

  {

    digitalWrite(LED, HIGH);

  }

  else 

  {

    digitalWrite(LED, LOW);

  }

}

Trình diễn phần cứng

Để xem phần trình diễn, hãy tải mã chủ và mã nô lệ lên bảng Arduino. Tuy nhiên, trước khi tải mã lên, hãy đảm bảo chọn bảng Arduino từ Bảng > Công cụ và cũng chọn cổng COM chính xác mà bảng Arduino được kết nối từ Công cụ > Cổng.

chọn Arduino uno

Master Arduino sẽ liên tục truyền dữ liệu qua bus I2C và dữ liệu sẽ nằm trong khoảng từ 0-6. Tùy thuộc vào dữ liệu mà thiết bị phụ nhận được và các điều kiện được đề cập ở trên Led ở chân 13 được bật và tắt.

Bản demo I2C Communication between Two ArduinosGiao tiếp I2C giữa hai bảng Arduino

Các ứng dụng của giao tiếp I2C

  • Giao tiếp này được sử dụng để cân bằng màu sắc, thay đổi độ tương phản và màu sắc trong màn hình.

  • Trong loa thông minh, âm lượng được thay đổi bằng phương thức giao tiếp này.

  • Nó được sử dụng trong việc đọc các cảm biến chẩn đoán như tốc độ quạt trong máy tính.

  • Bật và TẮT nguồn điện trong các thành phần hệ thống.

  • Truy cập đồng hồ thời gian thực và chip NVRAM giữ cài đặt của người dùng.

Ưu điểm và nhược điểm của giao tiếp I2C

Ưu điểm

Nó có thể thích ứng được vì nó duy trì nhiều giao tiếp chủ và nhiều nô lệ
. Chỉ sử dụng hai dây Nó rất linh hoạt có thể dễ dàng thích ứng với các yêu cầu của các thiết bị
phụ khác nhau ACK / NACK khẳng định rằng mỗi cạnh đã được gửi một cách hiệu quả. Các thiết bị có thể được
giới thiệu hoặc loại bỏ trên xe buýt.

Nhược điểm

Nó không áp dụng cho giao tiếp đường dài Chỉ sử dụng hai dây
Nó có tốc độ chậm Yêu cầu nhiều không gian hơn vì việc sử dụng điện trở
Phức tạp khi số lượng thiết bị tăng lên.

>>> 100+ Mã Sản Phẩm Dây Rút: https://mecsu.vn/san-pham/day-rut-nhua.5op

>>> 1000+ Mã Sản Phẩm Đầu Cosse: https://mecsu.vn/san-pham/dau-cosse.Q1j

Bài viết cùng chuyên mục

NHANH

NHANH

Vì Đổi mới liên tục nên Nhanh hơn

ĐÚNG

ĐÚNG

Coi trọng và ưu tiên việc làm Đúng

ĐỦ

ĐỦ

Tìm và mua Đủ Đơn hàng hơn

KỊP THỜI

KỊP THỜI

Hiệu suất tối ưu bởi Kịp Thời hơn