โปรเจกต์นี้คือการทำให้ปืนใหญ่เลโก้ยิงอัตโนมัติ พี่เป็นคนชอบเล่นเลโก้ และก็ชอบใช้ Arduino ด้วย เลยตัดสินใจทำโปรเจกต์นี้เล่นในเวลาว่าง เซอร์โวมอเตอร์ที่มีแขน (horn) ติดอยู่จะหมุนไปกระแทกคานยิง ทำให้ปืนใหญ่ยิงออกมา เป็นโปรเจกต์แรก สอง หรือสามที่เหมาะมากสำหรับมือใหม่!
นี่คือคู่มือแบบขั้นต่อขั้นในการทำมันขึ้นมา
ขั้นตอนที่ 1: ฮาร์ดแวร์
ขั้นตอนที่ 1 ส่วนที่ 1: พื้นฐานฮาร์ดแวร์
เริ่มจากต่อไฟ 5V เข้าไปที่แถวขั้วบวก และ GRND เข้าไปที่แถวขั้วลบ มันจะหน้าตาประมาณนี้ -

หมายเหตุทางเทคนิค: แผนภาพวงจรอาจแสดงให้เห็นขา VIN ต่อกับแถวบวก แต่ในการใช้งานจริงกับเซอร์โวมอเตอร์หลายตัว การใช้แรงดันไฟฟ้าที่มากเกินไปผ่าน VIN อาจทำให้เซอร์โวเสียหายหรือร้อนเกิน (โอเวอร์โหลด) ดังนั้น แนะนำให้ใช้ไฟ 5V ที่เสถียรจากพอร์ตไฟที่ควบคุมแล้วเท่านั้น
ขั้นตอนที่ 1 ส่วนที่ 2: ต่อเซอร์โวตัวที่ 1
เซอร์โวมอเตอร์มีสายสามเส้น - สายสีส้ม/เหลือง (สัญญาณ) จะเสียบเข้าช่อง DIGITAL (PWM~) สายสีแดง (ไฟเลี้ยง) จะไปที่ VIN (ซึ่งก็คือช่องใดก็ได้ในแถวบวก) และสายสีดำ/น้ำตาล (กราวด์) จะไปที่แถวลบที่ต่อกับขา GRND บน Uno ขา Digital ที่พี่ใช้สำหรับเซอร์โวตัวแรกคือขา 7 นี่คือหน้าตาแผนภาพเมื่อต่อเซอร์โวตัวแรกเสร็จ -

เซอร์โวมอเตอร์โดยทั่วไปจะมีสาย 3 เส้น แต่ละเส้นทำหน้าที่ต่างกันดังนี้:
- สายสีส้มหรือสีเหลือง (Signal): สายนี้รับสัญญาณ PWM (Pulse Width Modulation) เพื่อกำหนดมุมการหมุน ที่นี่เราจะต่อมันเข้ากับพอร์ต DIGITAL (ที่มีสัญลักษณ์ ~) บน Arduino Uno; พี่เลือกขา 7
- สายสีแดง (Power/VCC): ต่อกับไฟบวก 5V บนเบรดบอร์ด
- สายสีดำหรือสีน้ำตาล (Ground): ต่อกับแถวลบบนเบรดบอร์ด ซึ่งต่อกับขา GND ของ Arduino
ขั้นตอนที่ 1 ส่วนที่ 3: ต่อเซอร์โวตัวที่เหลือ
พอเข้าใจการต่อเซอร์โวตัวแรกแล้ว ตัวที่เหลือก็ง่ายเหมือนปอกกล้วยเข้าปากเลย แต่อย่างหนึ่งที่ต้องจำไว้ให้ดี - ต้องใช้ขา Digital ให้ตรงกับที่กำหนดในโค้ดด้วยนะ
ตัวอย่างเช่น ในโค้ด (ซึ่งอยู่ท้ายหน้า) ระบุว่า
secondCannon.attach(8);
เพราะฉะนั้น เซอร์โวตัวที่สองต้องต่อกับขา digital พิน 8
ในทำนองเดียวกัน เซอร์โวตัวที่สามต้องต่อกับขา digital พิน 6 และตัวที่สี่ควรต่อกับขา digital พิน 9
แต่เราสามารถเปลี่ยนได้ตามใจเลยนะ แค่ต้องแน่ใจว่าเปลี่ยนทั้งฮาร์ดแวร์และซอฟต์แวร์ให้ตรงกัน ไม่งั้นโค้ดจะไม่ทำงาน
ถ้าจะให้ทำงานตามโค้ดที่ให้ไว้ด้านล่าง แผนภาพควรเป็นแบบนี้ -

ในโปรเจกต์นี้ พี่กำหนดตำแหน่งการต่อตามลำดับนี้:
- ปืนใหญ่ตัวที่สอง (secondCannon): ต่อกับ Digital pin 8
- ปืนใหญ่ตัวที่สาม (thirdCannon): ต่อกับ Digital pin 6
- ปืนใหญ่ตัวที่สี่ (fourthCannon): ต่อกับ Digital pin 9
น้องสามารถเปลี่ยนพอร์ตเหล่านี้ได้ตามต้องการ แต่ต้องแก้ไขทั้งวงจรและโปรแกรมให้ตรงกันด้วย ไม่อย่างนั้นระบบจะควบคุมมอเตอร์ไม่ถูกตัว
หมายเหตุ: แม้ว่าแผนภาพวงจรจะดูซับซ้อนเพราะมีสายเยอะ แต่ถ้าน้องพิจารณาแต่ละส่วนแยกกัน จะพบว่ามันแค่เป็นการทำขั้นตอนเดิมซ้ำๆ แค่เปลี่ยนขาควบคุมเท่านั้นเอง
ยินดีด้วยน้อง! หมายความว่าแกผ่านส่วนฮาร์ดแวร์ของโปรเจคนี้ไปแล้วอย่างเป็นทางการ เก่งมาก!
ขั้นตอนที่ 2: ซอฟต์แวร์ (Software)
ทีนี้ก็ถึงเวลาของโค้ด จัดไปวัยรุ่น! ให้คัดลอกโค้ดที่อยู่ท้ายหน้านี้ไปวางใน Arduino sketch แล้วอัพโหลดขึ้นบอร์ดให้เรียบร้อย สำคัญมาก! ก่อนอัพโหลดต้องแน่ใจว่าได้ติดตั้งไลบรารี Servo.h ไว้แล้วนะ ไม่งั้นโปรแกรมจะไม่ทำงาน! ด้านล่างนี้คือคำอธิบายโค้ดแบบทีละขั้นตอน ว่ามันทำอะไรบ้างตอนโปรแกรมรัน
หัวใจสำคัญคือการติดตั้งไลบรารี Servo.h นี่เป็นไลบรารีมาตรฐานที่ช่วยให้เราคุมมุมของมอเตอร์ได้ง่ายๆ โดยไม่ต้องมานั่งเขียนคำสั่งควบคุมสัญญาณ PWM เองให้ปวดหัว
#include <Servo.h> //Including the library for the Servos
Servo firstCannon; //Defining the First Cannon as a Servo
Servo secondCannon; //Defining the Second Cannon as a Servo
Servo thirdCannon; //Defining the Third Cannon as a Servo
Servo fourthCannon; //Defining the Fourth Cannon as a Servo
โค้ดส่วนนี้เป็นการเซ็ตอัพไลบรารี Servo.h ซึ่งจะเล่นบทบาทพื้นฐานในโค้ดทั้งหมด เห็นได้จากบรรทัดต่อๆ มาที่ใช้ไลบรารีนี้กำหนดให้ปืนใหญ่ทั้งสี่กระบอกเป็น Servo หรือมอเตอร์ที่หมุนได้ 180 องศา โค้ดเริ่มต้นนี้สร้าง "ตัวแทนในซอฟต์แวร์" สำหรับเซอร์โวแต่ละตัว ช่วยให้เราส่งคำสั่งไปควบคุมมอเตอร์แต่ละตัวแยกกันได้
void setup() { //Setup code, or code that is only run once
Serial.begin(9600); //Start the Serial communication
Serial.println("Defend the Clones! Set up the defenses!") //Prints something in the Serial Monitor
firstCannon.attach(7); //Attach Digital Pin 7 to First Cannon
secondCannon.attach(8); //Attach Digital Pin 8 to Second Cannon
thirdCannon.attach(6); //Attach Digital Pin 6 to Third Cannon
fourthCannon.attach(9); //Attach Digital Pin 9 to Fourth Cannon
}
ฟังก์ชัน void setup() เนี่ย ใช้กันในเกือบทุกโปรเจค Arduino มันคือโค้ดที่รันแค่ครั้งเดียวเท่านั้น ในกรณีนี้ เรากำลังเริ่มการสื่อสารแบบ Serial ที่ความเร็ว 9600 baud แล้วก็พิมพ์ข้อความลงใน Serial Monitor เพื่อที่จะโปรแกรมเซอร์โวได้ เราต้องเชื่อมโยงชื่อของมันกับขา Digital Pin ที่ถูกต้อง นี่คือหน้าที่ของคำสั่ง .attach() ฟังก์ชัน void setup() นี้มีไว้เพื่อกำหนดบทบาทให้กับแต่ละพินของ Arduino โดยใช้คำสั่ง .attach() เพื่อระบุว่าเซอร์โวตัวไหนต่อกับพินไหน พร้อมทั้งเริ่มการสื่อสาร Serial เพื่อให้เราสามารถเฝ้าดูสถานะการทำงานผ่านหน้าจอคอมได้
void loop() { //Loop code, or code that is run an infinite amount of times
Serial.println("Beginning firing sequence") //Print something in the Serial Monitor
firstCannon.write(180); //Swerve the first servo 180 degrees, setting off the first cannon
delay(100); //Wait for 1/10 of a second
firstCannon.write(0); //Swerve the Servo back to original position in preparation for reload
delay(1000); //Wait for 1 second
secondCannon.write(180); //Swerve the second servo 180 degrees, setting off the second cannon
delay(100); //Wait for 1/10 of a second
secondCannon.write(0); //Swerve the Servo back to original position in preparation for reload
delay(1000); //Wait for 1 second
thirdCannon.write(180); //Swerve the third servo 180 degrees, setting off the third cannon
delay(100); //Wait for 1/10 of a second
thirdCannon.write(0); //Swerve the Servo back to original position in preparation for reload
delay(1000); //Wait for 1 second
fourthCannon.write(180); //Swerve the first fourth 180 degrees, setting off the fourth cannon
delay(100); //Wait for 1/10 of a second
fourthCannon.write(0); //Swerve the Servo back to original position in preparation for reload
delay(1000); //Wait for 1 second
Serial.println("All cannons fired");
Serial.println("Prepare for reload");
delay(10000);
Serial.println("Reloading Complete. Preparing to fire again")
}
นี่คือโค้ดส่วนสุดท้าย ใช้ฟังก์ชัน void loop() ที่ทำให้โค้ดด้านในทำงานซ้ำไปเรื่อยๆ ไม่มีสิ้นสุด จากนั้นเราก็พิมพ์ลง Serial Monitor ว่าปืนใหญ่กำลังจะยิง เซอร์โวของปืนใหญ่แต่ละกระบอกควรจะหมุน 180 องศา แล้วหมุนกลับไปตำแหน่งเดิม ทีละกระบอก หลังจากนั้นจะมีเวลารอ 10 วินาที (เวลาบรรจุกระสุน) ก่อนที่กระบวนการทั้งหมดจะเริ่มต้นซ้ำอีกครั้ง ห้ามช็อตนะตัวนี้! สู้งานนะน้อง
โค้ดใน void loop() ออกแบบมาเป็นลอจิกแบบเรียงลำดับ (Sequential Logic) คือให้ปืนแต่ละกระบอกยิงตามกันไปทีละตัว คำสั่ง write(180) จะส่งค่ามุมไปให้เซอร์โว ทำให้แขนหมุนไปตีกลไกยิงเลโก้ ส่วน write(0) จะดึงแขนกลับมาเพื่อให้บรรจุกระสุนใหม่ได้ง่าย หลังจากยิงครบ 4 นัดแล้ว ระบบจะหยุด 10 วินาที ให้เวลาน้องได้บรรจุกระสุนใหม่ ก่อนจะเริ่มรอบยิงถัดไป
ถ้าอัพโหลดโค้ดแล้วเจอบั๊กอะไรอีก ก็คอมเมนต์ถามมาได้เลย เดี๋ยวรุ่นพี่มาตอบให้เร็วสุดๆ ถ้าไม่มีปัญหาอะไร ก็ไปขั้นต่อไปกันเลย
ขั้นตอนที่ 3: ติดตั้ง
ขั้นสุดท้ายแล้ววว ต้องใช้ปืนเลโก้กับเทปธรรมดาๆ สักม้วน ปืนเลโก้หน้าตาแบบนี้เลย -

เทคนิคการติดตั้ง:
- รันโค้ดดูว่าเซอร์โวหมุนไปทางไหน
- สังเกตทิศทางที่แขนเซอร์โวหมุนไปเมื่อสั่งให้ไปที่ 180 องศา
- ใช้เทปติดเซอร์โวเข้ากับตัวปืนเลโก้ โดยวางแนวให้แขนเซอร์โววิ่งไปชนคันโยกสีเทาที่อยู่บนปืนในรูปด้านบนพอดี ใช้เทปติดเซอร์โวไว้ที่ด้านข้างหรือด้านบนของปืนเลโก้ โดยกะระยะให้แขนเซอร์โวตีโดนคันโยกสีเทาพอดีเป๊ะ
เยี่ยมมาก! น้องทำโปรเจคนี้สำเร็จอย่างเป็นทางการแล้ว อย่างที่บอก ถ้ามีคำถามอะไร คอมเมนต์ถามไว้ด้านล่างได้เลย
ถ้าชอบโปรเจคนี้ ลองไปดูโปรเจคอื่นๆ ต่อได้นะ