Popular Posts

Wednesday, June 29, 2016

Raspberry Pi ၏ GPIO pin မ်ားအား ပရိုဂရမ္ ေရးသားနည္း


နိဒါန္း

Raspberry Pi သည္ ATM card အရြယ္အစားသာ ရွိေသာ ကြန္ပ်ဴတာ တစ္လံုးျဖစ္ပါသည္။ ၄င္းတြင္ ျပင္ပ devices မ်ားႏွင္႔ ခ်ိတ္ဆက္ အသံုးျပဳႏို္င္ေသာ GPIO (gerneral purpose input/output) pin မ်ား ပါဝင္ေသာေၾကာင္႔ Embedded System မ်ား ျပဳလုပ္ရန္၊ အီလက္ထေရာနစ္ ပေရာဂ်က္မ်ား တည္ေဆာက္ရန္တို႔တြင္ အလြန္ အသံုးဝင္ပါသည္။ အလြယ္ဆံုး ဥပမာတစ္ခုမွာ ကၽြန္ေတာ္တို႔က ျဖစ္ေစ (input)၊ Pi ကျဖစ္ေစ (output)၊ ပရိုဂရမ္ေရးၿပီး ဖြင္႔လို႔ ပိတ္လို႔ရေသာ ခလုတ္ေလးမ်ား ျဖစ္ၾကပါသည္။  ထို႔ျပင္ အခ်ိဳ႕ GPIO pin မ်ားအား PWM (pulse width modulation) အတြက္ အသံုးျပဳႏိုင္ေသာေၾကာင္႔ power control ႏွင္႔ servo motor control မ်ားအတြက္လည္း အသံုးဝင္ပါသည္။
GPIO pins



အထက္ပါပံုတြင္ Raspberry Pi ၏ GPIO pins မ်ားအား board ေပၚတြင္ ျမင္ေတြ႕ရပံု ျဖစ္ပါသည္။ P1 ဟု ေရးသားထားေသာ ဘယ္ဘက္ အစြန္ဆံုး ေအာက္ဘက္ pin သည္ physical pin 1 ျဖစ္ပါသည္။ physical pin number မ်ား အားလံုးကို ေအာက္တြင္ ပံုႏွင္႔ ျပသေပးထားပါသည္။


GPIO pin number မ်ားသည္ physical pin number မ်ားႏွင္႔ မတူညီၾကပါ။ ၄င္းတို႔ကို ေအာက္ပါပံုတြင္ အေသးစိတ္ ေဖာ္ျပေပးထားပါသည္။


ပံုတြင္ အဝါေရာင္နဲ႔ ျပထားေသာ pin မ်ားသည္ GPIO pins မ်ား ျဖစ္ၾကၿပီး အနီေရာင္ pin မ်ားသည္ 5V power pinမ်ား ျဖစ္ၾကပါသည္။ လိေမၼာ္ေရာင္ pin မ်ားသည္ 3.3V power pin ျဖစ္ၿပီး၊ အနက္ေရာင္ pin မ်ားသည္ ground pin မ်ား ျဖစ္ၾကပါသည္။ Raspberry Pi ၏ ေမာ္ဒယ္မ်ားေပၚ မူတည္ၿပီး pin အေရအတြက္ ကြာျခားႏိုင္ပါသည္။ ကြာျခားေသာ pin layout ကို ေအာက္ပါပံုတြင္ ႏိႈင္းယွဥ္ ျပသေပးထားပါသည္။



GPIO pins မ်ား လက္ေတြ႕ အသံုးျပဳပံု

