สารบัญ:

Arduino Based (JETI) PPM เป็น USB Joystick Converter สำหรับ FSX: 5 ขั้นตอน
Arduino Based (JETI) PPM เป็น USB Joystick Converter สำหรับ FSX: 5 ขั้นตอน

วีดีโอ: Arduino Based (JETI) PPM เป็น USB Joystick Converter สำหรับ FSX: 5 ขั้นตอน

วีดีโอ: Arduino Based (JETI) PPM เป็น USB Joystick Converter สำหรับ FSX: 5 ขั้นตอน
วีดีโอ: Super Cheap DIY Wireless RC Sim Dongle - use your own transmitter in Heli X / Phoenix etc. 2024, กรกฎาคม
Anonim
Arduino Based (JETI) PPM เป็นตัวแปลงจอยสติ๊ก USB สำหรับ FSX
Arduino Based (JETI) PPM เป็นตัวแปลงจอยสติ๊ก USB สำหรับ FSX
Arduino Based (JETI) PPM เป็นตัวแปลงจอยสติ๊ก USB สำหรับ FSX
Arduino Based (JETI) PPM เป็นตัวแปลงจอยสติ๊ก USB สำหรับ FSX

ฉันตัดสินใจเปลี่ยนเครื่องส่ง 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

ต่อ RX และ Arduino
ต่อ RX และ Arduino
ต่อ RX และ Arduino
ต่อ RX และ Arduino

การเดินสายไฟค่อนข้างตรงไปตรงมา ฉันตัดสินใจที่จะจ่ายไฟให้กับ Arduino จาก USB เท่านั้น เนื่องจากมันจะจำลองอุปกรณ์จอยสติ๊ก สิ่งนี้จะจ่าย Arduino กับ 5V ซึ่งสามารถใช้สำหรับเปิดเครื่องรับ RC ได้

ฉันใช้ Pin VCC ซึ่งให้เอาต์พุตที่มีการควบคุม และพิน Gnd ที่ใกล้ที่สุด - เพียงแค่เชื่อมต่อกับตัวเชื่อมต่อ + และ - พินของ PPM เมื่อ Arduino ได้รับพลังงาน ตัวรับสัญญาณก็กำลังเปิดเครื่องเช่นกัน

สำหรับสัญญาณ PPM ฉันตัดสินใจใช้การขัดจังหวะเพื่อแยกวิเคราะห์ มีการขัดจังหวะเช่น ที่พิน 3 ดังนั้นเพียงแค่เชื่อมต่อที่นั่น - ไม่มี "หมุด RC ดั้งเดิม" บน Arduino แต่อาจมีวิธีการอ่านสัญญาณเครื่องรับที่มากกว่าและแตกต่างกัน

ฉันต้องปิดการเตือนแรงดันไฟฟ้า RX เนื่องจากแรงดันไฟฟ้า VCC พร้อมแหล่งจ่าย USB จะอยู่ที่ประมาณ 4.5V เท่านั้น - แต่ค่อนข้างเสถียร ดังนั้นจึงไม่มีปัญหาเลย

ขั้นตอนที่ 2: รับสัญญาณ PPM บางส่วน

รับสัญญาณ PPM บางส่วน
รับสัญญาณ PPM บางส่วน
รับสัญญาณ PPM บางส่วน
รับสัญญาณ 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

การเข้ารหัส Arduino
การเข้ารหัส Arduino
การเข้ารหัส Arduino
การเข้ารหัส Arduino

สิ่งที่ยังคงขาดหายไปคือการแยกวิเคราะห์สัญญาณ PPM และการกำหนดแกนและปุ่มของจอยสติ๊ก ฉันตัดสินใจทำแผนที่ต่อไปนี้:

ช่อง / ฟังก์ชั่น / การกำหนดจอยสติ๊ก:

  1. คันเร่ง -> แกนคันเร่ง
  2. ปีกเครื่องบิน -> แกน X
  3. ลิฟต์ -> แกน Y
  4. หางเสือ -> แกนหมุน X
  5. แผ่นปิด -> แกนหมุน Y
  6. เบรค -> แกน Z
  7. เกียร์ -> ปุ่ม 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 เช่นเดียวกับจอยสติ๊กอื่น ๆ ดังนั้นเพียงแค่กำหนดปุ่มและแกนและสนุกกับการออกบิน!

สิ่งที่ฉันชอบเกี่ยวกับวิธีการนี้ก็คือ คุณสามารถใช้เครื่องส่งสัญญาณของคุณได้เหมือนกับโมเดลจริง เช่น โดยใช้ขั้นตอนการบิน ฯลฯ

แนะนำ: