คลังเก็บหมวดหมู่: hardware

Deep Learning กับ nvidia jetson nano ตอนที่ 1

ตอนนี้ เราจะมาทดลองรันโปรแกรมบน jetbot กัน โดยจะเป็น examples ที่มากับตัว install 2 ตัวอย่างแรกจะเป็นการแนะนำการเขียนโปรแกรมเพื่อควบคุม jetbot ทั้งด้วย widgets และจอย

โปรแกรมตัวอย่างเขียนด้วย jupyter notebook และระบบที่รัน jetbot ก็ลงมาให้เรียบร้อยแล้ว เราสามารถรันแบบรีโมทผ่านบราวเซอร์จากเครื่องคอมเราได้เลย โดยเราก็รัน jetbot ด้วย power bank ทีติดตั้งไว้แล้ว เพื่อไม่ให้เป็นอุปสรรคในการเคลื่อนที่ของ jetbot การทดลองรันก็เพียงแค่เปิดไฟล์ ขึ้นมาแล้วให้มันรัน จะทีละส่วน(เค้าเรียกว่า cell)เพื่อทำความเข้าใจ หรือสั่งรันทั้งหมดเลยก็ได้ แต่ไม่แนะนำ เพราะ cell ท้ายๆ อาจจะเป็นการสั่งหยุดการทำงาน

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

1. ขั้นตอนแรก จะเป็นการเก็บ samples โดยโค้ดจะทำการเก็บภาพและให้เราแยกว่าภาพไหนคือ blocked หุ่นจะไปต่อไม่ได้ หรือ ภาพไหนคือ free หุ่นสามารถเคลื่อนที่ไปได้ เพื่อจะนำไป train
2. ทำการ train ขั้นตอนนี้ยุ่งยากหน่อย ผมพบว่า หากเก็บ samples จำนวนมาก (> 100) จะทำการ train บน jetbot ไม่สำเร็จ มีอาการดับไปซะเฉยๆ (เรื่องนี้ เดี๋ยวว่ากันอีกที) ดังนั้นจึงต้องทำการ train บนเครื่อง pc แทน ซึ่งใช้เป็น ubuntu 18.04 ก็ต้องไปทำการ install โปรแกรมที่จำเป็นทั้งหมด เรียกว่า ก็ต้องให้เหมือนบน jetbot นั่นเอง
หลังจากงมอยู่นาน จึงได้ขั้นตอนการ install ดังนี้

  • ลง anaconda ก็จะได้ python มาด้วย
  • ลง pytorch โดยเลือกได้ว่าจะใช้ cuda หรือไม่ ซึ่งบางคนใช้การ์ดจอ nvidia อาจอยากใช้ gpu ในการคำนวณ ก็ต้องไปลง driver cuda ก่อนนะ
  • ลง jupyter (อันนี้ไม่แน่ใจว่าตอนลง anaconda มันลงให้เลยอัตโนมัติแล้วหรือเปล่า)

*** ข้อที่ต้องระวังคือ เวอร์ชั่นของ pytorch บนเครื่องที่ใช้เทรนกับบน jetbot จะต้องเหมือนกัน ไม่งั้นจะโหลดโมเดลที่เทรนมาไม่ได้ ของผมใช้วิธีอัพเกรด jetpack เป็น เวอร์ชั่น 4.4 และอัพเกรด pytorch ไปเป็นเวอร์ชั่น 1.6

3. คือการนำ model ที่เทรนได้มาใช้งาน ซึ่งตอนนี้เจอปัญหาว่า แค่ออกตัวก็ดับตายสนิท ฮ่าๆ จากที่ลองหาข้อมูลในฟอรั่มดู น่าจะเป็นจังหวะมอเตอร์เริ่มหมุน พร้อมๆกับการที่กล้องทำงานจับภาพ น่าจะกินกระแสแบบพุ่งขึ้นทันทีทันใดก็เลยดับไป ลองใช้วิธีเขียนโค้ดให้มอเตอร์หมุนไปสักแป๊บนึงก่อนค่อยเริ่มจับภาพ ก็ใช้ได้ผลนะ

*เดี๋ยวจะลองเปลี่ยนไปใช้กล้อง USB ดูบ้างว่าอาการจะแตกต่างกันมั้ย

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

Deep Learning กับ nvidia jetson nano ตอนที่ 0

