Innovation
คือพี่อยากทำรถบังคับด้วยท่าทางมานานแล้วว่ะ ไปเสิร์ชดูก็มีสอนเพียบ แต่โคตรจะซับซ้อนเลยอะ เลยออกแบบเองเลยดีกว่า รู้มั้ยอะไรดีกว่านั้น? โปรเจคนี้มันใช้ได้กับหลายอย่างเลย (เดี๋ยวค่อยบอกทีหลัง)
Tutorial
มาเริ่มกันเลยดีกว่า
ฝั่งรับสัญญาณ (ตัวรถ)
อย่างแรกสุดเลย น้องต้องมีตัวโครงรถ (chassis) ก่อน สั่งซื้อออนไลน์ได้เลย ไม่ยากหรอก หรือถ้ายังมือใหม่จัด ก็ใช้กระดาษลัง/ผ้าใบ/อะคริลิค กับปืนกาวสักกระบอกก็อยู่ตัวแล้ว 😅
ในโปรเจคนี้ พี่ใช้บอร์ดสองตัว - ตัวนึงสำหรับรับ อีกตัวสำหรับส่ง
โมดูล nRF2401 2 ตัว ตัวนึงสำหรับบอร์ดส่ง อีกตัวสำหรับรับ พี่ใช้โมดูล nRF2401 แบบมาตรฐานนะ รองรับระยะดีเลย
เริ่มแรกเลย ประกอบมอเตอร์กับสายไฟให้เรียบร้อย ถ้าน้องมาอ่านถึงตรงนี้ พี่ว่าเรื่องนี้น้องน่าจะทำเป็นอยู่แล้วแหละ 😅
ถ้าใช้มอเตอร์ 4 ตัว ให้ต่อขั้วลบและขั้วบวกของมอเตอร์แต่ละข้างเข้าด้วยกัน จะได้ต่อสายแค่ 2 เส้น เหมือนใช้มอเตอร์แค่ตัวเดียว
(หมายเหตุ: l298n รองรับมอเตอร์แค่ 2 ตัว เลยต้องทำแบบนี้ ถ้าน้องใช้ l293d ลองไปหาวิธีควบคุมด้วย l293d ดูนะ)
จากนั้นก็ต่อมอเตอร์ทั้งสองคู่ตามแผนภาพวงจรท้ายบทความเลย

สำหรับ arduino uno กับ l298n
digital pin 2 > IN1
digital pin 3 > IN2
digital pin 4 > IN3
digital pin 5 > IN4
และเรื่องการจ่ายไฟนี่สำคัญมาก! พี่เจอมาแล้วว่าต่อ Arduino เข้าช่อง 5v กับ gnd ของ l298n ตรงๆ มันจ่ายไฟไม่พอ Datasheet บอกว่าใช้ไฟ 6v ถึง 12v แล้วทำไมล่ะ?
ก็คือ ช่องที่เขียนว่า 12v นั่นแหละ น้องต้องต่อขั้วบวกของแบตเตอรี่เข้าไป และต้องต่อสายไฟเส้นนึงจากช่องเดียวกันนี้ไปที่ขา VLN ของ Arduino ด้วย ส่วนขั้วลบของแบตเตอรี่ให้ต่อกับช่อง gnd และก็ต่อสายไฟเส้นนึงจากช่องเดียวกันนี้ไปที่ขา GND ใดๆ บน Arduino อีกที
The L298N Differential Action Matrix
บล็อคส่วนรับจะทำงานเชื่อมโยงกับโครงรถ RC โดยโมดูล nRF24L01 ฝั่งรับจะทำหน้าที่อ่านข้อมูลที่เข้ามา เมื่อได้รับคำสั่งเช่น 'L' มันจะเริ่มการบังคับเลี้ยวแบบดิฟเฟอเรนเชียล เพราะรถ 4WD แบบมาตรฐานไม่มีระบบพวงมาลัย มันเลยใช้วิธี Tank Steering แทน โดยโค้ด C++ จะสั่งให้ L298N Motor Driver ทำงานตามนั้น ตัวอย่างเช่น ถ้าจะเลี้ยวซ้าย มอเตอร์ฝั่งขวาจะหมุนไปข้างหน้า ส่วนมอเตอร์ฝั่งซ้ายจะหมุนถอยหลัง ทำให้รถหมุนบนแกนกลางของตัวเอง เหมือนกับที่เราบิดข้อมือนั่นแหละ
ทีนี้ มาต่อโมดูล nRF2401 เข้ากับ UNO กัน
การต่อขา (pinout):

