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

Κατανόηση της μίξης καναλιών: 4 βήματα (με εικόνες)
Κατανόηση της μίξης καναλιών: 4 βήματα (με εικόνες)

Βίντεο: Κατανόηση της μίξης καναλιών: 4 βήματα (με εικόνες)

Βίντεο: Κατανόηση της μίξης καναλιών: 4 βήματα (με εικόνες)
Βίντεο: OK Mag: Η Ιωάννα Τούνη κάνει πεντικιούρ και θηλάζει τον γιο της 2024, Ιούλιος
Anonim
Image
Image
Μέθοδος ανάμιξης »Καμία
Μέθοδος ανάμιξης »Καμία

Εάν έχετε οδηγήσει ποτέ ένα πλαίσιο τηλεχειριστηρίου, υπάρχει μια καλή πιθανότητα να έχετε χρησιμοποιήσει μίξη, ακόμα κι αν δεν το γνωρίζατε. Συγκεκριμένα, εάν έχετε χρησιμοποιήσει ένα μόνο joystick ή ένα gimble για τον έλεγχο ενός οχήματος που χρησιμοποιεί ολίσθηση ή διαφορικό τιμόνι, έχετε χρησιμοποιήσει μίξη.

Η μίξη είναι απλώς ο τρόπος με τον οποίο χρησιμοποιούνται τα δεδομένα από το joystick για να καθοριστεί πόση ισχύς πρέπει να παρέχεται σε κάθε πλευρά του πλαισίου.

Εάν ανοίξετε ένα χειριστήριο, γενικά θα δείτε δύο ποτενσιόμετρα μέσα. Το ένα για να μετρήσετε την τρέχουσα θέση σας κατά μήκος του άξονα Υ (πάνω και κάτω) και το άλλο για να μετρήσετε πού βρίσκεστε κατά μήκος του άξονα Χ (από πλευρά σε πλευρά).

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

Αρχικά θέλω να σημειώσω ότι οι περισσότεροι πομπούς RC έχουν δυνατότητα ανάμιξης όπως και πολλοί ελεγκτές κινητήρα. Αυτές οι πληροφορίες θα είναι πιο χρήσιμες εάν πρέπει να κάνετε τη μίξη μόνοι σας στον κώδικά σας. Πείτε για παράδειγμα εάν χρησιμοποιείτε Arduino για να διαβάζετε μη αναμεμειγμένα δεδομένα από δέκτη RC ή διαβάζετε αναλογικά δεδομένα από τα δοχεία σε ένα joystick ή αν διαβάζετε τις συντεταγμένες από ένα ψηφιακό joystick σε μια εφαρμογή για κινητά.

Ας ρίξουμε μια ματιά σε μερικές διαφορετικές προσεγγίσεις μίξης.

Βήμα 1: Μέθοδος ανάμειξης »Καμία

Αρχικά ας ρίξουμε μια ματιά στο τι συμβαίνει εάν δεν χρησιμοποιείτε καθόλου μίξη. Εάν απλώς στείλετε τα δεδομένα από τον έναν άξονα στη μία πλευρά του πλαισίου και τον άλλο άξονα στην άλλη πλευρά, το όχημά σας δεν θα ανταποκριθεί με τον τρόπο που θέλετε.

Για παράδειγμα, αν σπρώξετε το χειριστήριο εντελώς προς τα εμπρός, ο άξονας Υ βρίσκεται στο πλήρες γκάζι και ο άξονας Χ στο 0. Έτσι, θα οδηγούσατε σε κύκλους αντί να συνεχίσετε ευθεία.

Βήμα 2: Μέθοδος Μέθοδος »Περιστροφή

Μέθοδος Μέθοδος »Περιστροφή
Μέθοδος Μέθοδος »Περιστροφή

Ένας συνεργάτης μου είπε κάποτε ότι, με ένα τσίμπημα, μπορείτε να περιστρέψετε τον πομπό σας κατά 45 μοίρες για τη μίξη ενός φτωχού ανθρώπου. Αν σκεφτείτε ότι οι τιμές από τα δύο ποτενσιόμετρα σε ένα joystick είναι ο άξονας x an y σε ένα πλέγμα (και οι δύο άξονες εκτείνονται από -100 έως +100) αυτό έχει πολύ νόημα επειδή πρόκειται να +100 και στους δύο άξονες καθώς σπρώχνετε το χειριστήριο πάνω και δεξιά. Έτσι, εάν αυτό αντιστοιχεί απευθείας στα δύο κανάλια πλαισίου σας (στην αριστερή και δεξιά πλευρά του ρομπότ σας) θα έκανε το ρομπότ σας να προχωρήσει.

Έτσι, η πρώτη μέθοδος ανάμιξης που δοκίμασα ήταν να περιστρέψω μαθηματικά το συντεταγμένο x και y 45 μοίρες γύρω από το κεντρικό σημείο του πλέγματος.

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

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

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

Ας δούμε μερικά παραδείγματα κώδικα.

ΣΗΜΕΙΩΣΕΙΣ ΓΙΑ ΤΑ ΠΑΡΑΔΕΙΓΜΑΤΑ ΤΟΥ ΚΩΔΙΚΟΥ ΜΟΥ: Αφήνω έξω πώς αποκτάτε τις τιμές του joystick_x και του joystick_y όπως θα άλλαζε ανάλογα με το έργο σας. Επίσης, θα χαρτογραφήσω/περιορίζω σε ± 100, αλλά πιθανόν να χρειαστεί να αντιστοιχίσετε σε 1000 - 2000 για PWM ή 0 - 255 για αναλογική έξοδο κλπ. Πάντα περιορίζω … για κάθε περίπτωση.

