วันเสาร์ที่ 14 มกราคม พ.ศ. 2560

ใช้ AppInventor สร้างแอปควบคุม GPIO ของ HM-10 Bluetooth LE ด้วย Android


  HM-10 Breakout board ส่วนใหญ่ที่จัดหามาจากผู้จำหน่ายในจีน จะมีเฟิร์มแวร์ที่ไม่สามารถใช้ความสามารถในส่วนของ GPIO ของ CC2541 ได้ (อันนี้ทดลองกับบอร์ดที่สั่งซื้อมา)


แสดงรุ่นที่มีเฟิร์มแวร์ HMSoft กับแบบอื่น

  เนื้อหาที่นำเสนอต่อจากนี้ ต้องใช้ HM-10 Bluetooth LE ที่ลงเฟิร์มแวร์ของ HMSoft แล้ว ซึ่งสามารถทตามขั้นตอนในบทความ iBeacon ด้วย HM10 BLE (Bluetooth Low Energy)

HM-10 ที่ไม่มี Breakout board แสดงตำแหน่ง GPIO ด้านขวามือ

  HM-10 มี GPIO0 - GPIO9, GPIOA, GPIOB สามารถนำมาใช้ได้เมื่อได้รับการกำหนด Mode 1 (AT+MODE1) และ Mode 2 (AT+MODE2) ซึ่งทั้งคู่เป็น Remote Control Mode

  เมื่อกำหนดให้เป็น Mode 1 ขา GPIO2-GPIO3 สามารถนำมาใช้เป็น OUTPUT ส่วน GPIO4 - GPIO9 ,GPIOA,GPIOB จะเป็น INPUT

  ใน Mode 2 ทุกขาคือ GPIO2 - GPIOB จะเป็น OUTPUT ทั้งหมด

  ในบทความนี้จะใช้ AT Command ที่เกี่ยวข้องกับ Mode 2 เท่านั้น

  คำสั่งที่สามารถใช้ได้ เมื่อเลือกใช้ AT+MODE2

  - AT+PIOx? อ่านสภาวะที่ GPIO ตำแหน่ง x โดยที่ x = 1 - 9,A,B
  - AT+PIOx เขียนค่าสภาวะที่ GPIO  ตำแหน่ง x โดยที่ x = 2 - 9,A

  คำสั่งที่เกี่ยวข้องกับ GPIO ยังมีอยู่อีก แต่จะยังไม่นำมาพูดถึงในตอนนี้

ดสอบการใช้ AT Command ปิด เปิด หลอด LED

- ให้ต่อ LED กับ PIO ที่ต้องการ ทดลองใช้ PIO3 และ PIO6 ให้ต่อขา Anode กับขา PIO และต่อขา Cathode ผ่านรีซิสเตอร์ค่า 330 โอห์ม - 1K กับกราวด์
- ต่อ Tx Rx ผ่าน USB to Serial เพื่อรับส่งคำสั่ง
- เปิดโปรแกรมอ่านข้อมูลพอร์ทซีเรียล (Serial Monitor ของ Arduino IDE ก็ใช้ได้)
- เลือกหมายเลขพอร์ท ตั้งค่า 9600 และ No line ending
- ล้างค่าเดิมที่กำหนดไว้                                         AT+RESET
- กำหนดให้ HM-10 ใช้โหมด 2                              AT+MODE2

- ทดลองคำสั่งให้หลอด LED ที่ PIO3 ติด             AT+PIO31 
- และทำให้หลอด LED ที่ PIO3 ดับ                       AT+PIO30  
- ทดสอบกับ PIO6 ด้วยเช่นกัน

* ทุกคำสั่งต้องตามด้วย Enter
* ถ้าเคยตั้งค่าให้ HM-10 ให้ทำงานอย่างหนึ่งอย่างใดแล้ว เช่น iBeacon จะเห็นว่าบอร์ดจะไม่ตอบสนองกับคำสั่งที่ป้อนเข้าไป ให้ทำการพิมพ์ตัวอักษรใดๆ ก็ได้มากกว่า 80 ตัวอักษร แล้วก็เคาะ Enter ครั้งหนึ่ง จากนั้นทดสอบพิมพ์ AT ตามด้วย Enter จนตอบสนอง OK+WAKE หรือ OK ทำซ้ำๆจนกว่าจะได้

