Lab
Synchronous
การสื่อสาร I2C
I²C ย่อมาจาก Inter Integrate Circuit (IIC) แต่นิยมเรียกว่า I²C มากกว่า เป็นการสื่อสารอนุกรมแบบ synchronous (ใช้สัญญาณนาฬิกากำหนดจังหวะการส่งข้อมูลระหว่างกัน) สามารถเชื่อมต่อกันเป็นระบบบัสทั้งรับและส่งข้อมูลหว่างกันได้หลายอุปกรณ์ ซึ่งสามารถกำหนดตำแหน่งของอุปกรณ์แต่ละตัวได้ โดยใช้สายสัญญาณจำนวนเพียง 2 เส้น คือ SCL(Clock) และ SDA (Data) ทำให้สามารถเชื่อมต่ออุปกรณ์ได้หลายตัวในระบบเดียวโดยใช้จำนวนสายไฟน้อยลง.
SCL (Serial CLock) จะกำหนดหรือส่งสัญญาณนาฬิกาเพื่อกำหนดความเร็วในการรับส่ง
SDA (Serial Data)เป็นข้อมูลที่จะใช้ในการรับหรือส่ง
ในระบบจะต้องมี 1 อุปกรณ์ที่ทำหน้าที่เป็น Master เพื่อคอยควบคุมการสื่อสารกับอุปกรณ์ของลูกข่ายที่เรียกว่า Slave ซึ่งอุปกรณ์ Master จะมีตัวหลักในการจัดการติดต่อสื่อสาร หรือเป็นตัวกลาางในการรับหรือส่งระหว่าง Slave โดย Master จะเป็นผู้เริ่มต้นในการติดต่อก่อนเสมอ โดยลักษณะของการสื่อสารเป็นระบบบัส ดังแสดงในรูปด้านล่าง
https://www.totalphase.com/blog/2020/12/differences-between-uart-i2c/?srsltid=AfmBOoolrKnYHi-NfX4S9fIWqYnEINlKNsnOjEghzgMs5wjxVqJj614i
หลักการทำงาน
เริ่มต้น Master จะส่งสัญญาณ Start ด้วยการ กำหนดลอจิก Low ที่ขา SDA และ SCL เพื่อให้อุปกรณ์ Slave รอรับข้อมูล
จากนั้นจะเรื่มส่งข้อมูล ซึ่งประกอบด้วย 7 บิตแรกเป็นตำแหน่ง (Address) ของ Slave ที่ต้องการติดต่อด้วย
จากนั้นจะส่งสัญญาณการอ่าน / เขียน เพื่อแจ้งอุปกรณ์ Slave ตัวที่ต้องการติดต่อด้วยว่าต้องการอ่าน(ส่งข้อมูลกลับ) หรือ เขียนข้อมูลให้กับ Slave (หากเป็นบิต 0 หมายถึง อ่านข้อมูล หากบิต 1 หมายถึงต้องการเขียนข้อมูล)
อุปกรณ์ Slave ทุกตัวจะได้รับสัญญาณพร้อมๆกัน และจะตรวจสอบตำแหน่ง Address ว่าตรงกับตนเองหรือไม่ ถ้าตัวใดตรงกับ Address ก็จะส่งสัญญาณ ACK กลับไปยัง Master เพืื่อแจ่งกลับไปยัง Master ว่ามีตำแหน่งที่เรียกเชื่อมต่ออยู่
ขั้นต่อไปจะเป็นการส่งสัญญาณ Clock จำนวน 8 บิต หรือข้อมูล 8 บิต (1Byte) ซึ่งอาจจะเป็นการเขียน หรืออ่านข้อมูล ระหว่าง Master และ Slave แล้ว อุปกรณ์ Slave จะตอบสนองด้วยสัญญาณ ACK อีกครั้ง เพื่อแจ้งการรับหรือส่งข้อมูลเรียบร้อยไม่ผิดพลาด หาก Slave ไม่ส่งสัญญาณ ACK กลับไป Master จะส่งข้อมูลชุดเดิมมาอีกคร้ัง เนื่องจากเข้าใจว่าอาจจะมีการผิดพลาดในการส่งเกิดขึ้น
เมื่อ Master ส่งข้อมูลเสร็จสิ้นก็จะส่งสัญญาณ STOP แจ้งมายัง Slave สิ้นสุดการส่งข้อมูล
โดยจากรูปด้านล่างเป็นลักษณะ Master อ่านข้อมูลจาก Slave
I2C ถูกออกแบบมาสำหรับการสื่อสารระยะสั้นบนแผงวงจร (PCB) หรือระหว่างอุปกรณ์ที่อยู่ใกล้กัน โดยทั่วไปมีระยะทางที่เสถียรไม่เกิน 1 เมตร หรือประมาณ 30-100 เซนติเมตร หากต้องการเชื่อมต่อระยะไกลกว่านั้น สัญญาณอาจเกิดการรบกวนและการสูญเสียข้อมูล จึงจำเป็นต้องใช้ตัวขยายสัญญาณ (Bus Extender)
การเพิ่มระยะทาง: สามารถทำได้โดยลดความเร็ว (Clock Speed) หรือใช้ IC เฉพาะทาง เช่น P82B715 หรือ P82B96 เพื่อขยายสัญญาณให้ไกลขึ้น หรือ หากต้องการเชื่อมต่อเซ็นเซอร์ที่อยู่ไกลกว่า 1-2 เมตร ควรพิจารณาเปลี่ยนไปใช้โปรโตคอลการสื่อสารอื่น เช่น RS485 หรือ CAN bus
การใช้งาน LCD ชนิด I2C
LCD (Liquid Crystal Display) คือเทคโนโลยีจอแสดงผลแบบแบนที่ใช้คุณสมบัติของผลึกเหลว (Liquid Crystal) ควบคุมการผ่านของแสงจากไฟแบ็คไลท์ (Backlight) เพื่อสร้างภาพสีสันต่างๆ นิยมใช้ในทีวี จอมอนิเตอร์ และสมาร์ทโฟน เนื่องจากมีน้ำหนักเบา บาง ประหยัดไฟ และให้ภาพที่คมชัด หรือในงานไมโครคอนโทรลเลอร์จะนิยมเป็นแบบชนิดตัวอักษร 16 อักษร 2 บรรทัด
ปัจจุบันได้มีการพัฒนาให้จอ LCD สื่อสารกับไมโครคอนโทรลเลอร์ในรูปแบบ I2c ซึ่งใช้จำนวนสายสัญญาณเพิยงแค่ 2 เส้น คือสาย SCL และ SDA เท่านั้น โดยจะใช้ไอซี PCF8574 ของบริษัท NXP ทำหน้าที่รับสัญญาณ I2C มาควบคุม LCD แบบ 4 บิต ซึ่งต้องติดตั้งอุปกรณ์ โมดูล I2C เพิ่มบนตัวจอ LCD
https://randomnerdtutorials.com/esp32-esp8266-i2c-lcd-arduino-ide/
การต่อวงจรทดลองดังรูป
วงจรใน wokwi
การใช้งาน LCD ชนิด I2C ต้องมีการติดตั้ง Library เพิ่มเติม
https://wokwi.com/projects/454041712552841217
#include LiquidCrystal_I2C.h
// set the LCD number of columns and rows
int lcdColumns = 16;
int lcdRows = 2;
// set LCD address, number of columns and rows
// if you don't know your display address, run an I2C scanner sketch
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
void setup(){
// initialize LCD
lcd.init();
// turn on LCD backlight
lcd.backlight();
lcd.setCursor(0, 0);
// print message
lcd.print("Hello, Telecom");
delay(5000);
lcd.clear();
}
void loop(){
// set cursor to first column, first row
lcd.setCursor(0, 0);
// print message
lcd.print("Hello, Line 0");
//set cursor to first column, second row
lcd.setCursor(0,1);
lcd.print("Hello, Line 1");
delay(1000);
}