ESP32 (EP.9) ESP32 กับการใช้เป็น native USB device (HID)

ESP32 S3 (รุ่น S3 นะครับ ไม่ใช่ ESP32 ธรรมดา) มีความสามารถพิเศษอย่างหนึ่งก็คือตัวมันจะมี native USB hardware ใน chip  ก็คือเมื่อเสียบเข้า USB port ของ PC/Notebook  ESP32 S3 สามารถทำตัวเป็นอุปกรณ์ input แบบ USB โดยเป็นได้ทั้ง mouse / keyboard และอื่น ๆ ตามแต่เราจะเขียน code ประยุกต์มันให้เป็นอุปกรณ์ USB

ใน project สาธิตของกระทู้นี้ก็จะเสนอแนวทางการประยุกต์ใช้งานให้ทำงานเป็น USB keyboard และ mouse โดยรับ input ใด ๆ เข้ามาทางขา GPIO และส่งสัญญาณไปที่ PC เหมือนกับเรากดคีย์บอร์ดของคอมพิวเตอร์  ใน project นี้ผมจะสาธิตในรูปแบบของเกมสนุกอันนึงใน google chrome ก็คือเกมไดโน

ท่านที่ใช้ Google Chrome พิมพ์แบบนี้ที่ address bar ได้เลย
chrome://dino

เกมไดโนนี้เวลาเล่นจะต้องกดปุ่มลูกศรขึ้น (ARROW_UP) เพื่อให้ไดโนเสาร์กระโดดข้ามต้นกระบองเพชร โดยผมจะใช้ตัว LDR รับค่าของความสว่างในจอภาพ PC เพื่อนำไปเป็นสัญญาณกระตุ้นที่ขา GPIO ให้ ESP32 S3 สังสัญญาณเสมือนกับกดปุ่ม ARROW_UP เพื่อให้ตัวไดโนเสาร์กระโดดหลบต้นกระบองเพชรครับ

อุปกรณ์ที่ใช้มีเพียงเท่านี้


ขอเริ่มที่ตัว sensor ก่อน ใน project นี้จะใช้ sensor แสงพื้นฐานก็คือตัว LDR รับค่าความสว่างบนจอ PC  ก็คือในเกมนี้จะเป็นพื้นหลังสีดำอยู่แล้วและเมื่อมีสิ่งกีดขวางข้างหน้าไดโนเสาร์เลื่อนมา (ต้นกระบองเพชร) มันจะเป็นสีออกเทา-ขาวซึ่งก็หมายความว่าความสว่างจะเปลี่ยน  LDR ก็จะรับค่านี้ได้และไปสั่งงานให้ ESP32 S3 ส่งสัญญาณผ่าน USB ไปที่คอมพิวเตอร์เหมือนกับการปุ่มลูกศรขึ้น (ARROW_UP) เพื่อให้ไดโนเสาร์กระโดดครับ

ในการใช้งาน LDR เชื่อมต่อกับ ESP32 S3 จะต้องสร้างวงจรเองก็คือใช้ LM393 เป็นตัว comparator  ที่ต้องทำแบบนี้เพื่อจะได้มีสัญญาณ trigger ที่คมมากพอ …. จริง ๆ แล้วสามารถใช้ LDR ต่อกับตัวความต้านทานก็ได้ป้อนเข้า GPIO ก็ได้แต่ค่าแรงดันในการเปลี่ยนจาก logic 0 ไปเป็น logic 1 มันจะไม่ค่อยคมซึ่งมีผลต่อ delay time เป็นอย่างมากทำให้ส่งสัญญาณให้ไดโนเสาร์กระโดดพลาดได้ ดังนั้นจึงต้องใช้ comparator มาช่วยครับวงจรตามภาพล่างนี้

ในการติดตั้งตัว LDR ก็จ่อเข้ากับจอภาพง่าย ๆ อย่างนี้เลย

ผลลัพท์ออกมาแบบนี้


นอกจากนี้แล้วด้วยความที่ ESP32 S3 มันเป็นอุปกรณ์ native USB ดังนั้นจึงสั่งให้ประยุกต์ใช้งานให้สามารถ “พิมพ์” ข้อความไปที่โปรแกรมใด ๆ ก็ได้ใน windows อย่างในคลิปบนนี้เลื่อนไปวินาทีที่ 45 ก็คือพิมพ์ข้อความภาษาอังกฤษ  ซึ่งใน code สามารถเขียน delay time ได้ว่าจะให้พิมพ์ช้าหรือเร็วเท่าไหร่  แต่การประยุกต์ใช้งานลักษณะการพิมพ์เองแบบนี้ผมก็ยังนึกไม่ค่อยออกเท่าไหร่ครับ  ดังนั้นการประยุกต์ใช้งานแบบ sensor ร่วมกับเกมไดโนเสาร์กระโดดแบบข้างบนจะมีประโยชน์มากกว่า

ในการที่จะส่งสัญญาณผ่าน USB กับทำได้ทั้ง Keyboard / Mouse  ซึ่งใน library สามารถสั่งงานได้อย่างง่าย ๆ ว่าให้เลื่อน mouse cursor อย่างไร …. จากในคลิปบน (ที่เวลา 1:02) จะเห็นว่าสามารถวาดเป็นวงกลมได้ซึ่งถ้าเราทำด้วยมือไม่มีทางทำได้กลม perfect แบบนี้แต่ใน code ทำได้ครับ

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