นำคำสั่งมาวางในส่วนของ AppInventor

- ติดตั้ง BLE extension  โหลดไฟล์  เป็นไฟล์ที่ปรับปรุงแก้ปัญหาตอนนำไปติดตั้งแล้วโปรแกรมไม่ทำงาน เนื่องจาก BLUETOOTH_ADMIN ไม่ได้ถูกขออนุมัติ ซึ่งอาการปัญหานี้จะไม่พบตอนทดสอบกับ AI Companion
- สร้างและวางคอมโพเน้นท์ตามที่แสดงในภาพ ชื่อที่ใช้ให้เปรียบเทียบดูจาก Block จะไม่ได้บอกรายละเอียด ให้เรียกใช้งาน Bluetooth LE ด้วย



- เปิด Block และวางคอมโพเน้ท์

     ส่วนแรกในการสแกนหาอุปกรณ์, เลือกอุปกรณ์พร้อมทำการเชื่อมต่อ และการตัดการเชื่อมต่อ
     ส่วนที่สอง ทำการส่งคำสั่งเปิด-ปิดหลอด LED
     รหัสในช่อง service_uuid คือ 
0000ffe0-0000-1000-8000-00805f9b34fb
     รหัสในช่อง characteristic_uuid คือ
0000ffe1-0000-1000-8000-00805f9b34fb

     รหัสทั้งสองตัวจำเป็นในการอ่านเขียนข้อมูล และใช้ได้เฉพาะกับ HM-10 ถ้าใช้ตัวอื่นต้องหาข้อมูลเพิ่มเติม
     ส่วนที่สาม นำค่าที่ส่งกลับมา มาทำการเปลี่ยนสี (Background Color) ของปุ่ม LED1 และ LED2 ที่ใช้แสดงแทนการเปิดปิดของหลอด

     ส่วนสุดท้าย เป็นการส่งคำสั่ง AT Command ไปที่ HM-10

    สามารถพิมพ์คำสั่งลงในช่อง txtCmd กดปุ่ม btnCmd การตอบสนองมาที่ช่อง Response

อยากให้ทดลองจับวางและเขียนข้อมูลต่างๆเอง จะได้เห็นว่าจะสร้างและแก้ปัญหาได้อย่างไร
แต่ถ้าไม่สะดวกจริงๆ ก็สามารถ import ไฟล์ NewLE.aia ไปใช้ทดลองได้







วันอังคารที่ 10 มกราคม พ.ศ. 2560

IBeacon: นำข้อมูลอัพขึ้น Firebase


หลังจากได้โพสต์เรื่อง iBeacon ด้วย HM10 BLE (Bluetooth Low Energy) ไปไม่นาน ก็มีไอเดียมาจากผู้อ่าน สำหรับการนำค่าที่ iBeacon ส่งข้อมูลเข้ามา ส่งไปอัพเดทใน ThinkSpeak

ในบทความจะส่งไปไว้บน Firebase เนื่องจากความคุ้นเคยในการสร้างโค๊ดมากกว่า ส่วนใครจะนำไปวางไว้ที่ไหน ก็ตามสะดวก

ไล่ดู AT Command ของ HM-10 ก็พบกับ AT+DISC?


มีค่าที่ตอบกลับ 5 ค่า โดยค่าที่ผมสนใจคือ P2 และ P5 ส่งขึ้นไปวางไว้บน Firebase

ส่วนประกอบที่ต้องมี

- HM-10 ที่ทำให้เป็นของแท้แล้ว ตัวนี้จะใช้เป็น Master และส่งข้อมูลไปให้ ESP8266 เพื่อส่งต่อไปให้ Firebase ดังนั้นตัวนี้ไม่ต้องโปรแกรมให้เป็น iBeacon 

