Jump to content
elektro-skateboard.de

Wii Nunchuck mit Teensy 3.1


barney

Empfohlene Beiträge

Den Gedanken hatte ich auch, ist als Parameter (linear/exponentiell) bereits vorhanden.;)

Ich denke die programmtechnische Realisierung ist gut machbar, die Schwierigkeit ist die Anpassung an die Fahrsituation, sprich Motordrehzahl. Selbst wenn man den Counter im Teensy benutzen könnte bleibt noch die Frage, woher er ein Signal bekommt, dass er zählen kann.

Im ersten Ansatz kann ich natürlich den Sollwert für den Motorsteller nehmen, die ist eben im Schubbetrieb bei Bergabfahrt beliebig daneben, d.h. konkret Drehzahl liegt über Sollwert und die Bremse haut zu stark rein. Wenn man das Joysticksignal generell erst einmal mit einer Exponentialfunktion verformt, könnte man die Auflösung zu Beginn hoch und dann gröber werden lassen. Das könnte dann sowohl bei der Direktsteuerung und auch bei dem Tempomat funktionieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Dude,

 

anbei die saubere Lösung für die Jostick Abfrage.

 

Ist wie ein Überraschungsei:

-> Es ist zukünftig Egal, welche Werte der Joystick liefert und wie groß sein Wertebereich ist. Alle Ausgaben werden auf +-2047 normiert.

-> Sollte der Joystick unerwartet seine Min oder Max Werte unter-/überschreiten ist das auch egal und wird abgefangen.

-> Für den Controller Eigenbau ein Wichtiger Schritt, da dieser mit 12Bit auflöst und Werte von 0..4095 liefert.

-> Der Weg ist jetzt einstellbar. Linear oder Exponentiell.

-> Meine Joda Variablenbezeichnung wurde korrigiert. MinYAchse -> YAchseMin

 

VG

 

Barney

 

Was ich noch heute probieren werde ist die Exponentialfunktion für beschleunigen und Bremsen getrennt zu parametrieren.

 

VG

 

Barney

 

// Nunchuk - Steuerparameter SollWertvorgabe und Programmablaufsteuerung 
#define YAchseMin (uint16_t)               27 // MinmalWert y-Achse ganz unten (0..65535,0..30)
#define YAchseMax (uint16_t)              250 // MaximalWert y-Achse ganz oben (0..65535, 240..255)
#define YAchseNeutralstellung (uint16_t) 2000 // Neutralstellung Y-Achse (0..65535, 125..135)
#define YAchseWertMax (uint16_t)         2047 // Neutralstellung Y-Achse (0..65535, 125..135)
#define YAchseTotpunkt (uint16_t)          50 // Totpunkt der Y-Achse +-8 digits (0..65535, 125..135)
#define YAchseExp (float)                 1.4 // 1 linear, 2 quadratisch

uint16_t JoystickWert = 0;
IntervalTimer timer0;

void setup()
{                
 Serial.begin(38400);
 timer0.begin(ISR_Timer0, 15000); 
}

void loop()                     
{
}

void ISR_Timer0() {
 uint16_t YAchseMapped = 0;
 JoystickWert = JoystickWert++;
 if (JoystickWert > YAchseMax) JoystickWert = 0;
 Serial.print("JoystickWert: "); 
 Serial.print(JoystickWert);
 Serial.print(" ");
 if (JoystickWert < YAchseMin) JoystickWert = YAchseMin;  // Sicherheitsfunktion, da bei unterschreitung die map Funktion Ueberlauf produziert
 if (JoystickWert > YAchseMax) JoystickWert = YAchseMax;  // Sicherheitsfunktion, da bei ueberschreitung die map Funktion Ueberlauf produziert
 YAchseMapped= map(JoystickWert, YAchseMin, YAchseMax, 0, 4095);
 Serial.print("YAchseMapped: ");
 Serial.print(YAchseMapped);
 Serial.print(" ExpJoystick:  ");
 Serial.println(JoyExponent(YAchseMapped, YAchseExp, YAchseTotpunkt, YAchseNeutralstellung, YAchseWertMax));
}

static inline int8_t sgn(int JoystickWert) {
 if (JoystickWert < 0) return -1;
 if (JoystickWert==0) return 0;
 return 1;
}

