was successfully added to your cart.

Raspberry PI with GPIO ราสเบอรี่ไพการติดต่อกับ GPIO บนบอร์ดเบื้ิองต้น

By September 25, 2012General

สิ่งหนึ่งที่นักพัฒนาซอฟแวร์บน 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

โดยที่ GPIO0 และ GPIO1 มีการต่อตัวต้านทาน 1.8 kilohm pull-up ที่ 3.3V.

เริ่มจาก 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 ของราสเบอรี่ไพแทนครับ

 

Leave a Reply

*