ชมรมโดรน

1. บอร์ด Arduino Nano และช่อง PORT

Nano ทำหน้าที่อะไรบนโดรน และ PORT1–6 บนตัวโดรนคือขาไหนในโค้ด

บนโดรนมีคอมพิวเตอร์สองตัว ตัวแรกคือ Flight Controller (FC) ที่คุมมอเตอร์ ตัวที่สองคือ Arduino Nano ที่เราเขียนโค้ดใส่เอง FC บินเป็นอยู่แล้ว เราไม่ต้องสอน Nano มีหน้าที่แค่ "สั่ง FC ว่าจะบินไปไหน" และ "ขยับเซอร์โวที่ใช้ปล่อยบอลหรือยิงดอก"

ระบบบนโดรน: รีโมท, Flight Controller, Arduino Nano และเซอร์โวรีโมทส่งปุ่มไปที่ FC, FC กับ Nano คุยกันผ่าน I2C, Nano ส่งสัญญาณ PWM ไปเซอร์โวรีโมทปุ่ม KEY1–KEY14ไร้สายFlight Controllerคุมมอเตอร์ ทรงตัวคำสั่งปุ่ม + ความสูงArduino Nanoโค้ดของเราอยู่ที่นี่PWMเซอร์โวปล่อยบอล ยิงดอกI2C 2 เส้น (SDA, SCL)
ใครคุยกับใคร: ปุ่มจากรีโมทเข้า FC ก่อน แล้ว FC ส่งต่อให้ Nano ผ่านสาย I2C Nano ส่งคำสั่งบินกลับไปที่ FC และส่งสัญญาณ PWM ตรงไปที่เซอร์โว

ชื่อบอร์ดที่เลือกในโปรแกรมคือ 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

PORT1 ถึง PORT6 ของโดรนเทียบกับขาของ Arduino Nanoแต่ละช่อง PORT ต่อกับขาชิปและเลขขาที่ใช้ในโค้ดช่องบนโดรนขาชิปขาในโค้ดใช้ทำอะไรในโค้ดชมรมPORT1PB2D10drop_payload() ใน Servo.inoPORT2PB1D9ไม่มีโค้ดไหนเรียกใช้PORT3PB3D11เซอร์โวปล่อยบอล ช่อง 1, 2PORT4PD3D3เซอร์โวยิง S1 (SHOOT1_PIN)PORT5PC1A1เซอร์โวยิง S2 (SHOOT2_PIN)PORT6PC0A0เซอร์โวปล่อยบอล ช่อง 3, 4
ตาราง PORT1–6 ที่ถอดจาก protocol.hpp ช่องที่แรเงาฟ้าคือช่องที่โค้ดของชมรมใช้จริง

ตัวอักษรหน้าตัวเลขบอกกลุ่มขาของชิป เช่น 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

ลองทำ

  1. เปิด protocol.hpp หาบรรทัด #define PORT4 PD3 แล้วตามไปดูว่า PD3 ถูกนิยามเป็นเลขอะไร (คำตอบ: 3)
  2. ใช้ grep -n PORT drone_sanam5/*.ino ดูว่า PORT ไหนถูกใช้ในไฟล์ไหนบ้าง แล้วเทียบกับตารางด้านบน
  3. ถ้าเปลี่ยนไปใช้เซอร์โวยิงที่ PORT2 ต้องแก้ที่ไหนบ้าง (คำตอบ: SHOOT1_PIN ใน config.hpp และเพิ่ม pinMode(PORT2, OUTPUT) ใน beginDefault())

พังตรงไหนบ่อย

  • เซอร์โวไม่ขยับเลย ตรวจว่าเสียบช่องตรงกับที่โค้ดใช้ และ pinMode(..., OUTPUT) ถูกเรียกแล้ว
  • เสียบ Type-C ผิดช่อง อัปโหลดไม่ได้ ถอดแล้วเสียบอีกช่อง
  • เปลี่ยนช่อง แต่ไม่แก้ค่าคงที่ โค้ดยังสั่งขาเก่า ตรวจ BALL_SERVO_12_PIN และ SHOOT1_PIN เสมอ

On this page