โปรเจกต์ การควบคุม L9110 Motor Driver Board โดยใช้ Arduino
โปรเจกต์นี้แสดงวิธีการควบคุม Robot arm โดยใช้ L9110 Motor Board ได้อย่างสำเร็จ โดยไม่จำเป็นต้องใช้ Arduino outputs ทั้งหมดที่มี
โปรเจกต์นี้แสดงวิธีการควบคุม Robot arm โดยใช้ L9110 Motor Board ได้อย่างสำเร็จ โดยไม่จำเป็นต้องใช้ Arduino outputs ทั้งหมดที่มี
ผมต้องการสร้างหน่วยควบคุมเพื่อสั่งงานชุดหุ่นยนต์ Plastic Robot Arm ที่ประกอบขึ้นเอง เนื่องจากสวิตช์เดิมที่มีมาให้นั้นต้องควบคุมด้วยมือและมีความซับซ้อน อีกทั้งยังต้องใช้แบตเตอรี่สองชุดเพื่อจ่ายไฟบวกและลบให้กับส่วนควบคุม ซึ่งใช้ขับเคลื่อน Motor ให้หมุนไปข้างหน้าหรือถอยหลังโดยการเปลี่ยนทิศทางการไหลของกระแสไฟฟ้าผ่าน Motor
ส่วนหนึ่งของโปรเจกต์นี้สำเร็จได้โดยการใช้บอร์ด Motor Driver ที่มี Chip L9110 เพื่อลดแหล่งจ่ายไฟให้เหลือเพียงแรงดันเดียว ซึ่งสามารถจ่ายไฟได้ง่ายๆ ด้วยแหล่งจ่ายไฟขั้วเดียวแบบมาตรฐานทั่วไป
บอร์ดนี้สามารถสั่งการ DC Motor ขนาด 3V ใน Robot Arm และรองรับแรงดันได้สูงสุดถึง 12V ทั้งยังจ่ายกระแสได้ 800mA สำหรับแต่ละ Motor ซึ่งถือว่าเพียงพอมาก โดยพื้นฐานแล้วมันจะทำหน้าที่กลับขั้วแรงดันไฟฟ้าที่ Output ขึ้นอยู่กับ Logic Input ทั้งสองช่อง