- HM-10 จำนวนกี่ตัวก็แล้วแต่ความต้องการ เหล่านี้ต้องถูกโปรแกรมให้เป็น iBeacon โดยตั้งค่า Minor ให้ต่างกัน เช่น 0xFA01, 0xFA02

- ESP8266 จะเป็น ESP-01 หรือ NodeMCU ก็ได้ ตัวนี้จะทำ SoftwareSerial เพื่อเป็นจุดเข้าออกข้อมูลกับ HM-10 Master

- โด๊ดที่จะอัพโหลดให้ ESP8266      ตาวน์โหลดที่นี่

- Firebase Project สำหรับนำค่าที่อ่านได้ไปอัพเดท ถ้าใช้ ThingSpeak หรือตัวอื่นก็ศึกษาโค๊ดและก็ปรับไปตามที่ต้องการ 

การทดสอบ

ในบทความใช้ NodeMCU สำหรับการทดลอง ใช้ D5 ต่อกับ TXD และ D6 ต่อกับ RXD สำหรับ SoftwareSerial

ในส่วนของ WiFi ต้องปรับ SSID กับ Password ก่อนอัพโหลดเข้า NodeMCU
FIREBASE_HOST กับ FIREBASE_AUTH ก็ต้องให้ตรงกับที่สร้างไว้

ทำการป้อนไฟให้ iBeacon ทุกตัว ผลที่ได้เมื่อดูจาก IDE


ส่วนนี้เป็นผลการอัพเดทที่ Firebase จะเห็นผลของ iBeacon 2 ตัว ส่งค่าขึ้นไปที่ Firebase



การคำนวณระยะทาง

จาก P = TxPower (dBm) กับ Rssi = RSSI  (dBm)

ระยะห่าง d = 10 ^ ((P-Rssi) / 10*n) (n ranges from 2 to 4)

n ใช้สำหรับชดเชยการ Propagation ของคลื่นในสถานที่ๆแตกต่างกัน ในโค๊ดใช้ค่า 4.2119




วันเสาร์ที่ 7 มกราคม พ.ศ. 2560

iBeacon ด้วย HM10 BLE (Bluetooth Low Energy)




iBeacon ก่อกำเนิดจากค่าย Apple จุดประสงค์หลักๆ เพื่อใช้ในการระบุตำแหน่งภายในอาคาร ที่เป็นข้อหนึ่งที่ GPS ทำไม่ได้ เพราะดาวเทียมส่งพิกัดเข้ามาไม่ได้ จึงนำเอาความสามารถของ Bluetooth 4.0 มาประยุกต์ใช้

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

การจะทำได้ตัวชิป Bluetooth ต้องรองรับเทคโนโลยี 4.0 ซึ่ง HM-10 ขึ้นไปจึงจะใช้ได้

จริงแล้วการตั้งค่าให้ HM-10 ให้ทำหน้าที่ iBeacon ก็ไม่ได้ยุ่งยากอะไร ถ้าซื้อแบบที่มี Breakout board คือติดตั้ง HM-10 ก็อุปกรณ์เสรืมนิดหน่อยเพื่อให้เชื่อต่อกับ PC ได้ ก็ทำการเชื่อมต่อสาย Tx Rx VCC GND แล้วส่งชุดคำสั่ง AT Command ผ่าน Serial monitor เข้าไป ก็เรียบร้อยแล้ว

แต่ปัญหามันก็เกิดขึ้นจนได้

เพราะบอร์ดที่หาได้ที่มีราคาไม่สูง เป็นบอร์ดที่ทำจากประเทศจีน ซึ่งไม่ได้เข้ากันได้ (Compatible) กับบอร์ดของแท้ ก็เดือดร้อนผู้กล้าต้องหาวิธีการทำให้บอร์ดเหล่านี้ใช้งานให้ได้

ก็มีทั้งบทความและคลิปบนยูทูป แนะนำวิธีการ แต่ก็น่าจะมาจากแหล่งเดียวกัน

