Author Topic: Witty self-balancing Bot  (Read 42849 times)

Rene

  • freakyfriday
  • Full Member
  • *
  • Posts: 138
  • Karma: +6/-0
    • Video - Tutorials für Hobbyelektroniker
Witty self-balancing Bot
« on: May 23, 2019, 02:56:50 PM »
Hallo Witty - Programmierer

Hat jemand von euch sich schon etwas mit der Programmierung des Wittys vertraut gemacht? Ich bin mir immer noch nicht sicher, auf welcher Ebene man da einsteigen sollte.

Man merkt, dass Jean-Daniel ein Hardwaremensch ist. Er denkt in Registern und einzelnen Bits. Die Programmierung dient nur dazu, die Hardware in den gewünschten Zustand zu versetzten.
Dadurch wird der Code unglaublich kompakt und leistungsfähig, ist aber gar nicht so einfach zu verstehen.

Ich als Softwaremensch und Informatiker denke in Klassen und Datenstrukturen. Die Hardware ist nur dazu da, das was ich zusammenprogrammiert habe zu visualisieren. Solche Programme sind auf Mikrokontrollern aber oft zu gross und zu langsam.
Ich als Arduino - Programmierer stecke irgendwo dazwischen. Ich setze mich mit der Hardware auseinander, muss aber nicht die Funktion jedes einzelnen Bits kennen.

Die beim Witty mitgelieferten Bibliotheken steuern nicht nur die Hardware, sie ersetzen auch beinahe alles, was die Arduino - Umgebung so komfortabel macht.
Grundsätzlich würde es ja genügen, die Anwendung der mitgelieferten .h - Files zu verstehen und die eigenen Programme darauf aufzubauen. Obwohl auch einige Anleitungen und Beispiele zu den .h - Files vorhanden sind, kommen aber immer wieder Detailfragen zu einzelnen Funktionen auf. Und dann hilft nur ein Blick auf die Implementation dieser Funktionen.

Wie weit möchtet ihr gehen oder bin ich der Einzige, der einen Arduino-Pin nicht im Kopf dem richtigen Bit im richtigen Register zuordnen kann? Dürfen wir zum Beispiel in unserem PID-Regler die Arduino - Funktion millis() und micros() verwenden oder müssen wir dazu einen eigenen Timer - Interrupt aufsetzen?

Übrigens PFM anstelle von PWM für die Motorgeschwindigkeit ist absolut genial und MUSS verwendet werden!

Gruss
René
 

boxtec-support

  • Moderator
  • Hero Member
  • *****
  • Posts: 787
  • Karma: +15/-0
    • Boxtec Web
Re: Witty self-balancing Bot
« Reply #1 on: May 28, 2019, 11:47:42 AM »
Hallo zusammen,

Es besteht natürlich überhaupt kein Zwang irgendeine von JDs Libraries zu verwenden, ich glaube aber sobald man alle der Hardware Features die der Witty hat (gleichzeitig) einsetzen will, kommt man um diese kompakten Bibliotheken oder zumindest ein Teil davon nicht herum.
Jean-Daniels Idee war auch, dass man explizit die Libraries anpassen soll, daher sind sie in allen Beispielen mit "" inkludiert und nicht mit <>. Diese sind in dem Zusammenhang auch eher als Beispiele zur eigenen Erweiterung gedacht.

Ich glaube, dass das Balancieren wohl die schwierigste Aufgabe wird, nicht unbedingt nur aufgrund der Aufgabe und dem zeitkritischen Charakter der Regelung, sondern vor allem weil man den Code jedesmal zum Testen erst auf den Witty spülen muss um dann zu sehen, dass er (noch) nicht so tut wie er sollte und dabei aber nicht mal eben ein paar Zeilen seriellen Debugging Output zum Analysieren zur Verfügung hat sondern nur die Beobachtung des Scheiterns.
Die Idee von Jean-Daniel ist hier z.B. über den APA102 Strip gewisse Debugging Informationen binär anzuzeigen.

Für mich selber, wird daher die erste Aufgabe darin bestehen, den Witty einfach mal balancierend geradeaus fahren zu lassen, bisher sind die Erfolge da aber eher bescheidener Natur..
Vielleicht können wir aber vorab auch für unsere Hackathons konkrete Ziele finden und ggf. die Arbeiten aufteilen wenn das gewünscht ist.

Bzgl. der Libraries: Anpassungen, Erweiterungen, Fehlerbehebungen und auch weitere Beispiele sind jederzeit sehr willkommen, wer direkten Zugriff auf das git von Witty will, soll sich bitte direkt bei mir melden.
Die Witty Library ist übrigens seit dem Wochenende auch Teil des Arduino Library Managers und kann direkt über diesen installiert (und aktualisiert) werden.

Viele Grüsse - Christoph