လက္ေတြ႕ စမ္းသပ္ျပဳလုပ္ရာတြင္ GPIO pins မ်ားသည္ အံ႔ၾသစရာ ေကာင္းေလာက္ေအာင္ အသံုးဝင္ေၾကာင္း သတိထားမိပါလိမ္႔မည္။ Input မ်ားကို ခလုပ္ တပ္ထားၿပီး ဖြင္႔ပိတ္ေပးမွ မဟုတ္ဘဲ sensor မ်ားကေနျဖစ္ေစ၊ အျခား ကြန္ပ်ဴတာ ႏွင္႔ device မ်ား၏ signal အေနႏွင္႔ ျဖစ္ေစ ထည္႔သြင္းေပးႏိုင္ပါသည္။ Output အေနႏွင္႔ LED တစ္လံုး အဖြင္႔အပိတ္ျပဳလုပ္ရန္အတြက္သာမက ေမာ္တာမ်ား ေမာင္းႏွင္ႏိုင္ေစရန္၊ Relay မ်ား အဖြင္႔အပိတ္လုပ္ရန္ႏွင္႔ အျခား ကြန္ပ်ဴတာမ်ား၊ device မ်ားအား signal မ်ား ေပးပို႔ရန္အတြက္လည္း အသံုးျပဳႏိုင္ပါသည္။
တကယ္၍ Raspberry Pi အား အင္တာနက္္ ႏွင္႔ ခ်ိတ္ဆက္ေပးထားခဲ႔မည္ ဆိုပါက Piနဲ႔ ခ်ိတ္ဆက္ထားေသာ ပစၥည္းမ်ားကို မည္သည္႔္ေနရာကေနမဆို လွမ္းၿပီး ထိန္းခ်ဳပ္ႏိုင္မွာျဖစ္ၿပီး အခ်က္အလက္မ်ားအား အျပန္အလွန္ ေပးပို႔ႏိုင္မွာ ျဖစ္ပါသည္။ Physical device မ်ားအား အင္တာနက္က တဆင္႔ ထိန္းခ်ဳပ္ခိုင္းေစႏိုင္ျခင္းသည္ စိတ္လႈပ္ရွားစရာေကာင္းေသာ နည္းလမ္းတစ္ခုျဖစ္ၿပီး Raspberry Pi အတြက္ အသင္႔ေတာ္ဆံုး အသံုးျပဳမႈ တစ္ခုလဲ ျဖစ္ပါသည္။
အိမ္တြင္း ဝါယာလက္ႏွင္႔ ခ်ိတ္ဆက္ၿပီး အသံုးျပဳမည္္ဆိုပါကလည္း ကြန္ပ်ဴတာ၊ မိုဘိုင္းဖုန္းမ်ားက တဆင္႔ အလြယ္တကူ ဆက္သြယ္ထိန္းခ်ဳပ္ အသံုးျပဳႏိုင္မွာ ျဖစ္ပါသည္။
Rpi ၏ GPIO pin မ်ားအား အသံုးျပဳႏိုင္ရန္ ပရိုဂရမ္ ေရးသားရာတြင္ မ်ားေသာအားျဖင္႔ Python, Bash ႏွင္႔ C တို႔ကို အသံုးျပဳေလ႔ ရွိပါသည္။ ဤေဆာင္းပါးတြင္ ၄င္းတို႔ အားလံုးကို အသံုးျပဳ၍ GPIO ပရိုဂရမ္းမင္း ေရးသားနည္းမ်ားအား ေလ႔လာ တင္ျပသြားမည္ ျဖစ္ပါသည္။
အထူးသတိထားရမည္႔ အခ်က္မွာ Rpi ၏ GPIO pin မ်ားသည္ အကာအကြယ္ျပဳလုပ္ထားျခင္း မရွိေသာေၾကာင္႔ short ckt ျဖစ္ပြားပါက Rpi တစ္ခုလံုး ပ်က္စီးသြားႏိုင္ပါသည္။ အေတြ႕အႀကံဳ မရွိေသးေသာ ေလ႔လာသူမ်ား အႏၲရာယ္ကင္းေစဖို႔ $10 ခန္႔ တန္ဖိုးရွိတဲ႔ Pibrella ကို အသံုးျပဳႏိုင္ပါသည္။


