Έλεγχος joystick του σερβομηχανισμού arduino. Φτιάχνουμε άλλο ένα joystick (gamepad) στο Arduino. Τι χρειαζόμαστε

Η χρήση ενός joystick είναι ένας από τους τρόπους ανταλλαγής πληροφοριών μεταξύ ενός ατόμου και μιας συσκευής (υπολογιστή, μικροελεγκτή) που βασίζεται στο Arduino. Τις περισσότερες φορές χρησιμοποιούνται για τον έλεγχο μηχανισμών ή ρομπότ. Κατ' αναλογία με τον γνωστό κόσμο των τυχερών παιχνιδιών, τα joystick ονομάζονται επίσης και gamepad. Το gamepad είναι απλό και εύκολο στη χρήση. Σήμερα υπάρχει μεγάλος αριθμός τύπων joystick όσον αφορά τον αριθμό των βαθμών ελευθερίας, τη συχνότητα ανάγνωσης πληροφοριών και την τεχνολογία που χρησιμοποιείται. Σε αυτό το άρθρο, θα εξετάσουμε την πιο δημοφιλή επιλογή, θα μάθουμε πώς να ελέγχετε το joystick και πώς να το συνδέσετε.

Το αναλογικό μοχλό μοιάζει με ένα πόμολο που είναι τοποθετημένο σε μια άρθρωση με δύο ποτενσιόμετρα που καθορίζουν τους άξονες X και Y και ένα κουμπί Z. Γείρετε ή γυρίστε το κουμπί περιστρέφει μια ειδική κινούμενη επαφή, η οποία αλλάζει την τάση εξόδου. Το ίδιο το gamepad είναι εξοπλισμένο με ένα ελατήριο, χάρη στο οποίο επιστρέφει ομαλά στην αρχική του κεντρική κατάσταση αφού το απελευθερώσετε από οποιαδήποτε θέση. Η συσκευή σάς επιτρέπει να παρακολουθείτε πιο ομαλά τον βαθμό απόκλισης από το κεντρικό (μηδέν) σημείο.

Σύνδεση joystick σε arduino

Η σύνδεση του joystick στο Arduino Uno πραγματοποιείται σύμφωνα με το παρακάτω διάγραμμα.

Η μονάδα έχει 5 εξόδους - Vcc, Gnd, X, Y και Key (οι χαρακτηρισμοί ενδέχεται να διαφέρουν ανάλογα με τη συσκευή).

Τα δεδομένα στον άξονα X εξάγονται στην είσοδο A0, κατά μήκος του άξονα Y - στο A1. Για οπτικό έλεγχο του πατήματος του κουμπιού, μπορείτε επίσης να συνδέσετε το LED D11. Η ισχύς παρέχεται από τάση 5 βολτ. Η ακίδα GND συνδέεται με την ίδια ακίδα στην πλακέτα Arduino. Ο ακροδέκτης SW μπορεί να συνδεθεί σε οποιαδήποτε ψηφιακή ακίδα.

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

Πώς να παρακολουθείτε την τρέχουσα θέση ή κατεύθυνση του joystick

Για να χρησιμοποιήσουμε το joystick σε ένα πραγματικό έργο, πρέπει να γράψουμε ένα σκίτσο για να επεξεργαστούμε τα δεδομένα που στέλνει το joystick κατά τη λειτουργία του.

Μπορείτε να μάθετε σε ποια θέση βρίσκεται αυτή τη στιγμή η συσκευή, ανάλογα με τις τιμές των ποτενσιόμετρων. Η κίνηση πραγματοποιείται προς την κατεύθυνση των αξόνων X και Y που είναι κάθετοι. Οι πληροφορίες διαβάζονται από το gamepad χρησιμοποιώντας - εμφανίζει τιμές στην περιοχή από 0 έως 1023. Ως ορίσματα, λαμβάνει τους αριθμούς των ακίδων στο οποίο είναι συνδεδεμένο το joystick:

Serial.println(analogRead(A0)); // δείχνει τη θέση της συντεταγμένης Χ

Serial.println(analogRead(A1)); // δείχνει τη θέση της συντεταγμένης Y

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

byte const PIN_ANALOG_X = A0; // σταθερά για τη συντεταγμένη Χ

byte const PIN_ANALOG_Y = A1; // σταθερά για τη συντεταγμένη Y

Καθορισμός της κατεύθυνσης κίνησης με το joystick

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

Με την τιμή των θέσεων των αξόνων X και Y, μπορείτε να μάθετε εάν το joystick βρίσκεται στο κέντρο ή εάν έχει συμβεί μια μετατόπιση. Οι τιμές προς όλες τις κατευθύνσεις κυμαίνονται από 0 έως 1023, όπως αναφέρθηκε προηγουμένως. Πρώτα απ 'όλα, έρχεται η σκέψη ότι το κεντρικό σημείο θα είναι περίπου στην τιμή 511-512. Αυτό το συμπέρασμα δεν είναι απολύτως σωστό, αφού δεν μπορεί να προσδιοριστεί μια απολύτως ακριβής θέση.