Robot Arm มี Motor ทั้งหมด 5 ตัว และมี LED ความสว่างสูงติดตั้งอยู่ที่ส่วนก้ามคีบ
ผมต้องการใช้บอร์ด Arduino เพื่อลดความซับซ้อนในการควบคุมและช่วยให้สั่งการได้ง่ายขึ้น
คุณสามารถใช้บอร์ด Arduino รุ่นใดก็ได้ ตราบใดที่มี Digital Output, แหล่งจ่ายไฟ 5V และ Analogue Input (สำหรับการทดสอบ) พร้อมใช้งาน
ผมเห็นโปรเจกต์มากมายที่ใช้บอร์ด L9110 Dual Motor นี้ แต่ส่วนใหญ่จะใช้ PWM ในการขับเคลื่อน Motor ซึ่งทำให้ต้องใช้ Controller ทั้งสองตัวสำหรับ Motor เพียงตัวเดียว ซึ่งดูเป็นการสิ้นเปลือง
สิ่งที่ไม่ได้มีการพูดถึง และดูเหมือนจะไม่มี Datasheet สำหรับบอร์ดนี้ คือการต่อ Digital Output จาก Arduino ตรงไปยัง Input ควบคุมทั้งสองช่องนั้นใช้งานไม่ได้!
สาเหตุเป็นเพราะแรงดันจากแหล่งจ่ายไฟของ Motor เป็นตัวขับเคลื่อน Interface หากแรงดันนี้ต่างจาก +5V ที่ Arduino ใช้ มันอาจจะทำให้แหล่งจ่ายไฟของ Motor พัง หรือทำให้ Arduino พังได้!
ไม่มีรายละเอียดเรื่องนี้ในข้อมูลที่ผู้ผลิตให้มา แต่มีการระบุไว้ในบทความนี้
https://www.electroschematics.com/13797/l9110-motor-driver-primer/
บทความนี้อธิบายถึงวิธีการทดสอบบอร์ดโดยใช้สวิตช์สามทางเพื่อเชื่อมต่อแต่ละ Input ควบคุมเข้ากับ Ground (0 โวลต์) วิธีนี้ไม่จำเป็นต้องถอดประกอบบอร์ดตามที่มีรายละเอียดในโปรเจกต์อื่นๆ
ปัญหาคือจะทำซ้ำวิธีการนี้โดยใช้ Logic IC ที่สามารถควบคุมด้วย Arduino ได้อย่างไร
สิ่งที่ต้องการคือ Output Stage แบบ Open Collector โดยที่แหล่งจ่ายไฟสำหรับ Logic Chip ไม่ได้เชื่อมต่อกับบอร์ด Motor แต่ Output จะทำหน้าที่เหมือนสวิตช์ และชอร์ต Logic Input ของบอร์ด Motor ลง Ground
ผมพบ Chip ตัวหนึ่งที่เป็น NAND gate ซึ่งมี Output Stage แบบ Open Collector ซึ่งต้องใช้ Input แบบ HIGH สองช่องเพื่อให้ Chip ทำงาน และเชื่อมต่อ Output ลง Ground
Chip ตัวนี้คือเบอร์ 7403 ซึ่งอาจจะมาจากผู้ผลิตที่แตกต่างกันด้วยคำนำหน้าที่ต่างกัน เช่น SN, HC เป็นต้น แต่สำหรับโปรเจกต์นี้ถือว่าเป็น Chip ตัวเดียวกัน
Chip นี้มี NAND gate สี่ตัวรวมอยู่ใน Package แบบ 14 pin DIL ดังนั้นด้วยการออกแบบที่รอบคอบ ผมจึงสามารถควบคุม Motor ได้สูงสุด 2 ตัวต่อ Chip หนึ่งตัว

ผมสร้างโปรเจกต์นี้บน Stripboard ดังนั้นการจัดวางจึงทำได้ง่าย สำหรับ Motor 5 ตัว ผมต้องการ Chip 7403 สามตัวเพื่อควบคุม ส่วน LED ผมสามารถควบคุมได้โดยตรงจาก Arduino แต่เนื่องจากมันกินไฟมาก ผมจึงตัดสินใจขับเคลื่อนมันจาก Inverter gate โดยใช้ Chip 7404 กับไฟ +5V แทนการใช้บอร์ด Motor

หากผมขับเคลื่อนบอร์ด Motor โดยตรงจาก Arduino ผมจะต้องใช้ Digital Output จาก Arduino 2 ช่องต่อ Motor หนึ่งตัว รวมเป็น 10 Output บวกกับอีกหนึ่งช่องสำหรับ LED รวมทั้งหมดเป็น 11 Output
การใช้ NAND gate ช่วยให้ผมลดจำนวนลงเหลือ 7 Output ได้แก่ Motor Enable หนึ่งช่องต่อ Motor แต่ละตัว, หนึ่งช่องสำหรับควบคุม LED และอีกหนึ่งช่องสำหรับสวิตช์ Forward/Reverse ผมตัดสินใจว่าจะใช้งาน Motor ทีละตัวเท่านั้น ซึ่งจะช่วยลดขนาดของแหล่งจ่ายไฟลงได้อย่างมาก! ดังนั้น Input หนึ่งช่องของ NAND gate จะทำหน้าที่เปิดหรือปิด Motor (ON/OFF) และอีกหนึ่ง Input สำหรับ Forward หรือ Reverse
เพื่อให้บอร์ดทำงานได้อย่างถูกต้อง ผมสามารถสั่งการได้เพียงหนึ่ง Input ในเวลาเดียวกัน เพราะการสั่งการสอง Input พร้อมกันด้วย Output เดียวกันจะทำให้ Motor หยุดทำงาน แทนที่จะเขียนโปรแกรมที่ซับซ้อน ผมตัดสินใจกำหนดเงื่อนไขลงใน Logic Chip โดยการเพิ่มจำนวน Gate ในการควบคุม Motor เป็นสองตัว ตัวหนึ่งสำหรับ ON/OFF และ Forward และอีกตัวสำหรับ ON/OFF และ Reverse การใช้ Inverter gate ช่วยให้มั่นใจได้ว่าจะมีเพียงฝั่งเดียวเท่านั้นที่ทำงานในเวลาเดียวกัน!
ดังนั้นผมจึงรวม Chip 7404 เข้าไปในวงจร ซึ่งมี Inverter gate 6 ตัว (Hex) ใน Package 14 pin ผมใช้หนึ่งตัวสำหรับขับเคลื่อนส่วนควบคุม Forward/Reverse และอีกสองตัวสำหรับขับเคลื่อน LED ส่วนควบคุมทั้งหมดจะเป็น HIGH (+5 โวลต์) เพื่อสั่งให้ Motor ทำงานและเคลื่อนที่ไปข้างหน้า และยังช่วยให้ LED สว่างขึ้นด้วย วิธีนี้ช่วยให้การเขียนโปรแกรม Arduino ง่ายขึ้น
หาก Input ของ NAND gate ตัวใดตัวหนึ่งเป็น LOW ค่า Output จะเป็น HIGH ซึ่งจะไม่สั่งงาน Logic บนบอร์ด Motor (ไม่สั่งงาน Transistor ที่ส่วนท้ายของ Logic Output)
หาก Input ของ NAND gate ทั้งคู่เป็น HIGH ค่า Output จะเป็น LOW ซึ่งจะสั่งงาน Logic บนบอร์ด Motor (สั่งงาน Transistor ที่ส่วนท้ายของ Logic Output)

