คลังเก็บผู้เขียน: สี่สิบดีกรี

3D printing

ช่วงนี้ตัดสินใจซื้อ 3D printer มาใช้ กะว่าจะปริ้นท์ ชิ้นส่วนบางชิ้นที่หายากหรือราคาสูง เวลาทำโปรเจ็คต่างๆ ยิ่งโปรเจ็คอิเล็กทรอนิกส์ตามเว็บเมืองนอกที่น่าสนใจมีมากมาย เดี๋ยวนี้ใช้ปริ้นท์ขิ้นส่วนเอาแทบทั้งนั้น ไม่ว่าจะเป็น หุ่นยนต์, IoT หรือ home automation

ผมเลือกซื้อแบบ entry level มาลองก่อน ราคาไม่ถึงหนึ่งหมื่นบาท ไม่ได้เลือกตามความนิยมในตลาดบ้านเรา ข้อดีคือ มีปริ้นเตอร์จีนหลายยี่ห้อให้เลือกใช้ หลักการที่ผมใช้เลือกปริ้นเตอร์คือ ต้องดูแล้วมั่นคงแข็งแรงโดยตัวมันเอง ไม่ต้องทำอะไรเพิ่มเติมภายหลัง อาจจะดูจากวัสดุอุปกรณ์ที่ใช้ การดีไซน์ และขนาดที่ไม่เล็กจนเกินไป ไม่งั้นก็จะใช้งานได้ไม่คุ้มค่า สิ่งสุดท้ายคือ การประกอบไม่ยุ่งยากจนเกินไป เพราะนี่คือปริ้นเตอร์ตัวแรกของเรา คงไม่อยากต้องมานั่งประกอบหรือปรับแต่งจนท้อใจไปก่อนที่จะเห็นผลงานดีๆ

ระหว่างการประกอบ ควรใส่ใจการประกอบโครงสร้าง การยึดสายพาน ล้อเลื่อน ลีดสกรู ที่ควรมั่นคงแข็งแรงได้ฉากก็ตรวจให้เรียบร้อย ที่ควรเลื่อนขึ้นลงได้คล่องไม่ฝืดติดขัด สายพานก็ให้ตึงไม่หย่อนคล้อย ตำแหน่งการวางก็ควรจะมั่นคงหนักแน่น เพราะเวลาเครื่องทำงานเกิดแรงสั่นสะเทือนตลอดเวลา

ก่อนจะเริ่มทำการปริ้นท์ ก็ควรเช็คตำแหน่งต่างๆให้ถูกต้องตามคู่มือเสียก่อน การปรับระดับถาดปริ้นท์สำคัญมากๆ ระยะระหว่างหัวฉีดกับถาด ในการปรับแต่ง ผมใช้กระดาษ A4 สอดไประหว่างกลาง ให้กระดาษสามารถเลื่อนได้ไม่ฝืดหรือไม่หลวมจนเกินไป

การใส่ฟิลาเม้นท์ครั้งแรก ให้สอดไปจนยาวสุดๆเท่าที่จะทำได้ เมื่อเตรียมทุกอย่างพร้อมแล้วก็เริ่มปริ้น์ท์ครั้งแรกกันเลย

ในการใช้โปรแกรมเพื่อเตรียมไฟล์สำหรับการปริ้นท์นั้น เวลาซื้อเครื่องเค้าก็จะแถมโปรแกรมมาให้อยู่แล้ว เราสามารถไปหา download เอาใหม่ก็ได้ อย่างที่ผมใช้จะเป็นโปรแกรม cura ทำการเซ็ตข้อมูลปริ้นท์เตอร์ของเราเข้าไปในโปรแกรม ตั้งค่าต่างๆให้เรียบร้อย ก่อนที่จะเปิดไฟล์โมเด็ลที่ต้องการปรินท์ขึ้นมา ตั้งค่าหลักๆก็มี ระยะระหว่างเลเยอร์ เปอร์เซ็นต์ความหนาแน่น ค่านี้ยิ่งสูง ชิ้นงานก็ยิ่งแข็งแรง แต่ก็พิมพ์นานขึ้นด้วย ก็เลือกให้เหมาะสมตามการใช้งานชิ้นงานนั้นๆ