int JoyExponent (int16_t WertY, float Exponent, uint16_t Totpunkt, uint16_t Neutral, uint16_t WertMax)
{
 int16_t Wert = 0;
 WertY =  WertY - WertMax;
 uint16_t joyMax = Neutral - Totpunkt;
 int16_t joySign = sgn(WertY);
 int16_t joyLive = abs(WertY) - Totpunkt;
 Wert = joySign* WertMax * (pow(joyLive, Exponent) / pow((WertMax-Totpunkt), Exponent));
 return Wert;
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jetzt auch mit Unterscheidung für Beschleunigung und Bremse:

 

// Nunchuk - Steuerparameter SollWertvorgabe und Programmablaufsteuerung 
#define YAchseMin (uint16_t)               27 // MinmalWert y-Achse ganz unten (0..65535,0..30)
#define YAchseMax (uint16_t)              250 // MaximalWert y-Achse ganz oben (0..65535, 240..255)
#define YAchseNeutralstellung (uint16_t) 2000 // Neutralstellung Y-Achse (0..65535, 125..135)
#define YAchseWertMax (uint16_t)         2047 // Neutralstellung Y-Achse (0..65535, 125..135)
#define YAchseTotpunkt (uint16_t)          50 // Totpunkt der Y-Achse +-8 digits (0..65535, 125..135)
#define YAchseExpNeg (float)              1.4 // 1 linear, 2 quadratisch
#define YAchseExpPos (float)              2.0 // 1 linear, 2 quadratisch

uint16_t JoystickWert = 0;
IntervalTimer timer0;

void setup()
{                
 Serial.begin(38400);
 timer0.begin(ISR_Timer0, 15000); 
}

void loop()                     
{
}

void ISR_Timer0() {
 uint16_t YAchseMapped = 0;
 JoystickWert = JoystickWert++;
 if (JoystickWert > YAchseMax) JoystickWert = YAchseMin;
 Serial.print(JoystickWert);
 Serial.print(";");
 if (JoystickWert < YAchseMin) JoystickWert = YAchseMin;  // Sicherheitsfunktion, da bei unterschreitung die map Funktion Ueberlauf produziert
 if (JoystickWert > YAchseMax) JoystickWert = YAchseMax;  // Sicherheitsfunktion, da bei ueberschreitung die map Funktion Ueberlauf produziert
 YAchseMapped= map(JoystickWert, YAchseMin, YAchseMax, 0, 4095);
 Serial.print(YAchseMapped);
 Serial.print(";");
 Serial.println(JoyExponent(YAchseMapped, YAchseExpPos, YAchseExpNeg, YAchseTotpunkt, YAchseNeutralstellung, YAchseWertMax));
}

int JoyExponent (int16_t WertY, float ExponentPos, float ExponentNeg, uint16_t Totpunkt, uint16_t Neutral, uint16_t WertMax)
{
 int16_t Wert = 0;
 WertY =  WertY - WertMax;
 uint16_t joyMax = Neutral - Totpunkt;
 int16_t joyLive = abs(WertY) - Totpunkt;
 if (WertY < 0)  Wert = - (WertMax * (pow(joyLive, ExponentNeg) / pow((WertMax-Totpunkt), ExponentNeg)));
 if (WertY >= 0) Wert =    WertMax * (pow(joyLive, ExponentPos) / pow((WertMax-Totpunkt), ExponentPos));

 return Wert;
}

joy.thumb.PNG.356c6d308e21e4b25e50dc045cc1f989.PNG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Dude,

 

da du momentan aktiv an der Software herumschraubst, kannst Du bitte die Exponenten Funktion mit in der aktuellen Version von dir mit einbauen?

 

Hoffentlich blickt man vor lauter Customizing noch bei den Parametern durch....

 

VG

 

Barney

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mach ich, wird vermutlich aber erst in der nächsten Woche sein. Schickst Du mir Deinen Code noch zu?

 

Ich hab gestern noch testweise die Bremsfunktion auf einen LOG-Verlauf gemappt, allerdings ohne den Wertebereich anzufassen. Das waren nur ein paar Zeilen in der Motorsteuerungsroutine, die Beschleungung fand ich linear ganz gut. Die große Herausforderung war die Aktivierung der Gesetze für Logarithmen in meinem Kopf während des Fußballspiels. Ich hoffe das kann ich heute noch kurz testen. Wenn sich das gut anfühlt (=exp(AnzAbgängeVomBoard)) bau ich Deine fully fledged Variante ein.

 

Dude

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die große Herausforderung war die Aktivierung der Gesetze für Logarithmen in meinem Kopf während des Fußballspiels. Ich hoffe das kann ich heute noch kurz testen. Wenn sich das gut anfühlt (=exp(AnzAbgängeVomBoard)) bau ich Deine fully fledged Variante ein.

 

Fußballspiel? Das lenkt produktive / kreative nur unnötig ab :D

 

Den Code für die Exponenten Version steht hier im Thema!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Barney,

 

Code hab ich gesehen. Ich dachte nur, Du hättest das schon integriert ... gerade mit dem Totpunkt muss man beim DirectDrive noch ein wenig aufpassen. Sehe ich das richtig, die neue Timerroutine verwendest Du als for Schleife für die Ausgabe der Funktion?! Nice, schmeiß ich dann aber raus:)

 