Ο λανθασμένος προσδιορισμός της κεντρικής τιμής μπορεί να οδηγήσει σε εσφαλμένες πληροφορίες σχετικά με την κίνηση του joystick εάν βρίσκεται σε ακίνητη κατάσταση. Για να το κάνετε αυτό, επιλέξτε ένα αριθμητικό εύρος και υποθέστε υπό όρους ότι οποιαδήποτε τιμή σε αυτό θα είναι το κεντρικό σημείο. Οι τιμές πρέπει να προσαρμοστούν για κάθε τύπο joystick, αλλά κατά προσέγγιση θα είναι στην περιοχή 505-518. Οι τιμές που προκύπτουν γράφονται στον κώδικα ως σταθερές:

const int X_THRESHOLD_LOW = 505;

const int X_THRESHOLD_HIGH = 518;

const int Y_THRESHOLD_LOW = 500;

const int Y_THRESHOLD_HIGH = 510;

Το επόμενο βήμα είναι να μετατρέψετε τις συντεταγμένες σε ένα εύρος από -1 έως 1. Για το X -1 κινείται προς τα αριστερά, το 0 δεν είναι κίνηση, το 1 είναι δεξιά. Στο Y -1 - κίνηση προς τα κάτω, 0 - κεντρική τιμή, 1 - προς τα πάνω. Αρχικά, ορίζουμε όλες τις τιμές στο κέντρο 0. Για να ελέγξουμε αν συμβαίνει η κίνηση, χρησιμοποιούμε δηλώσεις if / else.

Παγίδες στη δουλειά του gamepad

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

Το δεύτερο πρόβλημα μπορεί να ονομαστεί η παρουσία των λεγόμενων νεκρών ζωνών. Οι δύο ακραίες τιμές με τις μεγαλύτερες αποκλίσεις πρέπει να είναι ίσες με 0 V και την τάση τροφοδοσίας. Στην πραγματικότητα, αυτές οι τιμές μπορεί να διαφέρουν, καθώς δεν χρησιμοποιείται ολόκληρο το ηλεκτρικό εύρος αλλαγής αντίστασης. Για να λυθεί αυτό το πρόβλημα, τα ακραία σημεία μπορούν να αντιστοιχούν σε τιμές 1 kΩ και 9 kΩ.

Πλακέτα επέκτασης ασπίδας JoyStick

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

Σκεφτείτε τι είναι αυτή η ασπίδα από τον παγκοσμίως διάσημο κατασκευαστή arduino Sparkfun. Αυτό το gamepad λειτουργεί καλά και είναι σχετικά φθηνό. Η συσκευή μπορεί να παραδοθεί σε ελαφρώς αποσυναρμολογημένη μορφή, επομένως πρέπει πρώτα να συναρμολογηθεί.


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

συμπέρασμα

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

Η σύνδεση μιας έτοιμης μονάδας δεν είναι δύσκολη· το ίδιο το σκίτσο ελέγχου είναι επίσης πολύ προσιτό. Τις περισσότερες φορές, το joystick χρησιμοποιείται σε χώρο με κουμπιά και συνδυάζεται με ασύρματες διεπαφές, επειδή είναι σχεδόν αδύνατο να ελέγξετε ένα joystick σε ένα καλώδιο με συσκευές που κινούνται γρήγορα. Ως εκ τούτου, συνιστάται η χρήση έτοιμων ασπίδων για εργασία, που έχουν όλα όσα χρειάζεστε.

Είχα ένα arduino nano (ένας κινέζικος κλώνος υψηλής ποιότητας από τη RobotDyn). Και εδώ τις προάλλες ήρθε επίσης ένας σερβοκινητήρας και ένας χειριστής από την Κίνα, και υπήρχε επίσης χρόνος να το καταλάβω λίγο. Λοιπόν, ο στόχος μου ήταν απλός: να συνδέσω ένα arduino nano, έναν σερβοκινητήρα και ένα joystick και να περιστρέφεται ο σερβομηχανισμός όταν περιστρέφεται το joystick. Για πρακτικούς σκοπούς, αυτό μπορεί να χρησιμοποιηθεί, για παράδειγμα, για τον έλεγχο της περιστροφής της κάμερας.

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

1. Σύνδεση Arduino και Servo:

  • καφέ (στο σερβο μου) σύρμα - γείωση (gnd)?
  • κόκκινο καλώδιο - 5v;
  • πορτοκαλί σύρμα - 8 καρφίτσες.

2. Σύνδεση Arduino και joystick:

  • gnd - gnd;
  • 5v - 5v (συνέδεσα σε 3.3v).
  • VRX (σήμα για συντεταγμένες X) - A1;
  • VRY (σήμα για συντεταγμένες Υ) - A0;
  • SW (λειτουργία κουμπιού - πατημένο ή απελευθερωμένο) - 2 ακίδες.

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