Chip Inverter จะเปลี่ยน Output ให้เป็นค่าตรงกันข้ามกับ Input เช่น หากป้อน HIGH เข้าไป Output จะเป็น LOW และในทางกลับกัน

การออกแบบวงจรที่สมบูรณ์แสดงอยู่ด้านล่าง ประกอบด้วย Motor Enable 5 ช่อง, LED Enable 1 ช่อง และส่วนควบคุม Forward/Reverse
แหล่งจ่ายไฟ +3V สำหรับ Motor จะแยกจากแหล่งจ่ายไฟ Logic ซึ่งได้รับมาจากแหล่งจ่ายไฟ +5V ของบอร์ด Arduino ทั้งหมดใช้สาย Ground (0 โวลต์) ร่วมกัน ซึ่งเชื่อมต่อกับบอร์ด Arduino และแหล่งจ่ายไฟ +3V แหล่งจ่ายไฟชุดเดียวกันนี้จะเชื่อมต่อกับบอร์ดควบคุม Motor ทั้งสามบอร์ดที่วางซ้อนกันระหว่าง Motor และบอร์ด Interface บอร์ด Arduino จะเชื่อมต่อกับบอร์ด Interface เท่านั้นเพื่อป้องกันความเสียหาย!
แต่ละ Interface จะเหมือนกันทุกประการ โดยทำซ้ำสามชุด สำหรับบอร์ด Dual Motor แต่ละบอร์ด!
ทั้งหมดใช้สายสัญญาณ Forward/Reverse และแหล่งจ่ายไฟร่วมกัน ส่วน Input และ Output จะอยู่บน Connector แยกกัน

คุณจำเป็นต้องมีทักษะการใช้หัวแร้งบัดกรีที่ดี
คุณต้องมี Male Header เพื่อเชื่อมต่อกับบอร์ด Arduino ชุดละ 4 และ 3 ขา
คุณต้องมี Female Header ขนาด 6 ช่อง 3 ชุด สำหรับบอร์ด Motor แต่ละบอร์ด

