Powered by Drupal, an open source content management system

การประยุกต์ใช้งาน Embedded Linux Computer (ตอนที่ 10 - i2c Hardware)

Embedded Linux ก็เหมือนกับ Embedded System ทั่วไปครับที่จำเป็นต้องมี I/O Port เพื่อติดต่อควบคุมอุปกรณ์ภายนอก เนื่องจาก ELC ของเราดัดแปลงมาจาก Router ซึ่งไม่ได้มีความจำเป็นต้องใช้ I/O Port มากมาย ดังนั้น I/O Port ที่มีอยู่บนพีซีบีจึงค่อนข้างจำกัดและถูกใช้ไปเพื่อการอื่นจนหมดสิ้น เนื่องจากเป้าหมายของโครงการเราต้องการ Input Pin เพื่อตรวจสอบสถานะของการเปิดปิดประตูโรงรถ เราจึงจำเป็นต้องหาทางขยาย I/O Port จากสิ่งที่มีอยู่แล้ว
ทางเลือกในการขยาย I/O Port ของเราก็โดยการใช้ I2C Bus ซึ่งเป็นBusที่มีคุณสมบัติของความเป็นBusครบถ้วนและต้องการเพียงสายสัญญานสองเส้นคือ SDA (Data) กับ SCL (Clock) ในการควบคุม 
 
เนื่องจาก I2C Bus ไม่ใช่เรื่องใหม่ดังนั้นจึงขอไม่ลงในรายละเอียด สำหรับผู้ที่สนใจสามารถทบทวนได้จากเวบมากมายเพียงแต่ใส่ Introduction to i2c ใน Google ตัวอย่างเช่น http://www.esacademy.com/myacademy/classes/I2CIntro/I2CIntro_files/frame.htm?category=
 
จากรูปข้างบนเราจะขยายPortโดยใช้ IC PCF8574AN (Remote 8-Bit I/O Expander for I2C-Bus) ซึ่งเป็นชิพที่ใช้ควบคุมโดย I2C Bus สามารถตั้งให้มี Slave Address ต่างกันได้ถึง 8 ตัว ดังนั้นเราสามารถที่จะขยาย Port ได้สูงสุดถึง 64 bit หากต้องการ ในกรณีโปรเจ็คของผม ผมวางแผนที่จะใช้สองตัวแยกกันระหว่าง Input กับ Output
 