GPIO pin မ်ားအား စမ္းသပ္အသံုးျပဳရန္ ေအာက္ပါပံုတြင္ ျပသထားသည္႔အတိုင္း LED တစ္လံုး၊ ဘက္ထရီ တစ္လံုး၊ Resistor တစ္ခုႏွင္႔ ခလုတ္တစ္ခုပါဝင္ေသာ အရိုးရွင္းဆံုး ဆားကစ္တစ္ခုကို အေျခခံ၍ စမ္းသပ္ႏိုင္ပါသည္။ (Resistor ကို အသံုးျပဳထားရျခင္းမွာ LED အား ကာကြယ္ရန္ ျဖစ္ပါသည္။)


GPIO pin အား အသံုးျပဳမည္ဆိုပါက ခလုတ္တစ္ခုႏွင္႔ ဘက္ထရီ ေနရာအား Pi ျဖင္႔ အစားထိုး အသံုးျပဳႏိုင္မည္ ျဖစ္ပါသည္။ အဘယ္ေၾကာင္႔ဆိုေသာ GPIO pin တစ္ခုသည္ ON (High) ေနခ်ိန္တြင္ 3.3volts ထြက္ေနမည္ျဖစ္ၿပီး OFF (LOW) ျဖစ္ေနခ်ိန္တြင္ 0volts ျဖစ္ေနမည္ ျဖစ္ေသာေၾကာင္႔ ျဖစ္ပါသည္။ ထို႔ေၾကာင္႔ ေအာက္ပါပံုတြင္ Raspberry Pi ၏ GPIO pin သည္ ဘက္ထရီ၏ အေပါင္းဘက္ႏွင္႔ သ႑န္တူၿပီး ground pin သည္ အႏုတ္ဘက္ႏွင္႔ သ႑န္တူေနမည္ ျဖစ္သည္။
ထို႔ျပင္ သတိျပဳရမည္႔ ေနာက္တစ္ခ်က္မွာ GPIO pin မ်ားအား အသံုးျပဳမည္႔ ပရိုဂရမ္မ်ားအားလံုးသည္ root အေနျဖင္႔ RUN ေပးရန္ လိုအပ္ပါသည္။ ထို႔ေၾကာင္႔ command အားလံုး၏ ေရွ႕တြင္ sudo ကို ထည္႔သြင္းေပးရမည္ ျဖစ္ပါသည္။

Python: ကို အသံုးျပဳ၍ ေရးသားနည္း



ပထမဦးစြာ Python package installer - pip ကို install ျပဳလုပ္ရန္ လိုအပ္ပါသည္။ Raspberry Pi ၏ terminal တြင္ ေအာက္ပါ command ကို ရိုက္ထည္႔ပါ။
sudo curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python
ထို႔ေနာက္ Rpi.GPIO Python module ကို install ျပဳလုပ္ေပးရမည္ ျဖစ္ပါသည္။
sudo pip install rpi.gpio
လိုအပ္ေသာ Python module မ်ား install ျပဳလုပ္ၿပီးေနာက္ ေအာက္ပါအတိုင္း စမ္းသပ္ ေရးသားႏိုင္ပါသည္။
import RPI.GPIO as GPIO
GPIO.setup(7,GPIO.OUT)
GPIO.output(7,True)
GPIO.output(7,False)

Bash: ကို အသံုးျပဳ၍ ေရးသားနည္း


