Πολλοί είχαν αυτό το παιχνίδι στην παιδική ηλικία, το ελεγχόμασταν με δύο περιστροφικά κουμπιά. Ακόμα και τότε, ήταν δυνατόν να συνδέσετε δύο κινητήρες DC με γρανάζια και να τους ελέγξετε από τα κουμπιά. Και τώρα για αυτό έχει γίνει δυνατή η προσαρμογή των joysticks. Ποια είναι αυτή που έκανε ο συγγραφέας των Instructables με το ψευδώνυμο millerman4487.
Όλα τα εξαρτήματα
σπιτικό το έβαλε σε ένα χαρτόνι:
Αλλά δύο ταυτόσημα μέρη έπρεπε να τυπωθούν - αυτοί είναι προσαρμογείς για τη σύνδεση των γραναζιών με τις λαβές της Magic Screen. Μοιάζει με οποιονδήποτε από τους προσαρμογείς:
Και έτσι συνδέεται με το κιβώτιο ταχυτήτων (ίσως αυτό να απαιτεί ελαφρά θέρμανση του προσαρμογέα με στεγνωτήρα μαλλιών):
Αρχείο STL.
Το ηλεκτρικό διάγραμμα της δομής παρουσιάζεται παρακάτω:
Υπάρχει μόνο μία ακατανόητη συνιστώσα σε αυτό - το τσιπ L293D. Περιέχει δύο καλούμενες γέφυρες τύπου H, καθένα από τα οποία μπορεί να αντιστρέψει τον κινητήρα που είναι συνδεδεμένος με αυτό. Κάτω από το διοικητικό συμβούλιο παρουσιάζονται τα συμπεράσματα
Arduino Συνδέστε ποια από τις ακίδες του συνδετήρα του joystick Wii Nunchuck. Το παρακάτω σκίτσο μπορεί να ξαναγραφεί για να λειτουργήσει με οποιονδήποτε άλλο τύπο χειριστηρίου, στην τρέχουσα μορφή του θα χρειαστεί.
#include
#if (ARDUINO & gt; = 100)
#include
#else
#include
// # καθορίστε Wire.write (x) Wire.send (x)
// # καθορίστε Wire.read () Wire.receive ()
#endif
static uint8_t nunchuck_buf [6]; // array για την αποθήκευση δεδομένων nunchuck,
// Χρησιμοποιεί τις θύρες C (αναλογική σε) ακίδες ως δύναμη & γείωση για Nunchuck
static void nunchuck_setpowerpins () {
#define pwrpin PORTC3
#define gndpin PORTC2
DDRC | = _BV (pwrpin) | _Βν (gndpin);
PORTC & = ~ _BV (gndpin);
PORTC | = _BV (pwrpin);
καθυστέρηση (100). // περιμένετε να σταθεροποιηθούν τα πράγματα
}}
// αρχικοποιήστε το σύστημα I2C, ενταχθείτε στο δίαυλο I2C,
// και πείτε στο nunchuck ότι μιλάμε γι 'αυτό
static void nunchuck_init () {
Wire.begin (); // Συνδέστε το i2c bus ως master
Wire.beginTransmission (0x52); // μεταδίδει στη συσκευή 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x40); // στέλνει τη διεύθυνση μνήμης
Wire.write ((uint8_t) 0x00); // στέλνει ένα μηδέν.
#else
Wire.send ((uint8_t) 0x40); // στέλνει τη διεύθυνση μνήμης
Wire.send ((uint8_t) 0x00), // στέλνει ένα μηδέν.
#endif
Wire.endTransmission (); // σταματήστε τη μετάδοση
}}
// Στείλτε ένα αίτημα για δεδομένα στο nunchuck
// ήταν "send_zero ()"
static void nunchuck_send_request () {
Wire.beginTransmission (0x52); // μεταδίδει στη συσκευή 0x52
#if (ARDUINO & gt; = 100)
Wire.write ((uint8_t) 0x00), // στέλνει ένα byte
#else
Wire.send ((uint8_t) 0x00); // στέλνει ένα byte
#endif
Wire.endTransmission (); // σταματήστε τη μετάδοση
}}
// Κωδικοποιήστε τα δεδομένα για να διαμορφώσετε τα περισσότερα προγράμματα οδήγησης wiimote εκτός
// Απαιτείται μόνο εάν χρησιμοποιείτε έναν από τους κανονικούς οδηγούς wiimote
static char nunchuk_decode_byte (char x) {
x = (χ ^ 0χ17) + 0χ17;
επιστροφή x;
}}
// Λήψη δεδομένων πίσω από το nunchuck,
// επιστρέφει 1 σε επιτυχή ανάγνωση. επιστρέφει 0 για αποτυχία
static int nunchuck_get_data () {
int cnt = 0.
Wire.requestFrom (0x52, 6); // ζητήστε δεδομένα από το nunchuck
ενώ (Wire.available ()) {
// λήψη byte ως ακέραιο
#if (ARDUINO & gt; = 100)
nunchuck_buf [cnt] = nunchuk_decode_byte (Wire.read ());
#else
nunchuck_buf [cnt] = nunchuk_decode_byte (Wire.receive ());
#endif
cnt ++;
}}
nunchuck_send_request (); // στείλτε αίτημα για το επόμενο φορτίο δεδομένων
// Εάν λάβαμε τα 6 byte, τότε τα εκτυπώνουμε
εάν (cnt> 5) {
επιστροφή 1; // επιτυχία
}}
επιστροφή 0? // αποτυχία
}}
// Εκτυπώστε τα δεδομένα εισόδου που έχουμε λάβει
// Τα δεδομένα επιτάχυνσης είναι 10 bits
// έτσι διαβάζουμε 8 bits, τότε πρέπει να προσθέσουμε
// στα τελευταία 2 bits. Αυτός είναι ο λόγος για τον οποίο εγώ
// πολλαπλασιάστε τα κατά 2 * 2
static void nunchuck_print_data () {
static int i = 0;
int joy_x_axis = nunchuck_buf [0].
int joy_y_axis = nunchuck_buf [1].
int accel_x_axis = nunchuck_buf [2]. // * 2 * 2;
int accel_y_axis = nunchuck_buf [3]. // * 2 * 2;
int accel_z_axis = nunchuck_buf [4]. // * 2 * 2;
int z_button = 0;
int c_button = 0;
// byte nunchuck_buf [5] περιέχει bits για τα κουμπιά z και c
// περιέχει επίσης τα λιγότερο σημαντικά bit για τα δεδομένα του επιταχυνσιόμετρου
// έτσι πρέπει να ελέγξουμε κάθε bit of byte outbuf [5]
αν ((nunchuck_buf [5]> & gt; 0) & 1)
z_button = 1;
αν ((nunchuck_buf [5]> 1) & 1)
c_button = 1;
αν ((nunchuck_buf [5]> & gt; 2) & 1)
accel_x_axis + = 1;
αν ((nunchuck_buf [5]> & gt; 3) & 1)
accel_x_axis + = 2;
αν ((nunchuck_buf [5]> & gt; 4) & 1)
accel_y_axis + = 1;
αν ((nunchuck_buf [5]> 5) & 1)
accel_y_axis + = 2;
αν ((nunchuck_buf [5]> & gt; 6) & 1)
accel_z_axis + = 1;
αν ((nunchuck_buf [5]> & gt; 7) & 1)
accel_z_axis + = 2;
Serial.print (i, DEC);
Serial.print ("\ t");
Serial.print ("χαρά:");
Serial.print (joy_x_axis, DEC);
Serial.print (",");
Serial.print (joy_y_axis, DEC).
Serial.print ("\ t");
Serial.print ("acc:");
Serial.print (accel_x_axis, DEC);
Serial.print (",");
Serial.print (accel_y_axis, DEC).
Serial.print (",");
Serial.print (accel_z_axis, DEC).
Serial.print ("\ t");
Serial.print ("αλλά:");
Serial.print (z_button, DEC).
Serial.print (",");
Serial.print (c_button, DEC);
Serial.print ("\ r \ n"); // newline
i ++;
}}
// επιστρέφει την κατάσταση zbutton: 1 = πατημένο, 0 = μη πατημένο
static int nunchuck_zbutton () {
επιστροφή ((nunchuck_buf [5] & gt; 0) & 1); 0-1 // voodoo
}}
// επιστρέφει την κατάσταση zbutton: 1 = πατημένο, 0 = μη πατημένο
static int nunchuck_cbutton () {
επιστροφή ((nunchuck_buf [5]> 1) & 1); 0-1 // voodoo
}}
// επιστρέφει την τιμή του joystick του άξονα x
static int nunchuck_joyx () {
επιστροφή nunchuck_buf [0];
}}
// επιστρέφει την τιμή του joystick του άξονα y
static int nunchuck_joyy () {
επιστροφή nunchuck_buf [1];
}}
// επιστρέφει την τιμή του επιταχυνσιόμετρου x-axis
static int nunchuck_accelx () {
επιστροφή nunchuck_buf [2]; // FIXME: αυτό εξαλείφει τα 2-bit των δεδομένων
}}
// επιστρέφει την τιμή του επιταχυνσιόμετρου άξονα y
static int nunchuck_accely () {
επιστροφή nunchuck_buf [3]; // FIXME: αυτό εξαλείφει τα 2-bit των δεδομένων
}}
// επιστρέφει την τιμή του επιταχυνσιόμετρου άξονα z
static int nunchuck_accelz () {
επιστροφή nunchuck_buf [4]; // FIXME: αυτό εξαλείφει τα 2-bit των δεδομένων
}}
int loop_cnt = 0;
byte joyx, joyy, zbut, cbut, accx, accy, accz;
άκυρη _print () {
Serial.print ("\ tX Joy:");
Serial.print (χάρτη (joyx, 15, 221, 0, 255)).
Serial.print ("\ tY Joy:");
Serial.println (χάρτης (joyy, 29, 229, 0, 255)).
}}
int joyx1 = 129; // 15-221
int joyy1 = 124; // 29-229
άκυρη ρύθμιση () {
Serial.begin (9600);
nunchuck_setpowerpins ();
nunchuck_init (); // στείλτε την χειραψία αρχικοποίησης
Serial.println ("Wii Nunchuck Ready").
pinMode (3, OUTPUT).
pinMode (5, OUTPUT).
pinMode (6, OUTPUT);
pinMode (9, OUTPUT);
// type ();
}}
void loop () {
αν (loop_cnt & gt; 10) {// κάθε 100 msecs παίρνει νέα δεδομένα
loop_cnt = 0.
nunchuck_get_data ();
zbut = nunchuck_zbutton ();
joyx = nunchuck_joyx (); // 15-221
joyy = nunchuck_joyy (); // 29-229
_print ();
}}
loop_cnt ++;
εάν (zbut == 1) {
Τύπος ();
zbut = 0;
}}
αλλού {
εάν (joyx> (joyx1 + 20)) {
int ταχύτητα1 = χάρτης (joyx - joyx1, 0, 80, 40, 255).
ταχύτητα1 = περιορισμός (ταχύτητα1, 0, 255);
analogWrite (6, 0);
analogWrite (9, ταχύτητα1);
}}
αλλοι αν (joyx
Μετά την ενεργοποίηση, μια σωστά συναρμολογημένη συσκευή αρχίζει να λειτουργεί αμέσως. Το Nunchuck είναι ένα αναλογικό χειριστήριο, έτσι μπορείτε να ελέγχετε όχι μόνο την κατεύθυνση αλλά και την ταχύτητα κίνησης. Το Arduino αναλαμβάνει τον έλεγχο ταχύτητας PWM. Αν η κίνηση κατά μήκος οποιουδήποτε άξονα συμβαίνει προς την αντίθετη κατεύθυνση, ο αντίστοιχος κινητήρας πρέπει να αντιστραφεί. Τοποθετώντας το δρομέα περίπου στη μέση της οθόνης και πατώντας το κουμπί Z, μπορείτε να κάνετε τη συσκευή να γράφει αυτόματα τη λέξη HI.