Raspberry PI
RaspberryPi: Sistem kawalan lampu isyarat pejalan kaki
Posted on .Berdasarkan contoh mudah memanipulasi LED di artikel terdahulu [http://www.tutorialmelayu.com/raspberry-pi/raspberrypi-manipulasi-led-menggunakan-gpio], kali ini kita akan membuat satu sistem mudah yang membabitkan lampu isyarat pejalan kaki.
Kita akan mulakan dengan spesifikasi sistem:
– Terdapat satu lampu isyarat untuk kenderaan (LIK) dan satu lampu isyarat untuk pejalan kaki (LIPK).
– LIK mempunyai tiga penunjuk; merah, oren dan hijau
– LIPK mempunyai dua penunjuk; merah dan hijau
– Terdapat satu butang untuk pejalan kaki (BPK). BPK di tekan menandakan terdapat pejalan kaki yang mahu melintas jalan.
– Secara asasnya, kenderaan mempunyai prioriti dan LIK akan kekal hijau selagi BPK tidak ditekan. Dalam konfigurasi ini, BPK kekal merah.
– Jika BPK ditekan, ianya akan diambil kira oleh sistem dan LIK akan bertukar menjadi oren. Selepas dua saat, LIK akan bertukar menjadi merah.
– Selepas dua saat, LIPK akan bertukar menjadi hijau menandakan pejalan kaki boleh melintas jalan.
– LIPK akan kekal hijau selama 8 saat. Pada 4 saat terakhir, LIPK akan berkelip-kelip kemudian bertukar menjadi merah. LIPK dan LIK akan kekal merah selama 2 saat sebelum LIK bertukar menjadi hijau.
Untuk sistem ni, saya mengambil langkah mudah dengan menggunakan kaedah state machine dalam embedded system. Secara asasnya kaedah ini mengubah spesifikasi menjadi keadaan-keadaan yang boleh menggambarkan spesifikasi tersebut dengan sepenuhnya.
Kelebihan menggunakan kaedah state machine adalah kita mempunyai 100% kawalan terhadap keadaan-keadaan dan bagaimana satu-satu keadaan itu boleh bertukar kepada keadaan yang lain. Pertukaran keadaan hanya boleh dilakukan jika kondisi yang ditetapkan ditepati.
Untuk memudahkan pemahaman, saya akan menggabungkan bahagian kawalan dan bahagian data dalam satu script.
Jadi untuk sistem ini, saya menggambarkan 6 keadaan seperti di bawah:
1) Keadaan S0
LIK hijau dan LIPK merah.
Bertukar ke keadaan S1 jika BPK ditekan.
2) Keadaan S1
LIK oren dan LIPK merah
Bertukar ke keadaan S2 selepas dua saat
3) Keadaan S2
LIK merah dan LIPK merah
Bertukar ke keadaan S3 selepas dua saat
4) Keadaan S3
LIK merah dan LIPK hijau
Bertukar ke keadaan S4 selepas empat saat
5) Keadaan S4
LIK merah dan LIPK hijau berkelip
Bertukar ke keadaan S3 selepas empat saat
6) Keadaan S5
LIK merah dan LIPK merah
Bertukar ke keadaan S0 selepas dua saat
Mudah bukan?
Sekarang kita boleh menukar 6 keadaan ini menjadi bash script:
#! /bin/bash
#### konfigurasi
GPIO=/sys/class/gpio
REDK=11
ORANGEK=9
GREENK=10
REDP=22
GREENP=23
PIN_KELUAR=($REDK $ORANGEK $GREENK $REDP $GREENP)
PIN_MASUK=(0)
UJI=1
state="S0"
if [ "$(whoami)" != "root" ]; then
echo "Script ni kena pakai sudo."
exit 1
fi
# quit signal
control_c()
{
for i in "${PIN_KELUAR[@]}"
do
if [ -d ${GPIO}/gpio${i} ]; then
echo 0 > ${GPIO}/gpio${i}/value
echo $i > ${GPIO}/unexport
fi
done
for i in "${PIN_MASUK[@]}"
do
if [ -d ${GPIO}/gpio${i} ]; then
echo $i > ${GPIO}/unexport
fi
done
echo -en "\n*** Keluar ***\n"
exit $?
}
trap control_c SIGINT
for i in "${PIN_KELUAR[@]}"
do
if [ ! -d ${GPIO}/gpio${i} ]; then
echo $i > ${GPIO}/export
echo out > ${GPIO}/gpio${i}/direction
fi
done
for i in "${PIN_MASUK[@]}"
do
if [ ! -d ${GPIO}/gpio${i} ]; then
echo $i > ${GPIO}/export
echo in > ${GPIO}/gpio${i}/direction
fi
done
# Init
echo 1 > ${GPIO}/gpio${GREENK}/value
echo 1 > ${GPIO}/gpio${REDP}/value
timer=0
# loop utama
while true; do
case "$state" in
"S0")
if [ $(cat ${GPIO}/gpio0/value) -eq 0 ]; then
state="S1"
echo 0 > ${GPIO}/gpio${GREENK}/value
echo 1 > ${GPIO}/gpio${ORANGEK}/value
timer=0
fi
;;
"S1")
timer=$((timer + 1))
if [ ${timer} -eq 2 ]; then
state="S2"
timer=0
echo 0 > ${GPIO}/gpio${ORANGEK}/value
echo 1 > ${GPIO}/gpio${REDK}/value
fi
;;
"S2")
timer=$((timer + 1))
if [ ${timer} -eq 2 ]; then
state="S3"
timer=0
echo 0 > ${GPIO}/gpio${REDP}/value
echo 1 > ${GPIO}/gpio${GREENP}/value
fi
;;
"S3")
timer=$((timer + 1))
if [ ${timer} -eq 4 ]; then
state="S4"
timer=0
tog=0
fi
;;
"S4")
timer=$((timer + 1))
if [ ${tog} -eq 1 ]; then
echo 1 > ${GPIO}/gpio${GREENP}/value
tog=0
else
echo 0 > ${GPIO}/gpio${GREENP}/value
tog=1
fi
if [ ${timer} -eq 4 ]; then
state="S5"
timer=0
echo 0 > ${GPIO}/gpio${GREENP}/value
echo 1 > ${GPIO}/gpio${REDP}/value
fi
;;
"S5")
timer=$((timer + 1))
if [ ${timer} -eq 2 ]; then
state="S0"
timer=0
echo 0 > ${GPIO}/gpio${REDK}/value
echo 1 > ${GPIO}/gpio${GREENK}/value
fi
;;
esac
sleep 1
done
Demo:
Fairuz
http://www.tutorialmelayu.comSystem Engineer (Texas Instruments France), Masters in Electronics , Embedded System Engineering,
Author yoga
Posted at 3:20 pm November 27, 2013.
maaf mas kalo di push button di ganti sama sensor PIR itu yang di rubah apany mas dari koding nya?? please bantuin dong
Author Wan
Posted at 10:22 am November 16, 2017.
Ada ladder diagram nya tak