Πίνακας περιεχομένων:

Μετατροπέας PPM σε Joystick με βάση το Arduino (JETI) για FSX: 5 βήματα
Μετατροπέας PPM σε Joystick με βάση το Arduino (JETI) για FSX: 5 βήματα

Βίντεο: Μετατροπέας PPM σε Joystick με βάση το Arduino (JETI) για FSX: 5 βήματα

Βίντεο: Μετατροπέας PPM σε Joystick με βάση το Arduino (JETI) για FSX: 5 βήματα
Βίντεο: Εισαγωγή στην Πληροφορική 2024, Ιούλιος
Anonim
Μετατροπέας PPM σε Joystick με βάση το Arduino (JETI) για FSX
Μετατροπέας PPM σε Joystick με βάση το Arduino (JETI) για FSX
Μετατροπέας PPM σε Joystick με βάση το Arduino (JETI) για FSX
Μετατροπέας PPM σε Joystick με βάση το Arduino (JETI) για FSX

Αποφάσισα να αλλάξω τον πομπό μου JETI DC-16 από τη Λειτουργία 2 στη Λειτουργία 1, η οποία βασικά αλλάζει το γκάζι και τον ανελκυστήρα από αριστερά προς τα δεξιά και αντίστροφα. Δεδομένου ότι δεν ήθελα να συντρίψω ένα από τα μοντέλα μου λόγω κάποιας σύγχυσης αριστερά/δεξιά στον εγκέφαλό μου, αναρωτιόμουν αν είναι δυνατόν να εξασκηθώ λίγο στο FSX.

Διάβασα και δοκίμασα τους πομπούς JETI που πράγματι υποστηρίζουν μια λειτουργία Joystick έξω από το κουτί, ωστόσο ήθελα πλήρη ευελιξία για τις εκχωρήσεις αξόνων και διακοπτών και χρησιμοποιούσα το TX όπως με ένα πραγματικό μοντέλο. Χρησιμοποιώντας την έξοδο του δέκτη, είναι επίσης δυνατό να αξιοποιήσετε την επεξεργασία σήματος στο DC-16 και να χρησιμοποιήσετε μίξερ, φάσεις πτήσης, διπλούς ρυθμούς, ό, τι μπορείτε να προγραμματίσετε εκεί.

Πρόσφατα βρήκα ένα ωραίο σεμινάριο για το πώς να φτιάξετε μια συσκευή εισόδου USB HID, δηλαδή ένα Joystick, από ένα φθηνό Arduino όπως το Pro Micro:

www.instructables.com/id/Create-a-Joystick…

Αυτό θα επέτρεπε όλα όσα χρειάζονταν για τον έλεγχο ενός αεροπλάνου / ελικοπτέρου / οτιδήποτε υπάρχει στο FSX! Άφθονοι άξονες και κουμπιά διαθέσιμα.

Δεδομένου ότι είχα μόλις ένα εφεδρικό JETI RSAT2, αποφάσισα να το συνδέσω με το Arduino και να προσπαθήσω να υλοποιήσω έναν μικρό αναλυτή PPM μαζί με τη βιβλιοθήκη Joystick.

Υποθέτω ότι κάποιος που ακολουθεί αυτά τα βήματα είναι εξοικειωμένος με τη σύνδεση και τον προγραμματισμό ενός Arduino. Δεν θα λάβω καμία εγγύηση για δυσλειτουργίες ή ζημιές!

Προμήθειες

Θα χρειαστείτε…

  • οποιοδήποτε Arduino υποστηρίζεται από τη βιβλιοθήκη Joystick, χρησιμοποίησα ένα Sparkfun Pro Micro 5V / 16 MHz
  • μια πρόσφατη έκδοση του Arduino IDE
  • οποιοσδήποτε δέκτης RC που βγάζει σήμα PPM, όπως το JETI RSAT2
  • μερικά καλώδια άλματος (ελάχιστο 3)
  • τη βιβλιοθήκη Joystick που είναι εγκατεστημένη στο Arduino IDE
  • η βιβλιοθήκη arduino-timer:

Βήμα 1: Συνδέστε το RX και το Arduino

Wire Up το RX και το Arduino
Wire Up το RX και το Arduino
Wire Up το RX και το Arduino
Wire Up το RX και το Arduino

Η καλωδίωση είναι αρκετά απλή. Αποφάσισα να τροφοδοτήσω το Arduino μόνο από USB, αφού θα μιμηθεί μια συσκευή Joystick. Αυτό θα τροφοδοτήσει το Arduino με 5V, το οποίο μπορεί να χρησιμοποιηθεί και για την τροφοδοσία του δέκτη RC.