หลังจากใช้งานมาสักพัก ปรินท์นั่นนี่โน่นมาจนใชฟิลาเม้นท์เกือบหมดม้วน 1 kg ภายในเวลาอันรวดเร็ว การศึกษาวิธีการใช้งานที่ดีที่สุด คือ ลองปริ้นท์มันเลยครับ เพราะระหว่างที่ปริ้นท์เราก็จะเจอปัญหาต่างๆ เช่น ชิ้นงานไม่สวย เกิดการผิดพลาดระหว่างการปริ้นท์ เหล่านี้ล้วนมาจากติดตั้งและเตรียมเครื่องทั้งนั้น หากติดตั้งได้ดีถูกต้อง ชิ้นงานจะออกมาสวยงามคมชัดถูกต้องอย่างไม่น่าเชื่อเลยครับ มันจะเป็นความรู้สึกดีๆ เมื่อคุณได้ผลิตชิ้นงานได้เอง

ขั้นต่อไป คือการลองออกแบบชิ้นงานด้วยตัวเอง ก็มีหลายโปรแกรมให้เริ่มต้นง่ายๆ อย่างเช่นตัวผมเองเริ่มด้วย tinkercad ตัวโปรแกรมมีบทเรียนออนไลน์ให้เรียนรู้ได้ไม่ยาก ทำชิ้นส่วนง่ายๆ หรือเอาของคนอื่นมาลองดัดแปลง เมื่อทำสำเร็จแล้วค่อยลองอะไรที่มันซับซ้อนขึ้นต่อไปครับ

 

 

ทดลองเล่น LoRa

มีโอกาสได้ทำการทดลองใช้งาน LoRa module กับ IoT platform ทั้งแบบ LoRa ธรรมดา และ LoRaWAN ความแตกต่างระหว่าง 2 แบบนี้ คือ LoRaWAN มี network protocol เพิ่มเข้ามาเป็นมาตรฐานการสื่อสารเช่นเดียวกับพวก WIFI แต่ก็ไม่ถึงกับมีความจำเป็นจะต้องใช้แบบ LoRaWAN แต่เพียงอย่างเดียวเท่านั้น งานระบบง่ายๆ หรือเขียน gateway เองได้ ก็จะสามารถใช้ LoRa module ได้หลากหลายแบบขึ้น เช่น ใช้โมดูลที่แปลง LoRa เป็น UART ให้เลย หรือถ้าใครต้องการระบบที่มีมาตรฐาน มีความปลอดภัย ก็ใช้ LoRaWAN ไป

ระบบแรกที่ได้ทดลองทำคือ Thingsboard.io โดยใช้ MQTT เป็นตัวส่งข้อมูลขึ้นไปให้ ฝั่ง LoRa device กับ gateway ก็เขียนโปรแกรมรับส่งข้อมูลเอง

ส่วนอีก platform หนึ่งคือ TheThingsNetwork.org อันนี้มี LMIC library ที่ implement LoRaWAN stack ให้ มีโปรแกรม gateway ที่มีคนเขียนด้วย LMIC ให้ได้ลองศึกษากันงานกันได้เลย ที่ผมทำการทดลอง ก็ใช้ single channel gateway ซึ่งอันที่จริงก็ไม่ได้เป็นไปตามมาตรฐาน (ควรจะเป็น multi-channel) แต่ก็หยวนๆกันไป เพราะ hardware มีราคาถูกกว่า คนเข้าถึงเพื่อเรียนรู้ได้ง่ายกว่า

ก็ต้องรอดูกันไปว่า จะเกิดมั้ย เพราะ การสื่อสารแบบอื่นๆ อย่างเช่น NB-IoT ก็มีบริษัทฝั่งอเมริกาหนุนอยู่ครับ

developer diary – ตอน Qt3D

ห่างหายจากการอัพเดตความรู้ไปนาน วันนี้นั่งสำรวจ Qt3d ว่าเป็นยังงัย ไปถึงไหนแล้ว เจออันหนึ่งน่าสนใจ ObjectPicker แล้วก็เรื่อง SkyBox พอ Qt 5.10 น่าจะออก feature นี้มา
พอดูเรื่อง Skybox ก็เลยไปดูต่อว่า เราจะสร้าง texture สำหรับมันได้อย่างไร พวก เครื่องมืออย่าง photoshop มีปลั๊กอิน แต่ถ้าเป็นการเอาภาพจริงมาสร้างน่าจะง่ายกว่า โดยอาศัยกล้อง 360 องศาถ่ายแบบ panorama แล้วใช้โปรแกรมช่วย ตอนนี้หาไม่ยาก เพราะเรื่อง VR กำลังมา
พอได้ texture แล้วทีนี้ก็เอามาใช้ไนการเขียน 3d scene ด้วย QML
ปีที่แล้วเห็นมีคุยกันเรื่อง Qt 3d studio ตอนนี้กลับเงียบๆไป

