วันพุธที่ 4 มิถุนายน พ.ศ. 2557

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

พื้นฐานการใช้งาน 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 ด้วยคำสั่ง


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 นี้สำหรับทดสอบ


#!/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)


        จากนั้นทดสอบโปรแกรมด้วยการสั่งว่า


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


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


#!/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)

        คราวนี้ก็เพิ่มลูกเล่นนิดหน่อย


#!/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 เป็นดังนี้


#!/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
        หากบทความมีข้อผิดพลาดประการใดต้องขอคำแนะนำด้วยนะครับ ขอให้สนุกครับ


Source:
http://blog.websocket.asia/p/gpio-raspberry-pi-python-module-rpigpio.html