ก็ถือโอกาสทำความเข้าใจแล้วก็มานำเสนอต่ออีกที

ยังไงก็ให้เครดิตกับคนที่คิดค้นวิธีการด้วยนะครับ ดูได้จากท้ายบทความนี้

ส่วนแรกจะมากล่าวถึงการทำบอร์ดไม่แท้ ให้สามารถรับคำสั่งที่บอร์ดแท้สามารถทำได้เสียก่อน

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

สิ่งแรกจะต้องมีสิ่งเหล่านี้

1. บอร์ด Arduino รุ่นไหนก็ได้ ถ้าแน่ๆที่ได้ทดลองคือ UNO
2. สายไฟเพื่อเชื่อมต่อจาก HM-10 อันนี้ต้องมีหัวแร้งเพื่อทำการบัดกรี
3. สร้าง Sketch บน Arduino แล้วนำโค๊ด CCLoder.ino มาวาง ก๊อปปี้ได้จาก ที่นี่ แล้วก็อัพโหลด
4. CCLoader.exe  โปรแกรมช่วยในการนำ Firmware ใส่เข้าใน HM-10 โหลดจาก ที่นี่ เปิดโปรแกรมด้วย Command prompt (Admin)
5. HM-10 firmware  โหลดจาก ที่นี่

ถ้ากดลิ้งค์ไม่ได้ ให้พิมพ์ตามทีวางไว้ให้ด้านท้ายบทความ

การเชื่อมต่อสาย (CC2541 คือ HM-10)



























Arduino อัพโหลดให้เรียบร้อยก่อนนะครับ

อัพโหลดเฟิร์มแวร์

ไฟล์ที่เป็นตัวเฟิร์มแวร์ (CC2541hm10v540.bin) ต้องวางไว้ในโฟลเดอร์เดียวกันกับโปรแกรม CCLoader.exe นะครับ

เปิดหน้าต่าง Command Prompt แล้วก็วิ่งไปที่โฟลเดอร์ที่เก็บไฟล์ไว้ พิมพ์คำสั่งตามนี้

D;\Downloads>ccloader 4 CC2541hm10v540.bin 0

ตัวเลข 4 เป็นหมายเลขคอมพอร์ทที่ Arduino ต่ออยู่
ตัวเลข 0 คือชนิดของบอร์ด Arduino ถ้าเป็นบอร์ด Leonardo ให้ใส่ 1 นอกนั้นใส่ 0

โปรแกรมจะส่งเฟิร์มแวร์


เป็นอันเสร็จเรียบร้อย

iBeacon พร้อมแล้ว

ตอนนี้ HM-10 ก็พร้อมที่จะเป็น iBeacon แล้ว เหลือขั้นตอนสุดท้าย

ก่อนอื่นทดสอบก่อนว่าลงเฟิร์มแวร์สมบูรณ์หรือไม่ ให้ถอดสายทั้งหมดที่เชื่อมต่อกับบอร์ดอาร์ดูโน่ออก แล้วต่อ USB to Serial เข้ากับ HM-10

ให้เปิด Serial Monitor ของอาร์ดูโน่ เลือกพอร์ทที่เชื่อมต่อ HM-10 ตั้งค่า 9600 และ No line ending

พิมพ์ AT ต้องตอบมาเป็น OK
พิมพ์ AT+VERR? ต้องตอบมาเป็น HMSoft V540

ได้ตามนี้ก็ขั้นตอนต่อไป

ตั้งค่าให้เป็น iBeacon

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

1. AT+RENEW  
ทำการรีเซทให้เป็นค่าเริ่มต้นจากโรงงาน

2. AT+RESET    
รีบู๊ท

3. AT                   
รอให้ตอบกลับ OK หลังจากรีบู๊ท

4. AT+MARJ0x1234  
เป็นการตั้งค่า iBeacon Major number ให้เป็น 0x1234 (hexadecimal) 
ค่านี้ถ้าต้องการให้เป็นกลุ่มเดียวกันให้ตั้งค่าเดียวกันให้กับทุกตัว

