Thursday, February 28

How to getting started WiringPi

ในการควบคุม GPIO ของ Raspberry pi นอกจากเราจะทำการ echo ค่า 1 และ 0 ไปที่ Filesystem ที่ชื่อ sysfs ของระบบ linux ที่เป็นที่เก็บไฟล์ื่ที่ติดต่อกับ GPIO Hardware ของ Raspberry Pi แล้ว (http://raspberry-pi-th.blogspot.com/2012/09/get-to-know-raspberry-pi-gpio.html) ยังมีอีกหลายวิธี ไม่ว่าจะเป็นการเรียกใช้ module RPi.GPIO(http://raspberry-pi-th.blogspot.com/2012/10/rpigpio-python-control-gpo-of-raspberry.html) ที่พัฒนาด้วยภาษาไพธอน แต่ก็ยังไม่ค่อยตอบโจทย์ผมเท่าไหร่ เพราะต้องใช้สิทธิ์ root ในการเรียกใช้คำสั่งเหล่านั้น ซึ่งไม่ค่อยสะดวกเท่าไหร่

วันนี้ผมจะมาแนะนำอีกหนึ่งไลบรารี่ ของคุณ Gordon Henderson ซึ่งได้พัฒนาชุดโปรแกรมสำหรับเรียกใช้งาน GPIO ของ Raspberry pi ด้วยภาษา C ซึ่งเข้าถึงรีจิสเตอร์ของ GPU ของ Raspberry Pi เลย และที่สำคัญ เราสามารถเรียกใช้ไลบรารี่ชุดนี้ ได้เหมือนคำสั่ง shell ของ linux ได้เหมือนๆ คำสั่งอื่นๆ ทั่วไป โดยไม่จำเป็นต้องเป็นสิทธิ์ Root ก่อนเลย ซึ่งสะดวกเป็นอย่างยิ่งครับ ในการนำไปต่อยอดพัฒนาโปรแกรมอื่นๆ ต่อไป 

เรามาติดตั้งกันก่อนเลยครับ เนื่องจากโปรแกรมนี้ ถูกเก็บไว้ด้วยรูปแบบกระจายซอร์สโค๊ดด้วย git-core หากเรายังไม่มี package นี้ในการช่วยดาวน์โหลดซอร์สโค๊ดต่างๆ จากผู้พัฒนาโปรแกรมให้ติดตั้ง git-core ด้วยคำสั่ง

sudo apt-get install git-core

จากนั้นทำการดาวน์โหลด wiringPi ด้วยคำสั่ง

git clone git://git.drogon.net/wiringPi

จากนั้นเข้าไปในโฟวเดอร์ wirignpi แล้วทำการเช็คอัพเดท

cd wiringPi
git pull origin

ต่อไปให้ทำการติดตั้ง ซึ่งจะเป็นการ compile โค๊ดที่เราโหลดมาบนบอร์ดของ โดยออกจากโฟวเดอร์ wiringPi ก่อน โดยเรียกคำสั่ง

cd ..
จากนั้นทำการรันไฟล์ build ด้วยคำสั่ง

./build

Raspberry pi จะทำการ compile wiringPi เพื่อให้กลายเป็นคำสั่ง shell ให้เราเรียกใช้ง่ายๆ ต่อไป

เมื่อ compile เสร็จแล้ว เราจะสามารถเรียกใช้คำสั่ง gpio ได้  ให้เราจินตนาการง่ายๆ ว่า คำสั่ง gpio ก็เหมือนคำสั่ง ls หรือ คำสั่ง cat หรือ cp เหมือนคำสั่งอื่นๆ บน linux นั่นเอง ดังนั้น มันจึงสามารถที่จะเรียกดูํ manual ของมันได้เช่นกัน ด้วยคำสั่ง

man gpio

ในคู่มือที่แสดงนี้ จะบอกถึงวิธีการเรียกใช้คำสั่งนี้ และที่ท้ายๆ คู่มือ เค้าจะเขียนบอกการจับคู่ขา WiringPi กับ GPIO จริงๆ ทั้ง Rev1 และ Rev2 ครับ

man gpio

ผมขออธิบายการเรียกใช้งานคร่าวๆ ของคำสั่ง gpio นี้นะครับ ที่เหลือ สามารถศึกษาเพิ่มเติมได้ใน man gpio นี้แหละครับ

ในการเรียกใช้งาน GPIO ของ Raspberry pi โดยค่าเริ่มต้น เมื่อเราจ่ายไฟไปที่บอร์ด Raspberry pi เริ่มต้น ที่ GPIO ส่วนใหญ่ จะมี สถานะเป็น Input หากเราต้องการนำขา GPIO ไปใช้งานเป็น Output แล้ว เราจะต้องทำการกำหนดทิศทางของ GPIO ซะก่อน ด้วยคำสั่ง

gpio mode 0 out <--- สั่งให้ wirignpi pin 0 ทำหน้าที่เป็น output
gpio write 0 1  <--- สั่งให้เขียนค่า 1 ไปที่ wiringpi pin 0 ซึ่งจะเกิด login high ที่ pin นี้

ผมลองเปิด webiopi เพื่อเช็คสถานะของ GPIO ไปด้วย ( http://raspberry-pi-th.blogspot.com/2013/01/webiopi-control-raspberry-pi-s-gpio-via.html )

gpio mode 0 out

ในทำนองตรงกันข้าม หากเราต้องการให้ pin ใดๆ ทำหน้าที่เป็น input รอรับสถานะทางไฟฟ้า ก็กำหนดเป็น in แล้้วใช้คำว่า read แทนการ write ดังต่อไปนี้

gpio mode 11 in
gpio read 11 

หวังว่าคงไม่ งง นะครับ ว่าทำไม 11 กับ GPIO7 มันเกี่ยวข้องอะไรกัน ซึ่งมันเป็นเรื่องของการตั้งชื่อ map pin เข้ากับตัวโค๊ดของผู้เขียนโปรแกรมนั่นเอง ไม่มีอะไรมาก

gpio mod 11 in

นอกจากนี้ คำสั่ง gpio ยังมีลูกเล่นอื่นๆ อีกไม่ว่าจะเป็นการสร้างสัญญาณ PWM หรือการอ่านสถานะ pin ทั้งหมดก็สามารถทำได้เช่นกัน ลองศึกษาเพิ่มเติมดูจากคำสั่ง man gpio หรือที่เว็บ https://projects.drogon.net/raspberry-pi/wiringpi/

เดี๋ยวต่อไป ผมจะยกตัวอย่างการนำคำสั่ง gpio ไปลองใช้งานในด้านอื่นๆ ดูบ้างครับ ขอให้สนุกกับ Raspberry pi นะครับ

อ่านเพิ่มเติม...

Monday, February 4

How to install MJPG-Streamer

MJPG-Streamer คือ โปรแกรมประเภทคำสั่งที่สามารถพิมพ์คำสั่งลงไป แล้วโปรแกรมจะทำการดึงภาพออกจากเว็บแคมของเรา แล้วทำการส่งไปเก็บไว้ เพื่อที่เราจะสามารถเข้ามาดูได้ โดยผ่านเว็บบราวเซอร์ หรือผ่านทางมือถือก็ได้

บทความต่อไปนี้ ผมได้ค้นหามาจาก http://www.raspberrypi.org/phpBB3/viewtopic.php?f=30&t=8659  ซึ่งก่อนหน้านี้ ผมพยายามทำมาหลายครั้งแล้ว แต่ ไม่ประสบความสำเร็จเหมือนคนอื่นเค้า เนื่องจากบอร์ด Raspberry Pi ของผมเป็น Model B rev 1 ซึ่งอาจจะมีอุปสรรคมากกว่าบอร์ดรุ่นใหม่ๆ สักหน่อย ซึ่งอาจจะทำให้บทความนี้ อาจจะไม่เวิร์กสำหรับคนอื่นก็ได้ ก็ต้องขอบอกไว้ ณ ทีนี้ด้วย ซึ่งการที่เราจะต่ออุปกรณ์อะไรสักอย่างกับ Linux ย่อมมีอุปกรณ์เรื่องของ driver ที่ไม่รองรับ นั่นเป็นเรื่องธรรมดาของ Linux OS ครับ (ต้องทำใจนิดนึง)

อุปกรณ์ที่ผมใช้ก็คือ บอร์ด Raspberry Pi Model B rev 1 ซึ่งมี RAM อยู่ 256 กับกล้อง WebCam ยี่ห้อ OKER รุ่น Webcam OKER (177) ซึ่งนับว่าโชคดีมาก ที่เจ้า Driver kernel ของผมมันรองรับพอดี หากเพื่อน ต้องการทราบว่ากล้องรุ่นใดบ้างที่ driver รองรับ สามารถตรวจสอบได้ที่ http://www.ideasonboard.org/uvc/

เรามาเริ่มกันเลยครับ หลังจากที่เราได้เช็คอัพเดทแล้ว sudo apt-get update ให้เราไปโหลด package เหล่านี้มาก่อน ได้แก่

sudo apt-get install subversion
sudo apt-get install libv4l-dev
sudo apt-get install libjpeg8-dev
sudo apt-get install imagemagick

ซึ่ง Subversion เป็นตัวเอาไว้โหลดซอร์สโค๊ดจาก svn server ที่นักพัฒนาโปรแกรมนิยมเอาไปเก็บไว้ครับ ส่วน package อื่นๆ ที่เหลือ ก็เกี่ยวเนื่อง และ เป็นไลบรารี่เสริมในการ

compile MJPG-Streamer อีกทีครับ

ตอนนี้เราจะโหลด MJPG-Streamer บ้างหล่ะ ให้ใช้คำสั่งนี้ครับ ซึ่งจะได้ตัวอัพเดทล่าสุดเลย

svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer mjpg-streamer

เสร็จแล้วให้เข้าไปที่โฟวเดอร์ mjpg-streamer/mjpg-streamer ด้วยคำสั่ง

cd mjpg-streamer/mjpg-streamer 

จากนั้นเราจะทำการ compile โปรแกรมของเราหล่ะ ด้วยคำสั่ง

make USE_LIBV4L2=true clean all

ซึ่งไม่น่าจะมี error ใดๆ ขึ้นมานะครับ (อาจจะมี warning ได้ แต่ อย่าให้มี error ก็แล้วกัน ) เสร็จแล้วก็ตามด้วย

sudo make DESTDIR=/usr install

หากไม่มี error แล้ว ให้เราทำการเสียบกล้อง webcam ของเราเข้าทาง port USB ของบอร์ด Raspberry pi ครับ ก่อนที่จะเสียบสาย USB เราอาจจะสั่งคำสั่ง

tail -f /var/log/messages

เพื่อดูว่า uvcvideo kernel driver มองเห็นอุปกรณ์ที่เป็น camera หรือยัง ถ้ามองเห็นแล้ว ควรจะได้ข้อความตามรูปข้างล่าง

uvcvideo kernel driver found webcam

จากนั้น ผมลองติดตั้ง fswebcam ซึ่งตัวนี้ ผมจะใช้เป็นตัวเช็คว่า ผมจะต้องปรับค่า output ที่กล้องให้ค่าได้เป็นอะไร ซึ่งเราจะนำไปใช้ในการตั้งค่า streamer ต่อไป 

ติดตั้ง fswebcam  ด้วยคำสั่ง

sudo apt-get install fswebcam

เสร็จแล้วให้ใช้คำสั่ง

fswebcam --verbose

fswebcam --verbose

ซึ่งจากข้อมูลที่ได้มา ผมควรที่จะปรับค่า output ที่จะได้จาก streamer ให้เป็น YUYV และ frame rate ควรจะเท่ากับ 4

ผมก็นำเอาข้อมูลที่ได้นี้ มาใช้ร่วมกับคำสั่ง

mjpg_streamer -i "/usr/lib/input_uvc.so -d /dev/video0  -r 352x288 -f 4 -y YUYV" -o "/usr/lib/output_http.so -p 8090 -w /var/www/mjpg_streamer"

image

(ศึกษาพารามิเตอร์ต่างๆ ได้ที่ คำสั่ง mjpg_streamer --help  หรือ จากไฟล์ /home/pi/mjpg-streamer/mjpg-streamer/start.sh )

หลังจากที่สั่งคำสั่ง เรียบร้อยแล้ว จะเกิดการ stream ภาพที่ได้จากกล้องไปเก็บไว้ที่ web root folder เราสามารถเปิดดูภาพที่ได้ผ่านหน้าเว็บบราวเซอร์ได้เลย โดยใส่  URL ไปที่ ip ของ Raspberry pi แล้วตามด้วยพอร์ต 8090 ครับ จากนั้นตามด้วยพารามิเตอร์ ?action=stream

สมมติว่า ip address ของบอร์ด raspberry pi เท่ากับ 192.168.2.105 จะได้ว่า

http://192.168.2.105:8090/?action=stream

ที่หน้าเว็บบราวเซอร์จะพบภาพจากกล้องเว็บแคมของเราครับ MJPG-Streamer work

ถ้าเพื่อนๆ ลองปรับพารามิเตอร์คำสั่ง mjpg_streamer ให้เหมาะกับ output ของกล้องหล่ะก็ ภาพที่ได้จะออกมาดี (เท่าที่กล้องมันจะทำได้) เลยหล่ะครับ หวังว่าคงเป็นประโยชน์ นำไปต่อยอดกันได้นะครับ

อ่านเพิ่มเติม...
 

แจกฟรี พื้นที่ฝากไฟล์ 15 GB

ติดตามข่าวสารผ่าน Twitter

ติดตาม Blog นี้

About Me

My photo

สวัสดีครับ ชื่อเปิ้ลนะครับ ถ้ามีอะไรให้ช่วยเหลือได้ ก็จะช่วยครับ
ผมได้สร้างบล๊อกไว้ เพื่อเก็บรวบรวมความรู้ และประสบการณ์ในการทำงานครับ แวะไปเยี่ยมชมกันได้ครับ http://mechacity.blogspot.com และบล๊อก http://faker-programmer.blogspot.com ครับ

Blog อื่นๆของฉัน

Microcontroller Electronics update

สถิติเยี่ยมชมบล๊อก