Tutorial Melayu

RaspberryPi: Sistem kawalan lampu isyarat pejalan kaki

Introduction

user

Fairuz

System Engineer (Texas Instruments France), Masters in Electronics , Embedded System Engineering,


LATEST POSTS

Nota: git alias yang biasa digunakan 05th December, 2013

Nota: Android .gitignore 23rd February, 2013

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:

profile

Fairuz

http://www.tutorialmelayu.com

System Engineer (Texas Instruments France), Masters in Electronics , Embedded System Engineering,

Comments
user

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

Reply

Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

View Comments (1) ...
Navigation