ข้อมูลของ PCF8574AN
อ้างอิง Datasheet ของ PCF8574AN (http://focus.ti.com/docs/prod/folders/print/pcf8574a.html)
 
การใช้งาน I2C Bus ต้องใช้สายสัญญานดังนี้
1. 3.3 V
2. GND
3. SDA
4. SCL
ซึ่งเราจำเป็นต้องดึงมาจาก GPIO และ Contact บนบอร์ด ดังนั้นจึงมาถึงจุดที่ท่านต้องต้องตัดสินใจแล้วว่า http://www.youtube.com/watch?v=uGQF8LAmiaE
ฮ่าๆๆ เลือกสีแดงใช่ไหมครับ งั้นได้เวลา Void Warranty แล้วครับ เพราะเราต้องทำการแกะฝาเพื่อหาจุดบัดกรีสายSDA และ SCL ต่อออกมายังบอร์ดภายนอก เริ่มต้นกันเลยครับ
 
 
1. หมุนเพื่อถอดเสาอากาศออก จากนั้นก็ฉีกสติ๊กเกอร์ Warranty ทิ้งไป ในบางรุ่นจะมีสกรูซ่อนอยู่ภายใต้ขายางที่ต้องปลดออกก่อน (สายที่เห็นต่อออกมาตรงกลางเป็นสายที่ผมต่อ Serial Port ครับ)
 
 
2. ออกแรงเพื่อแยกส่วนพลาสติคสีน้ำเงินออกจากสีเทาจะเห็นว่ามีสลักเพื่อยึดอยู่ โดยทำทั้งสองด้าน และทำทีละด้าน
 
 
3. พลักพื้นที่เป็นฝาล่างเพื่อแยกให้ออกจากฝาด้านบน แล้วยกขึ้นเพื่อถอดออก
 
 
4. ปลดสกรูสองตัวที่ยึดกับฝาด้านล่างออก
 
 
5. หลังจากแยกบอร์ดเปล่าๆออกมาแล้ว หงายท้องดู จะมีพื้นที่สองส่วนที่เราจะให้ความสนใจเป็นพิเศษครับ
 
ส่วนที่สอง
 
ส่วนที่หนึ่ง
 
6. จากที่กล่าวข้างต้น การใช้งาน I2C Bus ต้องการสายสัญญาน 3.3V, GND, SDA, SCL 
- 3.3V กับ GND จะมาจาก Connector ในส่วนที่สอง
- SDA จะมาจากจุดใดจุดหนึ่งระหว่าง 1-2 ของ White LED  (LED อยู่อีกด้านของ PCB)
- SCL จะมาจากจุดใดจุดหนึ่งระหว่าง 5-6 ของ DMZ LED
 
เนื่องจากความขี้เกียจในการไล่สายเพื่อดูว่าจะใช้จุดไหน เพราะสายตาเริ่มมีปัญหากับสิ่งที่เล็กๆเลยใช้วิธีดังนี้
 
6.1 หาจุดสำหรับ SCL โดยการวัด Volt ระหว่างจุด 5 และ 6 เทียบกับ GND ระหว่างที่ LED ดับได้ดังนี้
5-GND = 3.3 V
6-GND = 3.3 V
 
6.2 เปิดไฟ DMZ LED ด้วยคำสั่ง
# echo 1 > /proc/diag/led/dmz
 
6.3 วัด Volt ระหว่างจุด 5 และ 6 เทียบกับ GND ระหว่างที่ LED ติดได้ดังนี้
5-GND = 3.3 V
6-GND = 0.1 V
 
จะเห็นว่าจุดที่ 6 มีการเปลี่ยนแปลงระหว่าง 0.1 ถึง 3.3 V ดังนั้น สำหรับ SCL เราจะดึงมากจากจุดที่ 6
ใช้วิธีเดียวกันในการหาจุดสำหรับ SDA โดยคำสั่งในการเปิด White LED คือ
# echo 1 > /proc/diag/led/ses_white
 
ผลคือสำหรับ SDA เราจะดึงมาจากจุดที่ 2
 
Tip
ลองใช้คำสั่ง
# ls /proc/diag/led เพื่อดูว่าเราสามารถเปิดปิด LED ตัวใดได้บ้าง
ในการปิดไฟ ให้ echo 0 แทนการ echo 1
 
สรุปจุดสัญญานสำหรับ I2C Bus
 
- SDA จะดึงมาจากจุดที่ 2 และ SCL จะดึงมาจากจุดที่ 6 ในส่วนที่หนึ่ง

- 3.3 V และ GND จะดึงมาจาก Connector ในส่วนที่สอง

 
 
เมื่อได้สัญญานที่จำเป็นสำหรับการใช้งาน I2C Bus แล้วก็ต้องมีบอร์ดสำหรับทดสอบ พอดีผมมีบอร์ดที่ทำค้างไว้จากโปรเจ็คเก่าๆเลยขุดมาลองของก่อนเลย
 
 
บอร์ดนี้ประกอบด้วย PCF8574AN หนึ่งตัวที่ตั้ง Slave Address ไว้ที่ 0x38 และชิพ I2C Real Time Clock DS1307 ตั้ง Slave Address ไว้ที่ 0x68
 
 
ไดอะแกรมของวงจรอัปลักษณ์หน่อยนึงนะครับ ฮ่าๆๆ เพราะไม่ได้ทำพีซีบีนานแล้วเลยไม่ได้ติดตั้งโปรแกรมวาดไดอะแกรมสวยๆเอาไว้
มาถึงจุดนี้ฮาร์ดแวร์ก็พร้อมแล้วครับ ขั้นต่อไปก็คือการเตรียมการสำหรับซอฟแวร์เพื่อใช้ในการทดสอบฮาร์แวร์ ซึ่งขอยกยอดไว้ในตอนถัดไปเนื่องจากภาพในตอนนี้จะเยอะมากไปทำให้โหลดนาน