Παράδειγμα Arduino:

// περιστρέφεται μαθηματικά

διπλό rad = -45*M_PI/180; int leftThrottle = joystick_x * cos (rad) - joystick_y * sin (rad); int rightThrottle = joystick_y * cos (rad) + joystick_x * sin (rad); // περιορισμός leftThrottle = περιορισμός (leftThrottle, -100, 100); rightThrottle = περιορισμός (rightThrottle, -100, 100);

Παράδειγμα JavaScript:

// μαθηματικά rotatevar rad = -45*Math. PI/180; leftThrottle = joystick_x * Math.cos (rad) - joystick_y * Math.sin (rad); rightThrottle = joystick_y * Math.cos (rad) + joystick_x * Math.sin (rad); // constrainleftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = περιορισμός (rightThrottle, -100, 100); // helper functionvar constrain = function (num, min, max) {return Math.min (Math.max (num, min), max); };

Βήμα 3: Μέθοδος Μέθοδος »Απλό

Μέθοδος Μέθοδος »Απλό
Μέθοδος Μέθοδος »Απλό

Στη συνέχεια έχουμε μια πολύ απλή εξίσωση την οποία πήρα για πρώτη φορά από ένα από τα βίντεο του Shawn Hymel's Adventures in Science SparkFun όπου έτυχε να δουλεύει ένα πολύ παρόμοιο έργο με αυτό που δούλευα.

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

Και παρεμπιπτόντως δεν το αποκαλώ υποτιμητικά … υπάρχει μια ομορφιά στην απλότητα.

Παράδειγμα Arduino:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // περιορισμός leftThrottle = περιορισμός (leftThrottle, -100, 100); rightThrottle = περιορισμός (rightThrottle, -100, 100);

Παράδειγμα JavaScript:

var leftChannel = joystick_y + joystick_x;

var rightChannel = joystick_y - joystick_x; // περιορισμός leftChannel = περιορισμός (leftChannel, -100, 100); rightChannel = περιορισμός (rightChannel, -100, 100); // helper functionvar constrain = function (num, min, max) {return Math.min (Math.max (num, min), max); };

Βήμα 4: Μέθοδος Μέθοδος »Αναλογική

Μέθοδος Μέθοδος »Αναλογική
Μέθοδος Μέθοδος »Αναλογική

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

Καταλήγετε με μια κλίμακα -200 έως +200 προς όλες τις κατευθύνσεις στα παραδείγματά μου, το αντιστοιχίζω σε 100 because επειδή αντιπροσωπεύει το ποσοστό ισχύος που πηγαίνει σε κάθε κανάλι - ωστόσο θα θέλετε να το αντιστοιχίσετε σε ό, τι λειτουργεί στη χρήση σας - θήκη για τον ελεγκτή κινητήρα σας. Για παράδειγμα, εάν στέλνετε ένα σήμα PWM, μπορείτε να το αντιστοιχίσετε σε 1000 έως 2000 ή εάν στέλνετε ένα αναλογικό σήμα, μπορείτε να το αντιστοιχίσετε σε 0-255 και να ορίσετε την κατεύθυνση ως boolean κ.λπ.

Παράδειγμα Arduino:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // σε ορισμένες περιπτώσεις το μέγιστο είναι 100, σε ορισμένες περιπτώσεις είναι 200 // ας συνυπολογίσουμε τη διαφορά, οπότε το μέγιστο είναι πάντα 200int diff = abs (abs (joystick_y) - abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle - διαφορο: rightThrottle + διαφο? // Χάρτης από ± 200 έως ± 100 ή όποιο εύρος χρειάζεστε // constrainleftThrottle = περιορισμός (leftThrottle, -100, 100); rightThrottle = περιορισμός (rightThrottle, -100, 100);

Παράδειγμα JavaScript:

var leftThrottle = joystick_y + joystick_x; var rightThrottle = joystick_y - joystick_x; // σε ορισμένες περιπτώσεις το μέγιστο είναι 100, σε ορισμένες περιπτώσεις είναι 200, // ας συνυπολογίσουμε τη διαφορά, ώστε το μέγιστο να είναι πάντα 200var diff = Math.abs (Math.abs (joystick_y) - Math.abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle -diff: rightThrottle + diff; // Χάρτης από ± 200 πίσω έως 100 ± ή οτιδήποτε χρειάζεστεTeftottle = χάρτης (leftThrottle, -200, 200, -100, 100). -100, 100); // constrain leftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100); // ορισμένες βοηθητικές λειτουργίεςvar constrain = λειτουργία (num, min, max) {return Math.min (Math max (num, min), max); }; var map = λειτουργία (num, inMin, inMax, outMin, outMax) {var p, inSpan, outSpan, mapped; inMin = inMin + inMax; num = num + inMax; inMax = inMax + inMax; inSpan = Math.abs (inMax-inMin); p = (num/inSpan)*100; outMin = outMin + outMax; outMax = outMax + outMax; outSpan = Math.abs (outMax - outMin); αντιστοιχισμένο = outSpan*(p/100) - (outMax/2); επιστροφή χαρτογραφήθηκε;};

Συνιστάται: