Jump to content
elektro-skateboard.de

Wii Nunchuck mit Teensy 3.1


barney

Empfohlene Beiträge

Geschrieben

Hi Barney,

echt super:thumbsup:

 

Ich bin jetzt erst mal in Urlaub, das bedeutet kein Lötkolben aber volle

LiPos ... testen der Fahrfunktion satt. Ich hab so das Gefühl, dass meine Z-Taste nicht ganz astrein funktioniert. Wenn ich die nicht richtig fest drück springt mir das Board aus voller Fahrt in dem Leerlauf. Das ist wie wenn Dir einer unerwartet das Board nach hinten wegzieht und du einen Laufsprint hinlegst :devil: Hatte jemand schon mal ähnliche Probleme mit seinem Nunchuk?

 

Danach mach ich mich an's Umsetzen der kompletten Schaltung.

 

VG

Dude

Geschrieben

Hi Dude,

 

das Phänomen ist nicht unbekannt. Ich hatte schon mal nachgedacht die Tastenabfrage mit einet zeitlichen Komponente zu versehen. D.h. z.B. 100ms Selbsthaltung.

Geschrieben (bearbeitet)

Wo hast Du Deinen Madcatz bestellt? Bin bisher nur bei Amazon in US fündig geworden.

Dude

Erl.: z-catz

bearbeitet von Dude
Gefunden
Geschrieben

Es wurde ein unbemerkter Brems-Bug ausgemerzt!

Die Motorsteuerung wurde durch ISR in ein festes Zeitraster eingebracht.

 

3.4P1 05.06.2014 Barney: Fuer die vereinfachte Konfiguration sind jetzt Custom_Settings und Parameters in eine eigene Datei ausgelagert worden.
                         Überstromroutine überprüft.
3.4P2 08.06.2014 Barney: Steuerung funktioniert jetzt wieder. Unnoetige nunchuk.init wurden entfehrnt. Es werden durch die Nunchuk abfrage nur 20 Motorstellwerte/s erzeugt. Spaetere Version mit Teensy optimierter Lib ist angestrebt.
                         Messungen sind O.K.
                         Strombegrenzung nicht optimal, wird noch nachgearbeitet. Es fehlte ein if () wenn gembremst wird sollte die Strombegrenzung nicht die Bremse abschalten. Beim fahren klappt die Strombegrenzung nicht so optimal.
3.4P3 09.06.2014 Barney: Alle #Define mit Typendefinition versehen. Die Debugzwecke kann die Ausgabe der Messwerte von Serial1 auf Serial (USB) umgeleitet werden (Custom Settings)
                         Bremsen auch mit Ueberstrom ist jetzt moeglich.
3.4P4 11.06.2014 Barney: Fehler in Auswertung der Y-Achse und der Bremswertberechnung beseitigt. Wenn der gemessene Wert der Y-Achse unter MinYAchse lag, wurde ein negativer Überlauf errechnet, welches die direkte Bremsfunktion abgeschaltet hat.
                         Wenn jetzt analogY < MinYAchse ist wird analogY = MinYAchse. Vorsichtshalber wurde dies mit MaxYAchse auch begrenzt. Dies fällt nur bei der Verwendung mehrerer Nunchuks auf.
                         Die Berechnung des Motorstellwertes wird jetzt durch den Timer3 zeitlich festgelegt. Durch das Weglassen einer unnoetigen Nunchuk Abfrage und Umstellung der (wieder) Verbindung zum Nunchuk im Sekundentakt, ist ein 
                         zeitliches äquidistantes Steuern den Motors moeglich.

Geschrieben

Ich hab um die Ströme zu checken den Optokoppler mit LTspice simuliert - das sieht in der Simulation auch alles i.O. aus ... vor allem gibt es mir als Nicht-Elektrotechniker etwas mehr Sicherheit, bei dem was ich tue:thumbsup:

 

Wie hast Du den Überstromfall in der Praxis getestet?

 

Schickst Du uns noch die V3.4P4?

 

VG

Dude

Geschrieben

Huhu,

verbringe gerade die Zeit damit noch ein paar Kleinteile aus

Externe Links nur für Mitglieder sichtbar
zu beschaffen.

Vielen Dank @Dude

 

Diese sind:

-

-

- (Habe ich mir bei Conrad gekauft)

-

-

R-78 3.3-0-5 &

 

Wolle nochmal sicher gehen ob das die aktuelle Liste ist, welche ich jetzt noch benötige um ein funktionierendes Board ans Laufen zu bringen.

 

