Jump to content
elektro-skateboard.de

Wii Nunchuck mit Teensy 3.1


barney

Empfohlene Beiträge

Geschrieben

Kann und darf ich mit einer Platinenneubestellung rechnen?!

 

Derzeit gab es keine weiteren Anfragen. Es hat sich gerechnet 5 Platinen auf einen Schlag zu bestellen. Die Schaltplanfehler aus der Version 2.5 sind schon in der Datei raus. Ich kann gerne das Layout nochmals checken, wenn du einen günstigen Leiterplattenhersteller hast, kannst du auch selbst die Leiterplatte in Auftrag geben. Da gibt es viele China Anbieter, die das recht günstig machen.

Geschrieben

Na da hab ich ja noch richtig Glück gehabt mit meiner Platine. Quasi "very just in time" ;)

 

Der Keller ist auch Einsatzbereit. ( Ein bisschen ist zwar noch was anderes zu tun, aber das hält sich in Grenzen )

 

Der Februar ist zwar der kälteste Monat, aber bis es wieder wärmer wird ist genug zum Basteln da.

 

Aus meiner Sicht ein optimales Timing um die nächste Saison mit einem Teensy zu beginnen.

 

 

gRuss Ralf

Geschrieben (bearbeitet)

@barney

Dann werde ich wohl erst mal die Arduino-Variante ausprobieren wollen. Könnte ich die letzte Softwareversion von Dir gemailt bekommen?

 

PN ist unterwegs...

bearbeitet von ToniGadget
Geschrieben
@barney

Dann werde ich wohl erst mal die Arduino-Variante ausprobieren wollen. Könnte ich die letzte Softwareversion von Dir gemailt bekommen?

 

Die willst du nicht wirklich haben wollen!

 

Nimm einen Teensy und löte den Nunchuk mit Pins und Buchsen direkt an. Wenn du auf die MOSFETs verzichten kannst, ist das eine schnelle und saubere Lösung. Der Stromsensor oder die Spannungsmessung lassen sich auch so realisieren.

 

Vielleicht wollen bei Gelegenheit ja wieder 4-5 eine Leiterplatte haben.

 

VG

 

Barney

Geschrieben

@barney

 

Mmmhhhhh....

Einen Arduino nano hätte ich noch hier liegen. Einen Teensy müsste ich erst bestellen.

Wenn ich "nur" die normale Geschwindigkeitsregelung inkl. Hase & Igel Funktion mit Licht und Hupe realisieren möchte, wo liegt der Unterschied zwischen Arduino & Teensy ?

Geschrieben
@barney

 

Mmmhhhhh....

Einen Arduino nano hätte ich noch hier liegen. Einen Teensy müsste ich erst bestellen.

Wenn ich "nur" die normale Geschwindigkeitsregelung inkl. Hase & Igel Funktion mit Licht und Hupe realisieren möchte, wo liegt der Unterschied zwischen Arduino & Teensy ?

 

Die Arduino Version ist nicht mehr gepflegt. Einige Macken die erkannt worden sind, wurden im Teensy Quellcode bereinigt. Daher kann ich nur davon abraten.

Geschrieben
Die Arduino Version ist nicht mehr gepflegt. Einige Macken die erkannt worden sind, wurden im Teensy Quellcode bereinigt. Daher kann ich nur davon abraten.

Jaja, zu den 10 Jahren Produktpflege nach Abkündigung ist man ja nicht gesetzlich verpflichtet :D

Geschrieben (bearbeitet)

Wie sind die Realtime Anforderungen eigentlich für die Steuerung?

Also wie schnell muss die Reaktionszeit sein?

Momentan wird ja nur alle 50ms gefeuert.

Also wäre alles was <50ms abgearbeitet wird Realtime für die Motorsteuerung und FB.

Bei Computeranwendungen würde eine Reaktionszeit von <= 10ms als sofort wahrgenommen werden.

 

Brauchst du die IRQ-Timer?

Falls ja würde ich die Timer noch priorisieren und den Timer für Nuchchuk und Motorsteuerung maximal 5ms setzen.

 

 

Andere Möglichkeit wäre alles in der Loop-Routine abzufackelen und mit elapsedMillis arbeiten.

In dem Beispiel werden alle 100ms die Telemetriedaten eingelesen, jede Sekunde ein zweiter Timer gefeuert und die Motorsteuerung so schnell es die Hardware hergibt.

Die Motorsetuerung wird so zu dem definierten intervallen unterbrochen.

Wie lange das sein kann wird mit der elapsedMicros Variable gemessen.

So können wir feststellen ob uns das alles noch realtime genug ist.

 

// Timer für das Einlesen der Telemetriedaten
elapsedMillis tmrTelemetrie_elapsedMillis;
uint16_t tmrTelemetrie_timeout = 100;

// Timer2 als weiteres Beispiel
elapsedMillis tmrTimer2_elapsedMillis;
uint16_t tmrTimer2_timeout = 1000;

if (DEBUG_Runtime) {
 // Variable zur Messung der Ausführungszeit
 elapsedMicros Runtime;
}

void loop() {
 if (DEBUG_Runtime) Serial_DB.println("loop: Runtime Start");

 // Funktionsaufruf für Nunchuck
 //...

 // Funktionsaufruf für Motorsteuerung
 //...


 if (tmrTelemetrie_elapsedMillis >= tmrTelemetrie_timeout) {
   if (DEBUG_Runtime) Serial_DB.println("tmrTelemetrie tmrTelemetrie_timeout: Runtime Start");

   // Telemetrie Timeout zurücksetzten
   tmrTelemetrie_elapsedMillis = tmrTelemetrie_elapsedMillis - tmrTelemetrie_timeout;

   //Funktionsaufruf fürs auslesen der Telemetriedaten 
   //...

   if (DEBUG_Runtime) Serial_DB.println("tmrTelemetrie tmrTelemetrie_timeout: Runtime Ende");
 }

 if (tmrTimer2_elapsedMillis >= tmrTimer2_timeout) {
   if (DEBUG_Runtime) Serial_DB.println("tmrTimer2 tmrTimer2_timeout: Runtime Start");

   // Timer2 Timeout zurücksetzten
   tmrTimer2_elapsedMillis = tmrTimer2_elapsedMillis - tmrTimer2_timeout;

   //Funktionsaufruf für Timer2
   //...

   if (DEBUG_Runtime) Serial_DB.println("tmrTimer2 tmrTimer2_timeout: Runtime Ende");
 }

 if (DEBUG_Runtime) Serial_DB.println("loop: Runtime Ende");
}

 

(Der Code ist nur zur Veranschaulichung)

Das Einlesen der Telemetriedaten würde ich noch schaltbar machen wollen.

Wenn die Daten nicht geloggt oder angezeigt werden kann der Timer aus sein.

Die Ausgabe ebenso. Wenn keiner da ist der die Ausgabe haben will kann der Timer aus bleiben.

bearbeitet von Kai
Geschrieben (bearbeitet)

Hallo Kai,

 

Reaktionszeiten: Ich habe mehrere Zeiten für die Steuerung ausprobiert und war mit den jetzigen Werten zufrieden.

timer_1.begin(TimerT1, 1000000);  // 1 Sekunden Timer
timer_2.begin(TimerT2,  100000);  // 0.1 Sekunden Timer
timer_3.begin(TimerT3,   50000);  // 0.05 Sekunden Timer