Unix စနစ္တြင္ အရာအားလံုးသည္ ဖိုင္မ်ားပင္ ျဖစ္သည္။ ထို႔ေၾကာင္႔ Raspberry Pi တြင္လည္း GPIO pin မ်ားသည္ ဖိုင္မ်ားျဖစ္ၾကသည္။ ဤအခ်က္ကို အသံုးျပဳ၍ ေအာက္ပါအတိုင္း Bash ျဖင္႔ ဖိုင္မ်ားအား အခ်က္အလက္ ေရးသားထည္႔သြင္းသကဲ႔သို႔ echo ႏွင္႔ > ကို အသံုးျပဳ၍ ေရးသား ထိန္းခ်ဳပ္ႏိုင္သည္။ သတိျပဳရမည္႔ အခ်က္မွာ ဤနည္းကို အသံုးမျပဳမီ root ျဖစ္ေနေစရန္ sudo su command ကို စတင္ထားရမည္ ျဖစ္သည္။
sudo su -
echo "4" > /sys/class/gpio/export
echo "4" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio4/direction
echo "1" > /sys/class/gpio/gpio4/value
echo "0" > /sys/class/gpio/gpio4/value
GPIO pin မွာ input ဖတ္ရန္ အျခားဖိုင္မ်ားမွ ဖတ္သကဲ႔သို႔ပင္ cat ကို အသံုးျပဳႏိုင္ပါသည္။
echo "0" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio0/direction
cat /sys/class/gpio/gpio0/value

C: ကိုအသံုးျပဳ၍ ေရးသားနည္း


C language ျဖင္႔ ေရးသားရာတြင္ native C  language သက္သက္ျဖင္႔ ေရးသားရန္ ခက္ခဲမည္ ျဖစ္ပါသည္။ သို႔ရာတြင္ Raspberry Pi ကို Arduino သဖြယ္ အသံုးျပဳႏိုင္ေစရန္ Gordon က Arduino-like library တစ္ခုကို ေရးသားေပးခဲ႔ပါသည္။ ၄င္းကို C ျဖင္႔ ေရးသားထားၿပီး WiringPi ဟုေခၚပါသည္။ C, C++ ႏွင္႔ အျခား ပရိုဂရမ္းမင္း ဘာသာစကားမ်ားတြင္ ထည္႔သြင္းေရးသားႏိုင္ပါသည္။

ေအာက္ပါ အတိုင္း download ရယူပါ။
cd /tmp
wget http://project-downloads.drogon.net/files/wiringPi.tgz

tar xfz wiringPi.tgz

cd wiringPi/wiringPi
make
sudo make install
cd ../gpio
make
sudo make install

အထက္ပါ installation ျပဳလုပ္ၿပီးသည္႔အခါ wiringPi library ကို ပရိုဂရမ္ေရးသားရာတြင္ ထည္႔သြင္း အသံုးျပဳႏိုင္ၿပီ ျဖစ္ပါသည္။ ထို႔ေၾကာင္႔ nano ကို အသံုးျပဳ၍ blink.c အမည္ျဖင္႔ ေအာက္ပါအတိုင္း ေရးသားႏိုင္ပါသည္။
cd ~
nano blink.c
ေအာက္ပါ ကုဒ္မ်ားကို ကူးယူေရးသား၍ သိမ္းဆည္းလိုက္ပါ။
/*
* blink.c:
*      Simple test program to blink an LED on pin 7
*/

#include <wiringPi.h>
#include <stdio.h>

int main (void)
{
 int pin = 7;
 printf("Raspberry Pi wiringPi blink test\n");

 if (wiringPiSetup() == -1)
   exit (1);

 pinMode(pin, OUTPUT);

 for (;;){
   printf("LED On\n");
   digitalWrite(pin, 1);
   delay(250);
   printf("LED Off\n");
   digitalWrite(pin, 0);
   delay(250);
 }

 return 0;
}

ထို႔ေနာက္ compile ျပဳလုပ္ရန္ ေအာက္ပါအတိုင္း ျပဳလုပ္ႏိုင္ပါသည္။
cc -o blink blink.c -L/usr/local/lib -lwiringPi
ထိုအခါ blink အမည္ျဖင္႔ output ထြက္လာမည္ ျဖစ္ပါသည္။ ေအာက္ပါအတိုင္း RUN ႏိုင္ပါသည္။
sudo ./blink
Button တစ္ခုကို အသံုးျပဳ၍ LED တစ္လံုး၏ blinking rate ကို ေအာက္ပါ ကုဒ္မ်ားျဖင္႔ ေျပာင္းလဲႏိုင္ပါသည္။

/*
* buttonLED.c:
*      Simple test program to change the blinking rate of an LED when a button is pressed
*/

#include <wiringPi.h>
#include <stdio.h>

int main (void)
{
 int pin_LED = 7;    // GPIO7 / header pin 7
 int pin_switch = 8; // SDA0 / header pin 3
 int del = 250;

 printf ("Raspberry Pi wiringPi button LED test\n") ;

 if (wiringPiSetup() == -1)
   exit (1);

 pinMode(pin_LED, OUTPUT);
 pinMode(pin_switch, INPUT);

 for (;;){
   if (digitalRead (8) == 0){ // button pressed
     del = 100;
   } else {
     del = 250;
   }

   digitalWrite(pin_LED, 1);
   delay(del);
   digitalWrite(pin_LED, 0);
   delay(del);
 }

 return 0 ;
}

နိဂံုး

ယခု အခါ Raspberry Pi ကို Embedded system အမ်ိဳးမ်ိဳး၊ အေဝးထိန္း စနစ္မ်ား၊ RC car projects, Mulitcopters, RC airplane, Home Automation အစရွိေသာ အီလက္ထေရာနစ္ ပေရာဂ်က္မ်ိဳးစံုတြင္ တြင္က်ယ္စြာ အသံုးျပဳလ်က္ရွိေနပါသည္။ ထိုသို႔ အသံုးျပဳႏိုင္ျခင္း၏ အဓိက အခ်က္မ်ားမွာ GPIO pin မ်ားအား ထိေရာက္စြာ ပရိုဂရမ္ ေရးသားႏိုင္ျခင္း၊ Raspberry Pi ၏ တြက္ခ်က္မႈ စြမ္းရည္ ျမင္႔မားျခင္းႏွင္႔ အရြယ္အစား ေသးငယ္ျခင္း၊ ပရိုဂရမ္မင္း ဘာသာစကား အမ်ိဳးမ်ိဳးျဖင္႔ ေရးသား အသံုးျပဳႏိုင္ျခင္း အစရွိေသာ အခ်က္မ်ားေၾကာင္႔ပင္ ျဖစ္ပါသည္။ သို႔ရာတြင္ Raspberry Pi ၏ အဓိက အားနည္းခ်က္မွာ Analog to Digital Converter (ADC) မပါဝင္ျခင္း ျဖစ္ပါသည္။ ထို႔ေၾကာင္႔ Analog to Digital conversion ျပဳလုပ္ႏိုင္ရန္ ျပင္ပမွ MICROCHIP  MCP3208-BI/P  Analog to Digital Converter ( 12 bit, 100 kSPS, Single, 2.7 V, 5.5 V, DIP ) ကဲ႔သို႔ေသာ ADC တစ္ခုကို အသံုးျပဳႏိုင္ပါသည္။ ယခုေဆာင္းပါးတြင္ ကၽြန္ေတာ္႔ အေနျဖင္႔ လက္လွမ္းမီသမွ် နည္းလမ္းမ်ားကို တင္ျပထားျခင္းမွ်သာျဖစ္ၿပီး အျခား နည္းလမ္းေပါင္း မ်ားစြာ က်န္ရွိေနပါေသးသည္။ ဤေဆာင္းပါးပါ အခ်က္မ်ားအေနျဖင္႔ ျပည္႔စံုလံုေလာက္မႈ၊ တိက်မႈ မရွိပါက ကၽြန္ေတာ္၏ လိုအပ္ခ်က္ေၾကာင္႔သာ ျဖစ္ေၾကာင္းႏွင္႔ ထပ္မံျဖည္႔စြက္ေလ႔လာရန္ လိုအပ္ပါေၾကာင္း တင္ျပ လိုက္ရပါေတာ႔သည္။

ရည္ညႊန္းကိုးကား

No comments:

Post a Comment