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




Assigment

จากใบงาน Analog รับค่าอุณภูมิจาก Sensor NTC และการตั้งค่าอุณหภูมิจาก Potentiometer มาแสดงบนหน้าจอ LCD โดยให้บรรทัดบนแสดงค่าอุณหภูมิตั้งค่า บรรทัดล่างแสดงค่าอุณหภูมิที่วัดได้จากเซนเซอร์ และให้สถานะ LCD ติดหากอุณภูมิที่ตั้งค่าน้อยกว่าอุณหภูมิที่วัดได้จากเซนเซอร์ โดยใช้วงจรดังรูป ทังนี้ก่อนควบคุมอุณหภูมิให้หน้าจอ LCD แสดงผลช้อความทักทายค้างไว้ 5 วินาที