Χρησιμοποίησα το Pin VCC, το οποίο παρέχει ρυθμιζόμενη έξοδο, και τον πλησιέστερο ακροδέκτη Gnd - απλώς συνδέστε τον με τις ακίδες σύνδεσης + και - του PPM. Όταν τροφοδοτείται το Arduino, ενεργοποιείται και ο δέκτης.

Για το σήμα PPM, αποφάσισα να χρησιμοποιήσω διακοπές για να τις αναλύσω. Διακοπές είναι διαθέσιμες π.χ. στο Pin 3, απλώς συνδέστε το εκεί - δεν υπάρχει "εγγενής ακίδα RC" στο arduino, αλλά πιθανώς περισσότεροι και διαφορετικοί τρόποι ανάγνωσης στο σήμα του δέκτη.

Έπρεπε να απενεργοποιήσω τον συναγερμό τάσης RX, καθώς η τάση VCC με τροφοδοσία USB θα είναι περίπου 4,5V μόνο - αλλά αρκετά σταθερή, οπότε κανένα πρόβλημα.

Βήμα 2: Λήψη ορισμένων σημάτων PPM

Λήψη ορισμένων σημάτων PPM
Λήψη ορισμένων σημάτων PPM
Λήψη ορισμένων σημάτων PPM
Λήψη ορισμένων σημάτων PPM

Όταν τροφοδοτείται ο δέκτης ΚΑΙ ο TX, έπαιρνα σήματα PPM όπως φαίνεται στην εικόνα. 16 κανάλια, επαναλαμβανόμενα για πάντα. Εάν το Failsafe στο RSAT είναι απενεργοποιημένο και ο πομπός είναι απενεργοποιημένος, η έξοδος PPM θα απενεργοποιηθεί.

Περισσότερες πληροφορίες για το PPM είναι διαθέσιμες εδώ:

  • https://en.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. Οι κύριες λειτουργίες aileron, ανελκυστήρας, πηδάλιο και γκάζι η καθεμία απαιτεί μόνο ένα σερβο αντίστοιχα κανάλι πομπού. Πρόσθεσα επίσης πτερύγια, φρένα και γρανάζια, αφήνοντας 9 κανάλια δωρεάν μέχρι στιγμής. Λάβετε υπόψη ότι τα πτερύγια τοποθετήθηκαν σε φάση πτήσης και δεν ελέγχονται απευθείας μέσω ραβδιού, ρυθμιστικού ή κουμπιού.

Βήμα 4: Εκτέλεση του Joystick

Τρέξιμο του Joystick
Τρέξιμο του Joystick
Τρέξιμο του Joystick
Τρέξιμο του Joystick

Η βιβλιοθήκη Joystick είναι αρκετά εύκολη στη χρήση και παρέχει μερικά παραδείγματα και δοκιμές. Θα ήταν χρήσιμο να ελέγξετε πρώτα αν το Arduino εντοπίζεται ως σωστό Joystick, οι οδηγίες που συνδέονται στην ενότητα εισαγωγής και η ίδια η βιβλιοθήκη παρέχουν κάποιες καλές οδηγίες.

Στον πίνακα ελέγχου Συσκευές και εκτυπωτές, το Arduino εμφανιζόταν ως "Sparkfun Pro Micro" και το παράθυρο δοκιμής του joystick έδειχνε 7 άξονες και πολλά υποστηριζόμενα κουμπιά. Ακόμα και ένας διακόπτης καπέλου μπορεί να χρησιμοποιηθεί όταν είναι προγραμματισμένος στο Arduino.

Βήμα 5: Κωδικοποίηση του Arduino

Κωδικοποίηση του Arduino
Κωδικοποίηση του Arduino
Κωδικοποίηση του Arduino
Κωδικοποίηση του Arduino

Αυτό που εξακολουθεί να λείπει είναι η πραγματική ανάλυση του σήματος PPM και η ανάθεση σε άξονες και κουμπιά Joystick. Αποφάσισα για την ακόλουθη χαρτογράφηση:

Εκχώρηση καναλιού / λειτουργίας / Joystick:

  1. Γκάζι -> Άξονας γκαζιού
  2. Άιλερον -> άξονας Χ
  3. Ανελκυστήρας -> άξονας Υ
  4. Πηδάλιο -> άξονας περιστροφής Χ
  5. Πτερύγια -> άξονας περιστροφής Υ
  6. Φρένο -> άξονας Ζ
  7. Gear -> Κουμπί 0

Όταν η ταχύτητα είναι κατεβασμένη, το πρώτο κουμπί του Joystick πρέπει να πατηθεί και να απελευθερωθεί κατά την ανύψωση της ταχύτητας. Ωστόσο, αυτό θα απαιτήσει FSUIPC για FSX, εκτός κουτιού, το FSX θα δεχτεί μόνο ένα κουμπί για την εναλλαγή του γραναζιού, κάτι που δεν συμβαίνει ακριβώς με τα μοντέλα μου.