void TimerT1() {
// Verbindung zum Controller herstellen und Pairing pruefen, Ausgabe Temperatur, Strom, Spannung, 

void TimerT2() {
// Messung Strom, Spannung, Leistung und Ueberstromerkennung

void TimerT3() {
 if (PairingStatus == HIGH){
   Funkabriss();                  // Nunchuk auslesen bei gleichzeitiger Prüfung auf Funkabriss
   Motorsteuerung();              // Motorsteuerung
   if (LICHTHUPE) Licht_Hupe();   // Licht und Hupe
   Hase_Igel();                   // Geschwindigkeitsumschaltung
   BlinkerRL();                   // Blinker Rechts Links
   Drive_Mode();                  // Umschaltung DirectDrive / Integral Mode

Es gibt wirklich kein Ereignis, welches ms genau ausgeführt werden muss. Selbst die Strommessung bildet über eine Sekunde aus 10 Messwerten ein Durchschnittsstrom.

 

Wo liegt denn das Problem:

Ganz einfach. Es darf keine Routine blockieren. Nicht, dass die Serielle Ausgabe hängt und die Motorsteuerung blockiert. Im Überstromfall ist das nicht lustig. Daher die drei garantierten Time ISR. Was der Teensy sonst mit seiner Zeit macht:

 

void loop()
{
 if (DEBUG_Funktion) Serial_DB.println("Funktion: Loop");
 if (PairingStatus == LOW) verbinden(); // Versuche mit Nunchuk neu zu verbinden, wenn Funkabriss erkannt worden ist.
 delay(100);

Nix! Der könnte eine Menge erledigen, hat auch Zeit ohne Ende. Da würde der Webserver reinpassen, wenn der ESP8266 nicht so Zeit Zickig wäre. Was soll der Webserver auch anzeigen? Da werden keine Daten gespeichert. Klar könnte ich den freien Flash Speicher des Teensys persistent mit Daten zu müllen, aber der reicht mir nicht wirklich. Bei einer 4 Stunden Ausfahrt -> 240 Minuten * 60 Messwerte/Minute = 14.400 Messwerte * (2*Temperatur + 1*Strom + 1*Spannung) (Leistung könnte on the Fly berechnet werden) = 2*2Byte+2Byte+2Byte = 8Byte ~ ca. 150kByte

->

Externe Links nur für Mitglieder sichtbar

 

Ich würde mal sagen nö!

 

Also muss ein externer Speicher her. Für € 45,- Speicher + CPU + WLAN + IR + .... da kann ich nicht nein sagen. Zumal das Handling recht einfach scheint.

 

Zurück zu deiner Frage:

Hat sich in der Antwort dahin gehend erledigt durch meine Aussage in

 

Dem Banana, Ras oder wie sie alle heißen fehlt es an ADCs, DACs / PWMs. Dafür sind viele Serielle Schnittstellen vorhanden. Ich habe mir die Erweiterungsplatinen für diese Gruppe an SBCs angesehen. Diese werden über den I2C Bus adressiert und ausgelesen. Wenn ich die alle kostenmäßig zusammenrechne, fahre ich mit dem Teensy preiswerter.

 

Du musst an den Banana Hardware ranbasteln.

Bei den Preisen der benötigten Hardware kann ich gleich ein Teensy nehmen.

 

Daher gehupft wie gesprungen.

 

Edit:

Der Banana bootet ca. 30 Sekunden. Möchtest du solange auf dein Board warten?

bearbeitet von barney
Geschrieben (bearbeitet)

Es darf keine Routine blockieren. Nicht, dass die Serielle Ausgabe hängt und die Motorsteuerung blockiert. Im Überstromfall ist das nicht lustig. Daher die drei garantierten Time ISR. Was der Teensy sonst mit seiner Zeit macht:

Dann musst du noch die Prioriäten definieren, sonst dürfen sich die Timer gegenseitig unterbrechen.

Die Motorsteuerung kann ohne Priorität auch unterbrochen werden von den anderen beiden Timern und den anderen Interrupts die Teensy so anbietet.

Die wichtigen Funktionen sollten zwischen 0 - 127 sein.

Die unkritischen zwischen 129 - 255.

In der Doku steht die meisten andern Intrerrupts haben 128 als Priorität.

 

 

myTimer.priority(number);

Set the interrupt priority level, controlling which other interrupts this timer is allowed to interrupt.

Lower numbers are higher priority, with 0 the highest and 255 the lowest. Most other interrupts default to 128.

As a general guideline, interrupt routines that run longer should be given lower priority (higher numerical values).

 

 

... hat auch Zeit ohne Ende. Da würde der Webserver reinpassen, wenn der ESP8266 nicht so Zeit Zickig wäre. Was soll der Webserver auch anzeigen? Da werden keine Daten gespeichert. Klar könnte ich den freien Flash Speicher des Teensys persistent mit Daten zu müllen, aber der reicht mir nicht wirklich. Bei einer 4 Stunden Ausfahrt -> 240 Minuten * 60 Messwerte/Minute = 14.400 Messwerte * (2*Temperatur + 1*Strom + 1*Spannung) (Leistung könnte on the Fly berechnet werden) = 2*2Byte+2Byte+2Byte = 8Byte ~ ca. 150kByte

->

Externe Links nur für Mitglieder sichtbar

Webserver läuft doch auf dem ESP8266. Teensy muss nur die Telemetriedaten über seriell an den ESP8266 bereitstellen.

Entwerder pusht Teensy die über einen Timer oder besser, die Telemetriedaten werden erst dann gelesen wenn der ESP8266 die Daten abruft.

So das der ESP8266 die Daten nur bekommt wenn er loggt oder jemand mit dem Webserver verbunden ist.

wenn man an den ESP8266 eine sd card bekommt wäre eh besser auch für das Docroot des Servers.

Oder willst du mit dem ESP jetzt gar nix mer machen? ... Mal sehen du schickst mir ja eins mit.

 

Der Banana bootet ca. 30 Sekunden. Möchtest du solange auf dein Board warten?[

 

Auf keinen Fall. Das bekommt man aber bestimmt noch optimiert, die ganzen unnötigen Treiber raus, nicht in den Windowmanager booten ...

 

 

Gut also bei meinem Beispiel könnte die Motorsteuerung auch unterbrochen werden von irgendwelchen teensy interrupts.

Aber nicht von den Timern.

Schön wäre es natürlich wenn man auch normalen Funktionen eine Priorität geben könnte, vielleicht geht das, so tief bin ich noch nicht drin.

Der Gedankenansatz im Beispiel ist die Motorsteuerung ohne Verzögerung auszuführen, auf Interrupts komplett zu verzichten aber trotzdem Funktionen mit Timerintervall zu haben.

 

Aber angenommen die Ausführung einer Timer-Funktion dauert länger als der Intervall des Timers was passiert dann?

Um erstmal festzustellen wie lange die Funktionsaufrufe dauern habe ich

if (DEBUG_Runtime) {
 // Variable zur Messung der Ausführungszeit
 elapsedMicros Runtime;
}
...
if (DEBUG_Runtime) Serial_DB.println("tmrTelemetrie tmrTelemetrie_timeout: Runtime Start");
...
if (DEBUG_Runtime) Serial_DB.println("tmrTelemetrie tmrTelemetrie_timeout: Runtime Ende");

 

eingebaut.

 

So kann man feststellen wie lange die Funktionen laufen und wie lange es dauert bis zum nächste Loop und Motorsteuerungsaufruf.

Nur als Beispiel, in der Endfassung würde ich nicht nur den Zeitstempel sondern auch die Differenz, also die Laufzeit ausgeben ...

 

Alles mit Interrupts zu machen ist am Ende meiner Meinung nach intuitiver und einfacher und besser strukturiert programmierbar.

serialEvent() wäre zb die Callback-Funktion die gefeuert wird sobald Daten da sind.

Leider steht in der Doku nicht wie die Priorität des Interrupts ist. Im Zweifelsfall 128 aber das kann man rausfinden.

 

Wird in der Nunchuck LIB alles gepollt oder kann man dort auch mit ISR arbeiten?

Muss ich mir noch ansehen...

bearbeitet von Kai
Geschrieben

Hallo Kai,

 

ESP8266: Ich sehe da keine große Zukunft. An den ESP bekomme man keine SD-Card angebunden. Der Teensy hat auch nichts mehr frei. Wenn, würde es ein eigener Teensy mit SD-Card und ESP werden. Aber hier ist der Banana Pi mit einem normalen Nginx Webserver wesentlich komfortabler. Ein Anbinden eines Speichers per I2C-Bus ist auch nicht der Bringer. Bis du alle Daten ausgelesen hast, ist die Geduld beim Benutzer weg. Grafiken oder andere schöne Dinge sind auch nicht so einfach wie mit den Banana Pro zu realisieren.

 

Teensy IRQ Prioritäten:

Bisher hatte ich keine Probleme mit den Ausführungszeiten. Daher die Schlamperei. Die Frage ist RT ob man sich das alles noch antut oder den jetzigen Programmstil beibehält. Da ich kein Programmierer bin, hoffe ich da auf einen Fingerzeig von dir.

 

Grundsätzlich:

Wir sollten sollten nur einen Fahrplan festlegen, wie es weitergehen soll. Bei Software kann man schnell mal alles infrage stellen. Bei Hardware sieht es da naturgemäß anders aus. Das jetzige Board wird mehrfach verwendet. Da möchte ich keinen vor dem Kopf stoßen und schreiben "Pech gehabt". Daher der vorsichtige Versuch mit dem Banana Pro. Bei den Preis auch keine Investitionsruine.

 

Also Quo vadis Teensy?

Geschrieben

Webserver läuft doch auf dem ESP8266. Teensy muss nur die Telemetriedaten über seriell an den ESP8266 bereitstellen.

Entwerder pusht Teensy die über einen Timer oder besser, die Telemetriedaten werden erst dann gelesen wenn der ESP8266 die Daten abruft.

 

So Autonom ist der ESP8266 nun auch wieder nicht. Die Webseite muss im Prozessor generiert werden und per AT-Kommando an den ESP übertragen werden. Die autonomen Webserver im ESP sind für mich noch in der Entstehungsphase.

Externe Links nur für Mitglieder sichtbar

 

Static Files usw. noch weit entfernt von Daten in den ESP schieben....

Geschrieben

Gut also bei meinem Beispiel könnte die Motorsteuerung auch unterbrochen werden von irgendwelchen teensy interrupts.

Aber nicht von den Timern.

Schön wäre es natürlich wenn man auch normalen Funktionen eine Priorität geben könnte, vielleicht geht das, so tief bin ich noch nicht drin.

Der Gedankenansatz im Beispiel ist die Motorsteuerung ohne Verzögerung auszuführen, auf Interrupts komplett zu verzichten aber trotzdem Funktionen mit Timerintervall zu haben.

 

Aber angenommen die Ausführung einer Timer-Funktion dauert länger als der Intervall des Timers was passiert dann?

Um erstmal festzustellen wie lange die Funktionsaufrufe dauern habe ich

if (DEBUG_Runtime) {
 // Variable zur Messung der Ausführungszeit
 elapsedMicros Runtime;
}
...
if (DEBUG_Runtime) Serial_DB.println("tmrTelemetrie tmrTelemetrie_timeout: Runtime Start");
...
if (DEBUG_Runtime) Serial_DB.println("tmrTelemetrie tmrTelemetrie_timeout: Runtime Ende");

eingebaut.

 

So kann man feststellen wie lange die Funktionen laufen und wie lange es dauert bis zum nächste Loop und Motorsteuerungsaufruf.

Nur als Beispiel, in der Endfassung würde ich nicht nur den Zeitstempel sondern auch die Differenz, also die Laufzeit ausgeben ...

 

Alles mit Interrupts zu machen ist am Ende meiner Meinung nach intuitiver und einfacher und besser strukturiert programmierbar.

serialEvent() wäre zb die Callback-Funktion die gefeuert wird sobald Daten da sind.

Leider steht in der Doku nicht wie die Priorität des Interrupts ist. Im Zweifelsfall 128 aber das kann man rausfinden.

 

Wird in der Nunchuck LIB alles gepollt oder kann man dort auch mit ISR arbeiten?

Muss ich mir noch ansehen...

 

Ich habe viele Zeiten gemessen. Da ist noch reichlich Zeit vorhanden.

Die nunchuk Lib wartet, bis eine Antwort vom Nunchuk kommt. Ich weiß nicht wie es bei der nativen I2C Lib ist, aber in der i2c_t3 Lib kannst du per I2C_TIMEOUT die Wartezeit festlegen, dann blockiert wenigstens die Nunchuk Abfrage nicht alles danach. Ich habe aktuell auf die i2c_t3 Lib umgestellt.

Aber um deine Frage zu beantworten, du kannst mit viel Liebe alles auf ISR umstellen. Dann können wir aber die Arduino IDE wegwerfen und gleich in c++ direkt den Teensy Programmieren. Der Witz lag ja in den fertigen Libs, mit denen bin ich aber selten zufrieden. Schönes Beispiel ist die OneWire Busabfrage. Da muss ich noch die Zeit messen.

 

Daher stelle ich ja auf verschiedenen Libs um wie ADC, i2c_t3 usw. weil die nativen Libs schnarchig sind.

Geschrieben

Nochmal ESP:

 

Wenn du den internen Webserver nutzen möchtest, muss du auch eine entsprechende Firmware basteln.

 

Der ESP8266 Hardware Variante 9:

Externe Links nur für Mitglieder sichtbar

 

hat 1MB Flash memory extra. Dieser würde die SD-Card einsparen.

 

Die Firmware kannst du mit der VM zum Downloaden selber basteln. Hier bin ich aber raus aus dem Spiel.

Es ist kein Thema eine Teensy Leiterplaten Revision 2.7 zu machen, wo der ESP8266 neben den HC-05 auf der Leiterplatte untergebracht wird. Kai, du machst dann die Firmware für den ESP!

 

1. ESP-01:PCB Antenna, 400m Distance understand empty condition, easy to use

2. ESP-02: Surface Mount Device, suitable for submission limit, antenna can leads to the shell by using IPX header

3. ESP-03: Surface Mount Device, Built-in ceramic antenna process, all are able to be leaded by IO

4. ESP-04: Surface Mount Device,type of antenna could be customized,flexible design,all are able to be leaded by IO

5. ESP-05: Surface Mount Device,only lead out the Port and RST Foot,with small volume, compatible with external antenna

6. ESP-06:Bottom SMT technology,all are leaded by IO,with metal shielding case

7. ESP-07: Semi hole SMT technology,all are leaded by IO,with metal shielding case,support external IPX antenna as well as internal ceramic antenna.

8. ESP-08: Semi hole SMT technology,all are leaded by IO,with metal shielding case,type of antenna could be defined by customers .

9. ESP-09:Ultra small packaging as 10*10mm. 4 layer technology, 1M byte!

10. ESP-10:Patch Interface,narrow body design,10mm width,suitable for LED Controller.

11. ESP-11:Patch Interface, ceramic antenna,small body design.

Geschrieben
So Autonom ist der ESP8266 nun auch wieder nicht. Die Webseite muss im Prozessor generiert werden und per AT-Kommando an den ESP übertragen werden. Die autonomen Webserver im ESP sind für mich noch in der Entstehungsphase.

Externe Links nur für Mitglieder sichtbar

 

Static Files usw. noch weit entfernt von Daten in den ESP schieben....

 

However, hau weg den Chip :cornut:

Ich war doch eh für ein kleines Debian :peace:

 

Ich würde mich dann auf deine Wahl zu der Profi Banane verlassen und es dann später auch bestellen.

Geschrieben
However, hau weg den Chip :cornut:

Ich war doch eh für ein kleines Debian :peace:

 

Ich würde mich dann auf deine Wahl zu der Profi Banane verlassen und es dann später auch bestellen.

 

Wer sich auf mich verlässt, ist verlassen :devil:

Geschrieben
Nochmal ESP:

Wenn du den internen Webserver nutzen möchtest, muss du auch eine entsprechende Firmware basteln.

Darüber hatten wir es schon, schmeiß das WLAN-Modul weg, wir verpassen Debian Räder.

 

Banana pro - USB - Teensy, so dass man den Teensy über den Banana Pro aus Flashen kann. Herrlich und das über Wlan.

 

Hupe: Banana pro AudioOut

 

vollwertiger Webserver

 

...

Geschrieben
Katzenjammer? Hundegebell? Kuhglocken?

Throttle-abhängiges V8-Geräusch? (*würg* als E-Fahrer:D )

 

Oder auch schrill: quietschende Reifen...

 

Das Geräusch einer überfahrenden Katze oder alternativ die Krallen von Freddy Krueger an der Tafel.

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