@ Barney

Vielen Dank für die Zusendung des Quelltextes. Die Überprüfung war erfolgreich und das Board wurde erfolgreich geflasht.

 

Vielen Dank Jungs

Waiti

Geschrieben

Diese sind:

-

Externe Links nur für Mitglieder sichtbar

-

- (Habe ich mir bei Conrad gekauft)

-

-

R-78 3.3-0-5 &

-> DS1820 !

 

Wie soll ich es sagen?

 

1. Wenn Du nur steuern willst und keine Telemetrie benötigst, brauchst du nur den Teensy und den R-78 3.3-0.5.

2. Willst Du dein Board (Leistungsteil) über den Teensy einschalten, dann IRFP3206 und den Optokoppler.

3. Benötigst du telemetrische Daten, dann BT-Modul, DS1820, ACS756-050, u.s.w.

 

VG

 

Barney

Geschrieben
Welchen Überstrom Fall?

 

Du meintest doch, dass die Überstromroutine jetzt funktioniert. Ich vermute mal, dass man bei Normalbetrieb nicht in den Überstrom kommt, oder? Daher hab ich mich gefragt, wie Du das getestet hast, also den Fall "Überstrom" erzwungen hast ... oder passiert das einfach so beim Gasgeben ...

 

VG

Dude

Geschrieben
Du meintest doch, dass die Überstromroutine jetzt funktioniert. Ich vermute mal, dass man bei Normalbetrieb nicht in den Überstrom kommt, oder? Daher hab ich mich gefragt, wie Du das getestet hast, also den Fall "Überstrom" erzwungen hast ... oder passiert das einfach so beim Gasgeben ...

 

Hi Dude,

 

manchmal stehe ich auf dem Schlauch: Ich habe ein Testboard mit zwei Potis. Damit kann ich jeden "Strom" einstellen und damit die Routinen testen :D

 

VG

 

Barney

Geschrieben
Hallo Zusammen,

 

anbei der aktuelle Schaltplan - danke an Barney und Beatbuzzer für die vielen Ratschläge.

 

Dude

 

Auf die Schnelle einen kleinen Hinweis:

 

Der Spannungsteiler für A0 (Spannungsmessung) ist noch auf 30V -> 5V ausgelegt. Da der Teensy 3.1 nur 3.3V verträgt, sollte hier ein anderes Verhältnis eingestellt werden!

 

(R1+R2)/R2 für die Auslegung!

Geschrieben
Hi Dude,

 

manchmal stehe ich auf dem Schlauch: Ich habe ein Testboard mit zwei Potis. Damit kann ich jeden "Strom" einstellen und damit die Routinen testen :D

 

VG

 

Barney

 

My two Cents:

Ich hab mir den Code mal angesehen und dabei ist mir folgendes aufgefallen. Bei der Integrationssteuerung werden im Überström nur bei einer Beschleunigungsanforderung die Werte für StellwertMotorAlt NICHT upgedated. Du fängst das in der ersten if Anweisung ab. Bei nicht gedrückter Z-Taste werden auch im Überstrom neue Vorgaben für StellwertMotorAlt gemacht. Ich kann mir vorstellen, dass das beabsichtigt ist, da in diesen Fällen ja eine Reduktion des Stromes statt findet ... ist das der Grund?

Bei DirectDrive dagegen kann auch im Überstrom jede der If-Zweige durchlaufen werden, das passt dann nicht zu meiner Interpretation.

Ich kann jetzt leider nicht testen, da ich die notwendige HW nicht besitze, habe aber die Vermutung, dass man bei der Integrationssteuerung die Einschränkung "F_Ueberstrom == LOW" komplett aus der ersten if-Abfrage raus nehmen könnte. Wäre zumindest konsistent zum DirectDrive. Andernfalls müsste man die Einschränkung im DirectDrive auch rein nehmen.

 

Ist wie gesagt nur eine Analogiebetrachtung, testen kann ich's nicht und liege möglicherweise komplett daneben :D

 

P.S.: der Schaltplan hatte natürlich noch die von Dir erwähnten Fehler, es war wie ich bemerkt habe auch nicht meine aktuellste Version. :devil: Ich werde von der aktuellen Version ein pdf erzeugen und versuche die hochzuladen - ist bei der miserablen Internetverbindung hier im Urlaub aktuell meine größte Herausforderung;)

Geschrieben

Hi Dude,

 

danke für den Hinweis. Irgendwann wird man Code Blind.

 

Integrationssteuerung:

Das letzte "if" könnte auch ein "else if" sein. Ich war scheinbar der Meinung, dass Bremsen vor Beschleunigung sein muss. Im Prinzip nicht falsch, aber beim Abarbeiten der Routine etwas übertrieben.

 

Direct Drive:

if (analogY >= NeutralstellungYAchse) {

sollte eher ein

if (analogY >= NeutralstellungYAchse && F_Ueberstrom == LOW) {

sein.

 

Da ich wegen der Überstromerkennung und Trennung der Parameter soviel daran herumgefummelt habe, setze ich mich mal am Wochenende hin und gehe die Motorsteuerungs Routine in Ruhe nochmal durch. Leider habe ich mein Testboard nicht zur Hand. Ich muss mal an dieser Stelle improvisieren.

 

Es zeigt sich immer wieder, Software sollte nicht nur von einer Person geschrieben werden, es sollte mindestens ein zweiter die Zeilen durchgehen.

 

Wie findest du die Trennung der Parameter in eigene Files?

 

VG

 

Barney

Geschrieben

Hi,

 

derzeit erstelle ich unter Eagle ein Layout, die eine Platine oder einen Schaltplan zur Folge hat. Schlussendlich will ich mir eine "echte" Platine fertigen lassen, damit der Kram nicht wild herumfliegt. Den Schaltplan stelle ich in der ersten Version am Wochenende ins Forum. Wer Fehler findet oder Anmerkungen hat, kann mir diese gerne aufzeigen.

 

VG

 

Barney

Geschrieben

   if (zButton == LOW && analogY < UntererTotpunkt){   // Unmittelbares Abbremsen bei losgelassenem Z-Knopf
     StellWertMotor = UntererStellWertMotor + (analogY-MinYAchse)*(LeerlaufStellWertMotor-UntererStellWertMotor)/(NeutralstellungYAchse-MinYAchse);
     if (StellWertMotor >= LeerlaufStellWertMotor) StellWertMotor = LeerlaufStellWertMotor;   // Sicherheitsfunktion gegen beschleunigen
     if (StellWertMotor < UntererStellWertMotor) StellWertMotor = UntererStellWertMotor;      // untere Grenze fuer den Motorregler
   }

 

Dieser Code kommt zweimal vor. Da Direct Drive und die Integrationssteuerung den selben Code verwendet wird dieser zukünftig zentral stehen.

Geschrieben (bearbeitet)

Hi Barney,

 

mit der Modifikation

if (analogY >= NeutralstellungYAchse && F_Ueberstrom == LOW) {

sieht es schön symmetrisch aus, danke.:thumbsup:

 

Die Trennung der Parameter ist für mich o.k.. Ein einziges File hat halt den Vorteil, dass man gleich alles zur Hand hat, wenn man was ändern möchte. Gut ist allerdings, dass es nicht mehr nur ein DEBUG-Flag gibt!

Was mir besonders gefällt ist, dass die Motorsteuerung jetzt mit 50Hz abläuft - ich habe manchmal das Gefühl, dass die Steuerung unterschiedlich schnell auf eine neue Vorgabe anspricht; vllt. hilft die Änderung (kann es momentan leider nicht testen, da ich kein USB-Kabel für den Teensy dabei habe ... kommt aber noch).

 

Ich wollte den Schaltplan auch schon in EagleLight reinprfrimeln, kenne mich aber mit der Bedienung nicht aus, daher bin ich noch nicht so weit gekommen. Wenn Du es schaffst, die Bauteile auf einer 110x50 mm Platine unterzubringen wäre das richtig super, da ich unter meinem Gehäuse auf dem Board leider nicht mehr Platz habe:D

 

Grüße

Dude

 

P.S.: Ich restrukturiere gerade die Motorsteuerungsroutine - wenn's klappt wird sie recht übersichtlich und macht zudem noch das gleiche wie zuvor - Stay Tuned

bearbeitet von Dude
Geschrieben

Sneak Preview

 if (zButton == HIGH) {
   if (DirectDrive == FALSE) {   // INTEGRATIONSSTEUERUNG bei gehaltenem Z-Knopf
     if (analogY  > ObererTotpunkt && F_Ueberstrom == LOW) {   // Beschleunigen bei Ueberschreiten des Oberern Totpunktes wenn kein Ueberstrom vorliegt
       StellWertMotor = StellWertMotor + (analogY - NeutralstellungYAchse)/BeschleunigungsDaempfung;
     }
     else if (analogY < UntererTotpunkt) {                    // Verlangsamen bei Unterschreiten des UntererTotpunktes
       StellWertMotor = StellWertMotor + (analogY - NeutralstellungYAchse)/BeschleunigungsDaempfung;
     }
   }
   else if (DirectDrive == TRUE) {   // DIRECT DRIVE bei gehaltenem Z-Knopf
     if (analogY >= NeutralstellungYAchse && F_Ueberstrom == LOW) {   // Beschleunigen wenn kein Ueberstrom vorliegt
       StellWertMotor = LeerlaufStellWertMotor + (analogY-NeutralstellungYAchse)*(ObererStellWertMotor-LeerlaufStellWertMotor)/(MaxYAchse-NeutralstellungYAchse);
     }
     else if (analogY < NeutralstellungYAchse) {                      // Unmittelbares Abbremsen unterhalb der Neutralstellung der Y-Achse 
       StellWertMotor = UntererStellWertMotor + (analogY-MinYAchse)*(LeerlaufStellWertMotor-UntererStellWertMotor)/(NeutralstellungYAchse-MinYAchse);
     }  
   }
   if (StellWertMotor < UntererStellWertMotor) StellWertMotor = UntererStellWertMotor;   // untere Grenze fuer den Motorregler
   if (StellWertMotor > ObererStellWertMotor)  StellWertMotor = ObererStellWertMotor;    // obere Grenze fuer den Motorregler
   StellWertMotorAlt = StellWertMotor;  // Bei Ueberstrom wird der alte Wert benoetigt
 }

 if (zButton == LOW) {   // Gleichbehandlung von INTEGRATIONSSTEUERUNG UND DIRECT DRIVE bei losgelassenem Z-Knopf 
   StellWertMotor = LeerlaufStellWertMotor;   // Freilauf des Motors
   if (analogY < UntererTotpunkt){            // Unmittelbares Abbremsen wenn zusätzlich der untere Totpunkt unterschritten wird
     StellWertMotor = UntererStellWertMotor + (analogY-MinYAchse)*(LeerlaufStellWertMotor-UntererStellWertMotor)/(NeutralstellungYAchse-MinYAchse);
   }
   if (StellWertMotor < UntererStellWertMotor) StellWertMotor = UntererStellWertMotor;   // untere Grenze fuer den Motorregler
   if (StellWertMotor > ObererStellWertMotor)  StellWertMotor = ObererStellWertMotor;    // obere Grenze fuer den Motorregler
 }

 // Uberstrom detektiert, Motor abbremsen bis maximal Neutralstellung
 if (F_Ueberstrom == HIGH && StellWertMotor > LeerlaufStellWertMotor){
   StellWertMotor = LeerlaufStellWertMotor+(StellWertMotorAlt-LeerlaufStellWertMotor)*Reduktionsfaktor;
   if (DEBUG_Motorsteller){
     Serial.print("Reduktionsfaktor: ");
     Serial.println(Reduktionsfaktor);
   }
 }

 analogWrite(Pin_Motorstelleranschluss, StellWertMotor);   // Geschwindigkeitsvorgabe Motor in PWM-Register setzen

 

Dude

Geschrieben

Hi Dude,

 

danke für die Überarbeitung und Optimierung. Da werden sich die 72MHz freuen:D

 

Eine kleine Anmerkung: Bitte keine Tabs verwenden, damit kommt die Arduino IDE nicht immer zurecht. Was du da so mühselig einrückst ist nachher bei mir völlig durcheinander.

 

Ich habe mal ein Diff von unseren Versionen hinein gepackt. Natürlich nur die Motorsteuerung!

Für diesen Vergleiche benutze ich Notepad++ mit Compare Plugin.

 

VG

 

Barney

1434591056_MotorsteuerungDiff.thumb.PNG.d01c9a589ef8775726ec558adcab0d0d.PNG

Geschrieben

Hi Barney,

 

das mit den Tabs ist natürlich doof, zumal ich absichtlich keine verwende ... ich vermute mal dass mein Editor (jedit) die Leerzeichen umwandelt. Notepad++ hab ich auch installiert, bin in der Verwendung von Editoren emotionslos. Bevor ich raus kriege, wie ich die Tab-Umwandlung in jedit abschalte nehm ich eben den Notepad++.

 

Dude

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