#περιλαμβάνω //Βιβλιοθήκη για εργασία με σερβοκινητήρα int xPin = A1; //A1 - αναλογικό σήμα συντεταγμένες X του joystick int yPin = A0; //A0 - αναλογικό σήμα Συντεταγμένες Y του κουμπιού joystick intPin = 2; // Καρφίτσα για λειτουργία κουμπιού (πατημένο ή απελευθερωμένο) int xPosition = 0; // μεταβλητή για την αποθήκευση της τρέχουσας θέσης του joystick κατά μήκος του άξονα X int yPosition = 0; // μεταβλητή για την αποθήκευση της τρέχουσας θέσης του joystick κατά μήκος του άξονα Y int buttonState = 0; //κατάσταση τρέχοντος κουμπιού (πατημένο) int servoPin = 8; // pin για σήματα από τον σερβοκινητήρα Servo servo. // μεταβλητή τύπου Servo int angle = 90; //γωνία εκκίνησης περιστροφής του σερβοκινητήρα int ρεύμαXpos = 0; //Τρέχουσα θέση X void setup() ( pinMode(xPin, INPUT); // Το σήμα με xPin ορίζεται ως σήμα εισόδου pinMode(yPin, INPUT); // Το σήμα με yPin ορίζεται ως ένα σήμα εισόδου pinMode(buttonPin, INPUT_PULLUP); / / ενεργοποίηση pull-up αντίστασης στην καρφίτσα του κουμπιού servo.attach(servoPin); // προσάρτηση ακίδας servo.write(γωνία); // Περιστροφή σερβομηχανισμού 90 μοίρες ) void loop() ( xPosition = analogRead(xPin); // ανάγνωση τιμής xPin yPosition = analogRead(yPin); // ανάγνωση της τιμής του yPin buttonState = digitalRead(buttonPin); // ανάγνωση της "κατάστασης" του κουμπιού // εάν η τιμή xPosition είναι μεγαλύτερη από 360 εάν(xPosition > 360) ( γωνία = γωνία-10; // μειώστε τη γωνία περιστροφής κατά 10 μοίρες // εάν η γωνία είναι μικρότερη από 0 εάν (γωνία< 0) { angle = 0; //устанавливаем значение угла 0 градусов } } //если xPosition меньше 300 if(xPosition < 300) { angle = angle+10; // увеличиваем угол поворота сервомотора на 10 градусов //если угол поворота больше 180 градусов if(angle >180) ( γωνία = 180; //ρυθμίστε την τιμή γωνίας σε 180 μοίρες ) ) // εάν πατηθεί το κουμπί του joystick εάν (buttonState == 0) (γωνία = 90; //ρυθμίστε τη γωνία σε 90 μοίρες) servo.write (γωνία); // γυρίστε τον σερβομηχανισμό στην επιθυμητή καθυστέρηση γωνίας(50); // προσθήκη καθυστέρησης μεταξύ της ανάγνωσης δεδομένων )

Όταν το joystick ήταν συνδεδεμένο σε τροφοδοτικό 3,3 V, η προεπιλεγμένη τιμή για τις θέσεις X και Y ήταν 330 (όταν συνδέεται σε 5V, οι τιμές μπορεί να είναι διαφορετικές), για να ελέγξετε τις τιμές του τις τρέχουσες ενδείξεις, πήρα μια απόκλιση από την αρχική τιμή των 30 μονάδων.

Μπορείτε να παρακολουθείτε τις τιμές των αναλογικών σημάτων χρησιμοποιώντας την οθόνη σειριακής θύρας (μπορείτε να την ανοίξετε ως εξής: εργαλεία -> οθόνη θύρας ή CTRL + SHIFT + M). Για αυτό, στη συνάρτηση εγκατάσταση ()πρέπει να γράψετε τα εξής:

Serial.begin(9600); // αρχικοποίηση της ανταλλαγής δεδομένων μέσω του σειριακού πρωτοκόλλου με ταχύτητα 9600 bps

Σε λειτουργία βρόχος()γράψε τα εξής:

Serial.print("X: "); Serial.print(xPosition); Serial.print(" | Y: "); Serial.print(yPosition); Serial.print(" | Κουμπί: "); Σειριακή εκτύπωσηln(buttonState);

Ακολουθεί ένα βίντεο με το τι συνέβη:

Έτσι, σε αυτό το άρθρο, εξετάζεται η διαδικασία σύνδεσης ενός σερβοκινητήρα και ενός joystick στο Arduino Nano, δίνεται ένα παράδειγμα σκίτσου. Στο μέλλον, σκοπεύω να συνδέσω έναν δεύτερο σερβοκινητήρα για να χρησιμοποιήσω πλήρως τις δυνατότητες του joystick και να περιστρέφομαι κατά μήκος των αξόνων X και Y.

Νέα άρθρα


Μια απλή υλοποίηση ενός πεδίου κειμένου με αναπτυσσόμενες υποδείξεις (παρόμοια με τις αναζητήσεις Yandex και Google) κατά την εισαγωγή κειμένου σε C# WPF. Εφαρμογή ελέγχου χρήστη σε C#/

Νέα άρθρα

