สารบัญ:

ESP32 Bluetooth BLE รีโมทคอนโทรล: 8 ขั้นตอน
ESP32 Bluetooth BLE รีโมทคอนโทรล: 8 ขั้นตอน

วีดีโอ: ESP32 Bluetooth BLE รีโมทคอนโทรล: 8 ขั้นตอน

วีดีโอ: ESP32 Bluetooth BLE รีโมทคอนโทรล: 8 ขั้นตอน
วีดีโอ: Home Automation using ESP32 Bluetooth and IR remote control Relay | ESP32 Projects 2021 2024, พฤศจิกายน
Anonim
ESP32 Bluetooth BLE รีโมทคอนโทรล
ESP32 Bluetooth BLE รีโมทคอนโทรล
ESP32 Bluetooth BLE รีโมทคอนโทรล
ESP32 Bluetooth BLE รีโมทคอนโทรล
ESP32 Bluetooth BLE รีโมทคอนโทรล
ESP32 Bluetooth BLE รีโมทคอนโทรล
ESP32 Bluetooth BLE รีโมทคอนโทรล
ESP32 Bluetooth BLE รีโมทคอนโทรล

โปรเจ็กต์นี้เป็นตัวอย่างของวิธีเชื่อมต่อจอยสติ๊ก Bluetooth BLE ราคาไม่แพงกับ ESP32 รหัสนี้เขียนโดยใช้ Arduino IDE Ver 1.8.5 พร้อมส่วนเสริม ESP32 จอยสติ๊ก BLE ที่ใช้เป็นอุปกรณ์เชิงพาณิชย์ที่คุณสามารถซื้อบนอินเทอร์เน็ตได้ในราคาต่ำกว่า $20.00 หรือจากร้าน fiveBELoW ในพื้นที่ของคุณในราคา $5.00

จอยสติ๊กที่ฉันใช้ในโปรเจ็กต์นี้คือ Spektrum VR Control Bluetooth Remote Controller มันถูกวางตลาดโดยทำงานร่วมกับแท็บเล็ต Android และ IOS เป็นจอยสติ๊ก/เมาส์สำหรับใช้กับชุดหูฟัง VR

VR Control Bluetooth Remote Controller มีจอยสติ๊กตัวเดียวที่มีแกน X และ Y ปุ่มทริกเกอร์สองปุ่มที่ด้านหน้า และปุ่มหกปุ่มที่ด้ามจับ ปุ่มสองปุ่มใช้สำหรับเปิด/ปิดและควบคุมโหมด อีกสี่ปุ่มสามารถใช้สำหรับสิ่งที่คุณต้องการ โปรเจ็กต์นี้เป็นโครงร่างหรือเฟรมเวิร์กที่จัดการการเชื่อมต่อบลูทูธและการถอดรหัสปุ่มและจอยสติ๊กทั้งหมด สิ่งที่คุณต้องทำคือเพิ่มการเรียกใช้ฟังก์ชันเพื่อจัดการกับสิ่งที่คุณต้องการให้ปุ่มและจอยสติ๊กทำ คุณไม่จำเป็นต้องรู้อะไรเกี่ยวกับ Bluetooth เพื่อใช้เฟรมเวิร์กนี้

มีเว็บไซต์มากมายพร้อมคำแนะนำโดยละเอียดสำหรับการติดตั้ง Arduino IDE และส่วนเสริม ESP32 ฉันจะไม่พยายามทำซ้ำข้อมูลนั้นที่นี่ Google และปฏิบัติตามคำแนะนำ

เฟรมเวิร์กนี้เป็นการปรับตัวอย่างไคลเอ็นต์ BLE ที่เผยแพร่โดย IoT Sharing คุณสามารถหาได้ที่นี่ คุณสามารถศึกษารหัสนี้เพื่อทำความเข้าใจว่า BLE ทำงานอย่างไร Expressif มีตัวอย่างที่สมบูรณ์สำหรับไคลเอ็นต์ GATT BLE และอธิบายการดำเนินการโดยละเอียด (ไม่ได้เขียนสำหรับ Arduino IDE) คุณสามารถรับได้ที่นี่

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

ขั้นตอนที่ 1: เล็กน้อยเกี่ยวกับ Bluetooth Low Energy (BLE)

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

BLE ใช้สถาปัตยกรรมไคลเอนต์/เซิร์ฟเวอร์ เครื่องหนึ่งเป็นเซิร์ฟเวอร์ที่ให้บริการ อีกเครื่องหนึ่งเป็นเครื่องลูกข่ายที่ใช้บริการ เพื่อลดความต้องการพลังงาน BLE จะส่งข้อมูลแพ็คเก็ตขนาดเล็กเมื่อมีการเปลี่ยนแปลงเท่านั้น ในกรณีของจอยสติ๊ก อุปกรณ์จอยสติ๊กคือเซิร์ฟเวอร์ ในฐานะเซิร์ฟเวอร์ เซิร์ฟเวอร์จะโฆษณาตัวเองและจะส่งรายการบริการที่มีให้เมื่อถูกถาม อุปกรณ์จอยสติ๊กโฆษณาห้าบริการ บริการเดียวที่เราสนใจคือบริการ BLE HID (Human Interface Device) บริการ BLE มีสิ่งที่เรียกว่าคุณลักษณะที่เกี่ยวข้อง ลักษณะโดยทั่วไปคือแหล่งข้อมูล บริการ HID ของจอยสติ๊กมีลักษณะสิบประการ ลักษณะบางอย่างซ้ำกันและถูกละเว้น เราสนใจเฉพาะลักษณะรายงาน BLE ที่มีความสามารถในการอ่านและแจ้งเตือนเท่านั้น คุณลักษณะสามประการตรงตามข้อกำหนดเหล่านี้และให้ข้อมูลเกี่ยวกับตำแหน่งของจอยสติ๊กและสถานะของปุ่ม เมื่อเปิดใช้งานการแจ้งเตือน เซิร์ฟเวอร์จะส่งแพ็กเก็ตข้อมูลเมื่อตรวจพบการเปลี่ยนแปลงในลักษณะที่เกี่ยวข้อง

กรอบงานตรวจสอบว่าเซิร์ฟเวอร์ที่พบมีบริการ BLE HID และจะเปิดใช้งานการแจ้งเตือนในลักษณะรายงานสามแบบที่ให้ข้อมูลสถานะจอยสติ๊กและปุ่ม จากนั้น เมื่อกดหรือปล่อยปุ่มหรือย้ายจอยสติ๊ก ESP32 จะได้รับแพ็กเก็ตข้อมูลที่บอกว่าตำแหน่งจอยสติ๊กใหม่คืออะไร และ/หรือสถานะของปุ่มบางปุ่ม

ขั้นตอนที่ 2: การสแกนและตัวบ่งชี้การเชื่อมต่อ

กรอบงานกำหนดสอง LEDS, GREENLED และ BLUELED และกำหนดให้กับสองพิน GPIO ของ ESP32 GREENLED จะสว่างขึ้นเมื่อ ESP32 กำลังค้นหาจอยสติ๊ก BLE เมื่อพบจอยสติ๊กแล้ว ไฟ GREENLED จะถูกปิดและ BLUELED จะสว่างขึ้นเพื่อระบุว่าได้ทำการเชื่อมต่อแล้วและคุณพร้อมที่จะไป หากการเชื่อมต่อขาดหาย BLUELED จะปิดลง ESP32 จะถูกรีเซ็ต ไฟสีเขียวจะสว่างขึ้นและเริ่มการสแกนอีกครั้ง หากไม่พบจอยสติ๊กภายในสามสิบวินาที การสแกนจะหยุดและไฟสีเขียวจะดับลง หลังจากผ่านไปห้าวินาที การสแกนจะเริ่มขึ้นอีกครั้งและไฟสีเขียวจะเปิดขึ้น

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

ขั้นตอนที่ 3: ถอดรหัสเหตุการณ์ของจอยสติ๊กและปุ่ม

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

งาน FreeRTOS ถูกสร้างขึ้นเพื่อจัดการข้อมูลที่ได้รับจากการแจ้งเตือน หนึ่งงานสำหรับจอยสติ๊กและปุ่มทริกเกอร์ หนึ่งงานสำหรับปุ่ม A & B และหนึ่งงานสำหรับปุ่ม C & D งานเหล่านี้แต่ละงานมีการทำเครื่องหมายไว้อย่างชัดเจนว่าคุณควรเพิ่มโค้ดเพื่อทำสิ่งที่คุณต้องการกับกิจกรรมอย่างไร มองหา "//===== เพิ่มโค้ดของคุณที่นี่ =====" ความคิดเห็นในเนื้อหาของงานและเพิ่มโค้ดของคุณหลังจากนั้น แต่ละงานมีความคิดเห็นระบุว่าใช้สำหรับอะไรและใช้ Serial.println() เพื่อพิมพ์ข้อความเกี่ยวกับเหตุการณ์ที่เกิดขึ้น

นี่คือตัวอย่างจากงานปุ่ม A/B

โมฆะ taskButtonAB (เป็นโมฆะ * พารามิเตอร์) { ปุ่ม uint8_t;

//===== หากงานต้องการการเริ่มต้นเพียงครั้งเดียว ให้วางไว้ที่นี่ =====

ในขณะที่ (จริง) { // เลิกใช้ CPU รอข้อมูลใหม่ vTaskSuspend (NULL); // เราเพิ่งตื่น มีปุ่มข้อมูลใหม่ = VrBoxData[VB_BTNAB]; Serial.printf("ปุ่ม A/B: %02X\n", ปุ่ม); ถ้า (ปุ่ม & VB_BUTTON_A) { // ปุ่ม A กดหรือถูกกดค้างไว้ Serial.println ("ปุ่ม A"); //===== เพิ่มรหัสของคุณที่นี่ ===== }

ถ้า (ปุ่ม & VB_BUTTON_B)

{ // ปุ่ม B กดหรือถูกกดค้างไว้ Serial.println ("ปุ่ม B");

//===== เพิ่มรหัสของคุณที่นี่ =====

} } // สำหรับ } // taskButtonAB

ขั้นตอนที่ 4: การทำงานของ VR Box: จอยสติ๊ก

หากจอยสติ๊กถูกปล่อยไว้ที่ตำแหน่งตรงกลาง จะไม่มีการส่งการแจ้งเตือนของจอยสติ๊ก เมื่อจอยสติ๊กถูกย้ายออกจากศูนย์กลาง ข้อความแจ้งเตือนพร้อมข้อมูลจอยสติ๊กและข้อมูลปุ่มทริกเกอร์จะถูกส่งทุกๆ 15mS เมื่อจอยสติ๊กถูกย้ายกลับมาที่กึ่งกลาง ระบบจะไม่ส่งการแจ้งเตือนว่าถูกย้ายไปที่กึ่งกลาง กล่าวอีกนัยหนึ่ง จอยสติ๊กจะบอกคุณว่าจอยสติ๊กได้เคลื่อนออกจากศูนย์กลาง แต่ไม่ใช่ว่าได้ย้ายไปที่กึ่งกลาง ผลลัพธ์ที่ได้คือคุณได้รับข้อความที่ระบุว่าจอยสติ๊กกำลังเคลื่อนเข้าหาศูนย์กลาง แต่ไม่ถึงศูนย์กลาง น่ารำคาญมาก ปุ่มทริกเกอร์สองปุ่มรวมอยู่ในข้อมูลจอยสติ๊ก การกดปุ่มทริกเกอร์ปุ่มใดปุ่มหนึ่งหลังจากนำจอยสติ๊กกลับมาที่กึ่งกลางจะทำให้ตำแหน่งจอยสติ๊กอัปเดตเป็นศูนย์ กรอบงานมีตัวจับเวลาหมดเวลาในตัวซึ่งจะจำลองข้อความแจ้งเตือนจอยสติ๊กโดยอัตโนมัติในระยะเวลาสั้นๆ หลังจากข้อความแจ้งเตือนปุ่มจอยสติ๊ก/ทริกเกอร์หยุดมาถึง ตัวจับเวลาตั้งค่าจอยสติ๊กเป็นศูนย์ จอยสติ๊กมีช่วงประมาณ +/- 25 ในแต่ละแกน

ขั้นตอนที่ 5: การทำงานของ VR Box: ปุ่มทริกเกอร์

ปุ่มทริกเกอร์จะส่งข้อความแจ้งเตือนหนึ่งครั้งเมื่อกดและอีกครั้งเมื่อปล่อย ข้อความแจ้งเตือนที่กดจะแสดงปุ่มที่ถูกกด ข้อความแจ้งเตือนการปล่อยแสดงว่าปุ่มทั้งสองถูกปล่อย

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

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

ขั้นตอนที่ 6: การทำงานของ VR Box: ปุ่ม A/B

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

ขั้นตอนที่ 7: การทำงานของ VR Box: ปุ่ม C/D

ปุ่ม C และ D จะส่งข้อความแจ้งเตือนหนึ่งครั้งเมื่อกด และอีกครั้งเมื่อปล่อย หากกดค้างไว้ จะไม่มีการส่งข้อความเพิ่มเติมจนกว่าจะถูกปล่อย การกดปุ่ม C หรือ D ปุ่มใดปุ่มหนึ่งค้างไว้จะป้องกันไม่ให้เซิร์ฟเวอร์ตรวจจับกิจกรรมบนปุ่มอื่น

ขั้นตอนที่ 8: สรุป

การทำงานของปุ่มต่างๆ ในความคิดของฉันค่อนข้างว่องไว กรอบการทำงานมีที่สำหรับวางโค้ดของคุณเพื่อดำเนินการเมื่อกดปุ่ม หากคุณจำเป็นต้องตรวจจับการปลดปุ่มด้วย นั่นก็เหลือให้คุณหาวิธีดำเนินการ

ทั้งหมดขึ้นอยู่กับคุณที่จะกำหนดว่าคุณต้องการให้แต่ละปุ่มทำอะไรและควรขยับจอยสติ๊กอย่างไร วิธีจัดการกับความแตกต่างของทริกเกอร์ ปุ่ม A & B และ C & D ขึ้นอยู่กับคุณ

ดูในรหัสสำหรับ; taskJoyStick(), taskButtonAB(), taskButtonCD() ฟังก์ชันและเพิ่มโค้ดของคุณหลัง "//===== เพิ่มโค้ดของคุณที่นี่ =====" ความคิดเห็น

คุณจะต้องใช้ฟังก์ชันสูงสุดสี่ฟังก์ชันเพื่อจัดการกับจอยสติ๊ก (ไปข้างหน้า ถอยหลัง ขวา & ซ้าย) และได้ถึงหกฟังก์ชันเพื่อจัดการกับปุ่มต่างๆ ใช้งานทั้งหมดหรือเฉพาะสิ่งที่คุณต้องการ ทางเลือกเป็นของคุณ

หากคุณใช้กรอบนี้ ฉันชอบที่จะตะโกนออกมาเกี่ยวกับสิ่งที่คุณใช้มันและถ้าคุณพบว่ามันใช้งานง่าย

หากคุณมีคำถามเกี่ยวกับวิธีการทำงานหรือต้องการความช่วยเหลือในการทำงาน โปรดติดต่อฉัน

รหัสมีอยู่ใน GitHub ที่นี่

สนุก.

แนะนำ: