Chuẩn Giao Tiếp I2C Arduino Và Thư Viện Wire.h - OhStem

Chắc hẳn là đã có bài viết giới thiệu về giao tiếp I2C Arduino trên Internet rồi. Vậy nên, bài viết này OhStem xin nói về một góc nhìn khác: cách liên kết và sử dụng giao tiếp I2C trong Arduino.

Nếu các bạn quan tâm về khái niệm I2C là gì, bạn hoàn toàn có thể xem lại những bài viết về giao tiếp I2C Arduino của các bạn khác nhé!

>> Xem thêm: [PDF] Lập trình Arduino là gì? Tài liệu học Arduino miễn phí 2021

Mục lục

Toggle
  • Chuẩn giao tiếp I2C Arduino là gì?
  • Cấu tạo và nguyên lý hoạt động của I2C
  • Một số điều cần biết về giao tiếp I2C Arduino
  • Cách liên kết I2C giữa nhiều Arduino
    • Thiết bị cần dùng
    • Cách kết nối
    • Code
    • Hướng dẫn chi tiết cho board chủ (Master)
    • Hướng dẫn chi tiết cho board tớ (Slave)
  • Tổng kết

Chuẩn giao tiếp I2C Arduino là gì?

giao tiếp I2C Arduino
Giao tiếp I2C arduino

Đầu năm 1980, hãng sản xuất linh kiện điện tử Phillips đã thiết kế một chuẩn giao tiếp nối tiếp 2 dây, hay còn gọi là chuẩn giao tiếp I2C. I2C hay còn gọi là Inter-Integrated Circuit. Đây là cổng để giao tiếp giữa các IC với nhau.

Chuẩn giao tiếp I2C Arduino đầu tiên được thiết kế và phát triển từ Philips. Tuy nhiên, nó đã được hầu hết nhà sản xuất IC trên khắp năm châu sử dụng. I2C trở thành một chuẩn quan trọng trong các giao tiếp điều khiển ngoại vi.

Ngoài Philips thì còn có các ông lớn công nghệ khác như: Texas Instrument(TI), National Semiconductor Maxim Dallas,… tham gia phát triển chuẩn giao tiếp này.

Bus I2C được sử dụng làm bus giao tiếp ngoại vi cho hầu hết các loại IC như:

  • Chip điều khiển 8051,ARM, AVR, PIC, AVR,…
  • Chip nhớ RAM tĩnh (Static Ram), EEPROM.
  • Bộ chuyển đổi tương tự số (ADC).
  • IC điều khiển LCD, LED.
  • Số tương tự(DAC).
  • … Và còn nhiều thứ khác nữa.
Chuẩn giao tiếp i2c Arduino
Chuẩn giao tiếp i2c

Để sử dụng và điều khiển được cổng I2C này, bạn sẽ phải sử dụng và hàn, gắn dây Jumper lại với nhau một cách cẩn thận. Dưới đây, OhStem sẽ hướng dẫn bạn cách kết nối dây cũng như viết code để tiến hành giao tiếp i2c arduino giữa nhiều board mạch với nhau

Tuy nhiên, nếu bạn là người mới bắt đầu học lập trình Arduino thì bạn có thể tham khảo thêm các board mạch Arduino sử dụng chuẩn cắm Grove. Những chuẩn cắm này sẽ giúp bạn dễ dàng thực hành các dự án Arduino hơn. Bạn chỉ cần tập trung vào nghiên cứu code và các dự án mình cần làm, việc nối dây đã có chuẩn cắm Grove lo!

Ưu điểm: Bạn không cần phải hàn, gắn dây Jumper phức tạp và lộn xộn như trước nữa.

Bạn có thể tìm mua các bộ Arduino sử dụng chuẩn Grove tại đây.

>> Dành cho bạn: Buổi tập huấn về “Thực hành mạch điện tử trong dạy học STEM môn Vật Lý”

Tập huấn STEM về mạch điện tử trong dạy học STEM

Đăng ký ngay

Cấu tạo và nguyên lý hoạt động của I2C

Chuẩn giao tiếp I2C arduino thường sẽ sử dụng hai đường truyền tín hiệu:

  • Một đường xung nhịp đồng hồ (hay còn gọi là SCL) chỉ do Master phát đi (Bình thường là ở mức 100kHz và 400kHz. Mức cao nhất là 1Mhz và 3.4MHz).
  • Một đường dữ liệu (hay còn gọi là SDA) theo 2 chiều.

Hầu hết thiết bị đều có thể cùng được liên kết vào một bus I2C. Nhưng bạn đừng lo về việc sẽ nhầm lẫn giữa các thiết bị. Mỗi công cụ đều sẽ được phân biệt bởi một địa chỉ riêng, với một mối quan hệ chủ/tớ tồn tại trong toàn bộ thời gian kết nối.

giao tiếp i2c giữa 2 arduino

Mỗi một thiết bị hoàn toàn có thể hoạt động như là dụng cụ nhận hoặc truyền dữ liệu hay có thể vừa truyền vừa nhận. Hoạt động truyền hay nhận còn dựa trên việc dụng cụ đó là chủ (master) hay tớ (slave)

Một dụng cụ hay một IC khi liên kết với bus I2C, ngoài một địa chỉ (duy nhất) để phân biệt, nó còn được quy định là thiết bị chủ hay tớ

Lý do tạo nên sự phân biệt này ? Đó là vì trên một bus I2C thì quyền điều khiển thuộc về công cụ chủ. Công cụ chủ nắm vai trò tạo xung đồng hồ cho toàn hệ thống. Khi giữa hai thiết bị chủ-tớ giao tiếp ngoại vi thì dụng cụ chủ có chức năng tạo xung đồng hồ và quản lý địa chỉ của thiết bị tớ từ đầu tới cuối quá trình giao tiếp ngoại vi.

