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

  • Pingback: Wii Nunchuk Controller am Arduino – Teil 1 – Grundlagen – Makerblog.at

  • 15. Januar 2016 at 9:29
    Permalink

    Hallo Adi :-)

    Super Videoserie zur Servosteuerung. Gut gemacht.

    Für ein Kamera Gimbal sind Servos eher zu wackelig/zerbrechlich und Schrittmotoren zu schwerfällig. Ich empfehle brushless Motoren mit ESCs direkt mit Arduino anzusteuern und Motoren mit wenig KV (also wenig Drehzahl, dafür viel Torque) zu verwenden. Wenn du noch eine 3. Achse und ein Gyro einbindest kannst du auch ein cooles Steady-cam bauen für smoothe Kamerafahrten.

    LG
    Harry

    Reply
    • 18. Januar 2016 at 13:05
      Permalink

      Des hört sich sehr Interessant an!!!

      Reply
  • Pingback: Wii Nunchuk Controller am Arduino – Teil 3 – Beschleunigungssensor abfragen – Makerblog.at

  • 4. September 2016 at 17:41
    Permalink

    Klasse umsetzung!
    Können sie bitte so nett sein und ein scketch für 2 schrittmotoren schreiben(accel steper library)ich benutze 2 Easy driver.Ich habe versucht,leider ohne erfolg.Hardware technisch klapt alles,aber mit Code überhaupt nicht.
    Vielen dank.
    Lg
    Andreas

    Reply

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.