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++; 
}