dinoi

  • freakyfriday
  • Sr. Member
  • *
  • Posts: 441
  • Karma: +7/-0
    • Dinoi
Re: Witty self-balancing Bot
« Reply #2 on: May 28, 2019, 02:59:37 PM »
Hallo Zusammen

Den Code hatte ich kurz mal überflogen aber noch nichts weiteres damit gemacht.
Die Register nutzte ich bis jetzt in keinem Projekt somit kann ich hier nicht viel Wissen beitragen.
Wie Ihr, glaube ich auch, als erstes sollten wir den bestehenden Code bzw. die Bibliotheken verstehen.
Vorschlag: Wir ergänzen möglichst viel Code mit Kommentaren, was wird gemacht, wieso welcher Pin.
Wenn wir nichts verstehen, dann fragen wir JD. Ich bin gerne bereit Ihm in Französich zu schreiben,
dann kann er auch auf Französisch antworten. ( Was Ihm sicher einfacher fällt ).
Alle französischen Kommentare übersetzten wir in English.

Daher würde ich vorschlagen, dass wir alle direkt im Git eine Fragen/Antworten Datei anlegen wo jeder seine Fragen reinstellt und dann sende ich die an JD. Da können wir dann mehrere Zyklen machen. Wir sollten auch keine Hemmungen haben "Dumme" Fragen zu stellen.

Und ebenfalls würde ich vorschlagen wir editieren direkt im Git die Files und ergänzen sie oder wir machen einen eigenen Branch.

Bezüglich Debugging hätte ich noch zwei weitere Ideen.
a) Ein dünnes Kabel für Tx und GND welches flexibel und leicht ist. Das hält mann dann über dem Witty damit kann dieser trotzdem Balancieren oder hinfallen :-)
b) Wir hängen noch ein HC-05 Modul an, das sendet dann die Debugging Infos zum Computer/Smartphone

Debugging ist für mich sehr wichtig, jedoch sollten wir vorsichtig damit sein, es braucht Zeit und das Balancieren ist zeitkritisch.

Sobald wir dann den bestehenden Code verstehen, können wir damit spielen und Ihn anzupassen.
Jedoch denke ich sollten wir zuerst das normale fahren (mit Stütze) gut in den Griff bekommen.
Und dann die Gyro Daten auslesen und interpretieren können, soweit ich gesehen habe gibt es dazu noch nicht viel von JD.

Die nächsten Tage habe ich mir vorgenommen mit dem Witty richtig zu starten.

Gruss Reto

boxtec-support

  • Moderator
  • Hero Member
  • *****
  • Posts: 787
  • Karma: +15/-0
    • Boxtec Web
Re: Witty self-balancing Bot
« Reply #3 on: May 28, 2019, 05:20:43 PM »
Hallo Reto,

Das Vorgehen, die Libs zu verstehen (und ggf. auch inline zu dokumentieren) finde ich super.

Ich würde für die Fragen vorschlagen, das Forum hier zu nutzen, so können wir einander vorerst gegenseitig helfen und alles was ungelöst bleibt an JD geben (er wird sich über jemand der französisch mit ihm spricht sehr freuen  :) ). Da mittlerweile Releases aus dem Repo gebaut werden und eine Q&A Datei dann unweigerlich auf den PCs der Nutzer die die Witty Lib installieren/updaten landen würde ist das vrmtl. nicht ideal, ausser wir verwenden z.B. das Projekt Wiki dafür.

Was wir an Erkenntnissen und Verständnis gewinnen, kann dann entweder in die Kommentierung der Quellen und/oder separate Dokumentation fliessen. Ich stelle mich da auch gerne als markup Schreiberling zur Verfügung. Wer einen Account für unser git möchte, bitte mit gewünschten Login und Emailadresse bei mir melden.

Die Idee mit dem Kabel zum Debugging ist gut, aber dann kann der Witty ja nicht mehr um die eigene Achse rotieren resp. wird praktisch durch das Kabel balanciert. Ein HC-05 ist aus meiner Sicht der bessere Weg und sollte eigentlich direkt mit einem Adapter in den Kommunikationsheader oben einsteckbar sein.

Ich hoffe an Auffahrt etwas damit spielen zu können.

Grüsse - Christoph



dinoi

  • freakyfriday
  • Sr. Member
  • *
  • Posts: 441
  • Karma: +7/-0
    • Dinoi
Re: Witty self-balancing Bot
« Reply #4 on: May 28, 2019, 10:48:56 PM »
Hallo Christoph

Ok ja das ist perfekt, dann lass uns gleich mal beginnen. Ich habe heute etwas damit gespielt.

Die einzelnen Funktionen im WittyDemo2.ino habe ich ausprobiert, wobei das (2) pfm bei mir nicht funktioniert. Die Motoren bewegen sich überhaupt nicht, funktioniert das bei Euch?

Das Bild im Dokument https://www.didel.com/Witty.pdf finde ich gut, das im Git ist da weniger aktuell.

Beim (4) "demonstrate log dim" habe ich die Baud Rate im TerSer.h File erhöht. Bei 57600 funktioniert das bestens bei 115200 kommt nur Müll, wie ist das bei Euch?
Ich denke 9600 sind für uns zu wenig.
 
Bezüglich HC-05 und Debugging, hat jemand die Steckerbelegung von gem Gaia Stecker gefunden? Hat jemand so einen kleinen 1.27mm Stecker?

Danke und Gruss
Reto

dinoi

  • freakyfriday
  • Sr. Member
  • *
  • Posts: 441
  • Karma: +7/-0
    • Dinoi
Re: Witty self-balancing Bot
« Reply #5 on: May 29, 2019, 10:44:31 PM »
Bezüglich HC-05 und Debugging, hat jemand die Steckerbelegung von gem Gaia Stecker gefunden?

Hallo Zusammen

Die Steckerbelegung habe ich gefunden, von rechts nach links. GND ist an Pin 1.

GND
VCC
Tx
Rx
Reset

Jedoch habe ich eine weitere Frage, in den Dokumenten habe ich 3 Versionen von Pinouts gefunden, welche ist die richtige  ;) Siehe Anhang.

Gruss Reto

Rene

  • freakyfriday
  • Full Member
  • *
  • Posts: 138
  • Karma: +6/-0
    • Video - Tutorials für Hobbyelektroniker
Re: Witty self-balancing Bot
« Reply #6 on: June 02, 2019, 01:06:13 PM »
Hallo Reto

Die einzelnen Funktionen im WittyDemo2.ino habe ich ausprobiert, wobei das (2) pfm bei mir nicht funktioniert. Die Motoren bewegen sich überhaupt nicht, funktioniert das bei Euch?

Beim pfm-Test in WittyDemo2 bin ich auch nicht weiter gekommen. Habe dann aber etwas selbst experimentiert und mit Inter2.h und Pfm.h herumgespielt.
Das Ergebnis ist im angehängten PFMTest.zip zu finden.

Damit pfm funktioniert, muss in regelmässigen Abständen DoPfm() aus Pfm.h aufgerufen werden. Dieser Aufruf kann vom Timer2 - Interupt ausgelöst werden. Ich bin von Inter2.h ausgegangen und habe daraus ein eigenes IntTimer2.h gemacht. Der Interrupt wird alle 58 Mikrosekunden ausgelöst, wobei in der ISR dafür gesorgt wird, dass die eigentlichen Interrupt - Funktionen nur alle Millisekunden aufgerufen werden.

Die Interrupt - Funktionen können im Hauptprogramm definiert werden und dann mit addIntFunction() in die Liste eingetragen werden. Ich habe als Beispiel eine blinkende Led und den Aufruf von DoPfm() eingetragen.

Gruss
René


dinoi

  • freakyfriday
  • Sr. Member
  • *
  • Posts: 441
  • Karma: +7/-0
    • Dinoi
Re: Witty self-balancing Bot
« Reply #7 on: June 09, 2019, 10:33:22 PM »
Hallo René

Perfekt besten Dank, Dein Beispiel funktioniert sehr gut. Mit pfm kann man die Motoren sehr genau ansteuern.

Übrigens das Beispiel: TestG521.ino hat die Variablen vom Gy521.h nochmals deklariert. Die habe ich entfernt dann funktioniert es auch:

//int16_t GyX,GyY,GyZ;   
//int16_t AcX,AcY,AcZ;

Gruss Reto

Rene

  • freakyfriday
  • Full Member
  • *
  • Posts: 138
  • Karma: +6/-0
    • Video - Tutorials für Hobbyelektroniker
Re: Witty self-balancing Bot
« Reply #8 on: June 09, 2019, 11:25:35 PM »
Hallo Reto

Perfekt besten Dank, Dein Beispiel funktioniert sehr gut. Mit pfm kann man die Motoren sehr genau ansteuern.

Das war nur ein erster Versuch. Ich habe versucht das Ganze in Klassen zu verpacken. Das scheint auch ein gangbarer Weg zu sein, aber so richtig habe ich das noch nicht im Griff (C++ ist nicht gerade meine Lieblingssprache). Allerdings muss ich vor der Fülle von #define - Statements in Witty.h momentan kapitulieren. 

Gruss
René

Rene

  • freakyfriday
  • Full Member
  • *
  • Posts: 138
  • Karma: +6/-0
    • Video - Tutorials für Hobbyelektroniker
Re: Witty self-balancing Bot
« Reply #9 on: June 12, 2019, 09:49:05 PM »
motor und intTimer2 habe ich jetzt in Klassen verpackt. Erstaunlicherweise braucht das kaum mehr Speicherplatz.

Mit dem Gyro kämpfe ich noch, bisher habe ich es noch nicht geschafft, damit vernünftige Werte zu erhalten. Ich werde aber (hoffentlich) in Kürze eine vernünftige Klasse nachliefern können.

Gruss
René

MathiasW

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 614
  • Karma: +13/-0
    • my Arduino page
Re: Witty self-balancing Bot
« Reply #10 on: June 13, 2019, 12:09:10 PM »
Salut René,

der gyro liefert sehr sprunghafte Ergebniss, so dass man sie glätten muss:
Hier der Auszug aus meinem derzeitigen testcode:

Code: [Select]
MPU6050 accelgyro;

int16_t ax, ay, az;
int16_t gx, gy, gz;

#define Gry_offset 0  //The offset of the gyro
#define Gyr_Gain 16.348
#define Angle_offset 0  // The offset of the accelerator

float Angle_Delta, Angle_Recursive, Angle_Confidence;


void Filter()
{
  accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  //Angle_Raw = (atan2(ay, az) * 180 / pi + Angle_offset);
  Angle_Raw = (atan2(az, ay) * 180 / pi + Angle_offset);
  omega =  gx / Gyr_Gain + Gry_offset;
  // Filters datas to get the real move
  unsigned long now = micros();
  float dt = (now - preTime) * 0.000001;
  preTime = now;
  float K = 0.8;
  float A = K / (K + dt);
  Angle_Delta = (Angle_Raw - Angle_Filtered) * 0.64;
  Angle_Recursive = Angle_Delta * dt + Angle_Recursive;
  Angle_Confidence = Angle_Recursive + (Angle_Raw - Angle_Filtered) * 1.6 + omega;
  Angle_Filtered = Angle_Confidence * dt + Angle_Filtered;
}

In der Setuproutine lasse ich den Filter mindestens 100 mal laufen und sehe bei meinem Witty, wie sich der Winkel stabilisiert. Wenn sich der Robot aufstellt, mache ich das im loop dann auch.

Ich hoffe, das spart Dir einiges an Zeit.

Ciao, Mathias

Rene

  • freakyfriday
  • Full Member
  • *
  • Posts: 138
  • Karma: +6/-0
    • Video - Tutorials für Hobbyelektroniker
Re: Witty self-balancing Bot
« Reply #11 on: June 14, 2019, 08:03:32 AM »
Ich hoffe, das spart Dir einiges an Zeit.

Hallo Mathias,

ja, das wird es sicher. Vielen Dank. Es zeigt mir aber auch, dass ich wohl nicht darum herumkomme, mich mit den Grundlagen dieses Sensors zu befassen.

Gruss
René

dinoi

  • freakyfriday
  • Sr. Member
  • *
  • Posts: 441
  • Karma: +7/-0
    • Dinoi
Re: Witty self-balancing Bot
« Reply #12 on: July 02, 2019, 06:53:10 PM »
Hallo Zusammen

Das hier finde ich einen guten Beitrag mit guten Erklärungen zum Thema "Balancieren".
Er zeigt schön auf wie er das löst.

https://www.instructables.com/id/Arduino-Self-Balancing-Robot-1/

Gruss Reto

MathiasW

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 614
  • Karma: +13/-0
    • my Arduino page
Re: Witty self-balancing Bot
« Reply #13 on: July 03, 2019, 09:32:19 AM »
Salut Reto,

der Artikel ist herrlich und sehr gut geschrieben. Der Code, den ich verwende basiert auf einem Robot, der anscheinend an diesem Instructable stark angelehnt ist. Leider bootet der Witty sobald ich den Motor einschalte ... Ich habe mir auch einen stärkeren Akku besorgt, hatte aber noch nicht die Zeit, den Einspeisungpunkt auf der Platine zu finden

Ciao, Mathias

dinoi

  • freakyfriday
  • Sr. Member
  • *
  • Posts: 441
  • Karma: +7/-0
    • Dinoi
Re: Witty self-balancing Bot
« Reply #14 on: July 04, 2019, 09:34:50 PM »
Hallo Zusammen

Mir sind 2 Dinge noch aufgefallen:

a) Bei mir wird der sehr Gyro sehr vom Motor gestört. Ist Euch das auch aufgefallen?

a) In dem Beitrag auf Instructable schreibt der Autor, dass sein Roboter stabiler wäre wenn er etwas grösser wäre.
Irgendwie habe ich das Gefühl beim Witty auch, dass er fast zu sehr schon ausbalanciert ist zu zu leicht ist.
Das ist cool aber evtl. nicht gerade ein Vorteil. Was denkt Ihr?

Gruss Reto