1. บอร์ด Arduino Nano และช่อง PORT
Nano ทำหน้าที่อะไรบนโดรน และ PORT1–6 บนตัวโดรนคือขาไหนในโค้ด
บนโดรนมีคอมพิวเตอร์สองตัว ตัวแรกคือ Flight Controller (FC) ที่คุมมอเตอร์ ตัวที่สองคือ Arduino Nano ที่เราเขียนโค้ดใส่เอง FC บินเป็นอยู่แล้ว เราไม่ต้องสอน Nano มีหน้าที่แค่ "สั่ง FC ว่าจะบินไปไหน" และ "ขยับเซอร์โวที่ใช้ปล่อยบอลหรือยิงดอก"
ชื่อบอร์ดที่เลือกในโปรแกรมคือ Arduino Nano ชิปในบอร์ดคือ ATmega328P ตัวเลขที่ควรจำ
| รายการ | ค่า |
|---|---|
| หน่วยความจำโปรแกรม (Flash) | 32 KB |
| หน่วยความจำตัวแปร (RAM) | 2 KB |
| ความเร็วนาฬิกา | 16 MHz |
| แรงดันขา | 5 V |
RAM แค่ 2 KB เท่ากับ 2,048 ไบต์ ตัวแปรชนิด float ตัวเดียวกินไป 4 ไบต์ เขียนอาร์เรย์ใหญ่ๆ หรือข้อความยาวๆ ได้ไม่กี่ร้อยตัวก็เต็ม เรื่องนี้กลับมาที่หน้า PROGMEM
ช่อง PORT บนโดรน
โดรน RCSA EDU มีช่องเสียบสายที่คู่มือเรียกว่า PORT1 ถึง PORT6 แต่ละช่องต่อกับขาของชิปโดยตรง ไฟล์ protocol.hpp ตั้งชื่อเชื่อมไว้ให้แล้ว
// protocol.hpp
#define PC1 A1
#define PC0 A0
#define PB1 9
#define PB2 10
#define PB3 11
#define PD3 3
#define PORT1 PB2
#define PORT2 PB1
#define PORT3 PB3
#define PORT4 PD3
#define PORT5 PC1
#define PORT6 PC0อ่านจากล่างขึ้นบน: PORT3 คือ PB3 และ PB3 คือขา 11 ดังนั้นเขียน PORT3 ในโค้ด = เขียนเลข 11
ตัวอักษรหน้าตัวเลขบอกกลุ่มขาของชิป เช่น PB = Port B, PD = Port D, PC = Port C ชื่อพวกนี้มาจากแผ่นข้อมูลของชิป ในโค้ด Arduino ปกติเราใช้เลขขาแบบ 11 หรือ A0 สะดวกกว่า ชมรมใช้ชื่อ PORT3 เพราะตรงกับชื่อช่องในคู่มือ ไม่ต้องจำเลข
ตัวอย่างชีวิตจริง: ปลั๊กพ่วงมีป้ายเลข
ลองนึกถึงปลั๊กพ่วงที่แปะป้ายเขียนว่า "ทีวี" "พัดลม" "ที่ชาร์จ" คุณไม่ต้องรู้ว่าไฟมาจากเต้าเสียบไหนของผนัง แค่เสียบให้ตรงป้าย PORT ก็เหมือนกัน เสียบเซอร์โวปล่อยบอลที่ PORT3 แล้วเขียน PORT3 ในโค้ด จบ
ใช้ขาเหล่านี้ยังไง
ก่อนใช้ขาเป็นเอาต์พุต ต้องบอกชิปก่อนด้วย pinMode โค้ดชมรมทำที่ beginDefault() ใน DroneEasy.cpp
// DroneEasy.cpp
void DroneEasy::beginDefault() const {
Serial.begin(9600);
pinMode(PORT1, OUTPUT);
pinMode(PORT3, OUTPUT);
pinMode(PORT4, OUTPUT);
pinMode(PORT6, OUTPUT);
pinMode(PORT5, OUTPUT);สังเกตว่าไม่มี PORT2 เพราะไม่มีกลไกไหนต่ออยู่ ส่วนการกำหนดว่าช่องไหนทำอะไรอยู่ใน config.hpp และ Drone_Mission.ino
// config.hpp
#define SHOOT1_PIN PORT4
#define SHOOT2_PIN PORT5
// Drone_Mission.ino
const uint8_t BALL_SERVO_12_PIN = PORT3; // ควบคุมช่อง 1 และ 2
const uint8_t BALL_SERVO_34_PIN = PORT6; // ควบคุมช่อง 3 และ 4ช่องที่ห้ามใช้ปนกัน
สาย I2C ที่คุยกับ FC ใช้ขา A4 และ A5 ของ Nano ตัวเลขนี้เป็นของบอร์ด Nano ทั่วไป ห้ามเอาขา A4/A5 ไปทำอย่างอื่น ส่วน PORT5 (A1) และ PORT6 (A0) ใช้ได้ปกติ เพราะเป็นขาอื่น
USB สองช่องที่หน้าตาเหมือนกัน
โดรนมี Type-C สองช่อง ช่องข้างโดรนคือ Nano (อัปโหลดโค้ด Arduino) ช่องด้านหน้าคือ FC (อัปโหลดเฟิร์มแวร์การบิน) เสียบผิดช่อง คอมจะไม่เห็นพอร์ตหรืออัปโหลดค้าง ดูต่อที่ ติดตั้ง Arduino IDE
ลองทำ
- เปิด
protocol.hppหาบรรทัด#define PORT4 PD3แล้วตามไปดูว่าPD3ถูกนิยามเป็นเลขอะไร (คำตอบ: 3) - ใช้
grep -n PORT drone_sanam5/*.inoดูว่า PORT ไหนถูกใช้ในไฟล์ไหนบ้าง แล้วเทียบกับตารางด้านบน - ถ้าเปลี่ยนไปใช้เซอร์โวยิงที่ PORT2 ต้องแก้ที่ไหนบ้าง (คำตอบ:
SHOOT1_PINในconfig.hppและเพิ่มpinMode(PORT2, OUTPUT)ในbeginDefault())
พังตรงไหนบ่อย
- เซอร์โวไม่ขยับเลย ตรวจว่าเสียบช่องตรงกับที่โค้ดใช้ และ
pinMode(..., OUTPUT)ถูกเรียกแล้ว - เสียบ Type-C ผิดช่อง อัปโหลดไม่ได้ ถอดแล้วเสียบอีกช่อง
- เปลี่ยนช่อง แต่ไม่แก้ค่าคงที่ โค้ดยังสั่งขาเก่า ตรวจ
BALL_SERVO_12_PINและSHOOT1_PINเสมอ