Jump to content
elektro-skateboard.de

Wii Nunchuck mit Ardruino


benediktsamuel

Empfohlene Beiträge

Wie kann ich denn die Empfindlichkeit der Lebenderkennung im Sourcecode erhöhen?

 

Hi Sonni,

 

so wie ich das verstanden habe, ist die "Lebenderkennung" normal auf 3 (vermutlich Sekunden).

 

Stelle also die "int PairingLostTrigger = 10" z.B., wenn es Sekunden sind, wie angenommen.

 

Dann musst Du nur einmal eine messbare Bewegung in 10 Sek der 2 momentan abgefragten Achsen des Gyrometers erzeugen und er bleibt gebunden.

 

Viele Grüße,

 

Wolf

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zitat von sonni

int PairingLostTrigger = 1000;

-> Hatte wir schon zum Anfang diskutiert. Auf eigener Gefahr. Fällt dir der Nunchuk aus der Hand, wird dies erst nach vielen Minuten erkannt. Dein Board wird in der Zwischenzeit zum unkontrollierten Geschoss.

 

Zitat von sonni

int PairingSuccessTrigger = 1;

-> Das ist eine ganz schlechte Idee. Du gaukelst den Arduino eine Pairing vor. D.h. Ohne das der Empfänger und Nunchuk miteinander Reden, behauptest du die Verbindung wäre da. Dadurch das du den Lost Trigger auf 1000 gestellt hast, kann es Passieren, dass dein Board für viele Minuten die Flucht ergreift.

Das würde ich an deiner Stelle wieder auf 0 stellen.

 

Ich denke ich kaufe mir einfach den gleichen chuck wie barney, wenn er mir verrät wo er den gekauft hat^^.

 

@barney

Das Problem mit der Rückwärtsfahrt ist gelöst dank deinem tipp mit Der If funktion.

 

Die int Dämpfung setzt den Zeitpunkt ab dem der Regler sein Signal bekommt nur nach hinten.

 

Also y-achsen-wert 127 neutral.

 

Bei Dämpfungswert 50 wird erst ab y-achsen-wert 157 beschleunigt.

Bei Dämpfungswert 1 erst ab 128

Bei Dämpfungswert 80 erst ab 187 und so weiter

 

gibt es da noch eine lineare Aufsummierung die man verändern kann um den Anlauf seidiger zu gestalten :D

 

letztes Problem: diesen Wert auch auf 20 zu bekommen.

// Bremsfunktion bei losgelassenen Z Knopf durch zurueckziehen

// der X-Achse und unterschreiten des unteren Totpunktes

if (nunchuk.zButton == LOW && nunchuk.analogY < UntererTotpunkt){

StellWertMotor = nunchuk.analogY;

 

Gruß Sonni.

 

Ps: heute wurde meine Achse von einem Luftfahrtschweißer sehr schön geschweißt :).

bearbeitet von sonni
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich denke ich kaufe mir einfach den gleichen chuck wie barney, wenn er mir verrät wo er den gekauft hat^^.

Nö, wir bringen deinen zum laufen! Die Routine muss universeller sein. Und du bist der Tester :D

 

Die int Dämpfung setzt den Zeitpunkt ab dem der Regler sein Signal bekommt nur nach hinten.

Dämpfung macht was anderes:

StellWertMotor=StellWertMotor+((nunchuk.analogY-NeutralstellungYAchse)/Daempfung);

 

Ist so zu verstehen:

Der Zahlenwert für den Motorsteller liegt bei 0 bis 255. Der Nunchuk liefert auch einen Wert von 0 bis 255 (theoretisch! typisch 3 bis 245). Würde die Aufsummierung ohne Dämpfung stattfinden, würde bei einer Iteration die Möglichkeit bestehen gleich Vollpower zu haben.

Dämpfung (dumm benannt) teilt den Eingangswert des Nunchuck auf einen kleineren Wert. Dieser wird dann bei jeder Iteration dann aufsummiert. Ich hatte den Wert so gewählt, dass wenn man den Nunchuk auf max. vorwärts hält, die Routine erst nach 3 Sekunden den max Wert 255 an den Motorsteller Weiterreicht. Aber nicht als zeitliche Verzögerung sondern als Rampe, die in 3 Sekunden auf den vollen Wert ansteigt (in Bezug auf die Neutralstellung 127).

 

Jetzt die Falle:

Wenn du deinen Motorsteller auf verzögerte Beschleunigung eingestellt hast. Treffen leider zwei Dämpfungsroutinen aufeinander. Die Zeitverzögerungsroutine vom Motorsteller und der Arduino Rampe. (Den Spaß hat Chrizz schon hinter sich)

