Weiter geht es mit Teil 2 des Wii Nunchuk Tutorials für den Arduino (Link zu Teil 1).

Diesmal werden wir mit dem Joystick des Nunchuk zwei Servos steuern. Ich habe meine Servos in einen Pan-Tilt-Panoramakopf montiert und mit Heißkleber eine GoPro Kamera draufgeklebt. Das Ergebnis seht ihr im Video.

Bezugsquellen:
Original Nintendo Wii Nunchuk Controller

Der folgende Arduino Sketch ist kommentiert und wird zusätzlich im Video erklärt. Infos zur Installation der benötigten Library findet ihr in Teil 1 des Artikels.
Zum Debuggen werden die errechneten Werte auch am seriellen Monitor ausgegeben.

/*
 * Weitere Infos: www.makerblog.at
 * 
 * Library zum Download: https://github.com/timtro/wiinunchuck-h
 * Achtung: Nach dem Download des ZIPs und vor dem Import der Library in die Arduino IDE
 * das "-master" aus dem Dateinamen löschen.
 */
 
#include <Wire.h>
#include <Servo.h> 
#include <wiinunchuck.h>
 
Servo panServo; 
Servo tiltServo;
 
int pinPan = 10; // Links-Rechts
int pinTilt = 11; // Oben-Unten
 
float panPos = 90.0; // Aktuelle Position
float tiltPos = 90.0; // Aktuelle Position
int dxPan = 0; // Positionsänderung des Joysticks X
int dyTilt = 0; // Positionsänderung des Joysticks Y
 
float slowDown = 0.05; // Faktor zur Steuerung der Geschwindigkeit
 
 
void setup(){
 
 Serial.begin(57600);
 
 nunchuk_init();
 delay(100);
 nunchuk_calibrate_joy();
 delay(100);
 nunchuk_get_data();
 delay(100); 
 
 panServo.attach(pinPan);
 tiltServo.attach(pinTilt); 
 delay(10);
 panServo.write(panPos);
 tiltServo.write(tiltPos);
 
 panPos = 90.0;
 tiltPos = 115.0; 
}
 
void loop(){
 
 nunchuk_get_data(); // Daten vom Nunchuk empfangen
 delay(10);
 
 // Wenn C-Taste gedrückt, dann Position resetten
 if (nunchuk_cbutton() == 1) {
 dxPan = 0;
 dyTilt = 0;
 panPos = 90;
 tiltPos = 115;
 panServo.write(panPos);
 tiltServo.write(tiltPos);
 }
 
 // Wenn Z-Taste gedrückt dann Joystick auslesen
 if (nunchuk_zbutton() == 1) {
 // Wert an der X-Achse vom Nunchuk ist 0-255, ergibt
 // ein dxPan und dyTilt von -127 bis +128
 dxPan = -(128 - nunchuk_cjoy_x()); 
 dyTilt = (128 - nunchuk_cjoy_y());
 
 // Joystick-Bewegung rund um die Mitte ignorieren
 if (abs(dxPan) > 20) {
 // Wenn Joystick-Auschlag größer als 20, dann neue Position berechnen
 // Positionsänderung pro Durchlauf mit slowDown skalieren, sonst zu stark
 panPos = panPos + (float)dxPan*slowDown;
 }
 // Gleicher Ablauf wie dxPan
 if (abs(dyTilt) > 20) {
 tiltPos = tiltPos + (float)dyTilt*slowDown;
 }
 
 // Positionswerte für die Servos auf 0-180 begrenzen
 panPos = min(panPos, 180);
 panPos = max(panPos, 0);
 tiltPos = min(tiltPos, 180);
 tiltPos = max(tiltPos, 0);
 }
 
 // Ausgabe am seriellen Monitor, Achtung 57600 Baud!
 Serial.print("dX: ");
 Serial.print(dxPan);
 Serial.print(" dY: ");
 Serial.print(dyTilt);
 Serial.print(" X: ");
 Serial.print(panPos);
 Serial.print(" Y: ");
 Serial.println(tiltPos);
 
 // Neue Positionen an die Servos schreiben
 panServo.write((int)panPos);
 tiltServo.write((int)tiltPos);
 
 delay(10); 
}

Im 3. und letzen Teil des Tutorials, der in Kürze verfügbar ist, werden wir die beiden Servos dann direkt mit dem 3-Achsen Beschleunigungssensor des Nunchuk steuern.

5 thoughts on “Wii Nunchuk Controller am Arduino – Teil 2 – Servos steuern mit dem Joystick

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload the CAPTCHA.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.