ตั้งใจจะเขียนเป็นซีรียส์ หนึ่งเพื่อเป็นการสรุปข้อมูลที่ได้เรียนรู้ สองก็เพื่อเป็นประโยชน์แก่ผู้ที่สนใจ

ผมไม่ค่อยได้เคยเขียนอะไรยาวๆสักเท่าไร แต่จะพยายามไล่เป็นขั้นเป็นตอนตามการเรียนรู้ เป็นการลองกลับมาหัดเขียนอีกครั้ง

คำถาม คือ ทำไมต้อง jetbot ทำไมต้อง nvidia jetson nano
– เพราะมันฮอต และมันง่าย เนื่องจากมีเครื่องมือ มีซอฟแวร์ มีไกด์ไลน์ ให้เราทำตามไปก่อน ทำให้เริ่มต้นได้ง่าย ตัวบอร์ดถึงแม้จะราคาสูงกว่า raspberry pi ไปพอสมควร แต่ผมว่าคุ้มนะ
– ตัว hardware อุปกรณ์ไม่เยอะ ประกอบง่าย บัดกรี ไม่กี่จุด ก็เล่นได้ละ

เพิ่มเติมอีกหน่อย
nvidia ไม่ได้มีเพียงแค่โปรเจ็ค jetbot เท่านั้น ยังมีโปรเจ็คอื่นๆ ซึ่งใช้ซอฟแวร์ ISAAC SDK เช่น Kaya robot ก็จะมีอุปกรณ์ที่ต้องประกอบมากขึ้น
หรือถ้าไม่ใช้ SDK จาก nvidia จะไปใช้ ROS ก็ได้ ก็จะมีโปรเจ็คอย่างเช่น racecar ซึ่งแตกย่อยไปอีกหลายโปรเจ็คจากหลากหลายนักพัฒนา มีรายละเอียดที่แตกต่างกันในเรื่องของการใช้ hardware บางตัว

คำถามต่อมา แล้วเกี่ยวอะไรกับ deep learning
– deep learning มันก็คือเรื่องของ AI กรณีศึกษาในเรื่องนี้มักเกี่ยวข้องกับ vision system เกี่ยวข้องกับภาพ เช่น รู้จำป้ายทะเบียน รู้จำสิ่งกีดขวาง การนำทาง ดังนั้น jetbot หุ่นที่มีล้อ และติดกล้อง มันจึงเป็นอะไรที่เหมาะมากในการเอามาเรียนรู้ แถมสนุกด้วย

เริ่มต้นยังงัย
– อย่างน้อย ก็ต้องมีความรู้ มีประสบการณ์ ทั้ง hardware และ software สักหน่อย ใครที่ไม่เคยประกอบหุ่นเล่นเลย ก็ไปหาชุดคิทประกอบหุ่นยนต์มาลองเล่นก่อน ลองดูที่ www.ioteshop.com ร้านของผมเองก็มี อิอิ ให้รู้จักส่วนประกอบต่างๆของตัวหุ่นยนต์ หลักการไฟฟ้า อิเล็กทรอนิกส์เบื้องต้น อาจจะต้องมีเครื่องมือสำหรับงานประกอบ งานบัดกรี ต่างๆ
– ส่วน software ก็ต้องรู้เรื่อง linux เคยใช้งานมาบ้าง อ่านภาษาอังกฤษพอได้ เพราะต้องไป download และอ่านข้อมูลจากเว็บของ nvidia ส่วนภาษาที่ใช้เขียน สำหรับ jetbot นี้เป็น python ก็มีพื้นฐานสักหน่อย ภาษาอื่นก็ได้แต่เข้าใจหลักการเขียนโปรแกรม ก็โอเค

Hardware
1. nvidia jetson nano
ตัวบอร์ด jetson nano จริงๆประกอบด้วย 2 ส่วน คือ core module ที่มี CPU กับส่วนที่เรียกว่า carrier board ก็เป็นบอร์ดขยาย ที่ทำให้เราสามารถต่ออุปกรณ์อื่นๆได้ผ่านทางพอร์ทต่างๆ รวมทั้งจ่ายไฟให้มันด้วย
การจ่ายไฟให้ jetson nano ทำได้สองทาง คือผ่านทาง micro USB port และ jack DC เป็น 5V ทั้งคู่ เลือกเอาอย่างใดอย่างหนึ่ง โดยการใช้ jumper
ความแตกต่างนั้น ตามความเข้าใจของผม USB port นั้นสามารถรับ-จ่ายกระแสได้น้อยกว่า อย่าง jetbot นี้ ตอนรันใช้ไฟจาก power bank ผ่าน USB port ระบบจะถูกกำหนดให้ทำงานในโหมดกินพลังงานต่ำ
ส่วน jack DC คงไม่มีปัญหานี้ จัดเต็มได้เลย บริโภคไฟกันได้สุดๆ ดังนั้น adapter ที่ใช้ ก็น่าจะเป็น 5V 4A ขึ้นไป ก็เผื่อคุณภาพและประสิทธิภาพการทำงานของตัว adapter ไว้ด้วย

2. ชุดคิท jetbot
ประกอบไปด้วย 3D printed โครงหุ่นและล้อ ส่วนที่เป็นอุปกรณ์อิเล็กทรอนิกส์ ก็มีเพียง มอเตอร์ บอร์ดขับมอเตอร์ featherwing และกล้อง raspberry pi camera แค่นั้นเอง อ้อแล้วก็ power bank อีกอย่างนึง

เรื่องการประกอบ ใน github ของ jetbot มีอธิบายไว้ชัดเจนพอสมควร ผมคงไม่เขียนถึง

ก็ไปเตรียมหุ่นกันไว้นะ แล้วในตอนหน้า มาเริ่มใช้งานกันดีกว่า

I-IoT

ช่วงสิ้นปีมีโอกาสทำการทดลองสองสามตัวที่เกี่ยวข้องกับ I-IoT
เริ่มด้วย
1. ใช้ Raspberry Pi อ่านสัญญาณจาก ultrasonic sensor ส่งเข้า HMI software ผ่านทาง Modbus TCP ก็เหมือนกับเป็นการทดลองทำระบบ SCADA นั่นเอง

2. อ่านค่าจาก เซ็นเซอร์ ด้วยโปรโตคอล Modbus RTU ผ่านทาง RS485 แล้วส่งให้ software น่าจะเรียกได้ว่าเป็น edge software อย่าง KEPServerEX ที่ทำตัวเป็น OPC UA server แล้วให้ Node-RED ไปดึงข้อมูลมาแสดงผล โดยการสร้าง dash board และสามารถดูได้บน web browser

 

3. ส่วนอีกแบบหนึ่ง สำหรับระบบ SCADA เดิม ที่สามารถ export ข้อมูลออกมาเป็น csv หรือ excel ได้ อยากจะเอาข้อมูลการ operate ขึ้นเว็บออนไลน์ เพื่อทำการวิเคราะห์และแสดงผลออกมาเป็น ตาราง หรือ chart ต่างๆโดยไม่ต้องไปยุ่งกับระบบเดิมมากนัก ก็ใช้วิธีทำ dash board ด้วย การเขียน web application ขึ้นมาต่างหาก แล้วโยนไฟล์ที่ export ออกมาขึ้นไปให้

ใครที่สนใจต้องการทำ dash board  ติดต่อได้ครับ ผมรับงานนะครับ อิอิ

ทดลองเล่น 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 ก็มีบริษัทฝั่งอเมริกาหนุนอยู่ครับ

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

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

Node.js กับ ARM device และ ubuntu 12.04

zigbee-meshลองเอา z-stack linux gateway ขึ้นมา ด้วยความที่ ไม่มีบอร์ด beaglebone มองซ้ายขวา มี pandaboard เก่าอยู่ cpu พี่น้องกันน่าจะใช้แทนกันได้ ก็ปรากฏว่า ได้จริงๆ แต่ดันมาเจอปัญหาใหม่

พยายามลง node.js เพื่อใช้งานทำ web server app สำหรับ IoT อย่างที่เค้านิยมทำกัน เลยลองลงจาก repository ปกติ แต่ไม่สามารถทำงานได้ cpu 100% ตลอดเวลา พยายามลง ppa ที่เค้าแนะนำกัน ก็ไม่ได้อีก หาจนเจอว่า เวอร์ชั่นใหม่ๆนั้น ไม่สามารถทำงานได้กับ ubuntu version เก่าๆ สืบเนื่องจาก javascript V8

