แนะนำเรื่องการใช้ I2C สำหรับ Arduino, ESP32 และ Micro Python

I²C – Wikipedie

I2C — Arduino-ESP32 2.0.6 documentation

ความสัมพันธ์

I2C เป็นโปรโตคอลการสื่อสารที่ถูกออกแบบมาเพื่อใช้ในการเชื่อมต่ออุปกรณ์อิเล็กทรอนิกส์ในระบบแบบแปลงข้อมูลแบบมาสเตอร์-สแลฟ (Master-Slave) ซึ่งหมายความว่ามีอุปกรณ์หลัก (Master) และอุปกรณ์ย่อย (Slave) ที่เชื่อมต่อกันผ่านสาย SDA และ SCL.

  • Master (ผู้ควบคุมหลัก): อุปกรณ์หลักใช้ในการส่งคำสั่งและข้อมูลไปยังอุปกรณ์ย่อย (Slave) โดยอาศัย I2C address ของแต่ละอุปกรณ์. Master กำหนดความเร็วในการสื่อสาร (บางครั้งเรียกว่า Baud rate) และควบคุมการสื่อสารโดยรวมในเครือข่าย I2C.
  • Slave (ผู้ควบคุมย่อย): อุปกรณ์ย่อยรอรับคำสั่งและข้อมูลจาก Master โดยอ้างอิงถึง I2C address ของตัวเอง. Slave จะตอบสนองกับคำสั่งของ Master และส่งข้อมูลกลับหา Master ตามที่ได้รับคำสั่ง.

ความจำเป็น :

การใช้งาน I2C มีความจำเป็นในหลายสถานการณ์ เช่น:

  • การสื่อสารกับอุปกรณ์นิ่ง (Peripherals): I2C มักถูกใช้ในการสื่อสารกับอุปกรณ์เซ็นเซอร์และโมดูลต่าง ๆ ที่อยู่ในระบบภายนอก เช่น อุปกรณ์เก็บข้อมูลแบบ EEPROM, อุปกรณ์เรนเดอร์แสดงผล OLED, หรือเซ็นเซอร์อุณหภูมิ.
  • การเชื่อมต่อหลายอุปกรณ์: I2C ช่วยให้คุณสามารถเชื่อมต่อหลายอุปกรณ์ไปยังไมโครคอนโทรลเลอร์เดียว โดยใช้แค่สองสายเท่านั้น นี่เป็นประโยชน์ในโปรเจกต์ที่มีหลายอุปกรณ์ที่ต้องการการสื่อสาร.
  • ประหยัดพื้นที่: I2C เป็นโปรโตคอลที่ใช้เส้นสายน้อยกว่า การสื่อสารแบบอื่น ๆ เช่น SPI (Serial Peripheral Interface) หรือ UART (Universal Asynchronous Receiver-Transmitter) ซึ่งทำให้เหมาะสำหรับโปรเจกต์ที่มีพื้นที่จำกัด.
  • ความสะดวกและเร็ว: I2C มีความสะดวกในการใช้งานและมีความเร็วในการสื่อสารที่เพียงพอสำหรับส่วนใหญ่ของโปรเจกต์.
  • การติดตั้งและการใช้งาน: มีไลบรารีที่มีอยู่สำหรับ I2C บนหลายไมโครคอนโทรลเลอร์ที่ทำให้ง่ายต่อการติดตั้งและการใช้งาน.

ดังนั้น I2C เป็นโปรโตคอลที่มีประโยชน์มากในการเชื่อมต่อและควบคุมอุปกรณ์อิเล็กทรอนิกส์ในโปรเจกต์ที่ต้องการการสื่อสารระหว่างไมโครคอนโทรลเลอร์และอุปกรณ์อื่น ๆ ในระบบของคุณโดยมีความสะดวกและประหยัดพื้นที่อีกด้วย.



การใช้งาน I2C (Inter-Integrated Circuit) เป็นหนึ่งในวิธีที่ดีในการเชื่อมต่ออุปกรณ์อิเล็กทรอนิกส์ต่าง ๆ กับไมโครคอนโทรลเลอร์เช่น Arduino, ESP32 และไมโครไพทอล เนื้อหาในบทความนี้จะช่วยคุณเริ่มต้นในการใช้งาน I2C เบื้องต้นสำหรับเครื่องมือเหล่านี้

1. I2C เบื้องต้น

I2C เป็นมาตรฐานสื่อสารที่ออกแบบมาเพื่อใช้ในการเชื่อมต่ออุปกรณ์อิเล็กทรอนิกส์ในระบบแบบแปลงข้อมูลแบบมาสเตอร์-สแลฟ. มันใช้สายสองเส้นสำหรับการสื่อสาร - SDA (Serial Data Line) และ SCL (Serial Clock Line). นี่คือขั้นตอนพื้นฐานในการใช้งาน I2C:

  • ให้ตรวจสอบความถูกต้องของการต่อสาย SDA และ SCL ระหว่างอุปกรณ์ที่คุณต้องการเชื่อมต่อและไมโครคอนโทรลเลอร์ของคุณ (Arduino, ESP32, หรือไมโครไพทอล).
  • ต้องมีข้อมูลที่แน่นอนเกี่ยวกับที่อยู่ I2C ของอุปกรณ์ (หรือที่เรียกว่า I2C address) ซึ่งต้องระบุในโค้ดของคุณ.
  • คุณต้องเขียนโค้ดในไมโครคอนโทรลเลอร์เพื่อส่งข้อมูลไปยังอุปกรณ์ I2C หรือรับข้อมูลจากอุปกรณ์ I2C โดยใช้ไลบรารีหรือไลบรารีที่มีอยู่สำหรับแต่ละไมโครคอนโทรลเลอร์.

2. การใช้ I2C บน Arduino

การต่อสาย

  • ใน Arduino, สาย SDA และ SCL ประกอบด้วยขา A4 และ A5 ตามลำดับ.

การเขียนโค้ด

  • คุณสามารถใช้ Wire Library ใน Arduino ในการเขียนโค้ดสำหรับ I2C.

#include <Wire.h>

 void setup() {

  Wire.begin(); // เริ่มต้นการใช้งาน I2C

  // สามารถเพิ่มการตั้งค่าอื่น ๆ ตามต้องการ

}

 void loop() {

  // โค้ดเชื่อมต่อกับอุปกรณ์ I2C และสื่อสารข้อมูลได้ที่นี่

}

 

3. การใช้ I2C บน ESP32

อ้างอิง : https://espressif-docs.readthedocs-hosted.com/projects/arduino-esp32/en/latest/api/i2c.html

การต่อสาย

  • ใน ESP32, สาย SDA และ SCL ประกอบด้วยขา GPIO 21 และ GPIO 22 ตามลำดับ.

การเขียนโค้ด

  • คุณสามารถใช้ไลบรารี Wire.h ใน ESP32 เช่นเดียวกับ Arduino.

 

#include <Wire.h>

 void setup() {

  Wire.begin(); // เริ่มต้นการใช้งาน I2C

  // สามารถเพิ่มการตั้งค่าอื่น ๆ ตามต้องการ

}

 

void loop() {

  // โค้ดเชื่อมต่อกับอุปกรณ์ I2C และสื่อสารข้อมูลได้ที่นี่

}

 

4. การใช้ I2C บน Micro Python

การต่อสาย

  • การต่อสาย I2C บนไมโครไพทอลจะขึ้นอยู่กับบอร์ดคอนโทรลเลอร์ที่คุณใช้. คุณต้องทำการต่อสาย SDA และ SCL ไปยังขาที่เหมาะสมของบอร์ด.

การเขียนโค้ด

  • คุณต้องใช้ไลบรารี I2C ที่เหมาะสำหรับไมโครไพทอล ที่อาจต่างกันไปตามบอร์ดและไมโครคอนโทรลเลอร์ที่คุณใช้.

นี่คือการเริ่มต้นเบื้องต้นในการใช้งาน I2C สำหรับ Arduino, ESP32, และไมโครไพทอล โปรดทราบว่าการใช้งาน I2C อาจต้องปรับแต่งตามอุปกรณ์และโครงการของคุณ. ตรวจสอบเอกสารและคู่มือที่เกี่ยวข้องของผู้ผลิตไมโครคอนโทรลเลอร์และอุปกรณ์ I2C เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการใช้งาน I2C ในบทบาทที่คุณต้องการใช้งาน.




Code : 

#include <Arduino.h>
#include <Wire.h>

// กำหนดที่อยู่ I2C สำหรับอุปกรณ์สามตัว
#define SLAVE_ADDRESS_1 8
#define SLAVE_ADDRESS_2 9
#define SLAVE_ADDRESS_3 10

void setup() {
Wire.begin(); // กำหนดค่าเริ่มต้นให้การสื่อสารผ่าน I2C
Serial.begin(9600); // กำหนดค่าเริ่มต้นให้การสื่อสารผ่านช่องทางอีกช่องหนึ่งสำหรับการดีบัค
}

void loop() {
// จัดการการสื่อสารกับแต่ละอุปกรณ์แยกกัน
handleDevice1(SLAVE_ADDRESS_1);
handleDevice2(SLAVE_ADDRESS_2);
handleDevice3(SLAVE_ADDRESS_3);

// โค้ดเพิ่มเติมสำหรับงานที่ซ้ำกัน
}

void handleDevice1(int address) {
// สื่อสารกับอุปกรณ์ 1 (ที่อยู่อาณาเขต: SLAVE_ADDRESS_1)
Wire.beginTransmission(address); // เริ่มการสื่อสารกับอุปกรณ์
// ส่งคำสั่งหรือข้อมูลที่เฉพาะกับอุปกรณ์ 1
Wire.write("คำสั่งสำหรับอุปกรณ์ 1");
Wire.endTransmission(); // สิ้นสุดการสื่อสาร
}

void handleDevice2(int address) {
// สื่อสารกับอุปกรณ์ 2 (ที่อยู่อาณาเขต: SLAVE_ADDRESS_2)
Wire.beginTransmission(address); // เริ่มการสื่อสารกับอุปกรณ์
// ส่งคำสั่งหรือข้อมูลที่เฉพาะกับอุปกรณ์ 2
Wire.write("คำสั่งสำหรับอุปกรณ์ 2");
Wire.endTransmission(); // สิ้นสุดการสื่อสาร
}

void handleDevice3(int address) {
// สื่อสารกับอุปกรณ์ 3 (ที่อยู่อาณาเขต: SLAVE_ADDRESS_3)
Wire.beginTransmission(address); // เริ่มการสื่อสารกับอุปกรณ์
// ส่งคำสั่งหรือข้อมูลที่เฉพาะกับอุปกรณ์ 3
Wire.write("คำสั่งสำหรับอุปกรณ์ 3");
Wire.endTransmission(); // สิ้นสุดการสื่อสาร
}