สารบัญ:
วีดีโอ: Arduino Based (JETI) PPM เป็น USB Joystick Converter สำหรับ FSX: 5 ขั้นตอน
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
ฉันตัดสินใจเปลี่ยนเครื่องส่ง JETI DC-16 จากโหมด 2 เป็นโหมด 1 ซึ่งโดยพื้นฐานแล้วจะสลับคันเร่งและลิฟต์จากซ้ายไปขวาและในทางกลับกัน เนื่องจากฉันไม่ต้องการทำให้โมเดลของฉันพังเนื่องจากความสับสนทางซ้าย/ขวาในสมองของฉัน ฉันจึงสงสัยว่าจะเป็นไปได้หรือไม่ที่จะฝึกฝน FSX สักหน่อย
ฉันอ่านและทดสอบเครื่องส่งสัญญาณ JETI จริง ๆ แล้วรองรับโหมดจอยสติ๊กตั้งแต่แกะกล่อง อย่างไรก็ตาม ฉันต้องการความยืดหยุ่นอย่างเต็มที่สำหรับการกำหนดแกนและสวิตช์ และใช้ TX เช่นเดียวกับรุ่นจริง ด้วยการใช้เอาต์พุตของเครื่องรับ ยังสามารถใช้การประมวลผลสัญญาณใน DC-16 และใช้มิกเซอร์ เฟสของเที่ยวบิน อัตราแบบคู่ อะไรก็ได้ที่คุณตั้งโปรแกรมไว้ที่นั่น
เมื่อเร็ว ๆ นี้ฉันพบบทช่วยสอนที่ดีเกี่ยวกับวิธีการสร้างอุปกรณ์อินพุต USB HID คือจอยสติ๊กจาก Arduino ราคาถูกเช่น Pro Micro:
www.instructables.com/id/Create-a-Joystick…
สิ่งนี้จะช่วยให้ทุกอย่างที่จำเป็นในการควบคุมเครื่องบิน / เฮลิคอปเตอร์ / อะไรก็ตามใน FSX! มีแกนและปุ่มให้เลือกมากมาย
เนื่องจากฉันเพิ่งมี JETI RSAT2 สำรอง ฉันจึงตัดสินใจเชื่อมต่อกับ Arduino และพยายามใช้ตัวแยกวิเคราะห์ PPM ขนาดเล็กพร้อมกับไลบรารีจอยสติ๊ก
ฉันสมมติว่าใครก็ตามที่ทำตามขั้นตอนเหล่านี้คุ้นเคยกับการเชื่อมต่อและเขียนโปรแกรม Arduino ฉันจะไม่ใช้การรับประกันใด ๆ สำหรับการทำงานผิดปกติหรือความเสียหาย!
เสบียง
คุณจะต้องการ…
- Arduino ใด ๆ ที่ห้องสมุดจอยสติ๊กรองรับ ฉันใช้ Sparkfun Pro Micro 5V / 16 MHz
- Arduino IDE. เวอร์ชันล่าสุด
- เครื่องรับ RC ใด ๆ ที่ส่งสัญญาณ PPM เช่น JETI RSAT2
- สายจัมเปอร์สองสามเส้น (นาทีที่ 3)
- ไลบรารีจอยสติ๊กที่ติดตั้งใน Arduino IDE
- ไลบรารี arduino-timer:
ขั้นตอนที่ 1: ต่อ RX และ Arduino
การเดินสายไฟค่อนข้างตรงไปตรงมา ฉันตัดสินใจที่จะจ่ายไฟให้กับ Arduino จาก USB เท่านั้น เนื่องจากมันจะจำลองอุปกรณ์จอยสติ๊ก สิ่งนี้จะจ่าย Arduino กับ 5V ซึ่งสามารถใช้สำหรับเปิดเครื่องรับ RC ได้
ฉันใช้ Pin VCC ซึ่งให้เอาต์พุตที่มีการควบคุม และพิน Gnd ที่ใกล้ที่สุด - เพียงแค่เชื่อมต่อกับตัวเชื่อมต่อ + และ - พินของ PPM เมื่อ Arduino ได้รับพลังงาน ตัวรับสัญญาณก็กำลังเปิดเครื่องเช่นกัน
สำหรับสัญญาณ PPM ฉันตัดสินใจใช้การขัดจังหวะเพื่อแยกวิเคราะห์ มีการขัดจังหวะเช่น ที่พิน 3 ดังนั้นเพียงแค่เชื่อมต่อที่นั่น - ไม่มี "หมุด RC ดั้งเดิม" บน Arduino แต่อาจมีวิธีการอ่านสัญญาณเครื่องรับที่มากกว่าและแตกต่างกัน
ฉันต้องปิดการเตือนแรงดันไฟฟ้า RX เนื่องจากแรงดันไฟฟ้า VCC พร้อมแหล่งจ่าย USB จะอยู่ที่ประมาณ 4.5V เท่านั้น - แต่ค่อนข้างเสถียร ดังนั้นจึงไม่มีปัญหาเลย
ขั้นตอนที่ 2: รับสัญญาณ PPM บางส่วน
เมื่อเปิดเครื่องรับและ TX ฉันได้รับสัญญาณ PPM ตามที่แสดงในภาพ 16 ช่อง ย้ำตลอดกาล หาก Failsafe บน RSAT ถูกปิดใช้งานและตัวส่งสัญญาณปิดอยู่ เอาต์พุต PPM จะถูกปิดใช้งาน
ข้อมูลเพิ่มเติมเกี่ยวกับ PPM มีอยู่ที่นี่:
- https://th.wikipedia.org/wiki/Pulse-position_modul…
- https://wiki.rc-network.de/index.php/PPM
เนื่องจากฉันไม่ได้บินของจริงในกรณีนี้ ฉันจึงไม่สนใจการกำหนดเวลาตามทฤษฎีและเพิ่งรู้ว่าออสซิลโลสโคปว่าตัวรับสัญญาณของฉันส่งสัญญาณอะไรออกมาอย่างเฉียบขาดเมื่อขยับแท่งจากซ้ายสุดไปขวาสุด (การตั้งค่ามาตรฐานใน TX). ดูเหมือนว่า -100% จะสอดคล้องกับพัลส์ที่มีความยาว 600µs และ +100% ถึง 1600µs ฉันยังไม่สนใจความยาวของพัลส์หยุดชั่วคราว (400µs) ในโค้ด Arduino ของฉัน แต่ฉันถือว่าระยะห่างระหว่างเฟรมขั้นต่ำ 3000µs
ขั้นตอนที่ 3: การกำหนดค่าเครื่องส่งสัญญาณ
เนื่องจากจำเป็นต้องทราบตำแหน่งจริงของพื้นผิวการควบคุมเท่านั้น หนึ่งช่องสัญญาณ / "เซอร์โว" ต่อฟังก์ชัน RC ก็เพียงพอแล้ว ดังนั้นจึงสามารถทำการตั้งค่าตัวส่งสัญญาณที่ค่อนข้างง่าย - คล้ายกับรุ่น RC ปกติ หน้าที่หลักของปีกปีก ลิฟต์ หางเสือ และปีกผีเสื้อ แต่ละตัวต้องการช่องสัญญาณเซอร์โวตัวส่งสัญญาณเพียงช่องเดียวตามลำดับ ฉันยังเพิ่มแผ่นปิด เบรก และเกียร์ ทำให้ตอนนี้มีช่องว่าง 9 ช่อง โปรดทราบว่า Flaps ถูกวางในเฟสการบิน และไม่ได้ถูกควบคุมโดยตรงผ่านแท่ง ตัวเลื่อน หรือปุ่ม
ขั้นตอนที่ 4: เรียกใช้จอยสติ๊ก
ไลบรารีจอยสติ๊กใช้งานได้ง่ายมาก มีตัวอย่างและการทดสอบ คุณควรตรวจสอบก่อนว่า Arduino ถูกตรวจพบว่าเป็นจอยสติ๊กที่เหมาะสมหรือไม่ คำแนะนำที่เชื่อมโยงในส่วนรายการและไลบรารีเองก็ให้คำแนะนำที่ดี
ในแผงควบคุมอุปกรณ์และเครื่องพิมพ์ Arduino แสดงเป็น "Sparkfun Pro Micro" และหน้าต่างทดสอบจอยสติ๊กแสดง 7 แกนและปุ่มที่รองรับมากมาย แม้แต่สวิตช์หมวกก็สามารถใช้ได้เมื่อตั้งโปรแกรมไว้ใน Arduino
ขั้นตอนที่ 5: การเข้ารหัส Arduino
สิ่งที่ยังคงขาดหายไปคือการแยกวิเคราะห์สัญญาณ PPM และการกำหนดแกนและปุ่มของจอยสติ๊ก ฉันตัดสินใจทำแผนที่ต่อไปนี้:
ช่อง / ฟังก์ชั่น / การกำหนดจอยสติ๊ก:
- คันเร่ง -> แกนคันเร่ง
- ปีกเครื่องบิน -> แกน X
- ลิฟต์ -> แกน Y
- หางเสือ -> แกนหมุน X
- แผ่นปิด -> แกนหมุน Y
- เบรค -> แกน Z
- เกียร์ -> ปุ่ม 0
เมื่อเกียร์ลง ปุ่มแรกของจอยสติ๊กจะถูกกดและจะปล่อยเมื่อยกเกียร์ อย่างไรก็ตาม สิ่งนี้จะต้องใช้ FSUIPC สำหรับ FSX นอกกรอบ FSX จะยอมรับเพียงปุ่มสำหรับการสลับเกียร์ ซึ่งไม่ใช่สิ่งที่เกิดขึ้นกับรุ่นของฉันอย่างแน่นอน
ฉันให้โค้ดเวอร์ชันปัจจุบันกับความคิดเห็นจำนวนมาก ซึ่งทำงานได้ดีสำหรับฉัน อย่าลังเลที่จะเปลี่ยนงานหรือเพิ่มฟังก์ชันใหม่ ไม่ได้ใช้งานช่อง RC 9 ช่องล่าสุด
สำหรับการตั้งค่า คลาสจอยสติ๊กจะต้องเริ่มต้น โดยพื้นฐานแล้วโดยการกำหนดช่วงแกนตัวเลข:
/* กำหนดช่วงของแกน (กำหนดในส่วนหัว 0 - 1000) */
จอยสติ๊ก.setXAxisRange (CHANNEL_MIN, CHANNEL_MAX); จอยสติ๊ก.setYAxisRange(CHANNEL_MIN, CHANNEL_MAX); …
ด้วยการใช้ค่าตั้งแต่ 0 ถึง 1,000 คุณสามารถจับคู่ความยาวพัลส์ (600 - 1600µs) กับค่าจอยสติ๊กได้โดยตรงโดยไม่ต้องปรับขนาด
DIN 3 ถูกเตรียมใช้งานเป็นอินพุตดิจิตอล เปิดใช้งานการดึง และมีการต่ออินเตอร์รัปต์:
โหมดพิน (PPM_PIN, INPUT_PULLUP);
AttachInterrupt(digitalPinToInterrupt(PPM_PIN), PPM_Pin_Changed, CHANGE);
เพื่อจุดประสงค์ในการดีบัก ฉันได้เพิ่มงานพิมพ์บางส่วนผ่านอินเทอร์เฟซ Serial เป็นระยะ ๆ โดยใช้ไลบรารี arduino-timer:
ถ้า (SERIAL_PRINT_INTERVAL > 0) {
scheduler.every(SERIAL_PRINT_INTERVAL, (void*) -> bool { SerialPrintChannels(); return true; }); }
อินเทอร์รัปต์ของพินจะถูกเรียกเมื่อใดก็ตามที่ค่าลอจิคัลของพินเปลี่ยนไป ดังนั้นสำหรับแต่ละขอบในสัญญาณ PPM ประเมินความยาวพัลส์ด้วยการจับเวลาอย่างง่ายโดยใช้ micros():
uint32_t curTime = ไมโคร ();
uint32_t pulseLength = curTime - edgeTime; uint8_t curState = digitalRead (PPM_PIN);
โดยการประเมินสถานะของพินปัจจุบันและรวมกับความยาวพัลส์และพัลส์ในอดีต จึงสามารถจำแนกพัลส์ใหม่ได้ เงื่อนไขต่อไปนี้จะตรวจจับช่องว่างระหว่างเฟรม:
ถ้า (lastState == 0 && pulseLength > 3000 && pulseLength < 6000)
สำหรับพัลส์ที่ตามมา ความยาวของพัลส์จะถูกจับคู่กับสถานะของแกนโดยการตัดและให้น้ำหนักของความยาวพัลส์เพื่อให้ตรงกับช่วงของแกนจอยสติ๊ก:
uint16_t rxLength = ความยาวพัลส์;
rxLength = (rxLength > 1600) ? 1600: rxLength; rxLength = (rxLength < 600) ? 600: rxLength; rxChannels[curChannel] = rxLength - 600;
ในที่สุดอาร์เรย์ rxChannels จะมีค่า 16 ค่าตั้งแต่ 0 - 1,000 ซึ่งระบุตำแหน่งของแท่ง / ตัวเลื่อนและปุ่ม
หลังจากได้รับ 16 ช่องสัญญาณ การแมปไปยังจอยสติ๊กจะดำเนินการ:
/* แกน */
Joystick.setThrottle(ช่อง[0]); Joystick.setXAxis(ช่องสัญญาณ [1]); Joystick.setYAxis(1000 - ช่อง [2]); Joystick.setRxAxis(ช่อง[3]); Joystick.setRyAxis(ช่อง[4]); Joystick.setZAxis(1000 - ช่อง[5]); /* ปุ่ม */ Joystick.setButton(0, (ช่อง[6] < 500 ? 1: 0)); /* อัปเดตข้อมูลผ่าน USB */ Joystick.sendState();
ฉันกลับแกนบางแกนในโค้ด ซึ่งไม่จำเป็นอย่างยิ่ง เนื่องจากแกนสามารถกลับด้านได้ด้วยการพลิกทิศทางของเซอร์โวหรือการกำหนดใน FSX อย่างไรก็ตาม ฉันตัดสินใจที่จะรักษาทิศทางของเซอร์โวและการกำหนด FSX ดั้งเดิมไว้ด้วย
ปุ่มเปิดหรือปิดโดยการกำหนดช่องสัญญาณ 7
และอย่าลืมทำเครื่องหมายที่ตัวจัดกำหนดการ…ไม่เช่นนั้นจะไม่เห็นการพิมพ์ดีบัก
วงเป็นโมฆะ () {
ตัวกำหนดตารางเวลา.tick(); }
ในภาพหน้าจอที่ฉันแนบ คุณจะเห็นว่าช่อง 1 ถูกย้ายจาก 1,000 (เค้นเต็ม) เป็น 0 (ไม่ได้ใช้งาน)
FSX จะตรวจจับ Arduino เช่นเดียวกับจอยสติ๊กอื่น ๆ ดังนั้นเพียงแค่กำหนดปุ่มและแกนและสนุกกับการออกบิน!
สิ่งที่ฉันชอบเกี่ยวกับวิธีการนี้ก็คือ คุณสามารถใช้เครื่องส่งสัญญาณของคุณได้เหมือนกับโมเดลจริง เช่น โดยใช้ขั้นตอนการบิน ฯลฯ