Jump to content
elektro-skateboard.de

Nunchuk Code Probleme


axx

Empfohlene Beiträge

Also zunächst habe ich mir folgenden Code runtergeladen:

(link zum Forum)

 

Externe Links nur für Mitglieder sichtbar

#include <Wire.h>
#include <WiiChuck.h> // Library for Wii Nunchuck
#include <Wii.h>
#include <ArduinoNunchuk.h>
#include <Servo.h> // Library for controlin Servo or ESC
WiiChuck chuck = WiiChuck();
Servo myservo;
int speed_val; // Speed value
int speed_val_cur = 95; // Current speed value
int y = 0; // Jaystick value
int time = 200; // Delay timer
int speed_val_hold; // speed value which will be holded while Z button is pressed

void setup() {

Serial.begin(115200);
chuck.begin();
chuck.update();
myservo.attach(11); // ESC attached to 9 pin of Arduino

}

void loop() {

// If you hold down Z button of Nunchuck you accelerate faster
if ((chuck.buttonZ)||(chuck.buttonC)) {
if (chuck.buttonZ) {
Serial.print(" Z ");
time = 100;
speed_val_hold = speed_val_cur; // Sets speed value to hold
}
// If you hold down C button of Nunchuck you accelerate slower
if (chuck.buttonC) {
Serial.print(" C ");
//time = 100;
}
} else {
time = map (speed_val_cur,60,80,100,250);
speed_val_hold = 95;
}

delay(time);

chuck.update();
y = chuck.readJoyY();

// Maps the joystick value to the speed value (max speed 130) max posible 179
Serial.println();
speed_val = map(y, -105, 73, 95, 149);
// This is what hapens in case we loose a Blue tooth connection
if (y > 122) {
speed_val = 95; // 60 means – no speed , motor stoped
speed_val_cur = 95; // 60 means – no speed , motor stoped
speed_val_hold = 95;
}
// This is whats hapens then we again have BT signal, it just restarts everything
if (y == 124) setup();

if (y <= 0) {
speed_val_cur = 95;
speed_val = 95;

}
if (speed_val_cur < speed_val) {

speed_val_cur = speed_val_cur + 1;

}
else speed_val_cur = speed_val;

if ((speed_val_hold > 95) && (y > 0) ) speed_val_hold++; // If hold button is pressed and joistic moved up – increase speed
if ((speed_val_hold > 95) && (y < 0) ) speed_val_hold--; // If hold button is pressed and joistic moved down – decrease speed

if (speed_val_hold > 95) speed_val_cur = speed_val_hold;
if (chuck.buttonC) {
speed_val_cur = 95;
//time = 100;
}
myservo.write(speed_val_cur); // Here we control ESC
//—– Printing to screen to see results ———
Serial.print("Joy = ");
Serial.print(y);
Serial.print(" ");
Serial.print("Speed = ");
Serial.print(speed_val_cur);
}

 

Mit diesen Code(Arduino) kannst Du dir die Signale die vom (Bluetooth) Nunchuk Modul kommen und am Nano angeschlossen sind, über den Serial Monitor anzeigen lassen (+ - DATA(SDA) und CLOCK(SCL) sind verkabelt)

 

Soweit, sogut, also der Nunchuk ist schonmal mit dem Arduino Nano verbunden und überträgt die Signale so wie er soll.

 

 

Zudem ist es mit diesem Code möglich über

 

"myservo.attach(11); // ESC attached to 11 pin of Arduino“

 

direkt ein PWM Signal an den Regler zu schicken, welches dieser auch richtig Interpretiert, sprich Joystick Hoch = Speed Hoch.

 

Da dieser Code allerdings nicht der Code ist den Ich letztendlich nutzen möchte, habe ich einen anderen runtergeladen und zwar von „Todd“ aus dem Endless-Spehre Forum.

 

#include <Wire.h>
#include <WiiChuck.h> // Library for Wii Nunchuck
#include <Wii.h>
#include <ArduinoNunchuk.h>
#include <Servo.h> // Library for controlin Servo or ESC
WiiChuck chuck = WiiChuck();
Servo myservo;
int speed_val; // Speed value
int speed_val_cur = 95; // Current speed value
int y = 0; // Jaystick value
int time = 200; // Delay timer
int speed_val_hold; // speed value which will be holded while Z button is pressed

void setup() {

Serial.begin(115200);
chuck.begin();
chuck.update();
myservo.attach(11); // ESC attached to 9 pin of Arduino

}