● Έργο 18: Επεξεργασία δεδομένων από το joystick. Joystick Pan/Tilt Bracket Control

Σε αυτό το πείραμα, θα εξετάσουμε τη σύνδεση ενός αναλογικού joystick δύο αξόνων στο Arduino.

Απαιτούμενα εξαρτήματα:

Ένα joystick είναι εξαιρετικό για τον έλεγχο οποιασδήποτε συσκευής που βασίζεται σε Arduino που κινείται σε σύστημα συντεταγμένων 2D. Για τις πλακέτες Arduino, υπάρχουν αναλογικές μονάδες joystick που έχουν άξονα X, Y (ποτενσιόμετρα 10 kΩ) και ένα πρόσθετο κουμπί - τον άξονα Z. Το joystick σάς επιτρέπει να παρακολουθείτε ομαλά και με ακρίβεια τον βαθμό απόκλισης από το σημείο μηδέν. Το ίδιο το joystick έχει ελατήριο, επομένως θα επιστρέψει στην κεντρική κατάσταση αφού απελευθερωθεί από μια συγκεκριμένη θέση.
Οι ακίδες Vcc και GND μεταξύ και των τριών ομάδων ακίδων συνδέονται. Έτσι, χρειάζονται 5 καλώδια για τη σύνδεση: άξονας X, άξονας Y, κουμπί Z, τροφοδοσία Vcc και κοινό GND. Τα Joysticks είναι παθητικές μονάδες και δεν αντλούν ισχύ από την πλακέτα του Arduino. Οι ακίδες VERT και HORZ συνδέονται στις αναλογικές εισόδους A0 και A1 του Arduino, SEL - στην ψηφιακή είσοδο D2. Το διάγραμμα σύνδεσης φαίνεται στην εικ. 18.1.

Ρύζι. 18.1. Διάγραμμα καλωδίωσης πλακέτας joystick στο Arduino

Ας γράψουμε ένα σκίτσο για την ανάγνωση δεδομένων joystick και την έξοδο τιμών στην οθόνη σειριακής θύρας Arduino IDE. Το περιεχόμενο του σκίτσου φαίνεται στην Λίστα 18.1.

Const int axisX=A0 // Ο άξονας Χ είναι συνδεδεμένος στο A0 const int axisY=A1 // Ο άξονας Y συνδέεται με το A1 const int axisZ=2 // Άξονας Z (κουμπί joystick) συνδεδεμένος στο D2 int valX, valY, valZ = 0 ; void setup()( pinMode(axis_Z, INPUT_PULLUP); // ρυθμίστε το D2 ως ΕΙΣΟΔΟ με συμπερίληψη // pull-up αντίσταση μέσα στον επεξεργαστή Serial.begin(9600); ) void loop()( valX = analogRead(axisX); // τιμή του άξονα X valY = analogRead(axisY); // τιμή του άξονα Y valZ = 1 -digitalRead(axisZ); // Τιμή άξονα Z (κουμπί) // τιμές εξόδου στην οθόνη Serial.print("X:" );Serial.print(valX, DEC); Serial.print(" | Y:" );Serial.print(valY, DEC) Serial.print(" | Z: " );Serial.println(valZ, DEC); καθυστέρηση (500 ); // παύση πριν από την επόμενη ανάγνωση δεδομένων }
Εντολή σύνδεσης:

1. Συνδέουμε το joystick στην πλακέτα Arduino σύμφωνα με το διάγραμμα στο σχ. 18.2.
2. Φορτώστε το σκίτσο από τη λίστα 18.1 στον πίνακα Arduino.
3. Κοιτάμε στην οθόνη σειριακής θύρας Arduino IDE για να εμφανίσουμε τις τιμές μετατόπισης στους άξονες X και Y και την κατάσταση του κουμπιού (άξονας Z).

Ρύζι. 18.2. Διάγραμμα καλωδίωσης πλακέτας Joystick και βραχίονα παν/τίτλου για το Arduino


Ας δημιουργήσουμε ένα πιο κατανοητό παράδειγμα χρήσης ενός joystick για τον έλεγχο της θέσης ενός βραχίονα Pan/Titl με δύο σερβομηχανισμούς, στον οποίο μπορείτε να τοποθετήσετε, για παράδειγμα, μια κάμερα και να αλλάξετε τη θέση της κάμερας αριστερά/δεξιά και κάτω/πάνω χρησιμοποιώντας το joystick. Το διάγραμμα καλωδίωσης για αυτό το πείραμα φαίνεται στο σχ. 18.2.
Μετακινώντας το joystick κατά μήκος του άξονα Χ θα ελέγξουμε την περιστροφή του κάτω σερβομηχανισμού (αριστερά/δεξιά), μετακινώντας το joystick κατά μήκος του άξονα Y θα ελέγξουμε την περιστροφή του άνω σερβομηχανισμού (πάνω/κάτω). Η μέση ουδέτερη θέση του joystick σε κάθε άξονα (με αναλογική τιμή 512) αντιστοιχεί στη γωνία περιστροφής του σερβομηχανισμού κατά γωνία 90°. Τα περιεχόμενα του σκίτσου εμφανίζονται στην Λίστα 18.2.

