สิ่งหนึ่งที่นักพัฒนาซอฟแวร์บน Embedded System สนใจคือการทดลองโดยการควบคุม GPIO บนบอร์ด
แล้ววิธีการควบคุม GPIO บน Linux ละ ?
วิธีการควบคุม GPIO บน Embedded Linux มีหลายวิธีมากตั้งแต่ การเขียนติดต่อกับไดรเวอร์ GPIO ,การเขียนผ่าน mmap ซึ่งวิธีหลังค่อนข้างยุ่งยากกว่าและต้องเข้าใจการตั้งค่า register หรือแม้แต่วิธีอื่นๆ เช่นเขียนลงไปใน device driver เพื่อนำไปรวมกับไดรเวอร์อื่น หรือปรับแต่งเพื่ออุปกรณ์บางอย่าง แต่เราจะไม่พูดถึงรายละเอียดเรื่องนี้นะครับ เนื่องจากบทความนี้เป็นการเริ่มต้น GPIO กับ ราสเบอรี่ไพ
ในการเขียนควบคุม GPIO ของราสเบอรรี่ไพนั้นง่ายมากเลยครับสามารถทำได้จากหลายภาษา แต่เราจะเขียนถึงแค่สองภาษาคือ C และ Python นะครับเนื่องจากเห็นว่า Raspberry PI พยายามสนับสนุนอยู่มาก
อย่างแรกเราต้องเข้าใจฮาร์ดแวร์ก่อนว่าราสเบอรี่ไพมีใช้แรงดัน IO ที่ 3.3V ดังนั้นระวังการจ่ายไฟเลี้ยงเกินเข้าไปที่ IO นะครับเนื่องจากไม่มีวงจรอะไรป้องกันความเสียหาย
Header Pinout, top row:
Pin Number | Pin Name Rev1 | Pin Name Rev2 | Hardware Notes | Alt 0 Function | Other Alternative Functions |
P1-02 | 5V0 | 5V0 | Supply through input poly fuse | ||
P1-04 | DNC | ||||
P1-06 | GND | GND | |||
P1-08 | GPIO 14 | GPIO 14 | Boot to Alt 0 -> | UART0_TXD | ALT5 = UART1_TXD |
P1-10 | GPIO 15 | GPIO 15 | Boot to Alt 0 -> | UART0_RXD | ALT5 = UART1_RXD |
P1-12 | GPIO 18 | GPIO 18 | ALT4 SPI1_CE0_N ALT5 = PWM0 | ||
P1-14 | DNC | ||||
P1-16 | GPIO23 | GPIO23 | ALT3 = SD1_CMD ALT4 = ARM_RTCK | ||
P1-18 | GPIO24 | GPIO24 | ALT3 = SD1_DATA0 ALT4 = ARM_TDO | ||
P1-20 | DNC | ||||
P1-22 | GPIO25 | GPIO25 | ALT4 = ARM_TCK | ||
P1-24 | GPIO08 | GPIO08 | SPI0_CE0_N | ||
P1-26 | GPIO07 | GPIO07 | SPI0_CE1_N |
Header Pinout, bottom row:
Pin Number | Pin Name Rev1 | Pin Name Rev2 | Hardware Notes | Alt 0 Function | Other Alternative Functions |
P1-01 | 3.3 V | 3.3 V | 50 mA max current draw | ||
P1-03 | GPIO 0 | GPIO 2 | 1K8 pull up resistor | I2C0_SDA | I2C0_SDA / I2C1_SDA |
P1-05 | GPIO 1 | GPIO 3 | 1K8 pull up resistor | I2C0_SCL | I2C0_SCL / I2C1_SCL |
P1-07 | GPIO 4 | GPIO 4 | GPCLK0 | ||
P1-09 | DNC | ||||
P1-11 | GPIO17 | GPIO17 | ALT3 = UART0_RTS, ALT5 = UART1_RTS | ||
P1-13 | GPIO21 | GPIO27 | PCM_DIN | ALT5 = GPCLK1 | |
P1-15 | GPIO22 | GPIO22 | ALT3 = SD1_CLK ALT4 = ARM_TRST | ||
P1-17 | DNC | ||||
P1-19 | GPIO10 | GPIO10 | SPI0_MOSI | ||
P1-21 | GPIO9 | GPIO9 | SPI0_MISO | ||
P1-23 | GPIO11 | GPIO11 | SPI0_SCLK | ||
P1-25 | DNC |
จากรูปด้านบน เห็นว่าเรามี GPIO ที่สามารถใช้ได้คือ
GPIO0, GPIO1, GPIO4, GPIO7, GPIO8, GPIO9, GPIO10, GPIO11, GPIO14, GPIO15, GPIO17, GPIO18, GPIO21, GPIO22, GPIO23, GPIO24, GPIO25
เริ่มจาก Python ก่อนเลยนะครับ
สร้างไฟล์ภาษาไพธอนก่อนเลยเช่น
touch python_gpio_test.py
หลังจากนั้นให้ edit ด้วย nano ก็ได้แล้วเติม
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
GPIO.setup(18, GPIO.OUT)
while 1 :
GPIO.output(17, True)
GPIO Visit Your URL.output(18, True)
time.sleep(1)
GPIO.output(17, False)
GPIO.output(18, False)
time.sleep(1)
สั่งรันด้วย sudo python python_gpio_test.py จะได้ผลออกมาว่า
เป็นการสั่งให้ขา GPIO17 และ GPIO18 จ่าย output logic 1 และ logic 0 สลับกันทุกหนึ่งวินาทีครับตัวอย่างซอฟแวร์ดูเข้าใจง่ายดีไหมครับส่วนของภาษา C ขอติดไว้ก่อนนะครับเนื่องจากอยากอธิบายทั้งการใช้ mmap และผ่านไดรเวอร์ GPIO ว่าต่างกันอย่างไรแล้วจะใช้แบบไหน อ่อมีคำถามให้ลองเอาไปคิดกันครับว่าไลบรานี่ RPi.GPIO ใช้การ access GPIO ผ่านไดรเวอร์ GPIO หรือว่าผ่านไดรเวอร์ memory map
แต่ถ้าไครใจร้อนอยากทดลองเขียน C เลยก็แนะนำครับ
http://project4fun.com/node/38
สุดยอดบทความการใช้ GPIO บน Embedded Linux ของคนไทยแต่ให้เปลี่ยนเลขที่จะ export เป็น GPIO ของราสเบอรี่ไพแทนครับ