ชื่อโปรเจกต์: ล้อปรับทริมแท็บแบบแอนะล็อกสำหรับ FlightGear
การเชื่อมต่อ Arduino เข้ากับ FlightGear ไม่ใช่เรื่องใหม่ แต่ผมพบว่าข้อมูลใน wiki เก่าไปแล้ว และในฟอรัมก็ให้คำแนะนำที่มีค่าที่คุณต้องลองหาทางแก้ไขเอง
แนวคิดคือการสร้างคำสั่งแบบแอนะล็อกที่ดูดี ราคาถูก และกะทัดรัด เพื่อควบคุมล้อปรับทริมแท็บของแพนหางระดับ (elevator trim tab wheel) ของเครื่องบินใน FlightGear wiki ใช้งานได้ดีจนกระทั่งถึงส่วนของการสื่อสาร พูดอย่างเคร่งครัดคือ คุณไม่สามารถใช้ serial communication เพื่อส่งคำสั่งจาก Arduino ไปยัง FlightGear ได้โดยตรง คุณต้องใช้วิธีแก้ปัญหาด้วย Python เพื่อส่งแพ็กเก็ตผ่าน UDP

trim wheel คืออะไร? มันคืออุปกรณ์แอนะล็อกสำหรับควบคุมการเบี่ยงเบนของ trim tab ซึ่งเป็นอุปกรณ์ทางอากาศพลศาสตร์ที่ช่วยรักษาพื้นผิวควบคุม (ในกรณีนี้คือแพนหางระดับ (elevator) ที่ควบคุมการเชิดหรือก้มของเครื่องบิน) ให้อยู่ในตำแหน่งที่กำหนดโดยไม่ต้องใช้แรงจากนักบิน จาก wikipedia:
Trim tabs are small surfaces connected to the trailing edge of a larger control surface on a boat or aircraft, used to control the trim of the controls, i.e. to counteract hydro- or aerodynamic forces and stabilise the boat or aircraft in a particular desired attitude without the need for the operator to constantly apply a control force. This is done by adjusting the angle of the tab relative to the larger surface.