#περιλαμβάνω // σύνδεση της βιβλιοθήκης Servo Servo servo1, servo2; const int pinServo1=8 ; // Καρφίτσα για σύνδεση 1 σερβομηχανισμού const int pinServo2=9 ; // Καρφώστε για να συνδέσετε 2 σερβομηχανισμούς // μεταβλητές για την αποθήκευση των γωνιών περιστροφής των σερβομηχανισμών int angleServo1,angleServo2 = 0 ; const int axisX=A0; // Ο άξονας Χ είναι συνδεδεμένος στο A0 const int axisY=A1; // Ο άξονας Y συνδέεται με το A1 int valX, valY = 0 ; // μεταβλητές για την αποθήκευση τιμών αξόνων void setup(){ // συνδέστε τη μεταβλητή servo1 με τον pinServo1 pin servo1.attach(pinServo1); // συνδέστε τη μεταβλητή servo2 με τον pinServo2 pin Servo2.attach(pinServo2); ) void loop()( valX = analogRead(axisX); // X axis value valY = analogRead(axisY); // Y axis value // κλιμακώστε την τιμή στο διάστημα 0-180 angleServo1=χάρτης (valX,0 ,1023 ,0 ,180 ); angleServo2=map (valY,0 ,1023 ,0 ,180 ); // στρέψτε τους σερβομηχανισμούς στη γωνία λήψης servo1.write(angleServo1); servo2.write(angleServo2); καθυστέρηση(15); // παύση για να περιμένει να γυρίσουν οι σερβομηχανισμοί }
Εντολή σύνδεσης:

1. Συναρμολογήστε τον βραχίονα Pan/Title και τους σερβομηχανισμούς.
2. Συνδέουμε το joystick και το Pan / Title Bracket στην πλακέτα Arduino σύμφωνα με το διάγραμμα στο σχ. 18.2.
3. Φορτώστε το σκίτσο από τη λίστα 18.2 στον πίνακα Arduino.
4. Ελέγξτε τη θέση του βραχίονα Pan/Title μετακινώντας το joystick κατά μήκος των αξόνων X και Y.

Λίστες προγραμμάτων

Ήταν μια συνηθισμένη Παρασκευή, τίποτα δεν προμήνυε προβλήματα ...

Αλλά το σκουλήκι "ανάγκη να κάνουμε κάτι" έχει ήδη ξεκινήσει τη δουλειά του. Αφού διάβασα το άρθρο, θυμήθηκα ότι είχα ένα gamepad Segov στα σκουπίδια μου για 15 χρόνια, αν όχι περισσότερα. Το πήρα με σταθερή πρόθεση να φτιάξω ένα gamepad στον επεξεργαστή AVR (τότε δεν άκουσα για arduino, αλλά έκανα μερικά μικρά έργα στο AVR).

Το άρθρο για το MSX επιβεβαίωσε ακόμη περισσότερο την πρόθεσή μου και την Παρασκευή αποφάσισα - το κάνω!


Ένα αποσυναρμολογημένο gamepad Segov βγήκε από τους κάδους στο λευκό φως. Προς έκπληξή μου, ήταν πλήρες (καλά, εκτός από τα κομμένα κομμάτια και το αρχικό χειριστήριο που έλειπε), έλειπαν μόνο 2 μπουλόνια.

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

Και μετά με περίμενε απογοήτευση - 6 θύρες, 10 κουμπιά. Δεν υπήρχε όριο στη θλίψη μου, αλλά ο εγκέφαλός μου βρήκε ακόμα μια λύση, για αρχή αποφάσισα να προσπαθήσω να συναρμολογήσω ένα πρωτότυπο με 2 κουμπιά, αφού αποφάσισα να χρησιμοποιήσω εστίαση με δίοδο για ανάκριση 10 κουμπιών με 6 ακίδες. Σχεδόν εμπνευσμένος, κάθισα να ελέγξω ... Και μετά συνέβη το επόμενο πρόβλημα - υπάρχουν περισσότερα από 10 κουμπιά στο joystick! Γενικά, αυτή ήταν η στιγμή που ήταν απαραίτητο να δούμε την τεκμηρίωση, αν και υπήρχαν πολλές ιδέες - για παράδειγμα, συγκόλληση (ναι, με το κολλητήρι μου, που καλύπτει σχεδόν όλα τα πόδια στη μία πλευρά του μικροκυκλώματος) ή αναζήτηση διαφώτισης στο Διαδίκτυο.
Η τεκμηρίωση έλεγε ξεκάθαρα ότι το Beetle έχει στην πραγματικότητα 10 θύρες, όχι 6, κάτι που έκανε την περαιτέρω διαδικασία βαρετή (όπως νόμιζα). (Η χρήση 8 ακίδων καθιστά δυνατή τη δημοσκόπηση 2 * 6 = 12 κουμπιών, αυτό που χρειαζόμουν)

