สวัสดีครับ กลับมากับบทความสอนใช้งานบอร์ด Easy-eIoT HAT สำหรับใช้งานร่วมกับบอร์ด Raspberry Pi กันอีกแล้ว ในตอนที่ #3 ซึ่งในบทความที่ผ่านมา 2 ตอนเราได้พูดถึงเรื่องการใช้งานจอสี,การอ่านค่าความชื้นและอุณหภูมิจากเซ็นเซอร์ HS3004 รวมไปถึงควบคุมหลอด LED บนบอร์ด Easi-eIoT ตลอดจนการใช้งานปุ่มกด,rotary encoder และ buzzer กันไปเป็นที่เรียบร้อยแล้ว ในบทความนี้เราจะมาทำความรู้จักกันอุปกรณ์ส่วนควบที่ติดมากับบอร์ดที่เหลือกันครับ และจะมาทดลองใช้งานไปด้วยกัน โดยอ้างอิงจาก Pinout diagram ของเรากันก่อนว่าเรามีอุปกรณ์อะไรข้างและเชื่อมต่อกับขา GPIO อะไรบ้าง
โดยในบทความนี้เราจะมาพูดถึงการใช้งานอุปกรณ์ส่วนควบดังนี้
.
1. การใช้งานหลอด RGB LED WS2812b
2. การเขียน pygame เพื่อการแสดงผลบนจอ IPS 1.54 นิ้ว
โค้ดตัวอย่างทั้งหมดอยู่ที่ https://github.com/raspberrypi66/easy-eiot
การใช้งานหลอด WS2812B
หลอด LED เบอร์ WS2812B ที่ติดตั้งอยู่บนบอร์ด Easy-eIoT นั้นเป็นหลอด LED ที่สามารถต่ออนุกรมหลอดไปได้และสามารถส่งคำสั่งไปควบคุมหลอดไฟแต่ละหลอดได้เป็นอิสระต่อกันโดยใช้การต่อสายเพียง 3 เส้นคือ 5VO,DOUT และ GND โดยบนบอร์ด Easy-eIoT นั้นได้มีหลอด WS2812B ติดตั้งไว้แล้วจำนวน 1 ดวงโดยเชื่อมต่อกับขา GPIO12 และหากเราต้องการที่จะพ่วงหลอดออกไปมากขึ้นทางด้านหลังของบอร์ดจะมีคอนเนคเตอร์สำหรับเชื่อมต่ออยู่ โดยวิธีการในการควบคุมหลอด LED ประเภทนี้นั้นเราจะทำการส่งคำสั่งควบคุมออกไปยังหลอดตรงๆ โดยในหลอด WS2812B 1 หลอดภายในจะมีหลอด LED จำนวน 3 สีติดตั้งอยู่เพื่อให้สามารถแสดงสีออกมาผสมกันได้เป็นค่าสีที่ต้องการ
มีขาสัญญาณเข้าเพื่อรับสัญญาณมาควบคุมและขาสัญญาณออกเพื่อให้สัญญาณสามารถผ่านไปควบคุมหลอดที่ต่ออยู่ในลำดับถัดไปได้ โดยที่เมื่อมันใช้สายสัญญาณเพียงเส้นเดียวเท่านั้นการส่งค่าสถานะของสัญญาณ “0” และ “1” จึงจำเป็นต้องใช้วิธีส่ง pulse ออกไปแล้วใช้วิธีปรับ duty cycle ของ pulse เพื่อให้แยกความแตกต่างของ logic “0” และ “1” ได้ดังรูป
โดยหลอดแต่หลอดนั้นจะใช้ข้อมูลลูกคลื่นจำนวน 24 ลูก เพื่อการแสดงผลที่ 24 bit ของสี (GRB 8:8:8) โดยเมื่อ raspberry Pi ส่งสัญญาณควบคุมออกมาให้กับหลอดนั้น เริ่มจากหลอดแรกเมื่อได้รับลูกคลื่นจำนวน 24 ลูกแล้ว สัญญาณที่เหลือจะถูกส่งออกไปยังขา DOUT เพื่อไปเข้ายังขา DIN ของหลอดถัดไป ซึ่งหลอดถัดไปก็จะรับลูกคลื่นจำนวน 24 ลูกมาเก็บไว้ในตัวเองแล้วส่งสัญญาณที่เหลือออกไปยังหลอดถัดไปเช่นนี้ไปเรื่อยๆ โดยที่ค่าของลูกคลื่น 1 ลูกจะอยู่ที่ 1.25uS ผิดพลาดได้ไม่เกิน +- 150nS ซึ่งการที่จะให้ Raspberry Pi สามารถส่งสัญญาณที่เที่ยงตรงแบบนี้ได้เราจะต้องทำการตั้งค่าต่างๆเพื่อให้สามารถใช้งานหลอด WS2812B ได้ดังนี้
ทำการ update และ ติดตั้ง package ที่จำเป็น
sudo apt-get update
sudo apt-get install build-essential python-dev git scons swig
ตั้งค่า blacklist module
สร้างไฟล์ /etc/modprobe.d/snd-blacklist.conf
เพิ่มบรรทัด
blacklist snd_bcm2835
ทำการบันทึก
เปิดไฟล์ /boot/config.txt
เพิ่มบรรทัดลงไปที่ด้านล่างสุดของไฟล์
hdmi_force_hotplug=1
hdmi_force_edid_audio=1
ทำการบันทึก
ติดตั้งและ compile python library
cd ~/easy-eiot
git clone https://github.com/jgarff/rpi_ws281x.git
cd rpi_ws281x
scons
cd python
sudo python setup.py install
sudo reboot
ทำการทดลองการแสดงผล
cd ~/easy-eiot
sudo python3 ws2812b_test.py
จากโค้ดด้านบนในบรรทัด 24 จะเป็นการประกาศสร้าง object ที่ชื่อ strip ขึ้นมาเพื่อใช้ควบคุมหลอด WS2812B ของเรา โดยจะสามารถตั้งค่าต่างๆได้จากบรรทัดที่ 8-14 โดยหากเราต่อจำนวนหลอดเพิ่มขึ้นเราก็ต้องไปแก้ในบรรทัดที่ 8 ให้เป็นจำนวนตามที่ต้องการ
และในการสั่งเปลี่ยนค่าสีนั้นจะเป็นการเรียกผ่าน function ที่ชื่อ strip.setPixelColor() โดยสามารถระบุเป็นลำดับของหลอด(หลอดดวงแรกนับเป็น 0) และค่าสี 24bit ที่ต้องการ
เมื่อต้องการให้แสดงผลออกมาก็ให้ทำการเรียก strip.show()
ดังเช่นตัวอย่างในคลิปด้านล่างที่ทำการต่อหลอดพวงภายนอกอีกจำนวน 16 หลอด
https://www.youtube.com/watch?v=yuuNHGl6FdM
การเขียน pygame แสดงผลบนจอ IPS
ในส่วนนี้เราจะมาเรียนรู้พื้นฐานการเขียนโปรแกรมด้วย library pygame เพื่อการแสดงผลบนหน้าจอ IPS ของบอร์ด Easy-eIoT กันดูนะครับ โดยเราจะขึ้นโครงของโปรแกรมมาคร่าวๆดังนี้
โดยเพื่อให้ใช้งานร่วมกับส่วนอื่นๆได้โดยไม่เจอปัญหาใช้งานทรัพยากรร่วมกันเราจะประกาศให้ os.environ ของ SDL_VIDEODRIVER และ SDL_AUDIODRIVER เป็น dummy และ dsp ก่อนและประกาศให้ SDL_FBDEV เป็น /dev/fb0 (ได้จาก dmesg | grep “frame buffer”)
จากนั้นก็ทำการ initial pygame ขึ้นมาโดยกำหนดขนาดของหน้าจอเป็น 240×240 ซ่อน mouse pointer และสั่งให้แสดงผลเต็มหน้าจอ
และหากเราต้องการจะแสดงข้อความออกทางหน้าจอเราสามารถสร้าง font object ขึ้นมาได้จาก font ที่เป็นประเภท truetype font เมื่อต้องการให้แสดงผลก็สามารถ render ขึ้นมาได้และสั่ง blit ให้ไปยังตำแหน่งที่ระบุไว้บนหน้าจอและสุดท้ายเมื่อสั่ง display.flip() ข้อมูลที่เขียนใน buffer ทั้งหมดจะถูกนำมาแสดงที่หน้าจอ
และหากเราใช้ font ที่สนับสนุนภาษาที่เราต้องการให้แสดงผลก็จะสามารถใช้งานทันที โดยจากตัวอย่างจะเป็นการสั่งให้ pygame ทำงานที่ความเร็วในการแสดงผลที่ 60FPS โดยดเราสามารถกำหนดค่าดังกล่าวได้ด้วยตัวเองในบรรทัดที่ 57 จากโค้ดตัวอย่างจะได้การทำงานดังคลิปด้านล่าง
https://www.youtube.com/watch?v=DOkaAPm8Jdg
ตอนนี้หากทุกท่านทำตามบทความตั้งแต่เริ่มต้นก็จะสามารถใช้งานอุปกรณ์ส่วนควบทั้งหมดที่อยู่บนบอร์ด Easy-eIoT ได้อย่างครบถ้วนแล้วครับ และในบทความถัดไปเราจะมาลองใช้งานร่วมกับอุปกรณ์อื่นๆผ่านทาง header ที่เราจัดเตรียมไว้ไม่ว่าจะเป็น Serial,I2C,SPI,1-Wire และ I2S กันครับ
Source code : https://github.com/raspberrypi66/easy-eiot
รูป WS2812B จาก : https://cpldcpu.wordpress.com/2014/01/14/light_ws2812-library-v2-0-part-i-understanding-the-ws2812/