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.
Pingback: Wii Nunchuk Controller am Arduino – Teil 1 – Grundlagen – Makerblog.at
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
Des hört sich sehr Interessant an!!!
Pingback: Wii Nunchuk Controller am Arduino – Teil 3 – Beschleunigungssensor abfragen – Makerblog.at
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