Getestet hab ich meine LOG-Funktion auch gerade ... ist nicht gerade der Brüller. Ich meine, dass die Bremsfunktion bei meinem Alien ESC ab einem bestimmten Schwellwert mehr oder weniger giftig zupackt; regelbar ist anders:(

 

Hat jemand Erfahrungen mit der Einstellung und Dosierbarkeit der ABS-Brake beim Alien ESC? Ich hab aktuell einen hohen %-Wert von 80% oder so eingestellt, da ich immer davon Ausgegangen bin, es ist der Maximalwert bis wohin ich regeln kann. Werde mal einen niedrigeren Wert vorgeben - dann ist's bei hoher Geschwindigkeit komfortabler, bei geringer spürt man hält nix - auch blöd.

 

Dude

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Zusammen

 

Ich habe ein Gehäuse in CATIA konstruiert und es mal in 3D ausgedruckt.

Die LEDs werden noch versenkt. Ist lediglich ein Prototyp.

Das Ganze aus PLA und extrem stabil...

Werde Euch gerne Fotos hochladen - wenn gewünscht und auch das Audrucken sollte machbar sein.

 

Grüsse

Fabian

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Fabian,

 

coole Sache. Noch eine Frage, wo ist der Einschalter?

Persönlich würde ich das Display aussen tragen, also nicht am innenarm, sondern wie eine Uhr.

 

VG

 

Barney

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Barney

 

noch ist kein Loch für einen On Off Schalter vorhanden. Bin auf der Suche nach was geeignetem.

Die Gehäusestärke beträgt 2mm. Ein weiteres Loch ist schnell gebohrt.

Wie läuft es mit Eurer Steuerung?

Mir hat es ja leider einen Teensy geputzt. Falsch mit Strom versorgt :peace:

Hab leider noch keinen neuen bestellt.

 

Gruss Fabian

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Barney,

 

Code hab ich gesehen. Ich dachte nur, Du hättest das schon integriert ... gerade mit dem Totpunkt muss man beim DirectDrive noch ein wenig aufpassen. Sehe ich das richtig, die neue Timerroutine verwendest Du als for Schleife für die Ausgabe der Funktion?! Nice, schmeiß ich dann aber raus:)

 

