ระดับกลาง
สร้างรถหุ่นยนต์สองล้อ
หุ่นยนต์มอเตอร์การเคลื่อนไหว
เปลี่ยนโค้ดให้เป็นการเคลื่อนไหว – เชื่อมต่อแผงวงจรขับเคลื่อนมอเตอร์และโครงจริงเข้าด้วยกัน แล้วดูโปรแกรมของคุณขับเคลื่อนบางสิ่งบางอย่างได้จริง
รวมชิ้นส่วนจริง 6 รายการ
ราคารวมชุดนี้: 1,568.00 ฿
ยังไม่รวมส่วนลดคำสั่งซื้อที่คุณอาจได้รับตอนชำระเงิน
สิ่งที่คุณต้องใช้
เป้าหมายของโครงการ
โครงการนี้เปลี่ยนแชสซีหุ่นยนต์ให้กลายเป็นสิ่งที่ขับเคลื่อนได้จริงด้วยโค้ดของคุณเอง โดยรวมตัวควบคุม, ตัวขับมอเตอร์ และมอเตอร์ DC สองตัวเข้าไว้ด้วยกันเป็นเครื่องจักรที่ทำงานประสานกัน เป็นโครงการแรกในเส้นทางหุ่นยนต์เนื่องจากเป็นการแนะนำการควบคุมมอเตอร์โดยเฉพาะ ซึ่งเป็นประเภทเอาต์พุตที่แตกต่างจากสวิตช์ไฟหรือการขับเคลื่อนจอแสดงผลโดยพื้นฐาน
สิ่งที่ตัวควบคุมทำ
ตัวควบคุมจะตัดสินใจว่าหุ่นยนต์ควรไปทางไหนและแปลการตัดสินใจนั้นเป็นสัญญาณที่ตัวขับมอเตอร์เข้าใจ ซึ่งก็คือทิศทางสำหรับแต่ละล้อและความเร็วสำหรับแต่ละล้อ โดยมีการอัปเดตอย่างต่อเนื่องในขณะที่โปรแกรมทำงาน ที่นี่ใช้ ESP32-S3 แทนที่จะเป็นบอร์ดขนาดเล็กกว่าอย่าง ESP32-C3 โดยเฉพาะอย่างยิ่งเพื่อเพิ่มพื้นที่ GPIO: ตัวขับมอเตอร์เพียงอย่างเดียวก็ต้องการขาหลายขาแล้ว และการเผื่อพื้นที่สำหรับการอัปเกรดเซ็นเซอร์ในอนาคต (เช่น แถบเซ็นเซอร์ของโครงการติดตามเส้น) ก็เป็นสิ่งสำคัญตั้งแต่เริ่มต้น
สิ่งที่ตัวขับมอเตอร์ทำ
TB6612FNG จะอยู่ระหว่างตัวควบคุมและมอเตอร์ และทำหน้าที่ขับเคลื่อนมอเตอร์จริง ๆ เป็นตัวขับเคลื่อนแบบ MOSFET ซึ่งมีประสิทธิภาพด้านพลังงานมากกว่าการออกแบบตัวขับเคลื่อนเชิงเส้นแบบเก่าอย่าง L298N อย่างแท้จริง ซึ่งช่วยลดการสูญเสียพลังงานในรูปของความร้อน ซึ่งมีความสำคัญโดยตรงกับแชสซีที่ใช้แบตเตอรี่ ตัวควบคุมจะไม่ขับเคลื่อนแหล่งจ่ายไฟกระแสสูงของมอเตอร์โดยตรง แต่จะส่งสัญญาณลอจิกพลังงานต่ำไปยังตัวขับเคลื่อนเท่านั้น
สิ่งที่แชสซีและมอเตอร์ทำ
แชสซีจะยึดมอเตอร์เกียร์ DC สองตัว ล้อ และกล่องแบตเตอรี่ไว้ในตำแหน่งทางกายภาพที่แน่นอน และจะแปลการหมุนของมอเตอร์แต่ละตัวเป็นการเคลื่อนที่จริงของหุ่นยนต์ โดยการเลี้ยวจะทำได้โดยการหมุนล้อแต่ละข้างด้วยความเร็วที่ต่างกันหรือในทิศทางที่ต่างกัน แทนที่จะใช้กลไกการบังคับเลี้ยวแยกต่างหาก
พื้นฐานการเดินสายตัวขับมอเตอร์
ช่องมอเตอร์แต่ละช่องบน TB6612FNG ต้องการสองสิ่งจากตัวควบคุม: สัญญาณทิศทาง (ล้อนี้ควรหมุนไปทางใด) และสัญญาณความเร็ว PWM (เร็วแค่ไหน) สิ่งที่สำคัญไม่แพ้กันคือการเดินสายที่แยกจากกัน: แหล่งจ่ายไฟของมอเตอร์ ซึ่งคือชุดแบตเตอรี่ 18650 จะจ่ายไฟให้กับมอเตอร์เอง ในขณะที่พลังงานลอจิกของตัวควบคุมมาจากพอร์ต USB การแยกพลังงานมอเตอร์และพลังงานลอจิกออกจากกันเป็นแนวปฏิบัติมาตรฐาน ซึ่งช่วยปกป้องขาลอจิกที่ไวต่อการรบกวนของตัวควบคุมจากสัญญาณรบกวนทางไฟฟ้าที่กระแสของมอเตอร์สามารถสร้างขึ้นได้
แนวคิดซอฟต์แวร์และไลบรารี
ไลบรารีตัวขับมอเตอร์ส่วนใหญ่จะเปิดเผยฟังก์ชันง่ายๆ ต่อมอเตอร์หนึ่งตัว: กำหนดทิศทางและค่าความเร็ว และไลบรารีจะจัดการ PWM พื้นฐานและตรรกะของขาควบคุมทิศทางให้คุณ เริ่มต้นด้วยการให้มอเตอร์แต่ละตัวหมุนได้อย่างอิสระและยืนยันว่าทั้งสองทิศทางทำงานได้ก่อนที่จะเขียนตรรกะการขับขี่ระดับสูงขึ้น (เดินหน้า, เลี้ยว, หยุด) ด้านบน
การทดสอบและการแก้ไขปัญหา
- มอเตอร์ไม่หมุนเลย - ตรวจสอบแบตเตอรี่และการเดินสายตัวขับก่อนที่จะสรุปว่าเป็นข้อบกพร่องของโค้ด ตัวขับที่ไม่มีไฟเลี้ยงมอเตอร์จะยอมรับคำสั่งอย่างเงียบๆ และไม่ทำอะไรเลย
- มอเตอร์ตัวหนึ่งหมุนผิดทิศทาง - สลับสายสองเส้นของมอเตอร์ตัวนั้นที่ตัวขับ หรือกลับตรรกะทิศทางของมอเตอร์ตัวนั้นในโค้ด การแก้ไขทั้งสองวิธีนั้นถูกต้องเท่าเทียมกัน
- การเคลื่อนที่ผิดปกติหรือไม่แน่นอน - ตรวจสอบระดับการชาร์จและแรงดันไฟฟ้าของแบตเตอรี่ การจ่ายไฟไม่เพียงพอเป็นสาเหตุที่พบบ่อยมากที่ถูกเข้าใจผิดว่าเป็นปัญหาของโค้ด
- หุ่นยนต์ขับเป็นเส้นโค้งแทนที่จะเป็นเส้นตรง - ตรวจสอบให้แน่ใจว่ามอเตอร์ทั้งสองตัวได้รับค่าความเร็วเท่ากัน เนื่องจากความแตกต่างเล็กน้อยระหว่างมอเตอร์ DC สองตัวก็สามารถทำให้แชสซีสองล้อขับออกนอกเส้นตรงได้
การอัปเกรดเสริมในอนาคต: หุ่นยนต์ติดตามเส้น
แชสซีและตัวขับ TB6612FNG ชุดนี้ถูกนำกลับมาใช้โดยตรงในโครงการหุ่นยนต์ติดตามเส้น ซึ่งเพิ่มชุดเซ็นเซอร์ติดตามเส้นบนฐานขับเคลื่อนเดียวกัน เมื่อคุณคุ้นเคยกับการควบคุมมอเตอร์พื้นฐานในที่นี้แล้ว นี่คือขั้นตอนต่อไปที่เป็นธรรมชาติแทนที่จะเป็นการเริ่มต้นใหม่
การเดินสาย
- TB6612FNG VM → กล่องใส่แบตเตอรี่ 18650 (+) — ผ่านสวิตช์เปิดปิดของกล่อง — แหล่งจ่ายไฟมอเตอร์ ซึ่งแยกจากแหล่งจ่ายไฟลอจิก
- TB6612FNG GND → กล่องใส่แบตเตอรี่ (−) และ ESP32-S3 GND — ต้องมีกราวด์ร่วมกันระหว่างแบตเตอรี่, ตัวขับ และตัวควบคุม
- TB6612FNG VCC → ESP32-S3 3V3 — แหล่งจ่ายไฟระดับลอจิกสำหรับชิปตัวขับ
- TB6612FNG STBY → ESP32-S3 GPIO7 — ต้องถูกขับ HIGH เพื่อให้ตัวขับออกจากโหมดสแตนด์บาย
- TB6612FNG AIN1 → ESP32-S3 GPIO4 — ทิศทางมอเตอร์ A
- TB6612FNG AIN2 → ESP32-S3 GPIO5 — ทิศทางมอเตอร์ A
- TB6612FNG PWMA → ESP32-S3 GPIO6 — ความเร็ว/เปิดใช้งานมอเตอร์ A
- TB6612FNG BIN1 → ESP32-S3 GPIO15 — ทิศทางมอเตอร์ B
- TB6612FNG BIN2 → ESP32-S3 GPIO16 — ทิศทางมอเตอร์ B
- TB6612FNG PWMB → ESP32-S3 GPIO17 — ความเร็ว/เปิดใช้งานมอเตอร์ B
- TB6612FNG A01/A02 → มอเตอร์เกียร์ DC ซ้าย (ชุดแชสซี) — สายสองเส้น, ขั้วใดก็ได้ (สลับหากหมุนผิดทาง)
- TB6612FNG B01/B02 → มอเตอร์เกียร์ DC ขวา (ชุดแชสซี)
- บอร์ดพัฒนา ESP32-S3 → สาย USB-C → คอมพิวเตอร์ (สำหรับเขียนโปรแกรมเท่านั้น; ทำงานแบบไม่ต้องต่อสายจากกล่องแบตเตอรี่เมื่อแฟลชแล้ว)
หมายเลข GPIO ด้านบนเป็นทางเลือกทั่วไปที่ปลอดภัย — บอร์ดพัฒนา ESP32-S3 แตกต่างกันไปตามผู้ผลิต ดังนั้นโปรดยืนยันแต่ละขาเทียบกับแผนผังขาของบอร์ดเฉพาะของคุณ และหลีกเลี่ยงขาใดๆ ที่ทำเครื่องหมายว่าสงวนไว้สำหรับแฟลช/PSRAM (โดยทั่วไปคือ GPIO26-32 บนบอร์ดที่มี octal PSRAM) หรือ USB (GPIO19/20 บนบอร์ด S3 จำนวนมาก) โค้ดเริ่มต้นนี้จะขับขา PWMA/PWMB ให้เป็น HIGH เต็มที่สำหรับการเคลื่อนที่ด้วยความเร็วเต็มที่คงที่ แทนที่จะใช้ PWM แบบปรับความเร็วได้ ซึ่งทำให้ตัวอย่างง่ายขึ้นและหลีกเลี่ยงความคลุมเครือระหว่าง API PWM ของ ESP32 Arduino core ที่แตกต่างกัน — สลับไปใช้การควบคุมความเร็ว `ledcAttach()`/`ledcWrite()` เมื่อคุณพร้อมที่จะก้าวข้ามการเปิด/ปิด STBY จะต้องเป็น HIGH ก่อนที่มอเตอร์จะตอบสนองเลย และควรเดินสาย/ทดสอบขานั้นก่อนเมื่อเริ่มใช้งานตัวขับ การเพิ่มอินพุตระยะไกล (BLE หรือ Wi-Fi) หรือส่วนเสริมเซ็นเซอร์ติดตามเส้น (ดูโครงการหุ่นยนต์ติดตามเส้น) เป็นขั้นตอนต่อไปที่เป็นธรรมชาติเมื่อรูปแบบนี้ทำงานได้อย่างน่าเชื่อถือ
แผนภาพการต่อสาย
โค้ดเริ่มต้น
// Two-Wheel Robot Car — ESP32-S3 + TB6612FNG
// Basic starter: runs a fixed forward/stop/turn test pattern on loop.
// --- Pins — adjust to match your specific ESP32-S3 dev board's pinout ---
#define STBY 7
#define AIN1 4
#define AIN2 5
#define PWMA 6
#define BIN1 15
#define BIN2 16
#define PWMB 17
void motorA(bool forward, bool run) {
digitalWrite(AIN1, run ? (forward ? HIGH : LOW) : LOW);
digitalWrite(AIN2, run ? (forward ? LOW : HIGH) : LOW);
digitalWrite(PWMA, run ? HIGH : LOW); // full speed when running
}
void motorB(bool forward, bool run) {
digitalWrite(BIN1, run ? (forward ? HIGH : LOW) : LOW);
digitalWrite(BIN2, run ? (forward ? LOW : HIGH) : LOW);
digitalWrite(PWMB, run ? HIGH : LOW);
}
void stopMotors() {
motorA(true, false);
motorB(true, false);
}
void driveForward() {
motorA(true, true);
motorB(true, true);
}
void turnLeft() {
// Left motor reverse/stopped, right motor forward = pivot left
motorA(false, true);
motorB(true, true);
}
void turnRight() {
motorA(true, true);
motorB(false, true);
}
void setup() {
pinMode(STBY, OUTPUT);
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(PWMA, OUTPUT);
pinMode(BIN1, OUTPUT);
pinMode(BIN2, OUTPUT);
pinMode(PWMB, OUTPUT);
digitalWrite(STBY, HIGH); // take the driver out of standby
stopMotors();
}
void loop() {
driveForward();
delay(1500);
stopMotors();
delay(500);
turnRight();
delay(600);
stopMotors();
delay(500);
turnLeft();
delay(600);
stopMotors();
delay(1000);
}
ไม่แน่ใจขั้นตอนไหน?
ถามเรา