void loop() {

// If you hold down Z button of Nunchuck you accelerate faster
if ((chuck.buttonZ)||(chuck.buttonC)) {
if (chuck.buttonZ) {
Serial.print(" Z ");
time = 100;
speed_val_hold = speed_val_cur; // Sets speed value to hold
}
// If you hold down C button of Nunchuck you accelerate slower
if (chuck.buttonC) {
Serial.print(" C ");
//time = 100;
}
} else {
time = map (speed_val_cur,60,80,100,250);
speed_val_hold = 95;
}

delay(time);

chuck.update();
y = chuck.readJoyY();

// Maps the joystick value to the speed value (max speed 130) max posible 179
Serial.println();
speed_val = map(y, -105, 73, 95, 149);
// This is what hapens in case we loose a Blue tooth connection
if (y > 122) {
speed_val = 95; // 60 means – no speed , motor stoped
speed_val_cur = 95; // 60 means – no speed , motor stoped
speed_val_hold = 95;
}
// This is whats hapens then we again have BT signal, it just restarts everything
if (y == 124) setup();

if (y <= 0) {
speed_val_cur = 95;
speed_val = 95;

}
if (speed_val_cur < speed_val) {

speed_val_cur = speed_val_cur + 1;

}
else speed_val_cur = speed_val;

if ((speed_val_hold > 95) && (y > 0) ) speed_val_hold++; // If hold button is pressed and joistic moved up – increase speed
if ((speed_val_hold > 95) && (y < 0) ) speed_val_hold--; // If hold button is pressed and joistic moved down – decrease speed

if (speed_val_hold > 95) speed_val_cur = speed_val_hold;
if (chuck.buttonC) {
speed_val_cur = 95;
//time = 100;
}
myservo.write(speed_val_cur); // Here we control ESC
//—– Printing to screen to see results ———
Serial.print("Joy = ");
Serial.print(y);
Serial.print(" ");
Serial.print("Speed = ");
Serial.print(speed_val_cur);
}


 

 

Das wirklich unglaubliche daran ist nun Folgendes:

 

Ich Spiele den Code von Todd auf den Nano auf

(Verkabelung bleibt gleich, ebenso wird nicht das USB Kabel des Nanos abgezogen, sprich die Verbindung zw. Nunchuk/Nano/Regler wird nicht unterbrochen)

und alles Funktioniert Prima… sobald ich C drücke läuft der Motor im eingestellten Tempo los, mit jedem mal Joystick hochdrücken geht die Geschwindigkeit um den Wert X hoch und wird gehalten.

 

Die Sache wurde die ganze Zeit mit einem 2. Arduino überwacht, darauf war ein Code aufgespielt welcher PWM Signale im Serial Monitor Darstellt.

 

Der Wert muss grob <190 sein, das ist was der Regler als Leerlauf interpretiert, alles darüber nimmt der Regler Anfangs nicht an sonst würde der Motor ja direkt loslaufen.

Hat auch gepasst, ich habe die Werte in den Codes so angepasst das sie <190 sind.

 

 

Wenn ich den Regler von der Spannung Trenne (Arduino bleibt über USB weiterhin verbunden) und wieder verbinde geht noch alles.

 

NUN ABER…!

 

 

 

Wird die Spannungsversorgung vom Arduino unterbrochen und wieder verbunden, geht garnichts mehr!

Wenn der Bluetooth Nunchuk wieder „gepairt“ ist, reagiert die angeschlossene LED vom Empfangsteil auch auf Tastendrücke, aber das wars.

Im PWM Serial Monitor tut sich nichts mehr und der Regler bleibt auch ruhig.

 

 

Die einzige Möglichkeit es nun wieder lauffähig zu kriegen ist die, das ich den ersten Code aufspiele, dann geht es normal, anschliessend wird wieder Todd’s Code aufgespielt und Funktioniert, bis zum unterbrechen der Spannung auch.

 

Hat jemand ne Idee? ich weiss das geht schon tief rein, aber vllt weiss barney als programmierfuchs ja was?

 

 

Lg Alex

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Alex,

 

eine kleine Sache vorab. Es ist keine Bluetooth!

 

Das Verhalten, was du beobachtet hast, ist normal. Auch wenn das Empfangsmodul sich mit dem Nunchuk verbunden hat, muss noch ein Verbinden mit dem Arduino stattfinden. Ein kleiner Hinweis, dass war der Mist, was meinen Code bis zur Unlesbarkeit aufgebläht hat. Es gibt kein vernünftiges Kriterium, einen Funkabriss eindeutig zu detektieren. Ich habe mich hier im Forum viele Seiten darüber ausgelassen, wie ich der Annahme bin, wie man einen Funkabriss erkennen kann.

 

Wenn du das Funkabrissproblem gelöst hast, kannst du als nächstes mit den verschiedenen Totpunkten des Nunchuk auseinander setzen. Schlussendlich wirst du dich mit dem Problem Linearität und die Exponentialfunktion anfreunden.

 

Aber das hast du nicht gefragt, darum die Antwort, die du erwartest:

 

* Am einfachsten ist es den Aufruf "chuck.begin();" zyklisch aufzurufen und damit das Arduino Nunchuk Verbunden durchzuführen. Das ist natürlich suboptimal! Damit hackt die Nunchuk Routine.

* Ich kann dir wirklich nur nahelegen, nicht mit "delay();" zu arbeiten! Das geht in der Anfangsphase, aber später fängst du dir echte Probleme ein.

 

 

Ich hoffe ein wenig Licht in das Dunkle gebracht zu haben.

 

VG

 

Barney

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hey Barney, schonmal danke für die rasche Antwort.

 

Was meinst du mit "es ist kein Bluetooth"? auf der Packung vom Nunchuk stand es drauf und das Modul sieht auch irgendwie nach "Funk" aus und da muss doch drin sein was draufsteht auch wenns aus china kommt? :D:D:D 246ee366a13efd91923cf31276c88cc0a.jpg

 

wie auch immer, irgend ein Funkprotokoll wird es sein ;)

 

Was mich so sehr wundert ist das der erste Code funktioniert, wenns nach mir geht würde ich ja "einfach" den zweiten Code von Todd in den ersten Code einbauen, bzw den ersten so umbauen das er die Charakteristik von Todds Code hat.

 

Leider fehlts mir da noch ein bisschen.

 

das "chuck.begin();" ist im ersten, funktionierenden Code verbastelt und nicht in Todd's.

Ich habe mir diesen Code runtergeladen und nicht selbst geschrieben:confused5:, habe zwar ein paar einblicke in objective-c bekommen allerdings bin ich davon was da passiert noch etwas entfernt:confused5:. Die Parameter anzupassen ist nicht das Problem.

 

Werde Todd mal eine Mail schreiben,vielleicht hat er ja eine Idee woran es liegt.

 

Danke auf jeden fall schonmal für den Tipp, ich bleib am Ball!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

ich habe das gleiche Problem mit der Teensy ich muss den Reset Knopf drücken, damit der wieder pairen kann, bzw. die LED Leuchtet.

LG Waiti

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Alex,

 

eine kleine Warnung noch zum Thema Funkabriss:

 

* Auch wenn alles auf dem Labortisch funktioniert, kann es dir Draußen passieren, dass dein Board in dem Autonomen Modus übergeht. Ab da ist es nicht mehr lustig, wenn das Teil irgendeinen Fußgänger in die Hacken Fährt oder quer über die Kreuzung schießt.

 

Ich habe mir einige Lösungen mit dem Nunchuk angesehen und ich kann nur warnen!

 

Einer hier im Forum hat berichtet, dass ihn sein Board mit meinem Code unter den Füßen davon geschossen ist. Ist nicht wirklich geil!

 

VG

 

Barney

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

ich habe das gleiche Problem mit der Teensy ich muss den Reset Knopf drücken, damit der wieder pairen kann, bzw. die LED Leuchtet.

LG Waiti

 

Sollte in der aktuellen Version nicht mehr sein. Da ist eine Erkennung mit drinnen, die ein erneutes Pairing durchführt.

Im Demo Code für den Nunchuk ja.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Alex,

 

eine kleine Warnung noch zum Thema Funkabriss:

 

* Auch wenn alles auf dem Labortisch funktioniert, kann es dir Draußen passieren, dass dein Board in dem Autonomen Modus übergeht. Ab da ist es nicht mehr lustig, wenn das Teil irgendeinen Fußgänger in die Hacken Fährt oder quer über die Kreuzung schießt.

 

Ich habe mir einige Lösungen mit dem Nunchuk angesehen und ich kann nur warnen!

 

Einer hier im Forum hat berichtet, dass ihn sein Board mit meinem Code unter den Füßen davon geschossen ist. Ist nicht wirklich geil!

 

VG

 

Barney

 

Hallo Barney,

 

danke für den Tipp, klar, wenn das ding losschiesst ists eher schlecht, vorallem da es kein "kleines" Gerät ist und natürlich kein Versicherungsschutz besteht, hätte auch sobald der Code auf dem Labortisch funktioniert erstmal alle erdenklichen Szenarien durchgespielt und es erst ans Board geklatscht sobald in wirklich jeder Situation ein Fail-Safe Garantiert ist, auch wenn das Board vllt eher Safe-Life gebaut ist :arf:

 

Was wäre denn eine sichere Alternative? Ich habe hier grade noch eine 2,4 Ghz FlySky Funke rumfliegen, mit dieser geht das ganz wunderbar, allerdings ist der Einstellbereich des Zeigefingerpotis doch sehr klein, sprich da passiert auf kurzen Wege ganz schön viel..!

 

Die Möglichkeiten in Todds Code sind wirklich durchdacht.

Sobald du C drückst, geht der Motor auf die kleinstmögliche Drehzahl (stellst du im Code ein)

und mit jedem Mal Joystick HOCH geht er eine Stufe hoch und hält diese geschwindigkeit bis der C knopf losgelassen wird. Z dient als Bremse und sendet einen Bremswert X.

 

 

Verdammt Axt, ich will das es jetzt funktioniert :P

 

 

LG Alex

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Alex,

 

ich will nicht Todds Code madig machen, aber da ich seit über einem Jahr mit meinem Code fahre, einige kleine Hinweise, was so passieren kann:

 

* Die Verbindung wird unterbrochen -> leider ist der Nunchuk Empfänger so ausgelegt, dass er den alten Wert hält. Da kannst du so oft den Taster los lassen wie du willst, davon erfährt aber der Arduino nichts!

 

* Das Akku ist alle? Wird auch nicht bemerkt!

 

* Teensy? kann ich dir nicht sagen! Dude fährt damit und dieser Code wird weiterentwickelt. Da jetzt auch Spezialitäten wie Exponentialfunktion implementiert wird (ist?) sind hier schon viele negative Erfahrungen eingeflossen sind. Bald wird es eine Leiterplatte dafür geben, was hoffentlich den Aufbau erleichtert. Schlussendlich möchte ich das Funkmodul vom Nunchuk nicht weiter verwenden und einen eigenen Sender verwenden.

 

Ich selber werde auf Teensy wechseln. Der Arduino hat auch wieder in der letzten Skate Night seinen Job getan, aber der Arduino ist nicht leistungsfähig genug für weitere Experimente.

 

Ich möchte dir aber dazu nicht raten. Die Garantie (für den Teensy, so für den Arduino) werde ich nicht übernehmen! Im Zweifelsfall nimm eine Car-Funke und gehe auf Nummer sicher. (Bei soviel Power am Board)

 

VG

 

Barney

bearbeitet von barney
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 month later...

Hallo

 

wir haben das Problem gelöst indem wir den kabelgebundenen Nunchuk verwenden. Als Funkstrecke dienen Sparkfun Bluetooth Gold Module.

Je ein Teensy (einer am Nunchuk, er liest diesenmaus und sendet die Daten an den 2.ten, der empfängt und schreibt in ein ordentliches PWM Signal um) wir haben die Funkstrecke getestet. 100m kein Problem. Noch nie eine Abriss gehabt.

Gruss Fabian

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Barney

 

ich danke Dir.

Die Inspiration und die ersten Ideen sind ja von Dir:thumbsup:

Wir haben nun einen eigenen Code komplett neu geschrieben. Unser Ansatz ist deutlich anderst.

Du weisst ja Lenkung und so...

Im Moment haben wir auch nur die Standfeste Übertragung der Lenk- und Gasbefehle implementiert.

Totmann brauchen wir nicht, wird über den Regler abgefangen. Daten auslesen brauchen wir auch nicht, dies bietet der Regler ebenso an über eine CAN Schnittstelle.

Wenn mal Interesse hast: mgm compro eingeben und nachschauen. Der Hammer was die bieten...

 

Gruss an Dich und ich vefolge gespannt Dein Werk ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Tritt dem Gespräch bei

Du kannst jetzt posten und dich später registrieren. Wenn du bereits einen Account hast kannst du dich hier anmelden.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...