วันพุธที่ 1 พฤษภาคม พ.ศ. 2556


พื้นฐานการใช้งาน GPIO ของ Raspberry Pi ด้วยภาษา Python กับ Module RPi.GPIO

        เขียนเรื่อง Raspberry Pi เชื่อมต่อกับ WebSocket.asia ไปก่อนหน้านี้แล้ว ก็จะขอย้อนกลับมาเขียนเรื่องพื้นฐานการใช้งานกันบ้าง ว่าด้วยเรื่อง พื้นฐานการใช้งาน GPIO ของ Raspberry Pi Model B rev2.0 ด้วยภาษา Python กับ Module RPi.GPIO โดยมี Raspbian เป็น OS
        ก่อนอื่นต้องทำการติดตั้ง RPi.GPIO ด้วยคำสั่ง
?
1
2
3
sudo apt-get update
sudo apt-get install python-dev
sudo apt-get install python-rpi.gpio
        เมื่อเราจ่ายไฟให้ Raspberry Pi แล้ว จะมีไฟ 3.3V. ออกทางขาหมายเลข 1, 17 และ 5V. ออกทางขาหมายเลข 2, 4 โดยใช้ภาพนี้สำหรับเทียบหมายเลขขาของ GPIO
ภาพหมายเลขขา GPIO ของ Raspberry Pi


        เราจะทดลองในส่วน Output ก่อนซึ่งส่วน Diagram ของวงจรที่จะทำการทดสอบเป็นดังนี้

ภาพ Diagram ของวงจรที่ใช้ทดลอง

        ซึ่งเราจะใช้ขาหมายเลข 26 ในการทดลอง output โดยมีขาหมายเลข 25 เป็น Ground ซึ่งเมื่อต่อวงจรเสร็จอาจทดสอบได้ด้วยการใช้ไฟจากขาหมายเลข 1 ทดสอบดูก่อน
        จากนั้นใช้โค้ด Python นี้สำหรับสดสอบ

?
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/python
#-*-coding: utf-8 -*-
import RPi.GPIO as GPIO
 
pin = 26
 
GPIO.setmode(GPIO.BOARD)
GPIO.setup(pin, GPIO.OUT)
 
GPIO.output(pin,True)
?
1
 
        จากนั้นทดสอบโปรแกรมด้วยการสั่งว่า

?
1
sudo python ชื่อไฟล์.py

        ถ้าไม่มีอะไรผิดพลาด LED ก็จะติด
        คราวนี้จะดับอย่างไร? ก็ต้องแบบนี้ครับ

?
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/python
#-*-coding: utf-8 -*-
import RPi.GPIO as GPIO
 
pin = 26
 
GPIO.setmode(GPIO.BOARD)
GPIO.setup(pin, GPIO.OUT)
 
GPIO.output(pin,False)
?
1
 
        คราวนี้ก็เพิ่มลูกเล่นนิดหน่อย

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/python
#-*-coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
 
pin = 26
slp = 0.5
 
GPIO.setmode(GPIO.BOARD)
GPIO.setup(pin, GPIO.OUT)
 
while True:
    GPIO.output(pin,True)
    time.sleep(slp)
    GPIO.output(pin,False)
    time.sleep(slp)
        แบบนี้ก็จะได้ไฟกระพริบ
        ขอพักเรื่อง Output ไว้ก่อน มาลอง Input กันบ้าง ด้วย Diagram นี้
ภาพ Diagram สำหรับการทดลอง Input

       จากภาพ เราจะใช้ไฟ 3V. จากขาหมายเลข 1 ผ่าน R 100Kohm เข้าทางขาหมายเลข 23 และมี Switch ลง Ground ที่ขาหมายเลข 25
       ในส่วนของโค้ด Python เป็นดังนี้

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/python
#-*-coding: utf-8 -*-
import RPi.GPIO as gpio
 
pin = 23
 
gpio.setmode(gpio.BOARD)
gpio.setup(pin, gpio.IN)
 
while True:
  if gpio.input(pin) == False:
    print ("IN")
    while gpio.input(pin) == False:
        pass
        เมื่อรันโปรแกรม โปรแกรมวนลูปไปเรื่อยๆ หากมีไฟจ่ายผ่าน R เข้ามาก็จะไม่ทำอะไรจนกว่า Switch จะถูกกดทำให้ไม่มีไฟจ่ายให้ขาหมายเลข 23 ก็จะขึ้นข้อความว่า "IN"
        อาจมีคนสงสัยเหมือนผมว่าทำไมเราไม่ทำตรงข้ามกัน คือ ต่อวงจรแบบจ่ายไปผ่าน Switch แล้วเขียนโปรแกรมว่า if gpio.input(pin) == True: เราสงสัยก็ต้องลอง
ภาพ Diagram สำหรับทดลอง Input

        แล้วลองเปลี่ยน False เป็น True
        เมื่อเรารันโปรแกรม จะเป็นว่ามีข้อความ "IN" ขึ้นเรื่อยๆ โดยที่เรายังไม่ได้กด Switch คงเป็นเพราะ GPIO มีความอ่อนไหวต่อสัญญาณอะไรบางอย่างจึงทำให้การต่อแบบนี้ไม่เสถียร ให้ใช้แบบก่อนหน้านี้ที่จ่ายไฟให้สม่ำเสมอและรอจังหวะที่มีการกด Switch ลง Ground
        หากบทความมีข้อผิดพลาดประการใดต้องขอคำแนะนำด้วยนะครับ ขอให้สนุกครับ

ไม่มีความคิดเห็น:

แสดงความคิดเห็น