Παρέδωσα την τρέχουσα έκδοση του κώδικα με πολλά σχόλια, τα οποία λειτουργούν αρκετά καλά για μένα - μη διστάσετε να αλλάξετε την εργασία σας ή να προσθέσετε νέες λειτουργίες. Τα τελευταία 9 κανάλια RC δεν χρησιμοποιούνται προς το παρόν.

Για τη ρύθμιση, η κλάση Joystick πρέπει να προετοιμαστεί, βασικά καθορίζοντας τα εύρη των αριθμητικών αξόνων:

/ * Ορισμός εύρους αξόνων (ορίζεται στην κεφαλίδα, 0 - 1000) */

Joystick.setXAxisRange (CHANNEL_MIN, CHANNEL_MAX); Joystick.setYAxisRange (CHANNEL_MIN, CHANNEL_MAX); …

Χρησιμοποιώντας τιμές από 0 έως 1000, είναι δυνατή η απευθείας αντιστοίχιση του μήκους του παλμού (600 - 1600μs) στις τιμές του joystick χωρίς επανατοποθέτηση.

Το DIN 3 είναι αρχικοποιημένο ως ψηφιακή είσοδος, ενεργοποιημένα τα τραβήγματα και επισυνάπτεται μια διακοπή:

pinMode (PPM_PIN, INPUT_PULLUP);

attachInterrupt (digitalPinToInterrupt (PPM_PIN), PPM_Pin_Changed, CHANGE);

Για λόγους εντοπισμού σφαλμάτων, πρόσθεσα μερικές εκτυπώσεις μέσω της σειριακής διεπαφής σε τακτά χρονικά διαστήματα, χρησιμοποιώντας τη βιβλιοθήκη arduino-timer:

εάν (SERIAL_PRINT_INTERVAL> 0) {

scheduler.every (SERIAL_PRINT_INTERVAL, (άκυρο*) -> bool {SerialPrintChannels (); return true;}); }

Η διακοπή του πείρου θα καλείται κάθε φορά που η λογική τιμή του πείρου έχει αλλάξει, έτσι για κάθε άκρη στο σήμα PPM. Αξιολογήστε το μήκος παλμού με απλό χρονισμό χρησιμοποιώντας micros ():

uint32_t curTime = micros ();

uint32_t pulseLength = curTime - edgeTime; uint8_t curState = digitalRead (PPM_PIN);

Αξιολογώντας την τρέχουσα κατάσταση του πείρου και συνδυάζοντάς το με το μήκος του παλμού και τους παλμούς του παρελθόντος, οι νέοι παλμοί μπορούν να ταξινομηθούν. Τα ακόλουθα υπό όρους θα ανιχνεύσουν το κενό μεταξύ πλαισίων:

εάν (lastState == 0 && pulseLength> 3000 && pulseLength <6000)

Για τους επόμενους παλμούς, το μήκος του παλμού θα χαρτογραφηθεί σε μια κατάσταση άξονα περικόπτοντας και πόνοντας το μήκος παλμού για να ταιριάζει με το εύρος του άξονα του χειριστηρίου:

uint16_t rxLength = pulseLength;

rxLength = (rxΜήκος> 1600); 1600: rxLength; rxLength = (rxLength <600); 600: rxLength; rxChannels [curChannel] = rxLength - 600;

Ο πίνακας rxChannels περιέχει τελικά 16 τιμές από 0 - 1000, υποδεικνύοντας τις θέσεις ραβδιών / ρυθμιστικών και κουμπιών.

Μετά τη λήψη 16 καναλιών, πραγματοποιείται η αντιστοίχιση στο Joystick:

/ * άξονες */

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.

Και μην ξεχάσετε να σημειώσετε τον προγραμματιστή… αλλιώς, δεν θα είναι ορατές εκτυπώσεις εντοπισμού σφαλμάτων.

void loop () {

scheduler.tick (); }

Στο στιγμιότυπο οθόνης που επισυνάπτω μπορείτε να δείτε, το κανάλι 1 μεταφέρθηκε από το 1000 (πλήρες γκάζι) στο 0 (σε αδράνεια).

Το FSX θα ανιχνεύσει το Arduino όπως κάθε άλλο Joystick, οπότε απλώς εκχωρήστε το κουμπί και τους άξονες και διασκεδάστε απογειώνοντας!

Αυτό που μου αρέσει πολύ σε αυτήν την προσέγγιση είναι ότι μπορείτε απλά να χρησιμοποιήσετε τον πομπό σας όπως με ένα πραγματικό μοντέλο, π.χ. χρησιμοποιώντας φάσεις πτήσης κλπ.

Συνιστάται: