Raspberry Pi GPIO Intro

rpi_logo


linux@gpio ~#cat readme.txt
What is GPIO ? How can do with GPIO ? and Its basic usage

က်ေနာ္အခု rasppberry pi ကေန Gpio ကို python programming ကေန တဆင့္ ထိန္းခ်ုပ္ တဲ့ ပံုစံေလးကို ရွင္းျပခ်င္ပာတယ္။

GPIO (general purpose input/output ) pin အေရအတြက္ဟာ က်ေနာ္တို့ အသံုးျပဳ တဲ့ raspberry pi model အလိုက္ ကြဲလြဲမွုေတြရွိနိင္ပာတယ္။

raspberry pi 1 model A/B ေတြမွာ GPIO pin 26 pin ပဲပါတယ္။

Raspberry Pi GPIO
Raspberry Pi GPIO

pi 1 model B+ , A+ , pi 2 model B နဲ့ pi 3 model B မွာ က်ေတာ့ GPIO pin 40 ပာပာတယ္။

Raspberry Pi GPIO

GPIO pin ကေန ဘာေတြလုပ္လို့ရလို့လဲ ။ အေရးျကီးလို့လား ။

ကိုယ္သံုးတဲ့ေပာ္မွာ မူတည္ပာတယ္။ media server လိုမ်ုိးတို့ ၊ file server တို့ လိ္ုမ်ူိ;ပဲ စမ္းခ်င္တာ ၊ လုပ္ခ်င္တာဆိုရင္ေတာ့ GPIO pin ေတြအေျကာင္း မသိရင္လည္္း ရပာတယ္။ အကယ္လို့ Home automation ပိုင္းေတြ ( example အေနနဲ့ လက္ခုပ္တီးလိုက္ရင္ မီးဖြင့္တာတို့ ။ မီးမွိတ္တာတို့ ။ ေရကန္ထဲမွာ ေရ မရွိရင္ ေရစက္ကို auto
ေမာင္းတင္ခိုင္းတာတို့ ) ၊ robotic ပိုင္းေတြ ၊ electronic device ေတြ ၊ sensor ေတြနဲ့ ခ်ိတ္ဆက္လုပ္ခ်င္တာမ်ိုးေတြက် GPIO ကမသိမျဖစ္ လုိအပ္လာပာတယ္ ။

GPIO pin ေတြနဲ့ အလုပ္လုပ္တဲ့ အခာမွာ သိထားသင့္တာေလးေတြကို ေအာက္မွာတခ်က္ေလာက္ဖတ္ျကည့္ပာ ။

(၁). GPIO pin တခုခ်င္းစီကေန ယူတဲ့ current က 3mA ထက္မပိုသင့္ပာ။
(၂). GPIO pin ေတြကို raspberry pi power on ထားခ်ိန္မွာ screw driver နဲ့ ထိျခင္း ၊ metal object တခုခုနဲ့ ထိျခင္းမလုပ္ပာနဲ့ ။
(၃). Pi ကို power ေပးတာ 5V ထက္ မေက်ာ္ပာေစနဲ့ ။
(၄). 3.3V supply pins ေတြဆီကေန ယူသံုးတဲ့အခာ total 50mA ထက္ ပိုမသံုးသင့္ပာ ။
(၅). 5.5V supply pins ေတြဆီကေန ယူသံုးရင္ total 250mA ထက္ပို မသံုးသင့္ပာဘူး ။

GPIO pin ေတြကို ဘယ္လိုအသံုးခ်မလဲ ။

programming languages ေတြနဲ့ program ေတြေရးျပီး GPIO pin ေတြကို အသံုးခ်နိုင္ပာတယ္ ။

အခု က်ေနာ္က python programming နဲ့ GPIO ကို access လုပ္တာေလးျပခ်င္ပာတယ္ ။

လိုတာကေတာ့ python library ေလးျဖစ္တဲ့ Rpi.GPIO လိုပာမယ္ ။
အဲ့ဒီေကာင္ေလးက python နဲ့ native C ပုံစံကို wrap လုပ္ျပီး Input / Output ပိုင္းကို ျမန္ဆန္ေစဖို့အသံုးျပုတယ္ ။