:mad:

 

Wie kann man das Problem lösen.

Den Motorsteller so einstellen, das er nur eine minimale Verzögerung aufweist. Dann hast du was von der Rampe für den seidigen Motorlauf.

 

gibt es da noch eine lineare Aufsummierung die man verändern kann um den Anlauf seidiger zu gestalten :D

Sollte mit oben beantwortet sein!

letztes Problem: diesen Wert auch auf 20 zu bekommen.

 

Alt:

if (StellWertMotor <= 0){

StellWertMotor = 0;

 

Für Sonnis Regler Xerun:

if (StellWertMotor <= 21){

StellWertMotor = 21;

 

Obwohl ich das unschön finde besser wäre:

mymotor.attach(9);

 

-> mymotor.attach(9,600,2400);

Der unterste Wert ist default, wenn er nicht gesetzt wird 544. 600 Müsste als unterster Stellwert für deinen Regler reichen, ansonsten leicht anheben!

 

Wenn wir anfangen an jeder Stelle die if-Grenzwerte zu verändern, wird das Programm nicht universell sein.

 

Warnung:

Mit jeder seriellen Ausgabe in der Loop Routine verlangsamst du das Programm in der Schleifengeschwindigkeit. Die Werte für Dämpfung usw. bekommen einen neuen Wert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nochmal zum Thema Funkabriss:

Da Sonnis Nunchuk sich leicht gedämpft verhält muss folgende Routine angepasst werden:

 

 

accelXAlt = nunchuk.accelX; // Alten Wert des Beschleunigungssensors ablegen

nunchuk.update(); // Neue Werte vom Controller holen

 

// Warscheinlichkeitsdetektor Funkabriss

if (nunchuk.accelX == accelXAlt){

//Serial.println("Warscheinlichkeitsdetektor Funkabriss"); // Debug

//Serial.println(PairingLostCount,DEC); // Debug

PairingLostCount++;

// Sollte der Schwellwert ueberschritten werden

if (PairingLostCount > PairingLostTrigger){

//Serial.println("Warscheinlichkeitsdetektor Trigger ausgeloest"); // Debug

digitalWrite(InitReceiverStatusLED,LOW); // Status LED aus

PairingStatus = LOW; // Verbindung zun Controller steht nicht

}

}

 

Es wird nur eine Achse für den Funkabriss ausgewertet.

accelXAlt = nunchuk.accelX; // Alten Wert des Beschleunigungssensors ablegen

 

accelXAlt = nunchuk.accelX; // Alten Wert des Beschleunigungssensors X ablegen

accelYAlt = nunchuk.accelY; // Alten Wert des Beschleunigungssensors Y ablegen

accelZAlt = nunchuk.accelZ; // Alten Wert des Beschleunigungssensors Z ablegen

 

if (nunchuk.accelX == accelXAlt && nunchuk.accelY == accelYAlt && nunchuk.accelZ == accelZAlt)

 

Soll dann bewirken, dass wenn alle Achsen den alten Wert liefern, davon ausgegangen werden darf, dass die Verbindung abgerissen, oder der Nunchuk heruntergefallen ist. Die Empfindlichkeit wurde so deutlich erhöht.

 

Noch an die an die Variablenerweiterung denken:

 

int accelXAlt = 0; // Alter Beschleunigungswert X

int accelYAlt = 0; // Alter Beschleunigungswert Y

int accelZAlt = 0; // Alter Beschleunigungswert Z

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nächste Falle:

 

Mein Nunchuk neigt dazu, wenn er sehr ruhig gehalten wird, den Beschleunigungssensor "einzufrieren". Alle drei Achsen zeigen recht hartnäckig den letzten Wert an. Ein leichte Bewegung reicht aus, den Sensor wieder zu aktivieren.

Um dies hinzu bekommen, müsste ich aber tot auf dem Board zusammenbrechen. So langweilig könnte ich nicht fahren. :D

 

@Sonni

Sonni wurde die Empfindlichkeit jetzt für deinen Nunchuk in Bezug auf die Beschleunigungssensoren gesteigert?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Barney, genau das war die Falle. Das einfrieren,verharren der Beschleunigungswerte der 3 Achsen nach ca 3 Sekunden. Wenn ich in der Wohung sitze und hier den ganzen Tag experimentiere, dann nervt das schon wenn man mit der Hand wackeln muss. Dann habe ich wohl doch keinen minderwertigen Nunchuck. Das hätte ich aber besser gefunden, da dass nun ein zu umständlich lösbares Problem zu sein scheint.

 

Bei meiner ersten Ausfahrt bin ich auch nicht Tot gewesen aber trotzdem ging das Board öfter aus, also werde ich erst einmal einen neuen Chuck bestellen in der Hoffnung , dass dieser Empfindlicher reagiert und nicht bei Schwankungswerten der 3 Achsen im Bereich von +-5 ,nach 3 Sekunden einfriert.

 

Die Beschleunigungsempfindlichkeit muss ich erst noch uploaden, ich denke dass werde ich nacher noch machen.

 

 

Wie sieht, dass eigentlich bei dir Aus was fährst du für Boards? Doch sich nichts von der Stange:cornut:

Falls du mal Handwerkliche Hilfe benötigst, dann fühle dich bitte genötigt mich zu fragen .

 

Gruß Sonni

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Barney, genau das war die Falle. Das einfrieren,verharren der Beschleunigungswerte der 3 Achsen nach ca 3 Sekunden. Wenn ich in der Wohung sitze und hier den ganzen Tag experimentiere, dann nervt das schon wenn man mit der Hand wackeln muss. Dann habe ich wohl doch keinen minderwertigen Nunchuck. Das hätte ich aber besser gefunden, da dass nun ein zu umständlich lösbares Problem zu sein scheint.

 

Bei meiner ersten Ausfahrt bin ich auch nicht Tot gewesen aber trotzdem ging das Board öfter aus, also werde ich erst einmal einen neuen Chuck bestellen in der Hoffnung , dass dieser Empfindlicher reagiert und nicht bei Schwankungswerten der 3 Achsen im Bereich von +-5 ,nach 3 Sekunden einfriert.

 

Die Beschleunigungsempfindlichkeit muss ich erst noch uploaden, ich denke dass werde ich nacher noch machen.

 

Ansatz 1:

Ich denke um eine Erweiterung nach, wie z.B. die Bewegung des Joystick mit einzubeziehen.

 

Ansatz2:

Ich werde versuchen, direkten Bluetooth Kontakt zum Nunchuk herzustellen. Vielleicht klappt dies ja.

 

Wie sieht, dass eigentlich bei dir Aus was fährst du für Boards? Doch sich nichts von der Stange:cornut:

Falls du mal Handwerkliche Hilfe benötigst, dann fühle dich bitte genötigt mich zu fragen .

Gruß Sonni

 

Ganz böser wunder Punkt. Mein Board ist derzeit ein Construction Set. Ich packe das Fräsen meiner Motorhalterung derzeit überhaupt nicht. Mein Rad habe ich auch noch nicht abgedreht.

 

Programmieren kann ich auch immer nur für wenige Stunden.

 

Aber das andere Programmierprojekt ist sei Mittwoch abgeschlossen, so das ich mir die Bluetooth Geschichte genauer ansehen kann.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hast du eine Zeichnung deiner Motorhalterung? Ich habe zwar nur

Zugang zu einer nicht komputergesteuerten Fräsmaschine aber damit kann ich umgehen.

Ich bin gerne bereit dir das Teil zu fräsen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Sonni das klingt super:

Externe Links nur für Mitglieder sichtbar

 

schau mal hier rein. Die genauen Maße sende ich dir morgen. Die Rohlinge habe ich auch schon.

 

Momentan habe ich das Programm leicht neu gestaltet und kommentiert. Sollte jetzt besser lesbar sein. Bluetooth habe ich auch schon vorbereitet.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Sonni,

 

ich habe vergessen darauf hinzuweisen, dass sich wenige Pins verändert haben. Besonders der Motor Anschluss. :o

Das Ganze ist dem Bluetooth Modul geschuldet.

 

Zum Nunchuk und Bluetooth:

Das sieht nicht gut aus, den Nunchuk direkt per Bluetooth anzusprechen, wenn es überhaupt Bluetooth ist, was der Billigcontroller da sendet oder spricht.

 

Grüße

 

Barney

Link zu diesem Kommentar
Auf anderen Seiten teilen

Morgen.

 

Ich habe nur Freecad und ich glaube nicht, dass die Zeichnung so aussehen solll wie sie mir angezeigt wird.

 

Ich würde auch mit einem bemaßten Screeshot zurecht kommen.

 

 

Gruß Sonni

Link zu diesem Kommentar
Auf anderen Seiten teilen

Morgen.

Ich habe nur Freecad und ich glaube nicht, dass die Zeichnung so aussehen solll wie sie mir angezeigt wird.

 

Ich würde auch mit einem bemaßten Screeshot zurecht kommen.

Gruß Sonni

 

Anbei die Grundplatte.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zum Nunchuk und Bluetooth:

Das sieht nicht gut aus, den Nunchuk direkt per Bluetooth anzusprechen, wenn es überhaupt Bluetooth ist, was der Billigcontroller da sendet oder spricht.

 

Laut den einschlägigen Foren kein Bluetooth! :mad:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde dir noch eine Abrundung der Kanten empfehlen ,denn sonst verhackst du dich ganz schnell mit der Moterhalterung, was dir nicht passieren würde wenn sie ein Art Rampe darstellt.

 

gruß Sonni

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Sonni,

 

hast du im neuen Programm diese Zeile schon gefunden:

 

mymotor.attach(8,544,2400); // Motorpin zuweisen und unteren und oberen Wert fuer den Stellweg vorgeben

 

Wenn du die 544 auf 600 anhebst sollte es "die nicht unter 20 Wert" Problematik für deinen Xerun nicht mehr geben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde dir noch eine Abrundung der Kanten empfehlen ,denn sonst verhackst du dich ganz schnell mit der Moterhalterung, was dir nicht passieren würde wenn sie ein Art Rampe darstellt.

gruß Sonni

 

Hatte ich eigentlich auch vor. Aber der Rohling gibt es nicht her. Chrizz lebt mit dieser Halterung recht gut. Aber danke für den Hinweis.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Externe Links nur für Mitglieder sichtbar

 

 

 

kostet nicht die Welt so eine Aluplatte.

Ihr schweißt den Motorhalter direkt an nicht?

Ich habe dass bei mir noch mit einem Flansch gelöst der wurde angeschweißt und man kann den Motorhalter daran mit 4 Bolzen befestigen.

 

Update:

 

 

 

 

 

 

 

 

Ich setzte mich nach dem Mittag an das Programm, bin momentan noch mit den Sensoren beschäftigt:o

 

Danke dass du dir die viele Mühe machst und so auf meine Probleme eingehst!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Sonni,

 

hast du im neuen Programm diese Zeile schon gefunden:

 

mymotor.attach(8,544,2400); // Motorpin zuweisen und unteren und oberen Wert fuer den Stellweg vorgeben

 

Wenn du die 544 auf 600 anhebst sollte es "die nicht unter 20 Wert" Problematik für deinen Xerun nicht mehr geben

 

Leider ist immernoch das Problem, dass die Bremsung bei losgelassenen z-knopf nur bis y-Achsen-wert 20 funktioniert, wenn der wert unterschritten wird, dann wird der Motor wieder freigelassen...

 

Wenn ich allerdings mit der Z-Taste Bremse dann funktioniert es da ich die Zeile

// Subroutine fuer die Motorsteuerung

void Motorsteuerung(){

// Beschleunigen bei gehaltenen Z-Knopf und überschreiten des Oberern Totpunktes

if (nunchuk.zButton == HIGH && nunchuk.analogY > ObererTotpunkt){

StellWertMotor=StellWertMotor+((nunchuk.analogY-NeutralstellungYAchse)/Daempfung);

if (StellWertMotor >= 180){

StellWertMotor = 180; // obere Grenze fuer den Motorregler

}

}

// Verlangsamen bei gehaltenen Z-Knopf und unterschreiten des UntererTotpunkt

else if (nunchuk.zButton == HIGH && nunchuk.analogY < UntererTotpunkt){

StellWertMotor=StellWertMotor+((nunchuk.analogY-NeutralstellungYAchse)/Daempfung);

// Auf Wunsch kann die Bremsfunktion hier heraus genommen werden

// StellWertMotor <= Leerlauf , StellWertMotor = Leerlauf

if (StellWertMotor <= 20){ // negative Werte für den Motorregler sollte es nicht geben

StellWertMotor = 20;

angepasst habe.

 

 

 

kannst du hier etwas verändern?

// Bremsfunktion bei losgelassenen Z Knopf durch zurueckziehen

// der X-Achse und unterschreiten des unteren Totpunktes

if (nunchuk.zButton == LOW && nunchuk.analogY < UntererTotpunkt){

StellWertMotor = nunchuk.analogY;

Dass der Stellwert des Motors analog zum Hebelweg bis Wert 21 ist oder so?

 

 

Die Beschleunigung Setzt auch erst ab y-achsen-wert 177 ein, da sie immer noch durch den Dämpfungswert x

(z.B. 50),

 

x+127(neutralstellung y-achse),

 

nach hinten verschoben wird.

 

, da wäre es vlt gut den Hebelweg proportional zum Stellwert des Motors zu nehmen, wie bei der Bremsung ohne Z-Taste und die Zeit, der Addition, der Beschleunigungswerte zu verlangsamen als Dämpfer.

 

Weißt du was ich meine ?

Hast du dieselben Erfahrungen mit deinem Motorregler gemacht?

gruß sonni

bearbeitet von sonni
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Sonni,

 

dein Regler scheint sehr eigen zu sein.

 

Ich bin der Überzeugung, das der obere und untere Totpunkt nicht vom Regler richtig gelernt wird:

 

Damit hast du die direkte Kontrolle über den Nunchuk. Vielleicht klappt das Anlernen dann besser.

 

if (nunchuk.zButton == LOW && nunchuk.analogY < UntererTotpunkt){

StellWertMotor = nunchuk.analogY;

}

 

->

 

if (nunchuk.zButton == LOW){

StellWertMotor = nunchuk.analogY;

}

Aber bitte damit so nicht herumfahren!

 

 

zu

mymotor.attach(8,544,2400);

 

das Anheben von 544 auf 600 oder 700 hat keine Auswirkung????

Nicht 10 oder 15 als unterster Wert für die Bremse?

 

if (nunchuk.zButton == LOW && nunchuk.analogY < UntererTotpunkt){

StellWertMotor = nunchuk.analogY;

if (StellWertMotor <= 21){ // negative Werte für den Motorregler sollte es nicht geben

StellWertMotor = 21; // untere Grenze fuer den Motorregler

}

}

 

Sollte dein Bremsproblem bei direkter Bremse lösen, wenn es mit mymotor.attach nicht klappen sollte.

 

 

Ich baue meinen Regler heute mal auf. Der Unterschied fängt damit an, dass meiner für Hubschrauber ist und damit keinen Rückwärtsgang kennt.

 

 

Linearität:

Mist ich sehe den Gedankenfehler:

Im Quellcode der Servo Lib sehe ich gerade, dass die Werte nicht von 0 bis 255 gehen, sondern 0-180 (Grad) alles über 180 wird auf 180 begrenzt.

 

Damit ergeben sich mehrere Änderungen:

#define Leerlauf 127 // Motor Leerlauf

-> #define Leerlauf 90 // Motor Leerlauf

 

Hat du schon erkannt (war vorher 255):

if (StellWertMotor >= 180){

StellWertMotor = 180; // obere Grenze fuer den Motorregler

 

Ich schreibe das Ganze kurz mal um und poste die neue Version!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Göttlich!

 

// Bremsfunktion bei losgelassenen Z Knopf durch zurueckziehen

// der X-Achse und unterschreiten des unteren Totpunktes

if (nunchuk.zButton == LOW && nunchuk.analogY < UntererTotpunkt){

// Der Nunchuk liefert einen Bremswert von 127 bis zur 0 runter. Der Motorsteller benötigt aber einen

// Winkel unter 90 Grad. nunchuk.analogY - (NeutralstellungYAchse - Leerlauf) liefert einen geeigneten Wert.

StellWertMotor = nunchuk.analogY - (NeutralstellungYAchse - Leerlauf);

if (StellWertMotor >= Leerlauf){ // Sicherheitsfunktion, damit nicht mit der Bremsfunktion

StellWertMotor = Leerlauf; // Beschleunigt wird. Der oberste Wert darf nicht über den Leerlauf liegen

}

if (StellWertMotor <= 20){ // negative Werte für den Motorregler sollte es nicht geben

StellWertMotor = 20; // untere Grenze fuer den Motorregler

 

Jetzt bin ich Glücklich!

 

 

Das Finde ich sogar noch besser um die Bremse härter zu machen.

#define Leerlauf 40 // Motor Leerlauf

 

Linearität:

Mist ich sehe den Gedankenfehler:

Im Quellcode der Servo Lib sehe ich gerade, dass die Werte nicht von 0 bis 255 gehen, sondern 0-180 (Grad) alles über 180 wird auf 180 begrenzt.

 

Damit ergeben sich mehrere Änderungen:

#define Leerlauf 127 // Motor Leerlauf

-> #define Leerlauf 90 // Motor Leerlauf

 

Hat du schon erkannt (war vorher 255):

if (StellWertMotor >= 180){

StellWertMotor = 180; // obere Grenze fuer den Motorregler

 

Hat sich dadurch nicht verändert, wenn du mal dein Debugprogramm ausführst wo dir gezeigt wird, welche Werte die Achsen bei Knüppelbewegung ausführen, dann siehst du, dass Der Motorstellwert,der dem Regler übermittelt wird, immer um den Dämpfungswert nach hinter verschoben ist auf der Y-Achse.

 

Mich stört es eigentlich auch garnicht, ich bin auch nur manchmal krankhafter Perfektionist :D

 

 

 

Gruß Sonni

bearbeitet von sonni
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...