5. AT+MINO0xFA01  
เป็นการตั้งค่า iBeacon Minor number ให้เป็น 0xFA01 (hexadecimal) 
เลือกค่าให้ไม่เหมือนกัน ถ้าต้องการหลายตัว

6. AT+ADVI5  
กำหนดให้ส่งค่าเป็นจังหวะ ตัวเลข 5 จะเท่ากับทุกๆ  546.25 มิลลิวินาที

7. AT+NAMEDOPEY 
ตั้งชื่อให้แต่ละตัว ถ้าดูในมือถือจะเห็นชื่อ DOPEY 
ถ้าต้องการชื่ออื่นก็เปลี่ยนไปตามต้องการ

8. AT+ADTY3  
ทำให้ตัวอุปกรณ์ไม่สามารถถูกเชื่อมต่อได้ คือให้ส่งแต่ค่าเฉพาะตัวออกไปอย่างเดียว

9. AT+IBEA1  
เปิดโหมด iBeacon

10.AT+DELO2
ให้ทำหน้าที่เป็น  iBeacon อย่างเดียว

11.AT+PWRM0
เปิดการทำงาน auto-sleep. ทำให้สิ้นเปลืองพลังงานลดลงจาก  8 mA. ลงมาเป็น 0.18 mA 

12.AT+RESET  
รีบู๊ท

เมื่อจบการป้อนคำสั่ง ทุกอย่างก็จะเงียบ ต้องหาโปรแกรมมาตรวจสอบ
ให้ติดตั้ง iBeacon Scanner บน Android เสียก่อน



เปิดโปรแกรม




จะเห็นรายการ iBeacon ที่ตรวจพบ ในรูปมีอยู่ 2 ตัว สังเกตุว่าชื่อ HMSoft ทั้งสองตัว ทั้งๆที่ตั้งชื่อไม่เหมือนกัน ส่วนนี้จะหาข้อมูลเพิ่มเติมอีกที ว่าเกิดจากสาเหตุอะไร และต้องแก้ไขอย่างไร

ถ้าเลิกเป็นแบบ Radar จะเห็นระยะโดยประมาณ ของแต่ละตัว


แตะที่แต่ละตัวจะเห็นข้อมูล อันนี้ตัวแรก
อันนี้ของอีกตัว


ถ้าไม่พบอะไรเลยให้ดูว่าเปิดบลูทูธบนมือถือหรือยัง เปิดบลูทูธแล้วก็ทำการเปิดโปรแกรมอีกครั้ง

สรุปผลจากการทดลอง สามารถทำ HM-10 ทำตัวเป็น iBeacon ได้จริง รวมทั้งวิธีการแปลงร่างขากของไม่แท้ มาเป็นของแท้ ทำได้ตามที่ผู้คิดค้นแนะนำมา ส่วนที่ยังด้อยอยู่ คือระยะที่นำมาแสดงยังไม่คงที่ แม้ไม่มีการเคลื่อนที่ อันนี้ไม่แน่ใจว่าเป็นเพราะเป็นของไม่แท้ด้วยหรือไม่ ถ้ามีโอกาสที่ได้ของแท้มา จะนำมาทดลองและพิสูจน์กันต่อไป

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



ส่วนของสิ่งที่นำมาเสนอ ถ้าทำตามแล้วไม่ได้ ก็ลองเข้าไปอ่านดู

บทความต้นเรื่อง
http://forum.arduino.cc/index.php?topic=393655

คลิปบน Youtube
https://www.youtube.com/watch?v=ez3491-v8Og&feature=youtu.be

โค๊ดสำหรับ Arduino
https://github.com/RedBearLab/CCLoader/tree/master/Arduino/CCLoader

โปรแกรมช่วยอัพโหลดเฟิร์มแวร์
https://github.com/RedBearLab/CCLoader/tree/master/Windows

ไฟล์ไบนารี่ของเฟิร์มแวร์
http://forum.arduino.cc/index.php?action=dlattach;topic=393655.0;attach=183702