จำไว้ว่า ไม่ต้องต่อขา IRQ ไปไหนทั้งนั้น
คำเตือน: จ่ายไฟให้โมดูลผ่านขา 3V3 เท่านั้น ห้ามใช้ 5V บนบอร์ด Arduino เด็ดขาด ไม่งั้นโมดูลอาจพังได้!
การต่อสาย:
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)
ขาสำหรับ SPI interface เป็นขาเริ่มต้น ส่วนขา CSN กับ CE จะใช้ขา digital อะไรก็ได้ แต่ต้องไปเปลี่ยนในโค้ดให้ตรงกันด้วยนะ
ฝั่งส่งสัญญาณ:
ตรงนี้พี่ใช้ ESP32 (รุ่น DOIT ESP32 Devkit v1) จะมีโมดูลสองตัวที่ต้องต่อกับ 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)
ทีนี้มาพูดถึงเรื่องที่มัน "ยูนิเวอร์แซล" กันดีกว่า น้องต้องสังเกตเห็นแล้วว่าโมดูลพวกนี้มันต่อกับขา SPI ของบอร์ดเสมอ เช่นใน ESP, MOSI คือขา d23 อะไรแบบนั้น หลายๆ ทูตใช้โมดูล RF ที่มากับบอร์ดเลย แต่โปรเจคนี้ ถ้าน้องมีไมโครคอนโทรลเลอร์บอร์ดไหนก็ได้สองบอร์ด ที่ซัพพอร์ต I2C กับ SPI (ซึ่งสมัยนี้บอร์ดส่วนใหญ่มีหมดแล้ว) น้องก็แค่จ่ายไฟให้โมดูล แล้วต่ออินเตอร์เฟซที่ถูกต้อง (nrf กับ mpu6050) เข้ากับบอร์ดนั้นๆ ได้เลย ง่ายๆ จัดไปวัยรุ่น!
มาๆ ต่อกันเลย