MQTT + Silk

Silk เป็น web framework อีกตัวหนึ่งครับ แต่ไอเดียจะแตกต่างจากตัวอื่นๆที่เคยเขียนถึงไป ตัวนี้ค่อนข้างถูกจริตกับผมมากกว่าตัวอื่นๆ เนื่องจากมันคือการเขียน HTML document ด้วย QML

การที่มันยังสามารถใช้ model/view ของ QML ได้นั้น ทำให้เราสามาารถดึงข้อมูลจาก C++ model ไปแสดงใน HTML table ได้อย่างง่ายดาย

การที่มันยังเขียน web ได้ในแบบเดิมๆ ใช้ javascript ได้ ก็ทำให้ไม่ต้องเปลี่ยนแปลงวิธีการเขียนในส่วนนี้ไป

และด้วยความที่มันเป็น C++ web server โดยตัวมันเอง มันน่าจะเหมาะกับโปรเจ็คเล็กๆ อย่างพวก IoT ที่ไม่ได้ต้องการรองรับ client จำนวนมาก

จากที่ว่ามา ผมจึงเอามันมาลองกับ MQTT โดยมี hardware คือ nodemcu เอามาต่อกับ sensor DS18B20 เขียนโปรแกรมด้วย Arduino IDE โดย ก็ต้องลง library ESP8266, OneWire, PubSubClient (MQTT), DallasTemperature เพื่อให้ใช้อ่านค่าอุณหภูมิและส่งข้อมูลไปให้ MQTT server ผ่าน wifi ได้

 

ตัว server ก็เป็น linux รัน mosquitto ที่รองรับ websocket และ รัน silk webserver โดยเขียน web app ให้ subscribe MQTT message ผ่าน websocket ได้โดยใช้ paho javascipt client และใช้ justgage แสดงผลข้อมูลที่ได้ในแบบ graphics

การเล่นไฟล์เสียงต่อเนื่องกัน

เวลาทำระบบคิว เราจะเห็นได้ว่า จะมีเสียงเรียกคิวตามหมายเลขและเคาท์เตอร์ที่กำหนดได้ คงไม่มีใครทำรอไว้ทุกแบบ ก็น่าจะใช้วิธีการเล่นไฟล์ที่ต้องการแบบต่อเนื่องกันไป

ผมก็ลองอัดเสียงหล่อๆของตัวเอง (แหวะ ฮ่าๆ) แล้วก็ตัดมันออกเป็นหลายๆไฟล์ แล้วก็หาวิธีเล่นมันอย่างต่อเนื่อง ตัวโปรแกรมที่สามารถเล่นได้ก็มีหลายตัว ที่ผมลองแล้วก็มี gstreamer และ sox ครับ

จากการลองใช้งานทั้งคู่ ซึ่งเป็น command line ดู sox จะให้คุณภาพเสียงที่ดีกว่า แต่ทั้งนี้ทั้งนั้น ผมใช้ค่า default ในการเล่นนะ ไม่ได้ปรับแต่งค่าใดๆ

gstreamer บน Windows

qtgst-win

จริงๆเขียนโปรแกรมแบบนี้มาหลายปีแล้ว แต่วิธีการก็ต่างกันไปเรื่อยๆครับ คราวนี้มาเขียนบน Windows เพราะเริ่มจะกลับมา deploy งานบน x86 และ win10 บ้าง

ใช้ gstreamer บน Windows ค่อนข้างน่าเวียนหัว โดยเฉพาะเมื่อ อยากใช้ qt-gstreamer และ ms visual studio compiler ทำให้รู้ว่าการมี pkg-config บน linux ช่วยได้เยอะ แต่ลอง pkg-config (win 64) แล้วมัน crash ก็งงๆอยู่ว่าทำไม เดี๋ยวค่อยหาสาเหตุอีกที