Bạn có thể hiểu đơn giản: công cụ chủ sẽ giữ vai trò chủ động, còn công cụ tớ sẽ đóng vai trò bị động trong việc giao tiếp bên ngoài.

Một số điều cần biết về giao tiếp I2C Arduino

  • Chuẩn giao tiếp I2C arduino sẽ sử dụng 7 bit để xác định địa chỉ, vậy nên trên một bus sẽ có thể lên đến 2^7 địa chỉ, tương ứng với 128 công cụ có thể liên kết. Nhưng ở đây chỉ có 112, 16 địa chỉ còn lại được sử dụng theo mục đích riêng. Các bit còn lại sẽ quy định việc đọc hoặc ghi dữ liệu (1 là write, 0 là read).
  • Ưu điểm vượt trội của I2C cần nhắc đến chính là mức độ hiệu suất của nó. Một khối điều khiển trung tâm hoàn toàn có thể quản lý cả một mạng lưới thiết bị mà chỉ cần hai lối ra điều khiển.
  • Bên cạnh đó, chuẩn giao tiếp I2C arduino còn có chế độ 10 bit địa chỉ, ngang bằng với 1024 địa chỉ. Cũng giống như như 7 bit, 10bit này sẽ có 1008 cổng để kết nối, còn lại 16 địa chỉ sẽ dùng để phục vụ cho mục đích riêng (Mình chưa rõ lắm).
Chế độ 10bit địa chỉ của Arduino
chuẩn giao tiếp I2C

Cách liên kết I2C giữa nhiều Arduino

Thiết bị cần dùng

Để tiến hành, chúng ta cần các thành phần sau:

  • 2 board Arduino.
  • Dây cáp jumper.

Cách kết nối

Board mạch arduino để giao tiếp i2c
chuẩn giao tiếp I2C

Bạn thực hiện theo các bước sau để kết nối 2 Arduino Uno thông qua I2C:

  • Nối chân cắm A4 và A5 trên một Arduino với các chân. Bạn thực hiện tương tự với board Arduino kia
  • GND thì phải được dùng chung đối với 2 board mạch Arduino. Nối nó với một jumper
  • Và đặc biệt chú ý, bạn không được nối Arduino 5 V và 3,3 V với nhau. Tuy không ảnh hưởng nhiều đến Arduino 5V, Nhưng chắc chắn sẽ làm hỏng Arduino 3,3V

Code

Đoạn code sau được chia thành hai phần: mã lập trình cho chủ và mã lập trình cho tớ (slave).

Đầu tiên mình sẽ hướng dẫn làm code chủ:

Viết code cho board chủ

Và đây là đoạn code mà board tớ (slave) phiên dịch lại các ký tự nhận từ chủ:

Board slave phiên dịch khi nhận giao tiếp i2c arduino

Hướng dẫn chi tiết cho board chủ (Master)

  • Bước đầu, chúng ta hãy nhìn vào board chủ. Mình sẽ cần đến thư viện Wire.h:
thư viện wire.h arduino
  • Sau đó, trong phần lập trình, chúng ta bắt đầu thông qua việc sử dụng hàm Wire.begin (). Nếu như trong hàm không có đối số nào được cung cấp, Arduino này sẽ là bo chủ.
  • Cuối cùng, chúng ta gửi một ký tự x, nằm từ 0 đến 5. Chúng ta chọn các hàm sau để bắt đầu truyền tới thiết bị có địa chỉ 9, sau đó nhập ký tự và dừng truyền:

Hướng dẫn chi tiết cho board tớ (Slave)

  • Tương tự, hãy thêm thư viện Wire.h vào. Tuy nhiên, bạn sẽ bắt đầu bus I2C bằng cách sử dụng Wire.begin (9). Số trong đối số chính là địa chỉ mà mình muốn sử dụng cho Arduino. Mọi thứ mà các công cụ có địa chỉ 9 sẽ tiếp nhận thông tin truyền.
  • Bây giờ chúng ta cần phản ứng lại khi nhận được tín hiệu truyền I2C. Hàm sau sẽ thêm công dụng kích hoạt bo bất cứ lúc nào nhận được ký tự. Bạn có thể hiểu là bất cứ khi nào Arduino nhận được một ký tự trên I2C, nó sẽ chạy công dụng mà chúng ta bảo nó chạy:
  • Và đây là hàm. Lúc này, chúng ta cần lưu lại giá trị của ký tự đã nhận:
  • Trong hàm loop(), chúng ta cần giải thích ký tự đó để đèn LED nháy ở các tốc độ khác nhau, tùy thuộc vào ký tự đã nhận.

Tổng kết

Trên đây là tất cả các thông tin về chuẩn giao tiếp I2C arduino cũng như cách kết nối 2 board mạch arduino lại với nhau. OhStem hy vọng bài viết này sẽ hữu ích với bạn. Nếu bạn cảm thấy việc hàn gắn dây Jumper quá khó khăn và rắc rối, bạn có thể sử dụng các loại Arduino sử dụng chuẩn cắm Grove. Đây là loại dây cắm dễ sử dụng, phù hợp cho người mới bắt đầu.

OhStem hy vọng bài viết trên sẽ hữu ích đối với bạn. Nếu có bất kỳ thắc mắc gì thì bạn có thể liên hệ qua Fanpage của OhStem để được hỗ trợ và tư vấn, hoặc là để lại comment dưới đây nhé. OhStem sẽ cố gắng phản hồi nhanh nhất có thể. Cảm ơn bạn đã theo dõi bài viết.

Nguồn thông tin: sưu tầm

Từ khóa » Thư Viện I2c Cho Arduino