โปรเจกต์ Gesture controlled car ที่ง่ายที่สุด!
การสร้าง Gesture controlled car ไม่เคยง่ายขนาดนี้มาก่อน!
การสร้าง Gesture controlled car ไม่เคยง่ายขนาดนี้มาก่อน!
ผมอยากจะสร้างรถที่ควบคุมด้วยท่าทางมาตลอดเลยครับ
ผมลองค้นหาบทเรียนมาหลายที่ แต่ส่วนใหญ่ทำออกมาดูซับซ้อนเกินไป
ผมก็เลยออกแบบโปรเจกต์นี้ขึ้นมาเองครับ
และรู้ไหมว่าอะไรที่เจ๋งกว่านั้น? โปรเจกต์นี้เป็นแบบสากลหรือ universal (เดี๋ยวจะอธิบายเพิ่มภายหลังครับ)
มาเริ่มกันเลยครับ
ส่วนของตัวรับสัญญาณ (ตัวรถ)
ก่อนอื่นเลย คุณต้องมีโครงรถ (chassis) ซึ่งสามารถสั่งซื้อออนไลน์ได้ไม่ยากครับ หรือถ้าคุณเป็นมือใหม่ จะใช้กระดาษลูกฟูก/ผ้าใบ/อะคริลิก แล้วใช้ปืนกาวติดเอาก็ได้เหมือนกันครับ😅
ในโปรเจกต์นี้ ผมใช้ Board สองตัว ตัวหนึ่งสำหรับเป็นตัวรับสัญญาณ (receiver) และอีกตัวเป็นตัวส่งสัญญาณ (transmitter)
ใช้ nRF2401 transceiver module 2 ตัว สำหรับติดตั้งที่ Board ตัวส่งหนึ่งตัว และที่ Board ตัวรับอีกหนึ่งตัว
ผมใช้ Module nRF2401 รุ่นมาตรฐาน ซึ่งมีระยะการใช้งานที่ค่อนข้างดีเลยครับ
ขั้นตอนแรก ให้ประกอบ motors เข้ากับสายไฟก่อน ถ้าคุณกำลังอ่านบทเรียนนี้อยู่ ผมคาดว่าคุณคงไม่ต้องพึ่งบทเรียนในส่วนนี้แล้วล่ะครับ😅
ถ้าคุณใช้ 4 motors ให้ต่อสายขั้วลบและขั้วบวกของ motors ทั้งสองข้างเข้าด้วยกัน เพื่อที่คุณจะได้เชื่อมต่อทั้งคู่ผ่านสายไฟแค่ 2 เส้น เหมือนกับว่าเป็น motor ตัวเดียว
(หมายเหตุ: l298n รองรับ motor แค่ 2 ตัว ดังนั้นสิ่งนี้จึงจำเป็นครับ แต่ถ้าคุณใช้ l293d คุณสามารถไปดูบทเรียนวิธีควบคุมผ่าน l293d แทนได้)
จากนั้นเชื่อมต่อ motor ทั้ง 2 คู่ตามที่แสดงใน schematic ด้านล่างครับ

สำหรับ arduino uno และ l298n,
digital pin 2 > IN1
digital pin 3 > IN2
digital pin 4 > IN3
digital pin 5 > IN4
และส่วนการเชื่อมต่อไฟเลี้ยง (power connection) นั้นสำคัญมากครับ
ผมพบว่าการต่อ Arduino เข้ากับช่อง 5v และ gnd ของ l298n นั้นจ่ายไฟได้ไม่ดีเท่าที่ควร ทั้งที่ Datasheets ระบุแรงดันใช้งานไว้ที่ 6v ถึง 12v แล้วทำไมถึงเป็นแบบนั้นล่ะ?
ดังนั้น ในช่องที่เขียนว่า 12v ให้คุณต่อขั้วบวกของแบตเตอรี่เข้าที่นั่น และในช่องเดียวกันนั้นให้ต่อสายไฟอีกเส้นหนึ่งไปที่ pin VIN ของ Arduino ด้วยครับ
จากนั้นต่อขั้วลบของแบตเตอรี่เข้ากับ gnd และต่อสายไฟอีกเส้นจากช่องเดียวกันนั้นไปที่ pin GND ช่องไหนก็ได้บน arduino
คราวนี้ เรามาเชื่อมต่อ Module nRF2401 เข้ากับ UNO กันครับ
pinout:

