Arduino - Mạch tích hợp Inter
Mạch tích hợp liên (I2C) là một hệ thống trao đổi dữ liệu nối tiếp giữa các bộ vi điều khiển và các mạch tích hợp chuyên dụng thế hệ mới. Nó được sử dụng khi khoảng cách giữa chúng ngắn (máy thu và máy phát thường nằm trên cùng một bảng in). Kết nối được thiết lập thông qua hai dây dẫn. Một được sử dụng để truyền dữ liệu và một được sử dụng để đồng bộ hóa (tín hiệu đồng hồ).
Như được thấy trong hình sau, một thiết bị luôn là thiết bị chính. Nó thực hiện định địa chỉ của một chip phụ trước khi bắt đầu giao tiếp. Bằng cách này, một vi điều khiển có thể giao tiếp với 112 thiết bị khác nhau. Tốc độ truyền thường là 100 Kb / giây (chế độ tiêu chuẩn) hoặc 10 Kb / giây (chế độ tốc độ truyền chậm). Các hệ thống có tốc độ truyền 3,4 Mb / giây gần đây đã xuất hiện. Khoảng cách giữa các thiết bị giao tiếp qua bus I2C được giới hạn trong vài mét.
Bảng I2C Pins
Bus I2C bao gồm hai tín hiệu - SCL và SDA. SCL là tín hiệu đồng hồ, và SDA là tín hiệu dữ liệu. Bus chính hiện tại luôn tạo ra tín hiệu đồng hồ. Một số thiết bị phụ có thể buộc xung nhịp ở mức thấp để trì hoãn việc gửi nhiều dữ liệu hơn cho thiết bị chính (hoặc cần nhiều thời gian hơn để chuẩn bị dữ liệu trước khi thiết bị chính cố gắng xử lý nó). Điều này được gọi là "đồng hồ kéo dài".
Sau đây là các chân cho các bảng Arduino khác nhau:
- Uno, Pro Mini A4 (SDA), A5 (SCL)
- Mega, Do 20 (SDA), 21 (SCL)
- Leonardo, Yun 2 (SDA), 3 (SCL)
Arduino I2C
Chúng tôi có hai chế độ - mã chủ và mã phụ - để kết nối hai bảng Arduino bằng I2C. Họ là -
- Máy phát chính / Máy thu nô lệ
- Máy thu chính / Máy phát nô lệ
Máy phát chính / Máy thu nô lệ
Bây giờ chúng ta hãy xem bộ phát chính và bộ thu phụ là gì.
Máy phát chính
Các chức năng sau được sử dụng để khởi tạo thư viện Wire và tham gia bus I2C với tư cách là master hoặc slave. Điều này thường chỉ được gọi một lần.
Wire.begin(address) - Địa chỉ là địa chỉ nô lệ 7-bit trong trường hợp của chúng tôi vì cái chính không được chỉ định và nó sẽ tham gia bus với tư cách là cái chính.
Wire.beginTransmission(address) - Bắt đầu truyền tới thiết bị tớ I2C với địa chỉ đã cho.
Wire.write(value) - Xếp hàng các byte để truyền từ thiết bị chủ đến thiết bị phụ (giữa các cuộc gọi tới beginTransmission () và endTransmission ()).
Wire.endTransmission() - Kết thúc quá trình truyền tới thiết bị phụ đã được bắt đầu bởi beginTransmission () và truyền các byte đã được xếp hàng bởi wire.write ().
Example
#include <Wire.h> //include wire library
void setup() //this will run only once {
Wire.begin(); // join i2c bus as master
}
short age = 0;
void loop() {
Wire.beginTransmission(2);
// transmit to device #2
Wire.write("age is = ");
Wire.write(age); // sends one byte
Wire.endTransmission(); // stop transmitting
delay(1000);
}
Người nhận nô lệ
Các chức năng sau được sử dụng:
Wire.begin(address) - Địa chỉ là địa chỉ nô lệ 7 bit.
Wire.onReceive(received data handler) - Hàm được gọi khi thiết bị tớ nhận dữ liệu từ thiết bị chủ.
Wire.available() - Trả về số byte có sẵn để truy xuất với Wire.read (). Điều này sẽ được gọi bên trong trình xử lý Wire.onReceive ().
Example
#include <Wire.h> //include wire library
void setup() { //this will run only once
Wire.begin(2); // join i2c bus with address #2
Wire.onReceive(receiveEvent); // call receiveEvent when the master send any thing
Serial.begin(9600); // start serial for output to print what we receive
}
void loop() {
delay(250);
}
//-----this function will execute whenever data is received from master-----//
void receiveEvent(int howMany) {
while (Wire.available()>1) // loop through all but the last {
char c = Wire.read(); // receive byte as a character
Serial.print(c); // print the character
}
}
Máy thu chính / Máy phát nô lệ
Bây giờ chúng ta hãy xem bộ thu chính và bộ phát phụ là gì.
Bộ thu chính
Master, được lập trình để yêu cầu, và sau đó đọc byte dữ liệu được gửi từ Slave Arduino có địa chỉ duy nhất.
Hàm sau được sử dụng:
Wire.requestFrom(address,number of bytes)- Được sử dụng bởi master để yêu cầu byte từ thiết bị phụ. Sau đó có thể truy xuất các byte bằng các hàm wire.available () và wire.read ().
Example
#include <Wire.h> //include wire library void setup() {
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output
}
void loop() {
Wire.requestFrom(2, 1); // request 1 bytes from slave device #2
while (Wire.available()) // slave may send less than requested {
char c = Wire.read(); // receive a byte as character
Serial.print(c); // print the character
}
delay(500);
}
Máy phát nô lệ
Chức năng sau đây được sử dụng.
Wire.onRequest(handler) - Một chức năng được gọi khi một chủ yêu cầu dữ liệu từ thiết bị phụ này.
Example
#include <Wire.h>
void setup() {
Wire.begin(2); // join i2c bus with address #2
Wire.onRequest(requestEvent); // register event
}
Byte x = 0;
void loop() {
delay(100);
}
// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
Wire.write(x); // respond with message of 1 bytes as expected by master
x++;
}