gstreamer นี่เอามาใช้ เพื่อ แสดง live preview จาก stream rtsp ของกล้อง IP

ตอนแรกจะใช้ command line ด้วย ffmpeg เพื่อ capture ภาพ ติดตรงต้องเก็บเป็นไฟล์ก่อน แล้วถึงจะดึงภาพมาแสดงได้ พอรู้ว่า OpenCV สามารถดึงภาพจาก stream rtsp ได้ด้วย ก็เลยเปลี่ยนมาใช้ เพราะทำให้สามารถเอามาทำ image processing ต่อและเอาไปแสดงบน Qt/QML Quick control ได้โดยการ copy memory ได้เลย ไม่ต้อง save ก่อน (เอ แต่เดี๋ยวก็ต้อง save อยู่ดีนี่ – – !) ส่วนนี้ต้องให้มันทำงาน แยก thread ออกมาจาก main thread ที่ทำ GUI ไม่งั้น live preview ก็จะกระตุกเวลา capture ภาพ อันนี้เป็นสิ่งที่ผมชอบใช้ Qt เพราะทำให้การใช้ thread เป็นเรื่องง่ายขึ้นเยอะ

ข้อสังเกต คือปัจจุบัน สามารถแยกงานออกแบบ GUI ออกมาได้เกือบสิ้นเชิง ด้วยการใช้ Qt/QML ซึ่งดีต่อการทำงานเป็นทีมมาก

สุดท้าย เอา command line สำหรับ capture ภาพจาก stream rtsp มาฝาก มี 2 วิธี

  1. ใช้ gstreamer แต่คำสั่งนี้ บางทีก็ capture ไม่ได้ ไม่รู้ทำไมเหมือนกัน
    D:\gstreamer\1.0\x86_64\bin>gst-launch-1.0  rtspsrc location=”rtsp://admin:admin@192.168.1.108:554″ latency=10 num_buffers=10 ! decodebin ! videoconvert ! pngenc snapshot=TRUE ! filesink location=img.png
  2. ใช้ ffmpeg อันนี้ ชัวร์ป้าบ
    ffmpeg.exe -i rtsp://192.168.1.xx:554 -y -f image2 -vframes 1 test.jpg

อัพเดต 10 มี.ค. 2560 ไม่รู้มีใครเจอเหมือนกับผมมั้ย การใช้ OpenCV เปิด stream จะมี dalay อยู่พอสมควร เมื่อเทียบกับ gstreamer ที่สามารถกำหนด option เพื่อลด delay ได้ สุดท้ายก็เลยเปลี่ยนมาใช้การ capture frame ด้วย gstreamer ครับ

อ่านบัตรประชาชนรุ่นใหม่

ไม่ค่อยได้มาเขียนในนี้เท่าไรเลยพักนี้ ด้วยเหตุที่ทำหลายอย่างพร้อมๆกัน หากจะมีอะไรอยากเขียนนิดๆหน่อยๆก็ไปเขียนลงใน facebook แบบทันทีทันใดเลย

ปลายปีอีกละ ก็เอาซะหน่อย ลองสรุปดูว่าทำอะไรไปบ้าง

  • ความคืบหน้าการเปิด mocap studio ก็ต้องเลื่อนออกไปก่อน กำลังศึกษา 3D modeling จากประสบการณ์การทำเดโม การพูดคุยกับ modeller รวมทั้ง animator ยังต้องพัฒนาการสื่อสาร ประเด็นหลักคือ เรายังรู้ด้านกราฟิกน้อยเกินไป แม้ว่าจะมีความรู้ด้าน technical และเครื่องมือพอสมควรแล้ว แต่ยังไม่สามารถทำงานร่วมกันได้อย่างราบรื่น ก็เลยต้องถอยมาตั้งหลักก่อน
  • หลังจากที่ทำ signage ทำ kiosk มาบ้างแล้ว ปีหน้าจะเริ่มโปรเจ็คใหม่ๆ อย่างเช่น การทำตู้ check-in , car parking system และ target board ในโรงงาน จากที่ปีนี้ ได้งานเขียนทั้ง อ่าน 1D, 2D barcode, อ่านบัตรประชาชน, RFID รวมทั้งการใช้งานเครื่องพิมพ์ใบเสร็จ ก็ทำมาหมดแล้ว ต่อไปก็จะพัฒนา ตู้ที่สามารถจ่ายบัตร ทอนเงินได้ ยังมี requirement อ่านข้อมูลจาก passport เข้ามาด้วย

พูดถึงการอ่านบัตรประชาชน เคยเขียนโปรแกรมไปเมื่อนานมาแล้ว โดยอาศัยข้อมูลจาก code c# ที่มีผู้เผยแพร่เอาไว้ (ThaiNationalIDCard) มาแปลงเป็น c++ เมื่อเร็วๆนี้ได้พบว่า บัตรประชาขนมีรุ่นใหม่ออกมา และโค้ดเดิมไม่สามารถอ่านได้ ก็ได้ข้อมูลจากท่านเดิมนี่ละที่อุตส่าห์มาอัพเดตโค้ดไว้ ขอขอบคุณมา ณ ที่นี้ด้วยครับ เพราะได้ลองเข้าไปหาข้อมูลในเว็บของกรมการปกครอง ก็ไม่อยู่เสียแล้ว (อันนี้ไม่เข้าใจ) สอบถามจากผู้ขายเครื่องอ่านบัตร เค้าก็ไม่อยากตอบเท่าไร เพราะเค้าขายโปรแกรมด้วย (อันนี้ก็พอเข้าใจ)

LoRa

ลองสั่งทำ PCB บอร์ดมาจากต่างประเทศ สำหรับการทำเดโมหรือทดลอง ราคาไม่แพงเลยครับ เดี๋ยวนี้ไอซีทำออกมาเป็นโมดูลมากขึ้น ทำให้เราเอามาพัฒนาต่อยอดได้ง่ายและรวดเร็วกว่าเมื่อก่อน ดูอย่างเจ้า LoRasPi ที่ผมสั่งทำจำนวนไม่กี่บอร์ดก็ยังทำให้ได้ รายได้ก็กลับไปที่นักพัฒนาด้วย CooL!

แต่ว่ายังไม่ได้สั่งโมดูล LoRa เข้ามาจำหน่ายเลย รอก่อนนะเจ้าบอร์ด เอิ๊ก เอิ๊ก

IMG_20160823_104300-s

รีโมทควบคุมหุ่นยนต์

2wheels-3

วันก่อนทดลองประกอบโครงรถหุ่นยนต์ที่จำหน่ายในร้าน ioteshop การควบคุมมอเตอร์ก็ใช้ arduino ร่วมกับโมดูล tb6612fng ก็ง่ายดีครับ หากเป็นระบบอัตโนมัติ เช่น หุ่นยนต์เดินตามเส้น ก็ใช้เซนเซอร์อินฟราเรดในการตรวจจับเส้นเพื่อนำทาง แต่พอมาคิดว่าอยากจะมีรีโมทควบคุมมันได้เนี่ยก็มองหา โซลูชั่น หลายๆอันดู เช่น

  1. จอยต่อกับโมดูล nrf24l01
  2. wifi to serial
  3. bluetooth
  4. raspberry pi

1 กับ 2 ก็น่าสนใจ ติดตรง ต้องหาจอยมาใช้ร่วมกัน ขอหาก่อน
3 กับ 4 นี่ คิดถึง wiimote ขึ้นมา wiimote เป็น HID device (เหมือนเมาส์ คีย์บอร์ด จอยสติ๊ก) ใช้ bluetooth ในการสื่อสาร มันมีประเด็นขึ้นมาให้เลือกคือ

A. ถ้าเลือกใช้ arduino ต่อ จะคุยกับ HID bluetooth device ได้ ต้องมี USB host shield และ bluetooth USB dongle วิธีนี้โค้ดที่เคยเขียนควบคุมมอเตอร์ไม่ต้องเปลี่ยน

B. ถ้าเลือกใช้ raspberry pi แทน มี usb port ให้เสียบ bluetooth dongle หรือ ถ้าเป็น pi 3 ก็มีให้เลย(แต่แค่ควบคุมหุ่นยนต์ ไม่น่าใช้ น่าจะเปลืองแบตกว่า pi1 หรือ pi2) แต่ ต้องหาทางควบคุมทิศทางและความเร็วของมอเตอร์ ซึ่งถ้าจะใช้ hardware ก็ง่าย มีบอร์ด pwm เช่นของ adafruit เอามาต่อใช้ หรือถ้าจะเป็น software ก็ใช้ pi-blaster ซึ่งใช้ DMA ในการควบคุม เท่าที่ดูก็มีความแม่นยำโอเค

อืม ตกลงว่า ลองข้อ A ก่อนละกัน น่าจะง่ายที่สุด bluetooth usb dongle ก็มีอยู่แล้ว เหลือสั่ง usb host shield มาเท่านั้น

แต่ถ้าของมาช้า ก็อาจจะลอง B ก่อน ไว้จะมาอัพเดต ตอนต่อไป

อัพเดต พอดีไปเจอ joystick shield สามารถใช้ร่วมกับ nrf24l01 และ arduino ทำเป็นรีโมทคอนโทรลได้ ก็เป็นอีกหนึ่งทางเลือกครับ

RFID overview

พอดีจะใช้งาน RFID หลายๆแบบ ก็เลยต้องทบทวนความรู้กันนิดหน่อย ส่วนใหญ่เอามาจาก http://www.idautomation.com/barcode-faq/rfid/ และ http://blog.atlasrfidstore.com/

RFID (Radio Frequency Identification) เอามาใช้งานในด้าน ระบุตัวตน, access control เดี๋ยวนี้เอามาใช้งานหลากหลายขึ้น เช่น เก็บค่าทางด่วน, logistics, supply chain

ชนิดของ tag แบ่งตามความถี่ที่มันทำงาน

  • Low frequency, or LF, (125 – 134 kHz)
  • High frequency, or HF, (13.56 MHz)
  • Ultra-high frequency, or UHF, (433, and 860-960 MHz)

LF, HF, UHF ต่างก็มีข้อดี ข้อเด่นต่างกันไป เช่น LF ทะลุผ่านแผ่นโลหะบางๆได้ แต่ระยะการอ่านก็ได้เพียงสั้นๆ ส่วน UHF อ่านเขียนความเร็วสูงกว่า ระยะไกลกว่า แต่ก็ถูกลดทอนได้ง่ายกว่า

การเก็บข้อมูลใน tag แบ่งเป็น 3 ชนิด
class 0 – data ถูก encoded หรือ เขียนลงไป จากโรงงาน เรียกว่าเป็น read-only tag
class 1 – เอามาเขียนเองได้ แต่ได้แค่ครั้งเดียว เรียกอีกแบบ ว่า GEN1
class 1 GEN 2 EPC – อ่านเขียนได้หลายครั้ง มีฟีเจอร์เพิ่มเติมเข้าไปได้ เช่น lock after write, CRC read verification

ข้อดีของการใช้ RFID นั้นมีเยอะ ดูได้จากการเอามาใช้งานในหลายด้าน มาดูข้อเสียดีกว่า

ข้อเสีย

  1. เนื่องจากมันใช้สัญญาณวิทยุ ดังนั้น ถ้ามีการรบกวนเกิดขึ้น การอ่านก็จะทำไม่ได้ คือ มองไม่เห็น tag นั่นคือเรื่องของความแม่นยำของข้อมูล เช่น ในโกดัง ถ้าอ่านไม่เจอ tag อาจไม่ได้หมายความว่ามันไม่ได้อยู่ที่นั่นก็ได้ อาจจะโดนอะไรบังหรืออยู่ในตำแหน่งที่เครื่องอ่านไม่สามารถอ่านได้
  2. สาเหตุเดียวกับข้อแรก มันก็อาจจะถูกดักจับข้อมูล โดยผู้ไม่หวังดีได้

ชนิดของหน่วยความจำใน GEN 2 tag แบ่งได้เป็น 4 ชนิด คือ

  1. reserved – เอาไว้ เก็บ access และ killing password
  2. EPC – มีขนาดทั่วไปอย่างน้อย 96 bits เอาไว้เก็บ Electronics Product Code ตามชื่อมันนั่นเอง
  3. TID – เก็บ tag ID เปลี่ยนแปลงไม่ได้
  4. user – เป็น memory ส่วนที่เพิ่มเติมเข้า ให้ user สามารถเก็บข้อมูลลงไปเพิ่มเติมได้ ขนาดก็มีได้หลายขนาด เช่น 1k, 4k หรือ 8k bytes