หมายเหตุ: คุณไม่จำเป็นต้องต่อ IRQ เข้ากับอะไรเลยครับ
คำเตือน: ให้จ่ายไฟผ่านช่อง 3V3 เท่านั้น ห้ามใช้ช่อง 5V บน Board ARDUINO เด็ดขาด ไม่อย่างนั้น MODULE อาจจะเสียจนใช้งานไม่ได้
การเชื่อมต่อ:
arduino nRF2401
GND > GND
3V3 > VCC
digital 8> CSN
digital 7> CE
digital 11> MOSI (spi interface)
digital 12> MISO (spi interface)
digital 13> SCK (spi interface)
pins ของ SPI interface จะเป็น pins มาตรฐานครับ ส่วน pins CSN และ CE สามารถใช้ digital pins ไหนก็ได้ แต่คุณต้องไปเปลี่ยนค่าใน code ให้ตรงกันด้วย
ส่วนของตัวส่งสัญญาณ:
ในส่วนนี้ผมใช้ ESP32 ( DOIT ESP32 Devkit v1)
จะมี Module สองตัวที่ ESP จะต้องเชื่อมต่อด้วย ตัวแรกคือ nRF2401 (ซึ่งจะทำหน้าที่ส่งข้อมูลไปยังคู่ของมันที่ตัวรับสัญญาณ)
เชื่อมต่อ nRF2401 ดังนี้-
esp32 nRF2401
GND > GND
3V3 > VCC
d15 > CSN
d2 > CE
d23 > MOSI (spi interface)
d19 > MISO (spi interface)
d18 > SCK (spi interface)
ตอนนี้ได้เวลาอธิบายแล้วว่าทำไมมันถึงเป็น "สากล"
คุณคงสังเกตเห็นว่า transceiver modules จะเชื่อมต่อกับ SPI interfaces ที่สอดคล้องกันของ Board เสมอ เช่น บน esp pin MOSI คือ d23 เป็นต้น
หลายบทเรียนมักจะใช้ rf modules แบบเบ็ดเสร็จ แต่ในโปรเจกต์นี้ ถ้าคุณมี micro controller boards อะไรก็ได้สองตัวที่รองรับ I2C และ SPI interface (ซึ่งบอร์ดส่วนใหญ่ในปัจจุบันก็มีมาให้หมดแล้ว) คุณก็สามารถจ่ายไฟให้ module และเชื่อมต่อ interface ที่เกี่ยวข้องได้ทันที (nrf และ mpu6050)
มาต่อกันเลยครับ

เชื่อมต่อ mpu 6050 เข้ากับ esp ดังนี้
esp mpu6050
d21 > SDA
d22 > SCL
และต่อ gnd กับ 3v3 คงไม่ต้องให้ผมบอกวิธีต่อไฟซ้ำแล้วซ้ำอีกใช่ไหมครับ?
(pins ที่เหลืออีก 4 pins ไม่จำเป็นต้องใช้ในโปรเจกต์นี้ครับ ถ้าคุณเห็นว่ามีช่อง 3v3 แค่ช่องเดียว แต่อยากเชื่อมต่อทั้งคู่ ก็แค่รวมสาย 3v3 ของ nRF และ mpu6050 เข้าด้วยกัน แล้วลากสายเดียวจากจุดที่ต่อกันนั้นไปที่ช่อง 3v3 ครับ)
ผมจะขอละส่วนของการออกแบบถุงมือและการติดตั้งอุปกรณ์ลงไปให้คุณตัดสินใจเองนะครับ เพราะคุณอาจจะอยากออกแบบตามความสะดวกของตัวเอง
ผมรู้ว่าการใช้ esp อาจจะดูเกินความจำเป็นไปหน่อย แต่ผมไม่มี Board อื่นที่มีขนาดพอเหมาะพอดีน่ะครับ และอย่างที่บอกไป คุณสามารถใช้ Board อะไรก็ได้มาต่อแทน
ในการเขียนโปรแกรมลง ESP32 คุณต้องติดตั้ง board manager เพิ่มเติมด้วย เพราะคุณไม่สามารถเขียนโปรแกรมลง esp ใน IDE ที่เพิ่งติดตั้งใหม่ได้ทันที ดูบทเรียนได้ที่ลิงก์นี้ครับ
เครดิต- Electronics HUB
หลังจากเปิดสวิตช์ทั้งที่ตัวรถและรีโมทแล้ว nRF ทั้งสองฝั่งจะเชื่อมต่อกัน ให้รอประมาณ 20 วินาทีเพื่อให้ accelerometer ของ mpu6050 ทำการปรับค่า (calibrate) เพราะ mpu คือ module ที่จะคอยตรวจจับการเคลื่อนไหวของมือคุณครับ
เมื่อ calibrate เสร็จแล้ว การเอียง Module mpu6050 ไปข้างหน้าจะทำให้รถวิ่งไปข้างหน้า
การเอียงเข้าหาตัว หรือเอียงไปข้างหลัง จะทำให้รถวิ่งถอยหลัง
และการเอียงไปทางซ้ายหรือขวาก็จะทำงานในลักษณะเดียวกันครับ
- ตรวจสอบว่าคุณต่อสาย nRF modules ทั้งสองฝั่งถูกต้องหรือไม่
- โปรดใช้แบตเตอรี่ Li ion แบบชาร์จได้ถ้าเป็นไปได้ เพราะผมเคยเจอปัญหาตอนใช้แบตเตอรี่แบบอัลคาไลน์ครับ
- รอ 20 วินาทีเพื่อให้ mpu ทำการ calibrate
- หากการรับส่งสัญญาณทำงานได้ แต่ทิศทางผิดเพี้ยน เช่น เอียงไปข้างหน้าแต่รถถอยหลัง ให้สลับ pins ของ l298n ที่ต่อกับ arduino ดังนี้-
pins 2,3 -> 3,2
pins 4,5 -> 5,4
คุณจะสังเกตได้ว่าผมแค่สลับขั้วของมันครับ ในทำนองเดียวกัน ถ้ารถเลี้ยวซ้ายแทนที่จะเลี้ยวขวา หรือกลับกัน ให้สลับ-
pins 2,3 -> 4,5
pins 4,5 -> 2,3
- ตรวจสอบแหล่งจ่ายไฟด้วยครับ
- ต่อ MODULE NRF เข้ากับช่อง 3V3 เท่านั้น!!!
- อย่าอยู่ห่างจนเกินไป หรือตรวจสอบว่ามีสิ่งกีดขวางหรือคลื่นรบกวนในการส่งสัญญาณวิทยุหรือไม่
ผมคิดว่าเท่านี้น่าจะเพียงพอแล้วครับ
นี่คือ Schematics และ code ครับ:
ผมจะเพิ่มวิดีโอให้เร็วๆ นี้ครับ
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้