Arduino - วงจรรวมอินเตอร์
Inter-integrated circuit (I2C) เป็นระบบสำหรับการแลกเปลี่ยนข้อมูลแบบอนุกรมระหว่างไมโครคอนโทรลเลอร์และวงจรรวมเฉพาะของคนรุ่นใหม่ ใช้เมื่อระยะห่างระหว่างกันสั้น (ตัวรับและตัวส่งมักจะอยู่บนบอร์ดพิมพ์เดียวกัน) การเชื่อมต่อถูกสร้างขึ้นผ่านตัวนำสองตัว หนึ่งใช้สำหรับการถ่ายโอนข้อมูลและอีกอันใช้สำหรับการซิงโครไนซ์ (สัญญาณนาฬิกา)
ดังที่เห็นในรูปต่อไปนี้อุปกรณ์ชิ้นหนึ่งมักจะเป็นหลัก ดำเนินการระบุที่อยู่ของชิปทาสหนึ่งตัวก่อนที่การสื่อสารจะเริ่มขึ้น ด้วยวิธีนี้ไมโครคอนโทรลเลอร์หนึ่งตัวสามารถสื่อสารกับอุปกรณ์ต่างๆได้ 112 เครื่อง โดยทั่วไปอัตราบอดคือ 100 Kb / วินาที (โหมดมาตรฐาน) หรือ 10 Kb / วินาที (โหมดอัตราการรับส่งข้อมูลช้า) ระบบที่มีอัตราการส่งข้อมูล 3.4 Mb / วินาทีเพิ่งปรากฏขึ้น ระยะห่างระหว่างอุปกรณ์ที่สื่อสารผ่านบัส I2C ถูก จำกัด ไว้ที่หลายเมตร
พินบอร์ด I2C
บัส I2C ประกอบด้วยสองสัญญาณ - SCL และ SDA SCL คือสัญญาณนาฬิกาและ SDA คือสัญญาณข้อมูล บัสมาสเตอร์ปัจจุบันจะสร้างสัญญาณนาฬิกาเสมอ อุปกรณ์สเลฟบางตัวอาจบังคับให้นาฬิกาต่ำในบางครั้งเพื่อหน่วงเวลาที่มาสเตอร์จะส่งข้อมูลมากขึ้น (หรือต้องการเวลาในการเตรียมข้อมูลมากขึ้นก่อนที่มาสเตอร์จะพยายามนาฬิกาออก) สิ่งนี้เรียกว่า "นาฬิกายืด"
ต่อไปนี้เป็นพินสำหรับบอร์ด Arduino ต่างๆ -
- Uno, Pro Mini A4 (SDA), A5 (SCL)
- เมกะ, ครบกำหนด20 (SDA), 21 (SCL)
- ลีโอนาร์โด, หยุน2 (SDA), 3 (SCL)
Arduino I2C
เรามีสองโหมด - รหัสหลักและรหัสทาส - เพื่อเชื่อมต่อบอร์ด Arduino สองตัวโดยใช้ I2C พวกเขาคือ -
- เครื่องส่งสัญญาณหลัก / ตัวรับทาส
- ตัวรับสัญญาณหลัก / เครื่องส่งสัญญาณทาส
เครื่องส่งสัญญาณหลัก / ตัวรับทาส
ตอนนี้ให้เราดูว่าตัวส่งสัญญาณหลักและตัวรับสัญญาณทาสคืออะไร
เครื่องส่งสัญญาณหลัก
ฟังก์ชันต่อไปนี้ใช้เพื่อเริ่มต้นไลบรารี Wire และเข้าร่วมบัส I2C เป็นมาสเตอร์หรือทาส โดยปกติจะเรียกเพียงครั้งเดียว
Wire.begin(address) - แอดเดรสคือที่อยู่ทาส 7 บิตในกรณีของเราเนื่องจากไม่ได้ระบุมาสเตอร์และจะเข้าร่วมบัสในฐานะมาสเตอร์
Wire.beginTransmission(address) - เริ่มต้นการส่งไปยังอุปกรณ์ทาส I2C ด้วยที่อยู่ที่กำหนด
Wire.write(value) - คิวไบต์สำหรับการส่งจากอุปกรณ์ต้นแบบไปยังอุปกรณ์ทาส (ในระหว่างการโทรไปยัง beginTransmission () และ endTransmission ())
Wire.endTransmission() - สิ้นสุดการส่งไปยังอุปกรณ์ทาสที่เริ่มต้นโดย startTransmission () และส่งไบต์ที่จัดคิวโดย 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);
}
ผู้รับทาส
ใช้ฟังก์ชันต่อไปนี้ -
Wire.begin(address) - แอดเดรสคือที่อยู่ทาส 7 บิต
Wire.onReceive(received data handler) - ฟังก์ชั่นที่จะเรียกใช้เมื่ออุปกรณ์ทาสได้รับข้อมูลจากต้นแบบ
Wire.available() - ส่งคืนจำนวนไบต์ที่พร้อมใช้งานสำหรับการดึงข้อมูลด้วย Wire.read () ซึ่งควรถูกเรียกภายในตัวจัดการ 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
}
}
ตัวรับสัญญาณหลัก / เครื่องส่งสัญญาณทาส
ตอนนี้ให้เราดูว่าตัวรับสัญญาณหลักและเครื่องส่งสัญญาณทาสคืออะไร
ผู้รับปริญญาโท
Master ได้รับการตั้งโปรแกรมให้ร้องขอและอ่านไบต์ของข้อมูลที่ส่งมาจาก Slave Arduino ที่ไม่ซ้ำกัน
ใช้ฟังก์ชันต่อไปนี้ -
Wire.requestFrom(address,number of bytes)- ใช้โดยต้นแบบเพื่อขอไบต์จากอุปกรณ์ทาส จากนั้นไบต์อาจถูกดึงมาด้วยฟังก์ชัน wire.available () และ 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);
}
เครื่องส่งสัญญาณทาส
ใช้ฟังก์ชันต่อไปนี้
Wire.onRequest(handler) - ฟังก์ชันถูกเรียกใช้เมื่อมาสเตอร์ร้องขอข้อมูลจากอุปกรณ์ทาสนี้
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++;
}