ก็ต้องเอา version เก่าที่ support ARMV7 มาลงถึงจะใช้งานได้ ต่อมาก็มาติดปัญหาเรื่อง cyclic dependencies อีก (ด้วยความที่ลองแก้ปัญหาหลายวิธีมาก เลยสรุปไม่ได้ว่า สุดท้ายแล้วแก้ได้อย่างไร ทำทั้ง clear cache ลบ module ออกไปทั้ง folder เองเลยก็ทำ) แต่เรียกได้ว่า ลองใช้งาน node.js ครั้งแรก ก็เจอสารพัดปัญหา

นี่ก็เป็นอย่างนึง ที่คิดว่า ถ้าเราเอาสารพัดเทคนิคมายำรวมๆกัน ให้เป็น solution ขึ้นมา ก็จะสร้าง dependency problem ขึ้นมาเยอะมาก ไม่สนุกที่ต้องมานั่งหา root cause และจัดการกับผลกระทบที่เกิดกับส่วนอื่นๆ

C++ อย่างเดียวจบเลยดีกว่ามั้ย อย่างที่นำเสนอในตอนที่ผ่านๆมา

ทดลองเล่น ZigBee

ผมเริ่มสนใจ ZigBee ตั้งแต่ได้รู้จักและทดลองสินค้า smart home ของ xiaomi จริงๆก็ได้ยินชื่อมานานแล้ว แต่ที่เห็นขายกันเป็นโมดูลสำหรับนักพัฒนา จะเป็น xbee ซะมาก ราคาค่อนข้างสูง และผมก็ไม่ใช่นักอิเล็กทรอนิกส์จ๋าซะด้วย เลยไม่กล้าซื้อมาเล่น ผ่านมาหลายปี ตอนนี้พี่จีนทำโมดูลออกมาได้ถูกลงมาก (ที่พูดถึงนี่คือโมดูลที่ใช้ cc2530 ของ TI นะครับ) ประกอบกับยุค internet of things ทำให้ smart things หรืออุปกรณ์ต่างๆ ถูกเชื่อมต่อเข้ามาถึงคอมพิวเตอร์และมือถือได้ง่ายดายขึ้น เพื่อมอนิเตอร์และสั่งงาน ดังนั้นช่วงนี้จีงน่าเอามาศึกษา ผมก็เลยเริ่มเล่นและเขียนถึงมันนี่แหละครับ

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

เรื่องหลักการเรื่องอะไร มีคนศึกษาไว้เยอะแล้ว ลองเล่นเลยดีกว่า อิอิ ตัว cc2530 core โปรเซสเซอร์ มันก็คือ 8051 นั่นเอง เริ่มแรกก็หัดเขียนมันเพื่อควบคุม I/O port ต่างๆก่อน และมันมี serial port มาให้ด้วย ก็เริ่มอ่านค่าและสั่งงาน I/O ผ่าน serial port

ขั้นต่อมาเมื่อจะต้องทำให้มันคุยกันเองได้ระหว่างอุปกรณ์ ZigBee ด้วยกัน ทาง TI ก็ให้ framework เรามาเพื่อช่วยให้เราพัฒนา application ต่างๆได้ง่ายดายยิ่งขึ้น มันคือ ZStack นั่นเอง ดูเผินๆเหมือนเป็นระบบปฏิบัติการตัวนึงเลยทีเดียว ดูยุ่งยากมากขึ้นเยอะ แต่หากศึกษาตามตัวอย่างไปเรื่อยๆ ทดลองเล่นไป ก็จะเริ่มคุ้นเคยกับมันมากขึ้นนะครับ

ขั้นต่อไปก็คือ การที่เราต้องการติดต่อ ZigBee ผ่านทาง TCP/IP เน็ตเวอร์คได้ โดย TI ก็ได้ให้ Z-Stack Linux gateway มา ซึ่งเป็นโปรแกรม ที่เราสามารถเอามาลงใน ARM embedded board อย่าง BeagleBone ได้ (ก็มันของเจ้าเดียวกันนี่เนาะ) แต่ TI ก็ไม่ได้ใจร้ายขนาดนั้น มันมีทางที่เราสามารถนำ sourcecode มาคอมไพล์และรันบนบอร์ดอื่นได้เหมือนกัน เช่น Raspberry Pi โดยที่อาจจะต้องมีการปรับแก้อะไรนิดหน่อย

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

เดี๋ยวค่อยว่ากันไปเป็นตอนๆครับ