ต่อ mpu6050 เข้ากับ ESP แบบนี้นะ
esp mpu6050
d21 > SDA
d22 > SCL
ส่วน GND กับ 3V3 นะเหอะ น้องอยากให้พี่บอกวิธีต่อไฟกี่รอบเนี่ย? ต่อเหมือน nRF เลยจ้า
(ขาที่เหลืออีก 4 ขาไม่ต้องใช้ในโปรเจคนี้ ถ้าน้องเห็นว่ามีขา 3V3 แค่ขาเดียว ถ้าอยากต่อ ก็แค่เอา 3V3 ของ nRF กับ mpu6050 มาต่อรวมกันก่อน แล้วค่อยลากสายเส้นเดียวจากจุดนั้นไปต่อกับ 3V3 บน ESP)
เรขาคณิตของถุงมืออัจฉริยะ (MPU6050)
ส่วน Transmitter ทั้งหมดจะติดตั้งอยู่บนถุงมือผ้า โดยมี MPU6050 6-Axis Accelerometer ติดอยู่บนหลังมือ ESP32 จะอ่านค่าเวกเตอร์ความเร่งในแกน X/Y ของมัน เมื่อเรางอข้อมือไปข้างหน้า ความเร่งในแกน Y จะเกินค่าที่เราตั้งไว้ (เช่น > 15000) ซึ่งจะส่งคำสั่ง 'ไปหน้า' ออกไป ส่วนถ้าเราเอียงข้อมือไปทางซ้ายแรงๆ ความเร่งในแกน X จะต่ำกว่าค่าลบที่ตั้งไว้ (เช่น < -15000) แล้วส่งคำสั่ง 'เลี้ยวซ้าย' ออกไป หลังจากนั้น Transmitter ก็จะส่งคำสั่งนี้เป็นตัวอักษรออกทางโมดูล nRF24L01 ไปยังคลื่นวิทยุทันที
ส่วนการออกแบบถุงมือและติดตั้งฮาร์ดแวร์ลงไป พี่ปล่อยให้น้องทำเองละกัน เพราะน้องอาจจะอยากออกแบบให้สะดวกกับตัวเอง พี่รู้ว่า ESP มันโอเวอร์กิลไปหน่อย แต่พี่ไม่มีบอร์ดไซส์นั้นแบบอื่นแล้วอะ และอย่างที่บอก น้องใช้บอร์ดไหนก็ได้ที่มันรองรับ
การจะโปรแกรม ESP32 ได้ น้องต้องติดตั้ง Board Manager ก่อน เพราะว่าใน IDE ที่เพิ่งติดตั้งใหม่ๆ จะยังโปรแกรม ESP32 โดยตรงไม่ได้ เดี๋ยวหาวิธีติดตั้งให้เองนะ สู้งานนะน้อง
วิธีใช้งานโปรเจค-
หลังจากเปิดสวิตช์ทั้งรถและรีโมทแล้ว nRF ทั้งสองฝั่งควรจะเชื่อมต่อกันได้ รอสักประมาณ 20 วินาที ให้ mpu6050 คาลิเบรตตัวเอง เพราะว่า mpu คือโมดูลที่ใช้ติดตามการเคลื่อนไหวของมือน้องนั่นเอง
เมื่อคาลิเบรตเสร็จแล้ว การเอียงโมดูล mpu6050 ไปข้างหน้าจะทำให้รถวิ่งไปหน้า การเอียงโมดูลเข้าหาตัว (หรือไปข้างหลัง) จะทำให้รถถอยหลัง การเอียงไปทางซ้ายหรือขวาก็ทำงานแบบเดียวกัน
แก้ไขปัญหาเบื้องต้น-
- เช็คให้ดีว่าได้ต่อสายโมดูล nRF ทั้งสองฝั่งถูกต้องหรือยัง
- ถ้าเป็นไปได้ ให้ใช้แบตเตอรี่ลิเธียมไอออนแบบชาร์จไฟได้ พี่เคยมีปัญหาตอนใช้แบตเตอรี่อัลคาไลน์
- รอ 20 วินาทีให้ mpu คาลิเบรต
- ถ้าส่งสัญญาณได้ แต่การทำงานสลับกัน เช่น เอียงไปหน้าแต่รถถอยหลัง ให้ลองสลับขาของ L298N ที่ต่อกับ Arduino แบบนี้-
ขา 2,3 -> เปลี่ยนเป็น 3,2
ขา 4,5 -> เปลี่ยนเป็น 5,4
น้องคงสังเกตเห็นแล้วว่าพี่แค่สลับขั้วของมันนั่นแหละ ถ้ารถเลี้ยวซ้ายแทนที่จะขวา (หรือสลับกัน) ก็ทำแบบเดียวกัน ห้ามช็อตนะตัวนี้
ขา 2,3 -> 4,5
ขา 4,5 -> 2,3.
- ตรวจสอบแหล่งจ่ายไฟด้วยนะน้อง
- ต่อไฟ 3V3 เฉพาะให้กับโมดูล NRF เท่านั้น!!!
- อย่าอยู่ห่างเกินไป หรือลองเช็คดูว่ามีอะไรมาบังหรือรบกวนสัญญาณวิทยุมั้ย
คิดว่าเท่านี้ก็น่าจะพอแล้วล่ะ ฮะๆ
โค้ดและวงจร (Code and schematics)-
เอาล่ะ นี่คือวงจรและโค้ด เดี๋ยวจะเพิ่มวิดีโอให้ดูเร็วๆ นี้จ้า
Bionic Telemetry Rig
- ตัวส่งสัญญาณ (The Glove): ESP32 + MPU6050 + nRF24L01 + แบตเตอรี่
- ตัวรับสัญญาณ (The Vehicle): Arduino Uno + nRF24L01 + L298N Heavy Duty Motor Driver
- ชุดโครงรถ 4WD ทั่วไป (ต้องใช้มอเตอร์ 4 ตัวนะ; 2WD มันหมุนตัวบนพรมไม่ค่อยดี)
- แบตเตอรี่ลิเธียมโพลิเมอร์ 7.4V ถึง 11.1V เอาไว้จ่ายให้ขาเพาเวอร์ 12V ของ L298N โดยเฉพาะเลย (ป้องกันไม่ให้ไฟของ Uno ตก)