คุณต้องมี Male Header 2 pin สองตัว ตัวหนึ่งสำหรับเชื่อมต่อแหล่งจ่ายไฟ +5V เข้ากับ Logic Board และอีกตัวสำหรับเชื่อมต่อ Female Header ของ LED 2 pin เข้ากับ Logic Board
ใช้สายไฟแบบสายฝอย (Multi-stranded wire) สำหรับเชื่อมต่อบอร์ดเข้ากับ Header และสายไฟแบบแกนเดี่ยว (Single cored wire) สำหรับเชื่อมต่อระหว่างอุปกรณ์บนบอร์ด
คุณต้องใช้ IC Socket 14 pin สี่ตัว และ Stripboard ขนาด 38 แถวคูณ 20 รู (ระยะห่าง 0.1 นิ้ว) เพื่อติดตั้งอุปกรณ์
คุณยังต้องการ Resistor 1K จำนวน 10 ตัว เพื่อควบคุม Motor 5 ตัวผ่านบอร์ด Motor เพื่อจำกัดกระแสที่ดึงโดย Logic Board
ผมใช้ขั้วต่อสายไฟแบบ Chocolate Block สองช่อง เพื่อเชื่อมต่อแหล่งจ่ายไฟ +3V ซึ่งสามารถต่อกับแบตเตอรี่ AA สองก้อนหรือแหล่งจ่ายไฟจากไฟบ้านที่มีแรงดันเท่ากันได้
1. วาง IC Socket ก่อน โดยดัดขาไว้ใต้บอร์ดด้านที่เป็นทองแดง บัดกรีให้เข้าที่ จากนั้นตัดลายทองแดงระหว่างขาทั้งสองด้านของ IC Socket ออก
2. ตัดลายทองแดงระหว่างขาของ Chip 7403 และ Chip 7404 โดย Chip 7404 จะวางอยู่หลัง Chip 7403 ตัวแรกตามที่เห็นในรูป Layout
3. ต้องติดตั้ง Socket ทั้งสี่ตัวโดยเว้นระยะห่างระหว่าง Socket 7403 ทั้งสามตัวสำหรับ Resistor 1K สองตัวที่จะนำสัญญาณ Output จากอีกด้านของ Socket ไปยังขอบบอร์ด
4. จากนั้นเดินสายไฟจากรางแหล่งจ่ายไฟที่ด้านบนของบอร์ดไปยังขา 14 และขา 7 ของแต่ละ IC Socket
5. ต่อไปให้ใส่สาย Loop ระหว่างขา 10 กับ 13, และขา 2 กับ 4 บน Chip 7403
6. ใส่สาย Loop ระหว่างขา 4 และ 5 บน Chip 7404
7. ติดตั้ง Resistor ในแนวตั้งจากขา 1 และ 6 ของ 7403 แต่ละตัวลงบนบอร์ด และตัดลายทองแดงระหว่างปลายทั้งสองด้านเพื่อไม่ให้ชอร์ตกัน
8. ติดตั้ง Resistor สองตัวถัดจาก IC Socket สำหรับ 7403 แต่ละตัว แล้วตัดลายทองแดงระหว่างปลายทั้งสองด้าน
9. เชื่อมต่อขา 1 ของ Chip 7404 เข้ากับขา 5 และ 13 ของ 7403 ทุกตัว นี่คือส่วน Input สำหรับ Forward
10. เชื่อมต่อขา 2 ของ Chip 7404 เข้ากับขา 1 และ 9 ของ 7403 ทุกตัว นี่คือสัญญาณ Forward Input ในเวอร์ชันที่ถูก Invert แล้ว
11. เชื่อมต่อสายไฟอื่นๆ ทั้งหมดเข้ากับขา 9, 11 บน 7403 (ดูแผนผังวงจรประกอบ)
12. เชื่อมต่อสายฝอยจาก Header ขา 1-6 ไปยัง Resistor จากขา 3, 6, 9 และ 11 โดยขา 3 และ 4 ของแต่ละบอร์ดจะไปที่ Chocolate Block และต่อสายลบ (Ground) เพิ่มเติมจาก Chocolate Block ไปยังจุดลบ (0V) บน Logic Board
13. บัดกรี Male Connector 2 pin ตัวหนึ่ง (ด้านสั้น) เข้ากับจุดลบ (0V) บน Logic Board โดยใช้สายฝอยที่ยาวพอที่จะไปถึง Connector ของ LED บน Robot Arm
14. บัดกรีสายไฟอีกเส้นเข้ากับอีกขาของ Male Connector แต่ที่ปลายด้าน Logic Board ให้บัดกรี Resistor 1K เข้าไป
15. บัดกรีปลายอีกด้านของ Resistor เข้ากับขา 6 ข้างๆ Chip 7404
16. จากนั้นบัดกรีสายฝอยจากขา 2, 10 บน Chip 7403 ไปยัง Male Header ตามที่แสดงในแผนผังวงจร
17. บัดกรีสายฝอยจากขา 1 และ 3 บน Chip 7404 ไปยัง Male Header ตามที่แสดงในแผนผังวงจร
18. บัดกรี Male Connector 2 pin อีกตัว (ด้านสั้น) เข้ากับจุดลบ (0V) บน Logic Board โดยใช้สายฝอยที่ยาวพอที่จะไปถึงขั้ว Ground บนบอร์ด Arduino
19. บัดกรีสายไฟอีกเส้นเข้ากับอีกขาของ Male Connector และเชื่อมต่อเข้ากับแหล่งจ่ายไฟ +5V บน Logic Board
ผมใช้สายไฟสีต่างๆ เพื่อระบุสายไฟ คุณควรทำเช่นเดียวกันเพื่อช่วยในการตรวจสอบข้อผิดพลาด!
โปรดตรวจสอบการเชื่อมต่อในทุกขั้นตอนการบัดกรี โดยใช้ Multimeter ตั้งค่าไปที่ 'Ohms' เพื่อเช็คว่าจุดเชื่อมต่อไม่ได้ไปชอร์ตกับขาข้างเคียง
ใช้ท่อหด (Heat shrink tubing) เพื่อหุ้มจุดสัมผัสที่เปลือยอยู่บน IDC Header ทั้ง Male และ Female



คุณต้องมี Arduino IDE (Integrated Development Environment) ซึ่งสามารถดาวน์โหลดได้ฟรีจาก Arduino.cc และโปรแกรม .ino ที่ผมเขียนขึ้น คือโปรแกรมชื่อ Test Motor เพื่อควบคุมบอร์ดผ่าน Logic Board
คุณต้องติดตั้งโปรแกรม IDE บน PC หรือเครื่อง Linux เพื่อถ่ายโอนโปรแกรมไปยังบอร์ด UNO
โปรแกรมจะเปิด (Turn ON) Motor ทีละตัว โดยตรวจจับสถานะของสวิตช์ที่ Analogue Input บนบอร์ด Arduino
คุณสามารถกำหนดทิศทาง Forward หรือ Reverse ได้ แต่เมื่อปล่อยสวิตช์ Motor จะหยุดทำงานและสลับทิศทาง
คุณสามารถใช้สิ่งนี้เพื่อทดสอบ Motor แต่ละตัวตามลำดับ โดยอัปโหลดลงใน Arduino ในแต่ละครั้งเพื่อเปลี่ยนสถานะของ Motor
Output ของ Motor แต่ละตัวจะถูกกำหนดไว้ใน Array รวมถึง LED ด้วย
Output แบบ HIGH จะสั่งให้ Motor หรือ LED ทำงาน ส่วนค่า HIGH ในการตั้งค่า Forward/Reverse คือการเดินหน้า (FORWARD)
Output แบบ LOW จะสั่งให้ Motor หรือ LED ปิดการทำงาน (OFF) ส่วนค่า LOW ในการตั้งค่า Forward/Reverse คือการถอยหลัง (REVERSE)
[code]
int Motor[8] ; // Array for all motor output pins, one more than required
void setup() {
Motor[1] = 4; // Set output numbers for ports
Motor[2] = 5;
Motor[3] = 6;
Motor[4] = 7;
Motor[5] = 8;
Motor[6] = 9; // Set up port for LED on head of arm.
Motor[7] = 10; // Forward / reverse selection for ALL motors
// Switch connected to GND and A0, to locally turn off motors while testing.
pinMode(Motor[1], OUTPUT); // Open port to operate motor on Pincers Forward = In Reverse = Out
pinMode(Motor[2], OUTPUT); // Open port to operate motor Up= High Reverse = Down
pinMode(Motor[3], OUTPUT); // Open port to operate motor Forward = Forward Reverse = Backward
pinMode(Motor[4], OUTPUT); // Open port to operate motor Wrist Forward = Up Reverse = Down
pinMode(Motor[5], OUTPUT); // Open port to operate motor base Rotate Forward = Right Reverse = Left
pinMode(Motor[6], OUTPUT); // Open port to operate LED on head of Arm HIGH = ON LOW = OFF
pinMode(Motor[7], OUTPUT); // Open port for Forward / Reverse selection for ALL motors
}
void loop() {
digitalWrite(Motor[6], LOW); // Turn off LED.
if (analogRead(A0)< 1){ // switch ON
digitalWrite(Motor[1], HIGH); // Turn on Motor 1. HIGH turns it on! Pincers
digitalWrite(Motor[7], LOW); // HIGH is Forward, Reverse is OFF.
Serial.println(analogRead(A0));
}
if (analogRead(A0) > 200 ){ // switch OFF
digitalWrite(Motor[1], LOW); // Turn on Motor 1. HIGH turns it on!
digitalWrite(Motor[7], LOW); // HIGH is Forward, Reverse is OFF.
Serial.println(analogRead(A0));
}
delay(200); // debounce the switch action
}
[/code]

บรรทัดที่เป็น Comment จะขึ้นต้นด้วย //
บรรทัดใน void setup() จะเป็นการตั้งค่า Digital Port ที่ใช้สำหรับโปรแกรม
ในส่วนของ void loop()
LED จะถูกสั่งให้ OFF และ Motor ทั้งหมดควรจะเริ่มต้นในสถานะ OFF
สวิตช์ ON/OFF ถูกต่อเข้ากับ Ground และ Analogue Input (A0) บนบอร์ด Arduino เมื่อปิดสวิตช์จะเป็นการเรียกใช้คำสั่ง “ON” เมื่อเปิดสวิตช์จะเรียกใช้คำสั่งในส่วนของ “OFF” สิ่งนี้ช่วยให้ควบคุม Motor ที่กำลังทดสอบได้ด้วยตัวเอง ซึ่งส่วนนี้ไม่ได้ระบุไว้ในแผนผังวงจรเนื่องจากใช้สำหรับการทดสอบเท่านั้น
เมื่อคุณสามารถควบคุม Robot Arm ได้แล้ว ตอนนี้คุณสามารถเขียนโปรแกรมเพื่อกำหนดการเคลื่อนไหวโดยใช้ Motor ทั้ง 5 ตัว ไม่ว่าจะไปข้างหน้าหรือถอยหลังได้จาก Arduino
เนื่องจาก Output ทั้งหมดมีหมายเลข Pin กำหนดไว้ คุณจึงสามารถใช้โปรเจกต์ “Cheap Webserver using ESP-01 and Arduino UNO” เพื่อควบคุมแขนกลนี้จากระยะไกลได้
คุณยังสามารถลองใช้ PWM บน Pin ที่ทำหน้าที่ Enable ของ Motor เพื่อลดความเร็วและควบคุมความเร็วในการเคลื่อนที่ได้
นอกจากนี้ Motor เหล่านี้ไม่จำเป็นต้องจำกัดอยู่แค่ใน Robot Arm เท่านั้น แต่ยังสามารถนำไปใช้กับรถ, เรือ หรือสิ่งใดก็ตามที่ทำงานด้วย DC Motor
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้
ประเมิน Project
เอาฟอร์มยาวออกจากท้ายหน้า Project แล้ว เหลือเป็นปุ่มให้กดไปกรอกหน้าเดียว ตัวใหญ่ เว้นบรรทัดเยอะ อ่านง่ายกว่า
รีวิวจากคนใช้งานจริง
ถ้าเคยสั่งงาน เคยอ่านหน้านี้แล้วได้ประโยชน์ หรือมีข้อเสนอแนะ ฝากรีวิวไว้ได้เลย
ยังไม่มีรีวิวบนหน้านี้ ถ้าเคยใช้งานหรือมีข้อเสนอแนะ เขียนเป็นคนแรกได้เลย