က်ေနာ္ installation processကို raspbian OS အသံုးျပု ျပီး ျပပာမယ္။
raspbian OS ကို အသံုးျပုမယ္ဆို ( http://vx2-downloads.raspberrypi.org/raspbian/images/raspbian-2016-05-31/2016-05-27-raspbian-jessie.zip ) အဲ့link ကေန download ရယူုနိုင္ပာတယ္ ။

အဲ့တာကိုသြင္းဖို့ အတြက္ အရင္ဆံုး terminal ကေန

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python-dev
sudo apt-get install python-rpi.gpio

အစဥ္လိုက္ တေျကာင္းခ်င္းစီရိုက္ထည့္ေပးပာ ။

အရင္ဆံုး repositories ေတြကေန ရနိုင္မယ့္ package ေတြကို update လုပ္ပာတယ္ ။
ၿပီး ရင္ ကိုယ့္စက္ထဲမွာရွိေနတဲ့ software ေတြကို upgrade လုပ္ပာတယ္။
ေနာက္တဆင့္က python-dev ကို သြင္းပာတယ္။
ၿပီးေတာ့ library ကို သြင္းပာတယ္ ။

Ok , အခုမွ စမွာဗ်။

python နဲ့ GPIO control program ေတြရဲ့အစတိုင္းလိုလိုမွာ

import Rpi.GPIO as GPIO လို့ေရးျပီး GPIO functions ေတြကို GPIO name ေပးျပီးေခာ္သံုးပာတယ္ ။

ျပီးေတာ့ GPIO pin ေတြကို သံုးဖို့ mode ေရြးရပာတယ္။
mode သတ္မွတ္တဲ့ေနရာမွာ 2 မ်ိုးရွိပာတယ္။
(၁) BCM numbering ပံုစံ
(၂) Board numbering ပံုစံ

BCM numbering mode ဆိ္ုတာက GPIO pin ေတြကို broadcom soc channel အေနနဲ့ refer လုပ္တာပာ ။

Board numbering modeဆိုတာက GPIO pin ေတြကို နံပာတ္စဥ္လိုက္ သတ္မွတ္တာပာ ။

ေသခ်ာနားလည္ သေဘာေပာက္ေအာင္ အေပာ္ကပံုေလးနွစ္ပံုကို ျပန္ျကည့္ ျကည့္ပာ ။
ေလးေထာင့္တံုးေလးေတြမွာေရးထားတာက BCM အေနနဲ့ သတ္မွတ္တာပာ ။ အလယ္ကပံုစံက board အေနနဲ့သတ္မွတ္တာပာ ။

GPIO.setmode(GPIO.BCM) (refer GPIOpins as BCM numbering)
GPIO.setmode(GPIO.BOARD) (refer GPIOpins as BOARD numbering)

က်ေနာ္ ေနာက္ပိုင္း BCM mode အေနနဲ့ သတ္မွတ္ထားတဲ့ပံုစံနဲ့ပဲ ဆက္ျပသြားပာမယ္ ။
GPIO.setwarnings(False) ဆိုျပီး GPIO runtime warning ကိုdisable လုပ္ထားလို့ရပာတယ္။

ျပီးရင္ input or output အတြက္သတ္မွတ္ေပးရပာတယ္ ။

GPIO.setup(7,GPIO.OUT) #set GPIO 7 as output
GPIO.setup(8,GPIO.IN) #setup GPIO 8 as input
GPIO.setup(23,GPIO.IN,pull_up_down=GPIO.PUD_DOWN) #set GPIO 23 as input and enable pull-down resistor on pin 23
GPIO.setup(24,GPIO.IN,pull_up_down=GPIO.PUD_UP) #set GPIO 24 as input and enable pull-up resistor on pin 24

GPIO 7 နဲ့ 8 သတ္မွတ္တာကေတာ့ ပံုစံရွင္းပာတယ္။ output input ရိုးရိုးပာပဲ ။

23 နဲ့ 24 မွာေတာ့ က်ေနာ္တို့ input မွာ pull-up , pull-down resistor သတ္မွတ္ပာတယ္ ။

pull-up pull-down ဘာလို့သတ္မွတ္တာလဲ ။ မသတ္မွတ္ရင္ေရာ မရဘူးလား ။

input မွာ pull up or pull down resistor မခ်ိတ္ထားဘူးဆိုရင္ floating state အေနနဲ့အလုပ္လုပ္ပာတယ္။ GPIO input pin ကို ခ်ိတ္ထားတဲ့ wire ကေန radio wave ၊ electromagnetic radiation ပံုစံမ်ိုးေတြရျပီး input value ေတြကို လြဲေခ်ာ္ထိခိုက္ေစပာတယ္။

OK , motor နဲ့ ပန္ကာဒလက္အျကီးစားေတြလည္ေအာင္ GPIO input pin ေတြနဲ့ ထိန္းတယ္ဆိုပာေတာ့ ။ default အေနနဲ့ပဲထားေတာ့
မလိုအပ္တဲ့random change of state လိုမ်ိုး value ေတြဝင္လာမယ္ဆိုရင္ ပန္ကာကမလိုအပ္တဲ့အခ်ိန္မွာထလည္တာတို့ လိုမ်ိုးျဖစ္တတ္ပာတယ္။

pi မွာ built in pull-up pull-down resistor ပာပာတယ္ ။

pull_up_down=GPIO.PUD_UP ဆိုျပီး pull up resistor ကို သံုးမယ္လို့သတ္မွတ္ေပးလို့ရပာတယ္။

pull_up_down=GPIO.PUD_DOWN ဆိုရင္ေတာ့ pull down resistor ကို သံုးမယ္လို့ သတ္မွတ္တာေပာ့။
default ဆိုရင္ေတာ့ GPIO.PUD_OFF ေပာ့ ။အဲ့ဒာကေတာ့ ထည့္မေရးလည္းရပာတယ္။

output or input လုပ္တာေလးေတြကိုတခ်က္ျကည့့္ျကည့္ပာ။

GPIO.output(24,1) ( 1 ေနရာမွာ GPIO.LOW,GPIO.HIGH,1,0,TRUE,FALSE သံုးလို့ရပာတယ္)
(GPIO 24 ကို output 1 ထုတ္တာေလးေပာ့)

input=GPIO.input(13) ( GPIO 13 ကေနဝင္လာတဲ့ value ကို input ဆိုတဲ့ variable ထဲသိမ္းလိုက္တာပာ)

ေနာက္ျပီး GPIO pin ေတြကေန clock generator ပံုစံထုတ္လို့ရပာ
တယ္။

GPIO.setup(4,GPIO.ALT0) #GPIO 4 ကို clock genအေနနဲ့ သတ္မွတ္တယ္

GPIO.setclock(4,64000) #clock frequencyကို HZ အေနနဲ့သတ္မွတ္တယ္။
# frequency က 4640 ကေန 19000000 range ထဲပဲ ရွိသင့္တယ္။

GPIO.output(4,1) # turn on the clock

GPIO.output(4,0) #turn off the clock

GPIO.setclock(4,500000) #frequency ျပန္ changeတယ္#

GPIO.cleanup() #GPIO pin ေတြအာားလုံးကို reset ျပန္လုပ္တာပာ။

အခုက GPIO module ထဲကအေျခခံ ေလးေတြကိုေျပာျပတာပာ ။
သူ့ထဲမွာမွ ေနာက္ထပ္ function (eg . wait_for_edge တို့ add_event_detect တို့ ) ေတြကို ဆက္ေလ့လာျကည့္ပာ ။

ျပီးေတာ့ i2c ဆိုတဲ့ servo motor တို့ pulse width modulation ပိုင္းေတြနဲ့ ဆက္စပ္လုပ္ေဆာင္တဲ့ library အေျကာင္းေလးလည္း
ဆက္လက္ေလ့လာျကည့္ျကပာ။

raspberry pi device က linux base OS ေတြနဲ့ အလုပ္လုပ္တဲ့ အတြက္ေျကာင့္ linux command ေတြကိုလည္း မျဖစ္မေနသိထားသင့္ပာတယ္။

အဲ့ဒာေျကာင့္ အသံုးမ်ားတဲ့ linux command ေတြနဲ့ ထိေတြ့နိုင္ေအာင္ ဆက္ေရးပာ့မယ္။

command တေျကာင္းမွာ command / option(switch) / argument ဆိုျပီး သံုးပိုင္းခြဲနိုင္ပာတယ္။တခ်ို့ command ေတြက် argument လိုပာတယ္ ။ တခ်ုိ႕က်ေတာ့မလိုပာဘူး။

အခုေျပာမယ့္ထဲမွာေတာ့ သိဖို့လုံးဝလိုအပ္တဲ့ command switch ေလးေတြပဲထည့္ေျပာေပးပာ့မယ္။
~ means can replace with another.

uname -a ( print all system information)
uname –help ( get some info about uname command)
ls (list directory)
ls -al (list all with long format)
uptime -p ( system runtime)
df -h ( disk space usage in human readable form)
whoami ( print current user)
cd ~location ( change directory)
mkdir ~directory ( make directory)
rm -r ~directory (delete directory)
cp -i ~sourcefile ~newfile ( copy )
whatis ~ls ( display one line manual for ls command )
top ( display process)
clear (clear terminal )
reset (reset terminal)
date (print date time info)
cal (print calender)
touch ~file (create file)
pwd (print current working directory)
ping -c3 ~www.google.com ( ping google 3 time)
head ~file ( output first part of file)
tail ~file (output last part of file)
cat ~file (output entire file)
less ~file ( output file less)
more ~file (output file more)

မသိမျဖစ္သိထားသင့္တဲ့ Linux commandေလးေတြပာ။

အားလံုးအဆင္ေျပျကမယ္လို့ေမွ်ာ္လင့္ပာတယ္။

AungKyaw Phyo