Getestet hab ich meine LOG-Funktion auch gerade ... ist nicht gerade der Brüller. Ich meine, dass die Bremsfunktion bei meinem Alien ESC ab einem bestimmten Schwellwert mehr oder weniger giftig zupackt; regelbar ist anders:(

 

Hat jemand Erfahrungen mit der Einstellung und Dosierbarkeit der ABS-Brake beim Alien ESC? Ich hab aktuell einen hohen %-Wert von 80% oder so eingestellt, da ich immer davon Ausgegangen bin, es ist der Maximalwert bis wohin ich regeln kann. Werde mal einen niedrigeren Wert vorgeben - dann ist's bei hoher Geschwindigkeit komfortabler, bei geringer spürt man hält nix - auch blöd.

 

Dude

 

 

Ich hab den Alien ESC genau aus diesem Grund wieder verkauft.

Die ABS Bremse ist kompletter schrott. Jedenfalls bei einem Gelände Board wo man ausschließlich nur elektrische Bremst. Schlecht dosierbar. Meiner Meinung nach auch schlecht für den Motor.

Der ESC kann den Motor nur 100% Bremskraft geben. Er unterscheidet nur zwischen der Frequenz. Also Bremsen, Lösen, Bremsen, Lösen,... Das führt zu einem Abs Effekt.

 

Die Baijaboard Jungs haben ebenfalls die Alien in Verwendung. Wie die das schaffen inklusive regenerative Bremse ist mir ein Rätsel?

 

Gruß Gerald

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hab gestern mal mit Bruno von Alien zu dem Thema getextet. Er meinte sie sind gerade dran, eine nicht-ABS Bremse umzusetzen. Dauer aber noch rund 5 Wochen, er wird es dann ins ES Forum einstellen.

 

Dude

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hoi Zäme

 

vergesst doch das Bremsen über den Motor.

Ich habe ja die hydraulische Scheibenbremsanlage an den ABEC 11 Flywheels verbaut und seit dem kann ich fein dosiert Bremsen ohne Ruckler oder dergleichen.

Ich finde die Idee mit dem Motor-Bremsen interessant aber bei unseren Boards und vor allem auf dem Asphalt ist halt doch mal schnell der Stick-Slip Effekt da und es rattert.

Vor allem kann die hydraulische zupacken ohne Ende wenn es sein muss und man könnte sie auf 4 Räder anstatt 2 Räder erweitern.

 

Kurze Frage @ Barney:

Ich werde jetzt nen Teensy nachbestellen. Wo finde ich für Tests dann die aktuellen Infos (wieder via Email?), Falls ja würde ich mich bei Dir melden sobald der Teensy da ist. Es hat etwas länger gedauert, die beiden BT Module von Sparkfun zum Senden und Empfangen zu bewegen...

 

Grüsse

Fabian

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hydraulikbremsen hab ich an meinem Mountainbike ... stell mir das recht klobig und schwer vor. Gibt es dazu Fotos o.ä.?

Dude

Link zu diesem Kommentar
Auf anderen Seiten teilen

Externe Links nur für Mitglieder sichtbar

 

hier habe ich ein paar Bilder reingestellt.

Im Prinzip ist das auf jedes Rad bzw. Achse adaptierbar.

 

Grüsse

Fabian

Link zu diesem Kommentar
Auf anderen Seiten teilen

Im Sande verlaufen - das Interesse war da aber niemand wollte etwas von den Teilen haben.

Wollte das Ganze eigentlich weiterentwickeln und noch etwas optimieren. Satnd aktuell, 5 Personen sind ausgiebig gefahren und fanden es nach anfänglicher Skepsis: GEIL.

Vor allem in der Schweiz wo es doch recht bergig ist, macht das Sinn.

Und wie Du sagtest, den ALIEN Spass kannst vergessen.

 

Grüsse

Fabian

Link zu diesem Kommentar
Auf anderen Seiten teilen

Cool, wann geht's los? :thumbsup:

Wie machen wir das mit der Bezahle für die Bestellung? Ich kann Dir das Geld gerne vorab überweisen.

 

Dude

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Dude,

 

hier die (hoffentlich) Finale Version von der Leiterplatte. Ich habe noch einen Expansionsanschluss mit den freien Anschlüssen vom Teensy eingebracht. Sonni wollte noch einen Balancer für die Akkus haben. Die Serielle 1 und 2 sind für den Toshiba Sigma BLDC. Der Spannungsteiler ist für 33V gerechnet. Es sollten aber nur Akkus bis 28V angeschlossen werden. Der Rest ist Reserve. Warum 28V? Der R78 3.3-0.5 verträgt nicht mehr als 32V Eingangsspannung!

 

Es gibt einen potentialfreien Motorsteller Anschluss. Wer nicht die Opto HV-Serie (Flugregler) verwendet, sollte damit glücklich werden.

 

Der Power MOSFET für das Ein/-Ausschalten des Leistungsteil, schaltet den MOSFET mit 12V (oder 15V, je nach Z-Diode). Damit sollte der MOSFET wirklich niederohmig sein und damit auch keine großen Verluste auftreten.

 

Ein Anschluss für den Stromsensor ist auch vorhanden, einschließlich der passenden Spannungsversorgung des ACS756-050.

 

Der Nunchuk Empfänger ist ein Anbauteil geworden, da dieser später dieser nicht mehr gebraucht wird.

 

Die Widerstände musste ich alle vergrößern. Die 7mm waren zu knapp, jetzt sind es 10mm Widerstände der E24 Reihe. Man sollte immer die Libs prüfen. Das Gehäuse der MOSFETs stimmte auch nicht (DPACK -> TO252AA).

 

Der Bestückungsdruck ist auch generiert.

 

Kannst du bitte einen geneigten Blick auf die Leiterplatte werfen. Vielleicht habe ich was übersehen oder falsch angeschlossen.

 

Danke für die anstehende Mühe

 

Barney

Elektroskate Teensy 20140621.zip

95914801_LeiterplatteI21062014.thumb.PNG.672ce17128981b3d3135709e06442e31.PNG

bearbeitet von barney
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Barney,

 

mach ich gerne. Vorab zwei Fragen:

- Balancer: hab ich nicht verstanden ... soll der Teensy die Zellspannungen beim Laden überwachen und ggf. die Ladeströme umverteilen. Da fehlt doch dann nich ein wenig auf der Platine? Oder steh ich auf dem Schlauch

- Hoffe ich bring jetzt nicht alles durcheinander aber ich hab 8s Lipos ... damit komm ich bei vollen Akkus etwas über die 33 V. Bin ich damit draußen oder werden damit noch Widerstände notwendig oder ? Wäre auf jeden Fall blöd, wenn keine 8s Verwendung finden könnten

 

So jetzt ist aber Anpfiff Deutschland : Ghana.

 

Dude

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...