หลายท่านที่ศึกษาและรู้จัก ESP32 มาบ้าง อาจจะทราบว่าใน ESP32 นั้น มีส่วนของการเชื่อมต่อผ่านบลูทูธอยู่ด้วย แต่ข้อมูลในเว็บ IOXhop , เว็บอื่น ๆ หรือแม้แต่หน้าเว็บหลักของผู้พัฒนา กลับไม่มีข้อมูลเรื่องการใช้งานบลูทูธบน ESP32 เท่าไรนัก เนื่องจากการใช้งานส่วนของบลูทูธนั้น ยังต้องอ้างอิงกับไลบรารี่ของชุดพัฒนา ESP-IDF อยู่ ซึ่งชุดพัฒนา ESP-IDF ก็ยังมีการพัฒนา และปรับปรุงส่วนของบลูทูธอยู่เสมอ ทำให้ทางฝั่งผู้ที่พัฒนาลง Arduino ไม่ทำออกมาเสียที ประกอบกับปัญหาเรื่องไลบรารี่ทำ Web Server ที่กำลังเร่งพัฒนากันอยู่ ทำให้โอกาศที่เราจะได้ใช้งานบลูทูธบน ESP32 นั้นน่าจะอีกยาวนาน
แต่เนื่องจากไลบรารี่ใช้งานบลูทูธในส่วนของ ESP-IDF ได้สมบูรณ์ในระดับที่สามารถใช้งานได้ค่อนข้างครบแล้ว ทำให้เริ่มมีตัวอย่างการใช้งานบลูทูธบน Arduino ออกมาบ้าง โดยอาศัยไลบรารี่ SimpleBLE เป็นหลัก ตัวไลบรารี่สามารถเปิดใช้งานบลูทูธและตั้งชื่อได้ แต่ไม่สามารถทำอย่างอื่นได้เลย การไปใช้งานสามารถทำได้แบบทางเดียว คือส่งข้อมูลออกไป โดยใช้วิธีเปลี่ยนชื่อไปเรื่อย ๆ แล้วเครื่องรับก็ใช้วิธีแสกนหาชื่อไปเรื่อย ๆ แล้วนำชื่อที่ได้นำไปเป็นข้อมูลประมวลผล
ตัวอย่างวิดีโอที่ใช้ไลบรารี่ SimpleBLE ส่งค่าอุณหภูมิไปยังอุปกรณ์อื่น ๆ
แต่สำหรับในบทความนี้เราจะมาลองใช้งานบลูทูธเต็มรูปแบบกันครับ โดยใช้ไลบรารี่ easyBLE ที่ทางร้าน IOXhop ได้พัฒนาขึ้นเอง จะรองรับใช้งานบลูทูธในระดับหนึ่ง คือสามารถรับ – ส่งข้อมูลหากันได้ ทำให้เราสามารถนำไปประยุกต์ใช้บลูทูธในการคอนฟิกค่าต่าง ๆ เช่น ชื่อ WiFi รหัสผ่าน WiFi เพื่อใช้เชื่อมต่ออินเตอร์เน็ตได้
ในส่วนของแอพพลิเคชั่น จะใช้เครื่อมือสร้างแอพ ฯ อย่างง่ายอย่าง App Inventor ซึ่งก็จะต้องใช้ไลบรารี่เสริม เนื่องจากการใช้งานบลูทูธ 4.x ที่ ESP32 รองรับ จะใช้งานได้ยากเล็กน้อย และไม่รองรับไลบรารี่บลูทูธแบบเก่า (รุ่น 2.0 แบบที่ HC-05 HC-06 ใช้) ทำให้เครื่องมือสร้างแอพ ฯ อื่น ๆ ยังไม่รองรับอย่างเต็มรูปแบบมากนัก แต่ App Inventor เองก็รองรับได้ในระดับหนึ่ง
BLE ย่อมาจาก Bluetooth Low Energy หรืออาจแปลเป็นไทยได้ว่า บลูทูธพลังงานต่ำ ตามหลักแล้วอุปกรณ์ BLE จะใช้พลังงานน้อยมาก ๆ บางอุปกรณ์เครมว่าสามารถอยู่ได้ต่อเนื่องนาน 1 ปี โดยใช้พลังงานจากถ่านกระดุมเพียงก้อนเดียว แต่สำหรับเราที่นำ BLE มาใช้งานกับ ESP32 อาจจะไม่กังวลเรื่องพลังงานซักเท่าไร (เพราะ ESP32 ใช้พลังงานเยอะอยู่แล้ว) ตัว ESP32 นั้นใช้งานบลูทูธเวอร์ชั่น 4.2 ซึ่งป็นเวอร์ชั่นที่รองรับ BLE อย่างเต็มรูปแบบ และมีรูปแบบการสื่อสารกับอุปกรณ์ต่าง ๆ ที่แตกต่างไปจากเวอร์ชั่นก่อนหน้านี้มาก ต่อไปนี้เราก็จะมาทำความรู้จักกับหลักการใช้งาน BLE อย่างเต็มรูปแบบกันครับ
สำหรับในบลูทูธเวอร์ชั่นก่อนหน้านี้ จะใช้งานการสื่อสารแบบ UART หลัก คือเมื่อมีการเชื่อมต่อแล้วจะสามารถรับ – ส่งข้อมูลกันได้เลย ส่วนข้อมูลที่รับ – ส่งนั้น จะมีรูปแบบเป็นอย่างไร ก็จำเป็นจะต้องไปออกแบบโปรโตคอลกันเอง
แต่สำหรับ BLE จะค่อนข้างยืดหยุ่น และใช้งานง่ายในระดับหนึ่ง คือเมื่อมีการเชื่อมต่อแล้ว จะต้องมีการกำหนดบริการที่จะขอข้อมูล หรือส่งข้อมูล ซึ่งจะเรียกว่า Service ซึ่งแต่ละ Service ก็จะมีสิ่งที่เรียกว่า Characteristic เป็นตัวลูกที่เราจะเข้าไปรับ – ส่งข้อมูลอีกที เมื่อดูจากคำอธิบายอาจจะ งง ๆ แนะนำให้ดูจากแผนผังด้านล่างนี้ได้เลย
สังเกตว่าชั้นบนสุดจะเป็นชั้นส่วนของอุปกรณ์ มีหมายเลขประจำตัวเป็น Mac Address ค่าของ Mac Address นี้ เราไม่สามารถแก้ไขได้ เนื่องจากจะถูกกำหนดมาตั้งแต่ขั้นตอนการผลิตชิป ESP32 แล้ว ตามหลักแล้วค่า Mac Address ของแต่ละอุปกรณ์จะไม่มีโอกาศซ้ำกันได้เลย ดังนั้นในการเชื่อมต่อบลูทูธ เราจึงใช้ Mac Address ในการอ้างอิงอุปกรณ์ที่จะเชื่อมต่อด้วย ทั้งนี้ชั้นนี้จะสามารถกำหนดค่าอื่น ๆ ได้ เช่น ชื่อของบลูทูธ ซึ่งจะแสดงให้เห็นเมื่อตอนสแกนหา ชื่อของบลูทูธเราสามารถตั้งเองได้โดยไม่มีข้อจำกัดใด ๆ
เป็นชั้นที่อยู่รองลงมาจาก Device ซึ่งใน 1 อุปกรณ์สามารถมี Service ได้หลายตัว ทำให้ใน BLE สามารถใช้อุปกรณ์ตัวเดียวให้บริการข้อมูลทีแตกต่างกันได้ หมายเลขอ้างอิงของ Service จะเรียกว่า UUID มักอยู่ในรูปของเลขฐาน 16 จำนวน 1 ไบต์ (อ้างอิงจากตัวอย่างในไลบรารี่ของผู้พัฒนาชุด ESP-IDF) ซึ่งค่า UUID นี้ จะต้องไม่ซ้ำกันเลย
เป็นชั้นในระดับล่างสุดที่เราสามารถใช้งานได้ การใช้งานรับ – ส่งข้อมูลจะต้องเชื่อมต่อลงมาจนถึงชั้น Characteristic จึงจะสามารถรับ – ส่งข้อมูลกันได้ ในชั้นนี้จะมีหมายเลขอ้างอิงของแต่ละ Characteristic เรียกว่า UUID มักอยู่ในรูปของเลขฐาน 16 จำนวน 2 ไบต์ โดยมี UUID ของ Service นำหน้า เพื่อให้สามารถเข้าใจได้ง่ายว่าเป็น Characteristic ของ Service ไหน
ตัว Characteristic ที่อยู่ในระดับล่างสุดของระบบการทำงานของ BLE จะเปรียบเสมือนตัวแปรหนึ่ง ที่สามารถเขียนได้ และอ่านค่าได้ โดยตัวแปรนั้นจะมีชื่อตาม Characteristic UUID เมื่อต้องการรับ – ส่งข้อมูล ควรกำหนดให้ข้อมูลของ Characteristic เมื่อเขียนเข้าไปแล้ว อ่านออกมา จะได้ค่าเดิมที่เขียนเข้าไป จึงจะถูกหลักการของการใช้งาน BLE เช่น เขียน 10 ลงไป เมื่ออ่านควรจะได้ค่าเป็น 10 ด้วย
แต่อย่างไรก็ตาม BLE ค่อนข้างอิสระในการใช้งาน หากงานของเราไม่สามารถทำได้ตามมารตฐานที่กำหนดมา เราสามารถที่จะส่งข้อมูลกลับเป็นข้อมูลอื่น ๆ ที่ไม่เกี่ยวข้องได้ เช่น ตอนเขียนข้อมูล กำหนดให้ Characteristic เป็น 10 แต่ตอนอ่าน จะตอบกลับเป็นค่าอื่นเช่น OK ซึ่งไม่ใช่ค่าที่เขียนลงไปก็ได้
คือการส่งคำสั่งเพื่อที่จะให้อุปกรณ์ทำตามคำร้องได้ถูกต้องตามต้องการ ซึ่งมีดังนี้
สำหรับไลบรารี่ easyBLE จะรองรับเฉพาะคำสั่ง Read และ Write เท่านั้น ดังนั้นหากต้องการตรวจจับข้อมูลที่เปลี่ยนแปลง สามารถทำได้โดยตั้ง Timer ให้ส่งคำสั่งไป Read ตามเวลาที่กำหนด
ก่อนอื่นให้ติดตั้งไลบรารี่ easyBLE ก่อน โดยเข้าไปที่ลิงค์ https://github.com/ioxhop/easyBLE/releases จากนั้นเลือกกด Source code (zip) ของเวอร์ชั่นล่าสุด
จากนั้นคลายไฟล์ แล้วนำโฟลเดอร์ที่ได้ไปไว้ที่โฟลเดอร์ Documents\Arduino\libraries แล้วเปลี่ยนชื่อโฟลเดอร์ให้เป็น easyBLE
จากนั้นให้เปิดโปรแกรม Arduino เลือกไปที่เมนู File > Examples > easyBLE > basic
จากนั้นเลือกบอร์ด เลือกพอร์ตให้ถูกต้อง แล้วอัพโหลดโปรแกรมลงบอร์ดพัฒนา ESP32 ได้เลย
หลังจากอัพโหลดแล้ว ให้เปิด Serial Monitor มารอไว้ก่อน (ปรับ Band เป็น 115200 ด้วย)
ที่โทรศัพท์มือถือแอนดรอย เปิดบลูทูธ แล้วเข้าไปดาวน์โหลดแอพ ฯ BLE Scanner จาก Google Play จากนั้นเปิดแอพ ฯ ขึ้นมา จะพบว่ามีอุปกรณ์ BLE Basic แสดงขึ้นมาแล้ว ให้กดปุ่ม Connect ได้เลย (ให้เก็บค่า Mac Address ไว้ด้วย อย่างในรูปคือ 24:0A:C4:81:E8:6A)
จากนั้นให้กดที่ปุ่มลูกศร จะสังเกตเห็นว่าแอพ ฯ จะแสดงค่า UUID แบบเต็มของ Service และ Characteristic มาให้ ซึ่งตามจริงแล้วเมื่อนำไปใช้สร้างแอพจะต้องระบุ UUID แบบเต็ม แต่เนื่องจากไลบรารี่ easyBLE ต้องการให้พิมพ์โค้ดในโปรแกรม Arduino ให้สั้น จึงไม่ให้กรอก UUID แบบเต็ม แต่ให้กรอก UUID แบบสั่นแทน ซึ่งค่าที่กรอกก็นำไปใช้เป็นส่วนหนึ่งของ UUID เช่นเดียวกัน
ให้ทดลองกดปุ่มกลมรูปตัว R จะเป็นการทดลองส่งคำสั่ง Read จะสังเกตว่าหลังกด จะแสดงคำว่า OK ! ในส่วนของ Value
เมื่อกลับมาที่ Serial Monitor จะพบข้อความแสดงขึ้นแจ้งรับคำสั่ง Read เข้ามา ซึ่งจะระบุค่าของ Service UUID และ Characteristic UUID มาให้ด้วย ทำให้ง่ายต่อการนำไปใช้งาน โดยสามารถนำค่าของ Service UUID และ Characteristic UUID ไป if แล้วส่งข้อมูลกลับไปได้เลย
เมื่อทดลองกดที่ปุ่ม W จะมีหน้าต่างขึ้นมาให้กรอกข้อมูลที่ต้องการส่ง เมื่อกรอกเสร็จแล้วให้กดปุ่ม OK
เมื่อกลับมาที่หน้า Serial Monitor จะพบว่า สามารถรับข้อมูลเข้ามาได้แล้ว โดยข้อมูลส่วน Data จะอยู่ในรูปของรหัสแอสกี้
จะเห็นได้ว่า เราสามารถรับ – ส่งข้อมูลผ่านบลูทูธด้วย ESP32 ได้แล้ว ท่านสามารถอ่านโค้ดและทำความเข้าใจการใช้งานได้ไม่ยากโดยอ้างอิงจากหลักการที่ได้กล่าวไว้ในหัวข้อที่แล้ว โดยผู้เขียนแนะนำว่าการรับข้อมูลเข้าใหเดูในบรรทัดที่ 23 เป็นต้นไป ข้อมูลที่ส่งเข้ามาจะเก็บไว้ในตัวแปร data สามารถนำค่าไปใช้งานได้เลย
ส่วนการตอบกลับข้อมูลเมื่อมีคำสั่ง Read ให้ดูตั้งแต่บรรทัด 13 เป็นต้นไป จะสังเกตได้ว่าจุดสำคัญคือฟังก์ชั่น ble.reply(); ที่จะใช้ส่งข้อมูลกลับไป (จากตัวอย่างส่ง “OK !” กลับไป)
ก่อนอื่นให้เข้าไปโหลดไฟล์โปรเจคตัวอย่างที่ BLE_TEST.aia แล้วเข้าไปที่หน้าหลักของ App Invertor ที่ลิงค์ http://ai2.appinventor.mit.edu/ จะพบกับหน้าหลักของ App Invertor
เราจะเพิ่มโปรเจคตัวอย่างลงไปใน App Invertor โดยกดไปที่เมนู Projects แล้วเลือก Import project (.aia) from computer …
จากนั้นเลือกไฟล์ BLE_TEST.aia ที่ได้ดาวน์โหลดมา แล้วกดปุ่ม OK
จากนั้นจะมีหน้าแก้ไขโปรเจคเพิ่มขึ้นมา ใหเกดเข้าไปในส่วนของ Blocks โดยกดที่ปุ่ม Blocks ทางด้านขวา
จากนั้นแก้ไข Mac Address ที่ได้จากขั้นตอนที่แล้วให้ถูกต้อง
แล้วคลิกที่เมนู Build ด้านบน เลือก App ( provide QR code for .apk )
รอซักครู่ แล้วสแกน QR code ติดตั้งแอพให้เรียบร้อย
ทดลองเปิดแอพขึ้นมา จะพบหน้าตาดังรูป
กลับไปที่โปรแกรม Arduino IDE ให้คัดลอกโค้ดต่อไปนี้ลงไป แล้วอัพโหลดให้เรียบร้อย
ที่แอพ ฯ ให้กดที่ปุ่มเชื่อมต่อ จากนั้นให้สังเกตตรง Titlebar จะแสดงคำว่าเชื่อมต่อแล้ว ให้ทดลองกดที่คำว่าหลอดไฟได้เลย การติด – ดับของหลอดไฟจะสำพันธ์กับเครื่องหมายถูกที่แสดงบนแอพ ฯ
จะเห็นได้ว่าเราสามารถควบคุมหลอด LED ผ่านแอพ ฯ ที่สร้างโดย App Invertor ได้แล้วครับ สำหรับโปรแกรมที่อยู่ใน App Invertor มีไม่เยอะมาก ผู้อ่านสามารถทำความเข้าใจได้ง่าย จุดสำคัญที่ใช้ส่งข้อความจะอยู่ที่บล็อก .WriteStrings ที่จะทำหน้าที่ส่งข้อมูลออกไปหา ESP32
จะเห็นได้ว่าเมื่อใช้งานไลบรารี่ easyBLE จะทำให้สามารถใช้งาน BLE บน ESP32 ได้ง่ายขึ้นมาก อีกทั้งการทำแอพ ฯ สามารถทำได้โดยใช้เครื่องมือสร้างแอพ ฯ อย่างง่ายอย่าง App Invertor ได้ โค้ดโดยรวมที่ใช้ในบทความนี้มีไม่มากนัก เมื่ออ่านจากหลักการการทำงานของ BLE แล้ว ก็จะทำให้ผู้อ่านสามารถเข้าใจการใช้งานได้อย่างรวดเร็วมากขึ้นครับ
สำหรับหลักการทำงานของ BLE ที่ลงไว้ในบทความนี้เนื้อหาไม่ถูกต้อง 100% ซะทีเดียว เนื่องจากผู้เขียนต้องการให้ผู้อ่านเข้าใจหลักการคร่าว ๆ ก่อน เมื่อเข้าใจแล้วผู้อ่านสามารถเข้าไปอ่านทำความเข้าใจเชิงลึกได้ที่ลิงค์ BLE – Bluetooth Low Energy – Soft Power Group ซึ่งให้ข้อมูลไว้ละเอียด และถูกต้องทุกประการ
สำหรับบทความนี้ผู้เขียนไม่ได้อธิบายโค้ด อาจจะทำให้เข้าใจโค้ดได้ยาก ขอให้ผู้อ่านทำให้ควบคุมหลอด LED ผ่านบลูทูธให้ได้ก่อน จากนั้นจึงค่อยมาไล่ทำความเข้าใจโค้ดทีหลัง ก็จะทำให้เข้าใจมากขึ้นเพราะทราบผลลัพธ์ที่ได้อยู่แล้ว
สำหรับบทความนี้ก็มีเพียงเท่านี้ ขอฝากติดตามว่าบทความต่อไปจะเป็นเรื่องเกี่ยวกับอะไรด้วยนะครับ สำหรับบทความนี้ก็ขอจบเพียงเท่านี้
~ สวัสดีครับ ~