Το διάγραμμα σύνδεσης είναι μια μήτρα 6 x 2, επειδή η αρχική πλακέτα ήταν καλωδιωμένη με τρόπο που ήταν βολικό για μένα. (Παρεμπιπτόντως, κατά τη διάρκεια της προηγούμενης επανάληψης, τα κομμάτια κόπηκαν για να συνδεθεί ο ελεγκτής του πληκτρολογίου, έπρεπε να το επαναφέρω, αποδείχθηκε άσχημο)

Το σχήμα του gamepad που προκύπτει:

Έχοντας προσθέσει γρήγορα ένα παράδειγμα, βεβαιώθηκα ότι δεν λειτουργεί ... Δεν καταλαβαίνω;! Το παράδειγμα είναι το πιο απλό. Μετά από σκέψη, συνειδητοποίησα ότι η ψηφιακή ακίδα δεν έχει την αντίσταση που δίνουν τα λαστιχένια αγώγιμα κουμπιά, άλλαξε λίγο το κύκλωμα, τώρα διαβάζεται το αναλογικό σήμα και συγκρίνεται με το μισό μέγιστο. Ξαναπουλώ τις επαφές, ξαναγράφω το πρόγραμμα και ... δεν δουλεύει απολύτως τίποτα. Ο ελεγκτής δεν έχει οριστεί, όλα έχουν φύγει. Ο κωδικός ελέγχεται και επανελέγχεται, όλα πρέπει να λειτουργούν! Και το χειριστήριο δεν φαίνεται σε κανένα. Το κίνητρο πέφτει, κάνουμε ένα διάλειμμα.

Μετά από αρκετή ώρα, αφού έπαιξα ανεπιτυχώς με το Beetle, αυτό ήταν, σκότωσα το χειριστήριο με το κολλητήρι μου, με λύπη βγάζω το Arduino Micro από τους κάδους, φλας το firmware και σιωπά ξανά! Γίνεται σαφές ότι κάτι δεν πάει καλά με τον κώδικα, στο τέλος βρίσκω έναν κοινό λόγο - έναν ατελείωτο βρόχο στο βρόχο (), το διορθώνω, αλλά δεν μπορώ να το ράψω! Αποδεικνύεται ότι το πρόβλημα όταν δεν εμφανίζεται ο ελεγκτής λύνεται πατώντας το reset κατά το αναβοσβήνει (ή κλείνοντας τις ακίδες στην περίπτωσή μου)

Το αποτέλεσμα ήταν ένα gamepad Segov, δοκιμασμένο, λειτουργικό, είμαι χαρούμενος: έπαιξα Metal Gear, Felix The Cat, Super Mario.





P.S. "LED Trick". Φυσικά, δεν είναι απαραίτητο να χρησιμοποιήσετε ένα LED, μια συνηθισμένη δίοδος ταιριάζει καλύτερα, η ουσία είναι απλή, αντί για δύο συμπεράσματα, χρησιμοποιήστε ένα, συνδεδεμένο με διαφορετικά κουμπιά μέσω 2 διόδων:

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

Βίντεο:

Προσδιορισμός:

  • Τάση τροφοδοσίας: 5 V / 3,3 V (και οι δύο τάσεις είναι εντός του αποδεκτού εύρους).
  • Τωρινή κατανάλωση:< 10 мА
  • Διαστάσεις: 30x30 mm

Όλες οι μονάδες της γραμμής "Trema" κατασκευάζονται στην ίδια μορφή

Σύνδεση:

  • Οι έξοδοι "X" και "Y" της μονάδας συνδέονται με οποιεσδήποτε αναλογικές εισόδους του Arduino. Οι τιμές που διαβάζονται από αυτές τις ακίδες αυξάνονται καθώς το joystick μετακινείται από αριστερά προς τα δεξιά και από κάτω προς τα πάνω.
  • Το pin "K" είναι ψηφιακό και συνδέεται με οποιοδήποτε pin Arduino. Στην κανονική κατάσταση, το επίπεδο του λογικού "0" είναι πάνω του και όταν πατήσετε το joystick, αλλάζει σε λογικό "1".
  • Οι ακίδες "V" και "G" είναι ακροδέκτες ισχύος.

Είναι βολικό να συνδέσετε τη μονάδα με 3 τρόπους, ανάλογα με την κατάσταση:

Μέθοδος - 1:Χρησιμοποιώντας έναν ενσύρματο βρόχο και Piranha UNO

Χρησιμοποιώντας τα καλώδια "Father - Mom", συνδέουμε απευθείας με τον ελεγκτή Piranha UNO


Μέθοδος - 2: Χρήση του Trema Set Shield

Η μονάδα μπορεί να συνδεθεί σε οποιαδήποτε από τις αναλογικές εισόδους του Trema Set Shield.


Μέθοδος - 3: Χρήση ενσύρματου καλωδίου και ασπίδας

Χρησιμοποιώντας ένα καλώδιο 5 συρμάτων, σε Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO κ.λπ.


Θρέψη:

Η τάση εισόδου είναι 5 V ή 3,3 V DC, που εφαρμόζεται στους ακροδέκτες Vcc (V) και GND (G).

Περισσότερα για την ενότητα:

Τα δεδομένα της μονάδας διαβάζονται από δύο ποτενσιόμετρα και ένα κουμπί τακτ που συνδέεται μηχανικά με το μοχλό του joystick. Το κουμπί συνδέεται με το τροφοδοτικό Vcc και την έξοδο "K", η οποία πιέζεται στο GND μέσω μιας αντίστασης. Επομένως, μόνο δύο καταστάσεις μπορούν να ρυθμιστούν στην έξοδο "K": λογικό "0" (κουμπί απελευθερωμένο) ή "1" (κουμπί πατημένο). Οι ακίδες συντεταγμένων "X" και "Y" είναι αναλογικές έξοδοι της μονάδας, συνδέονται με ποτενσιόμετρα έτσι ώστε η τάση που λαμβάνεται μεταξύ αυτών των ακίδων και του GND να αυξάνεται όταν το joystick μετακινείται από αριστερά προς τα δεξιά και από κάτω προς τα πάνω.

Παραδείγματα:

Εντοπίστε τη θέση του joystick και ενεργοποιήστε το LED στο πάτημα του κουμπιού

const int8_t Xaxis = A0; // Προσδιορίστε τον αριθμό ακίδας στον οποίο είναι συνδεδεμένος ο ακροδέκτης του άξονα X του joystick const int8_t Yaxis = A1; // Προσδιορίστε τον αριθμό ακίδας στον οποίο είναι συνδεδεμένος ο ακροδέκτης του άξονα Υ του joystick const int8_t Κουμπί = 2; // Προσδιορίστε τον αριθμό της ακίδας στον οποίο είναι συνδεδεμένη η ακίδα του κουμπιού joystick const int8_t LED = 7; // Προσδιορίστε τον αριθμό pin με τον οποίο είναι συνδεδεμένο το LED uint16_t XborderMIN = 505; // Ορίστε το όριο των τιμών, ΚΑΤΩ από το οποίο θα θεωρηθεί ότι το joystick εκτρέπεται κατά μήκος του άξονα X προς τα αριστερά uint16_t XborderMAX = 515; // Ορίστε το όριο των τιμών, ΠΑΝΩ από το οποίο θα θεωρηθεί ότι το joystick εκτρέπεται κατά μήκος του άξονα X προς τα δεξιά uint16_t YborderMIN = 505; // Ορίστε το όριο των τιμών, ΚΑΤΩ από το οποίο θα θεωρηθεί ότι το joystick εκτρέπεται προς τα κάτω κατά μήκος του άξονα Y uint16_t YborderMAX = 515; // Ορίστε το όριο τιμών, ΠΑΝΩ από το οποίο θα θεωρηθεί ότι το joystick έχει κλίση προς τα πάνω κατά μήκος του άξονα Y uint16_t Xvol = 0, Yvol = 0; // Ορισμός μεταβλητών που θα λαμβάνουν τιμές που διαβάζονται από τους άξονες του joystick void setup() ( Serial.begin(9600); // Έναρξη μεταφοράς δεδομένων στη σειριακή θύρα παρακολούθησης pinMode (LED, OUTPUT); // Ρύθμιση της εξόδου LED για εργασία σε λειτουργία εξόδου pinMode(Button, INPUT); // Ρύθμιση της ακίδας του κουμπιού ώστε να λειτουργεί σε λειτουργία εισόδου ) void loop() ( Xvol = analogRead(Xaxis); // Ανάγνωση άξονα X Yvol = analogRead(Yaxis); // Ανάγνωση άξονα αν (Xvol< XborderMIN) { // Проверяем, полученное значение Х меньше нижней границы центрального положения или нет. Если да, то if (Yvol < YborderMIN) { // проверяем, полученное значение У меньше нижней границы центрального положения или нет. Если да, то Serial.println("Left-Down"); // значит джойстик находится в положении ВЛЕВО-ВНИЗ } else if (Yvol >YborderMAX) ( // Εάν η λαμβανόμενη τιμή Y είναι μεγαλύτερη από το άνω όριο της κεντρικής θέσης, τότε Serial.println("Left-Up"); // σημαίνει ότι το joystick βρίσκεται στη θέση LEFT-UP ) αλλιώς (Serial. println("Αριστερά"); // Εάν η τιμή Y που λήφθηκε είναι εντός των ορίων της κεντρικής θέσης κατά μήκος του άξονα Y, τότε το joystick εκτρέπεται προς τα ΑΡΙΣΤΕΡΑ ) ) διαφορετικά εάν (Xvol > XborderMAX) ( // Ελέγξτε εάν το Η τιμή X είναι μεγαλύτερη από το ανώτερο όριο της κεντρικής θέσης ή όχι. Εάν ναι, τότε εάν (Υβολ< YborderMIN) { // проверяем, полученное значение У меньше нижней границы центрального положения или нет. Если да, то Serial.println("Right-Down"); // значит джойстик находится в положении ВПРАВО-ВНИЗ } else if (Yvol >YborderMAX) ( // Εάν η λαμβανόμενη τιμή Y είναι μεγαλύτερη από το άνω όριο της κεντρικής θέσης, τότε Serial.println("Right-Up"); // σημαίνει ότι το joystick βρίσκεται στη θέση RIGHT-UP ) αλλιώς (Serial. println("Δεξιά"); // Εάν η ληφθείσα τιμή του Y είναι εντός των ορίων της κεντρικής θέσης κατά μήκος του άξονα Y, τότε το joystick εκτρέπεται προς τα ΔΕΞΙΑ ) ) αλλιώς ( // Εάν η τιμή που λήφθηκε του X είναι εντός τα όρια της κεντρικής θέσης κατά μήκος του άξονα Χ, τότε αν (Υβολ< YborderMIN) { // проверяем, полученное значение У меньше нижней границы центрального положения или нет. Если да, то Serial.println("Down"); // значит джойстик находится в положении ВНИЗ } else if (Yvol >YborderMAX) ( // Εάν η τιμή Y που λήφθηκε είναι μεγαλύτερη από το ανώτερο όριο της κεντρικής θέσης, τότε Serial.println("Up"); // σημαίνει ότι το joystick βρίσκεται στη θέση UP ) αλλιώς ( Serial.println("Center "); // Εάν η ληφθείσα τιμή του Y είναι εντός των ορίων της κεντρικής θέσης κατά μήκος του άξονα Y, που σημαίνει ότι το joystick βρίσκεται στο κέντρο. ) ) if (digitalRead(Button)) ( // Ελέγξτε εάν το κουμπί είναι πιεσμένο delay(1); // Εάν πατήθηκε το κουμπί, τότε καταργήστε την αναπήδηση digitalWrite(LED, !digitalRead(LED)); // και αλλάξτε την κατάσταση εξόδου της σειράς LED. println("Κλικ με κουμπί!"); // Εκτυπώστε το κείμενο κατά το οποίο πατήθηκε το κουμπί (digitalRead(Button)) () // Εάν το κουμπί είναι κρατημένο, τότε δεν κάνετε καμία καθυστέρηση (10); // Εάν το κουμπί απελευθερωθεί, τότε καταστείλετε την αναπήδηση ) )