ข้อกำหนดเพิ่มเติมสำหรับโปรเจกต์นี้: python พร้อมกับไลบรารี serial, socket, และ sys ที่ติดตั้งไว้แล้ว สมมติว่าได้ติดตั้ง Anaconda แล้ว ไลบรารีที่ขาดหายไปสามารถติดตั้งได้จาก Anaconda prompt โดยการพิมพ์:
>>> conda install -c anaconda pyserial
เช่นเดียวกันสำหรับ serial และ socket ค้นหาแพ็กเกจที่เหมาะสมบนอินเทอร์เน็ต โดยปกติแล้วแพ็กเกจที่ดาวน์โหลดมากที่สุดสำหรับแพลตฟอร์มของคุณมักจะดี เมื่อคุณมี python พร้อมไลบรารีเหล่านี้ (และแน่นอนว่า FlightGear ติดตั้งอยู่แล้ว) คุณสามารถไปยังส่วนถัดไปได้เลย
มีสคริปต์โค้ดสามส่วนคือ: Arduino sketch, สคริปต์ python ที่สามารถรันได้ และสคริปต์ XML Arduino sketch จะต้องถูกอัปโหลดไปยังบอร์ดของคุณ สคริปต์ python จะต้องถูกรันเพื่อเปิดใช้งานการสื่อสารระหว่าง Arduino และ FlightGear ส่วนสคริปต์ XML คือโปรโตคอลทั่วไปของ FlightGear ที่ต้องย้ายไปยัง <FlightGearRoot>/data/protocol เพียงครั้งเดียวเท่านั้น
Arduino sketch ต้องการไลบรารี U8glib ตามที่ระบุไว้ในคอมเมนต์ ให้ปรับบรรทัดที่ 2 ของ sketch ให้ตรงกับจอแสดงผลของคุณ:
#include <U8glib.h>
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI
ดูตัวอย่างและเอกสารประกอบของ U8glib sketch ควรจะทำงานได้แม้จะไม่มีจอแสดงผล ดังนั้นคุณสามารถเล่นได้โดยไม่ต้องมีภาพตอบรับจากบอร์ดของคุณ
หากคุณไม่พอใจกับทิศทางการหมุน เพียงแค่สลับตำแหน่งของอาร์กิวเมนต์สองตัวสุดท้ายในคำสั่ง map ด้านล่างนี้
w = map(p,0,1023,100,-100);
m = map(p,0,1023,90,0);
เพื่อให้ค่าของ potentiometer เปลี่ยนจาก -100 เป็น 100 และมาตรวัดของเข็มเปลี่ยนจาก 0 เป็น 90 (นี่เป็นเคล็ดลับในการวาดเข็มให้อยู่ในตำแหน่งที่ถูกต้อง ลองทำดูเองได้ถ้าคุณอยากรู้)
สคริปต์ python มีที่อยู่ของโฮสต์และหมายเลข serial port โฮสต์ควรจะเป็น "localhost" (ถ้าไม่ได้ผล ลองใช้ 127.0.0.1) ส่วนพอร์ตจะเป็นพอร์ตใดก็ได้ (อาจจะดีกว่าถ้าเป็นพอร์ตที่ไม่ได้ใช้งานโดยแอปพลิเคชันอื่น ผมไม่แน่ใจ) serial port ที่บอร์ดของคุณเชื่อมต่ออยู่สามารถอ่านได้จาก Arduino IDE ในกรณีของผมคือ "COM4". หมายเหตุ: หากคุณทดสอบ Arduino ด้วย serial monitor คุณอาจจะต้องถอดปลั๊กแล้วเสียบใหม่ก่อนที่จะรันสคริปต์ python เพื่อให้มันทำงานได้อย่างถูกต้อง
host = "localhost"
port = 21567
#buf = 1024
addr = (host,port)
UDPSock = socket(AF_INET,SOCK_DGRAM)
tty="COM4"
print("tty is ", tty)
สคริปต์ python สามารถเก็บไว้ที่ใดก็ได้ คุณสามารถเรียกใช้ได้จาก command line ของระบบปฏิบัติการของคุณ ในกรณีของผม (Windows) ผมพิมพ์ใน command prompt ว่า:
python c:\\path\\to\\file\\arduinoElevatorTrim.py
สิ่งนี้สามารถเริ่มทำงานก่อนหรือแม้แต่หลังจากเริ่ม FlightGear ก็ได้
สุดท้ายนี้ ตามที่กล่าวไว้ก่อนหน้า สคริปต์ XML จะต้องถูกย้ายไปที่โฟลเดอร์ protocol ของการติดตั้ง FlightGear ของคุณเพียงครั้งเดียวเท่านั้น ตอนนี้คุณก็พร้อมแล้ว เปิด FlightGear ด้วยโหมดที่คุณต้องการ (command line หรือ launcher) โดยเพิ่มคำสั่งต่อไปนี้ (ไม่มีช่องว่างระหว่างตัวอักษร!):
--generic=socket,in,30,localhost,21567,udp,arduinoElevatorTrim
โดยที่เรากำลังสั่งให้ FlightGear ใช้ generic protocol ผ่าน socket, อ่านอินพุต 30 ครั้งต่อวินาที, ที่อยู่ localhost, พอร์ต 21567, โปรโตคอล UDP, และใช้คำสั่งในไฟล์ arduinoElevatorTrim.xml สนุกกับ trim wheel ส่วนตัวของคุณได้เลย!
รายละเอียดทางเทคนิคเพิ่มเติม
การเชื่อมต่อฮาร์ดแวร์กับ Flight Simulator
โปรเจกต์นี้มีส่วนต่อประสานการควบคุมทางกายภาพที่สมจริงสำหรับฟังก์ชัน "Elevator Trim" ในโปรแกรมจำลองการบิน FlightGear
- Analog Input Resolution: ใช้ potentiometer แบบ multi-turn ที่มีความแม่นยำสูง Arduino จะแมปการหมุนเป็นค่า 10-bit (0-1023) และส่งไปยัง PC
- Serial Interface Bridge: สคริปต์ Python หรือ "Generic Protocol" ภายในของ FlightGear จะรับฟังข้อมูล USB-Serial ของ Arduino และแมปเข้ากับ property tree ภายในของโปรแกรมจำลอง (
/controls/flight/elevator-trim)
ความสมจริงในการสัมผัส
- Physical Feedback: แตกต่างจากการใช้ mouse หรือ keyboard ล้อควบคุมทางกายภาพนี้ช่วยให้นักบินสามารถ "สัมผัส" สภาวะ trim ของเครื่องบินได้ ซึ่งให้ระดับความสมจริงและความแม่นยำที่สูงขึ้นมากสำหรับการบินเสมือนจริงระยะไกลแบบ cross-country