รายการอุปกรณ์ครบถ้วนสำหรับโปรเจคนี้ อยู่ในบทความเต็มที่เว็บเราเลยจ้า ไปดูได้
บทนำ
ถ้ายังไม่ได้อ่านคู่มือเริ่มต้นสำหรับ Arduino Uno Rev3 (Uno) ของเรา แนะนำให้อ่านก่อนนะ ไม่งั้นอ่านต่อได้เลยจ้า ในโปรเจคนี้ เราจะเชื่อมต่อจอยสติ๊ก 4 ทิศเพื่อควบคุมการหมุนแนวนอน (Pan) และการเอียงแนวตั้ง (Tilt) ของโมดูลกล้องเล็กๆ ระบบ Pan-Tilt นี้ประกอบด้วย Servo Motor 2 ตัว ซึ่งจำเป็นมากสำหรับงานหุ่นยนต์และระบบ CCTV ส่วนจอยสติ๊กประกอบด้วย Limit Switch 4 ตัว แต่ละตัวมีขา 2 ขา ดังนั้นเราต้องใช้พิน Digital I/O ทั้งหมด 8 พิน โดย 4 พินจะใช้เป็น output และอีก 4 พินใช้เป็น input Servo motor นั้นควบคุมด้วย Pulse Width Modulation (PWM) ดังนั้นเราต้องใช้ช่อง PWM 2 ช่องบน Uno เพื่อตั้งค่ามุมที่แม่นยำ
กลไกของจอยสติ๊ก 4 ทิศ
จอยสติ๊ก 4 ทิศประกอบด้วยลิมิตสวิตช์ 4 ตัว ซึ่งจะถูกกดเมื่อเลื่อนจอยสติ๊กไปทางซ้าย ขวา ขึ้น หรือลง โมเดลนี้ต่างจากจอยสติ๊กแบบ Analog (แบบที่มีก้าน Potentiometer) สวิตช์พวกนี้เป็นแบบ normally-open (NO) หมายความว่าเมื่อสวิตช์ไม่ถูกกด ขาทั้งสองข้างจะไม่ต่อกันภายใน เมื่อสวิตช์ถูกกด ขาทั้งสองข้างจะต่อกันภายใน
ลองทดสอบเร็วๆ ด้วยฟังก์ชัน continuity บน มัลติมิเตอร์ วางโพรบอันนึงบนขาแรก และอีกโพรบนึงบนขาที่สองของลิมิตสวิตช์ มันไม่ควรมีเสียงบี๊บ (continuity) ทีนี้ เลื่อนจอยสติ๊กเพื่อกดลิมิตสวิตช์ที่กำลังวัดอยู่ มันควรจะมีเสียงบี๊บแล้ว
มีอนิเมชันด้านล่างแสดงให้เห็นว่าลิมิตสวิตช์ตัวไหนถูกกดเมื่อจอยสติ๊กถูกเลื่อนไปในทิศทางใด ตัวอย่างเช่น เมื่อเลื่อนจอยสติ๊กขึ้น ลิมิตสวิตช์หมายเลข 3 จะถูกกด

ความสำคัญของตัวต้านทานดึงลง (Pull-Down Resistor)
ต้องใช้ ตัวต้านทานดึงลง (Pull-down resistor) ที่ด้าน output ของลิมิตสวิตช์แต่ละตัว เพื่อป้องกันไม่ให้พิน input ที่เชื่อมต่อกับ Uno เกิดอาการ ลอย (floating) พินลอยหมายความว่าแรงดันสัญญาณสามารถสลับไปมาระหว่าง +5V (ถ้าใช้แรงดันสูงเป็นค่านี้) กับ GND แบบสุ่ม สภาวะนี้เรียกว่า Floating Input ทำให้พินไวต่อสัญญาณรบกวนทางไฟฟ้า ทำให้ Uno อ่านค่าแบบสุ่มๆ กระโดดไปมาระหว่าง HIGH (+5V) กับ LOW (GND) ซึ่งอาจทำให้ Uno คิดว่าสวิตช์ถูกกด แล้วมันก็จะทำงานตามนั้น ตัวอย่างเช่น สมมติเรามีโค้ดที่เช็คว่าถ้า input ดิจิตอลเป็น high ไฟ LED จะติด ถ้า input ดิจิตอลเป็น low (ซึ่งเป็นสถานะปกติที่เราต้องการ) ไฟ LED จะดับ แต่ถ้าพิน input ลอย มันอาจสุ่มเป็น high ทำให้ไฟ LED ติด ทั้งๆ ที่สวิตช์ไม่ได้ถูกกด
ตัวต้านทานดึงลง (Pull-down Resistor) ช่วยให้มั่นใจว่าแรงดันที่พิน Input จะถูกดึงลงสู่ Ground (0V) เสมอเมื่อสวิตช์เปิด (ไม่ถูกกด) เมื่อสวิตช์ถูกกด แรงดันจากแหล่งจ่าย +5V จะไหลผ่านสวิตช์เข้าสู่พิน Input ทำให้ Uno อ่านค่า HIGH ได้อย่างแม่นยำ
แผนภาพด้านล่างแสดงตัวต้านทานดึงลงที่ต่อกับ output ของสวิตช์ (ซึ่งเป็น input ของ Uno) เมื่อสวิตช์ไม่ถูกกด (OFF) output จะถูกดึงลงสู่ GND เมื่อสวิตช์ถูกกด (ON) output จะถูกดึงขึ้นสู่ +5V

การควบคุมด้วย PWM (Pulse Width Modulation)
PWM ถูกใช้ในงานหลากหลายแบบ เช่น หุ่นยนต์และการควบคุม มันคือเทคนิคที่ใช้เลียนแบบแรงดันเอาท์พุตแบบต่อเนื่อง (Analog) โดยใช้สัญญาณ ดิจิทัล เอาท์พุตแบบดิจิทัลจะมีได้แค่สูง (ปกติ +5V หรือ +3.3V) หรือต่ำ (GND) เท่านั้น ถ้าอยากได้แรงดันที่เปลี่ยนไปมาได้ เราต้องปรับค่าที่เรียกว่า Duty Cycle (เดูตี้ไซเคิล) นี่คืออัตราส่วนระหว่างเวลาที่สัญญาณเป็น ON ต่อ OFF ในหนึ่งรอบวงจร ตัวอย่างเช่น ถ้า Duty Cycle เป็น 50% แปลว่าสัญญาณจะ ON อยู่ 50% และ OFF 50% ของหนึ่งรอบ ถ้าเป็น 75% ก็จะ ON 75% และ OFF 25% ของหนึ่งรอบ
สำหรับ เซอร์โวมอเตอร์ สัญญาณ PWM จะกำหนด "ตำแหน่ง" ของเพลามอเตอร์ โดยทั่วไปเซอร์โวต้องการความถี่ 50Hz (คาบเวลา 20ms) และความกว้างพัลส์ระหว่าง 1ms ถึง 2ms เพื่อตั้งมุมจาก 0 ถึง 180 องศา

การออกแบบกลไกและตัวเรือน
พวกจอยสติกที่ซื้อมามักจะไม่มีตัวเรือนให้ติดตั้ง เราก็เลยต้องออกแบบเองซะเลย พวกเราใช้เครื่อง 3D Printer พิมพ์ขึ้นมา หรือน้องจะใช้แผ่นอะคริลิกทำก็ได้นะ นอกจากนี้เรายังออกแบบแผ่นปิดด้านบนใหม่จากอะลูมิเนียม เพื่อให้มี ระยะห่าง (Clearance) เพิ่มขึ้นสำหรับลิมิตสวิตช์ งานชิ้นนี้เราทำจากแผ่น อะคริลิก หนา 1/8 นิ้ว และใช้เครื่อง เลเซอร์คัตเตอร์ ตัด

การเดินสายจอยสติก
ลิมิตสวิตช์บนจอยสติกมักจะไม่มีสายมาให้ น้องสามารถใช้ขาคอนเนคเตอร์แบบตัวเมีย (Female Quick Disconnect) หรือจะบัดกรีสายไฟตรงไปที่ขาเลยก็ได้ พวกเราเลือกบัดกรีสายไฟตรงไปที่ขาเลยเพื่อความแข็งแรงทนทานและลดความต้านทานสัมผัส เราใช้สายขนาด 30 AWG เพราะกระแสที่ไหลผ่านสายมีไม่มาก (ใช้แค่ตรวจสอบสถานะ Logic) แต่น้องใช้สายขนาด 24 ถึง 30 AWG ก็ได้ ถ้าเป็นไปได้ พยายามติดป้ายหรือใช้สีสายให้แตกต่างกัน จะได้รู้ง่ายๆ ว่าสายไหนต่อกับลิมิตสวิตช์ตัวไหนบนจอยสติก ไม่งั้นน้องต้องมานั่งใช้มัลติมิเตอร์จิ้มไล่ทีละสายแน่ๆ
ขั้นตอนการเดินสาย:
- ตัดสายไฟแต่ละเส้นให้ยาวประมาณ 2 ฟุต น้องจะทำให้สั้นหรือยาวกว่านี้ก็ได้ ขึ้นอยู่กับความยาวของสายรวมที่ต้องการ
- ปอกฉนวนปลายสายแต่ละข้างออกประมาณ 1/2 นิ้ว
- บัดกรีสายไฟเข้ากับขาแต่ละขาของลิมิตสวิตช์
- เพื่อป้องกันการลัดวงจรระหว่างขาที่อยู่ติดกัน ให้ใส่ท่อหดความร้อน (Heat Shrink) ตามภาพด้านล่าง
- เมื่อบัดกรีสายทุกเส้นเสร็จแล้ว ให้ร้อยสายผ่านรูบนตัวเรือน แล้วติดตั้งจอยสติกเข้ากับตัวเรือน

ที่ปลายสายแต่ละเส้น ให้บีบขา Crimp Pin แบบตัวผู้ (Male) ติดเข้าไป จะได้เสียบลงบนเบรดบอร์ดง่ายๆ สาย 30 AWG นี่บางเกินไป ถ้าไม่มี Crimp Pin ค้ำไว้ ประโยชน์ของการใช้สายหนากว่านี้คือ น้องอาจจะไม่ต้องใช้ Crimp Pin เลยก็ได้ พวกเรายังใส่ท่อหดความร้อนที่ปลายสายแต่ละเส้นอีกด้วย จากนั้นก็เสียบ Crimp Pin ลงบนเบรดบอร์ด หรือจะเสียบตรงไปที่ขาเฮดเดอร์ตัวเมียบนบอร์ด Uno เลยก็ได้ ถ้าสายยาวพอ
หวังว่าน้องจะติดป้ายสายไว้ดีแล้วนะว่าสายไหนต่อกับลิมิตสวิตช์ตัวไหน พวกเราใช้ขา 2-5 ของ Uno เป็นขาเอาท์พุต และใช้ขา 6-8 และ 11 เป็นขาอินพุต สายที่ต่อกับขาอินพุตของ Uno จะต้องถูกต่อเข้ากับเบรดบอร์ดก่อน เพื่อที่จะได้ต่อกับตัวต้านทานแบบ Pull-Down ได้ ตามแผนภาพด้านล่างเลย

ต่อสายให้เซอร์โว
มอเตอร์เซอร์โว (Servo) โดยทั่วไปจะมีสาย 3 เส้น: ไฟเลี้ยง (แดง), กราวด์ (ดำหรือน้ำตาล), และสัญญาณ (เหลืองหรือส้ม) ที่ปลายสายมักจะมีเฮดเดอร์แบบเมีย 3 พินรออยู่ เราก็เลยต้องมีพินเฮดเดอร์แบบผู้ (male header pins) 3 อันเพื่อเอาไปเสียบลงเบรดบอร์ด น้องจะเดินสายสัญญาณของเซอร์โวแต่ละตัวไปที่เบรดบอร์ดก่อนก็ได้ หรือจะต่อตรงเข้าเฮดเดอร์เมียบนบอร์ด Uno เลยก็ได้ เราเลือกใช้พิน 9 กับ 10 นะ เพราะมันเป็นช่อง PWM (ดูได้จากที่มีเครื่องหมาย '~' บนบอร์ด) เซอร์โวที่ใช้เอียงกล้อง (tilt) จะต่อกับพิน 10 ส่วนเซอร์โวที่ใช้หมุนกล้อง (pan) จะต่อกับพิน 9 ดูแผนภาพวงจรประกอบได้ด้านล่างเลย

ต่อสายขั้นสุดท้าย
ถ้ายังไม่ได้ยึดบอร์ด Uno เข้ากับพื้นที่โปรโตไทป์บน FuelCan ก็จัดการซะ เราเอาเบรดบอร์ดไปวางไว้ในช่องเก็บของด้านล่างนี่แหละ จะได้ไม่ต้องใช้สายจัมเปอร์ยาวเฟื้อย ต้องจ่ายไฟกราวด์ (GND) ให้กับรางกราวด์ และ +5V ให้กับรางบวกบนเบรดบอร์ด ใช้สายทดสอบแบบปลอกแบนาน่าจั๊ก (banana jack to test-lead clip) ที่มีมาให้ได้เลย ต้องใช้พินเฮดเดอร์แบบผู้ 2 อันเพื่อยึดปลอกสายทดสอบเข้ากับเบรดบอร์ด เสียบปลาย Type A ของสาย USB เข้ากับช่อง USB1 และปลาย Type B เข้ากับช่องบน Uno เสียบสาย USB Type A ต่อ Type A เข้ากับพอร์ต USB ของคอมพ์น้อง และเข้ากับช่อง USB ภายนอกของ FuelCan จากนั้นก็เปิดไฟให้ FuelCan ด้วยอะแดปเตอร์ AC-DC ได้เลย
ตรรกะของซอฟต์แวร์
ต่อสายเสร็จสรรพ เปิดไฟ FuelCan แล้ว คราวนี้ก็อัพโหลดสเก็ตช์ลง Uno ได้เลย หัวใจของโปรแกรมนี้อยู่ที่การตรวจสอบสถานะของ อินพุตดิจิตอล ในทิศทางต่างๆ เมื่อสวิตช์ถูกกด ค่าตัวแปรที่เก็บมุมของเซอร์โว (degrees) จะถูกเพิ่มหรือลดทีละนิด แล้วค่าดังกล่าวจะถูกส่งไปให้เซอร์โวผ่านคำสั่ง servo.write(angle)
สเก็ตช์อยู่ด้านล่างนี้ เมื่อจอยสติกถูกกดขึ้น ลง ซ้าย ขวา กล้องก็จะเอียงขึ้น เอียงลง หมุนซ้าย หมุนขวาตามลำดับ ถ้าของน้องทำไม่ตามนี้ ลองสลับสายอินพุตจากลิมิตสวิตช์ดูนะ
#include <Servo.h>
Servo panServo;
Servo tiltServo;
int panAngle = 90;
int tiltAngle = 90;
void setup() {
panServo.attach(9);
tiltServo.attach(10);
// Set Input pins for Joystick
pinMode(6, INPUT); // Right
pinMode(7, INPUT); // Left
pinMode(8, INPUT); // Down
pinMode(11, INPUT); // Up
// Set Output pins to supply power to the switches
pinMode(2, OUTPUT); digitalWrite(2, HIGH);
pinMode(3, OUTPUT); digitalWrite(3, HIGH);