Στην οθόνη σειριακής θύρας θα δείτε.

Παρόμοια άρθρα

  • Τα πιο συγκλονιστικά σεξουαλικά έθιμα της Αφρικής Αφρικανικά γαμήλια έθιμα

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

  • Βιογραφία και προσωπική ζωή της Svetlana Loboda

    (ΦΩΤΟΓΡΑΦΙΕΣ) Η Ουκρανή τραγουδίστρια Σβετλάνα Λόμποντα, η οποία έκρυβε την εγκυμοσύνη της για πολύ καιρό, παραδέχτηκε ότι επρόκειτο να παντρευτεί τον πατέρα του αγέννητου παιδιού της, τον χορογράφο Αντρέι Τσάρ: «Δεν σκεφτόμαστε γάμο. Η σφραγίδα στο διαβατήριο είναι ένα λειτουργικό ...

  • Πώς να προστατευτείτε από έναν καλλιτέχνη pickup

    Pick-up Patterns of Seduction Οι Pick-up artists έχουν δύο βασικά κόλπα για να μαζεύουν κορίτσια. Το πρώτο – γρήγορο – στο περιβάλλον pickup θεωρείται ιδιαίτερο chic. Αυτό είναι ένα διαζύγιο μιας κοπέλας για σεξ αμέσως μετά τη συνάντησή τους, σε λίγες μόνο ώρες. Απειρος...

  • Όλα για τα οφέλη αυτού του ηλιόλουστου φρούτου

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

  • Cristiano Ronaldo: βιογραφία, προσωπική ζωή, φωτογραφία

    Ο Κριστιάνο Ρονάλντο είναι μια από τις πιο διάσημες προσωπικότητες στον κόσμο του ποδοσφαίρου. Την προσοχή δεν προσελκύουν μόνο οι αθλητικές του επιτυχίες, αλλά και η προσωπική του ζωή. Η λαμπερή εμφάνιση και το άψογο στυλ τον έκαναν πολύ δημοφιλή σε όλο τον κόσμο....

  • Εξαιρετικά επιτυχημένος προγραμματιστής Zarakh Iliev Zarakh Iliev και τα αδέρφια του

    Σε λιγότερο από ένα χρόνο, το πάρκο Zaryadye πρόκειται να ανοίξει στον χώρο του κατεδαφισμένου ξενοδοχείου Rossiya κοντά στο Κρεμλίνο. Ο όγκος των επενδύσεων του προϋπολογισμού σε αυτό εκτιμάται σε 20 δισεκατομμύρια ρούβλια. Κοντά στο πάρκο θα βρίσκεται ένα ξενοδοχείο χτισμένο στη θέση ενός κερδοφόρου...