STM32F103C8 Plattformprojekt mit Display, FATFS, IMU MPU-9250 und Examples

nichtgedacht

Erfahrener Benutzer
#1
Hallo

ich habe hier https://github.com/nichtgedacht/mini-sys ein komplettes
Projekt für OpenSTM32 System Workbench (http://www.openstm32.org) hin
gelegt.

Das Projekt lässt sich auf Knopfdruck installieren und ist für mich die
Grundlage für alles weitere. Der original Code für das LCD stammt wie
der übrige hinzugefügte Code aus den Firmware Repos von STM für den
STM32F4xx und den STM32F1xx. Diesen Code habe ich stark verbessert, so
dass man 1. Display beliebig drehen kann und 2. mehr der Chip vom
Display die Arbeit macht. Da der initiale Code mit CubeMX erzeugt wurde,
kann man damit auch weiterhin die Konfiguration verändern. Dieses Tool
und die IDE sind auch für Linux erhältlich und beide sehr einfach zu
installieren.

Als Hardware eignet sich eins dieser billigen Boards "STM32 minimum
development system" oder ein marple mini clone mit STM32F103C8 oder
STM32F103CB und eins dieser ST7735 gesteuerten Displays mit 128x160
Pixel und SD Karten Slot wie z.B das Teil von Adafruit oder ähnliche.
Was man noch braucht sind ein paar Drähte eine Lochrasterplatte,
Buchsenleisten und ein ST-Link V2 Debug Adapter, den man ebenfalls
günstig bei ebay bekommt.

Als letzte Neuerung habe ich jetzt eine Breakout Platinchen mit einer MPU-9250 IMU
hinzugefügt. Somit passt es hier zum Thema.

Als kleine Application hiervon gibt es zunächst nur eine scheinbar durch Schwerkraft bewegte Kugel (Kreis)
im Display.

Vielleicht will es ja jemand clonen und was richtiges daraus machen.

Hardwarekosten < 20€

Gruß
Dieter
 

nichtgedacht

Erfahrener Benutzer
#2
Hi

inzwischen ist die Experimentierplatine fast als Flight Controller fertig. Dabei wollte ich ursprünglich nur ein Stehwellenmessgerät bauen und hatte mich auf den STM32 wegen der 12 Bit ADCs gestürzt.

Nur mit dem P Anteil in den Reglern sträubt sich das Ding heftig gegen Lageänderungen und hat nicht die geringste Neigung zum Schwingen. Natürlich hört das Sträuben auf, wenn keine weitere Lageänderung erfolgt. Das heißt, nach dem gewaltsamen Drehen besteht das Ding nicht darauf wieder in die Ausgangslage zurück zu wollen. Ist ja noch kein I Anteil eingeschaltet. Die Steuerung wirkt sehr agil aber nicht nervös. Ich denke wenn man Hubschrauber fliegen kann ist das Ding schon so leicht beherrschbar. Bis jetzt habe ich es nur in der Hand getestet und warte noch auf die passenden Akkus.

Die Lageregelung scheint jedenfalls keine Hexenwerk zu sein. Bei Timer Interrupt gesteuerten 400 Hz Update Rate bleibt sogar noch Zeit was auf das Display zu zaubern. Ich bin davon überzeugt, dass 400 Hz mehr als schnell genug ist.

Bilder:
Der billig Copter
Das Prototyping (Ausschnitt: S-Bus Inverter)

Gruß
Dieter
 

Anhänge

nichtgedacht

Erfahrener Benutzer
#3
Hi

Nachdem ich die PID Regler durch Testen in der Hand einigermaßen eingestellt und noch ein Failsafe implementiert hatte war Gestern Erstflug. Beim ruckartigen Schubgeben neigt er etwas zu wackeln. Auf Gier kommt er sehr knackig. Ich habe das Ki für Roll und Nick noch etwas zurück genommen. Mal sehen ob das was gebracht hat. Das Problem ist ja, das beim Testen in der Hand eine mögliche Schwingung sich nicht entfalten kann durch die Dämpfung. Da merkt man erst im Flug was Sache ist.

Eigentlich sollte diese Einstellverfahren funktionieren:

Ki und Kd auf Null
Kp erhöhen bis der Regelkreis schwingt.
Die Frequenz der Schwingung messen.

Dann:

mit
Tu als die Periode der Schwingung
Kkrit als Kp bei der das Schwingen einsetzt
Ti als Zeitkonstante für den Integrator
Td als Zeitkonstante für den Differentiator

und den Zusammenhängen:
1 K = Kp
2. Ki = K / Ti
3. Kd = K * Td

folgende Werte einstellen:

Kp = 0.6 * Kkrit, Ti = 0.5 * Tu, Td = 0.12 * Tu

Also mit einer Frequenz 20 Hz und Kkrit = 0.666 und 1. 2. 3.:
Kp = 0.6 * 0.666 = 0.4 , Ki = 0.4 / ( 0.5 * 50 * 10^-3) = 16, Kd = 0.4 * 0.12 * 50 * 10^-3 = 0.0024

Das Problem ist, dass man das nicht gefahrlos im Flug ermitteln kann und die Frequenz auch nur geschätzt ist.
Immerhin kann man Kkrit einigermaßen in der Hand ermitteln und vorsichtig mit konservativen Annahmen weitermachen.

Aber wahrscheinlich interessiert es hier ja doch wieder niemanden.

Gruß
Dieter
 

nichtgedacht

Erfahrener Benutzer
#4
Hallo,

ich wollte nur mal sagen, dass das Teil inzwischen perfekt fliegt.
Wenn man das Display weg lässt und 5V aus einem Motorsteller bezieht kann man damit eine winzig kleine Flightcontrol für 3,5€ bauen.

Gruß
Dieter
 

amadeus

Erfahrener Benutzer
#5
Dieter , klasse Job und vor allem so schnell?!
Mich interessiert es, leider hat die qualität hier im forum schon vor jahren abgenommen. hier wird eigentlich nur noch fertig zusammengesteckt und gut.
 

nichtgedacht

Erfahrener Benutzer
#6
Hi

Nachdem ich die 9 PID Werte mit der Fernsteuerung einstellbar gemacht habe konnte ich die Regler für Nick und Roll noch etwas verbessern.

Generell war ich so vorgegangen:
1 .Nur P Anteil und diesen erhöht, bis in der Hand bei sehr losem Halten ein Schwingen auftrat.
2. Den ermittelten P Anteil halbiert und soviel I Anteil dazu gegeben bis wieder ein Schwingen auftrat.
3. Den ermittelten I Anteil halbiert und dann etwas D Anteil dazu gegeben.

Danach flog er perfekt. Ich konnte allerdings sehen, dass nach einem Anstoß der Knüpppels auf Roll oder Nick ein kleines
kurzes Nachwippen auftrat.

Jetzt bin ich aber endlich in der Lage auf dem Flugfeld die Werte zu justieren. Ein nennenswertes erhöhen der P Werte
ergab nur ein Schwingen im Flug. Also wieder zurück damit. Dann habe ich in kleinen Schritten den D Anteil erhöht.
Jetzt ist das Nachwippen beim Knüppel Anstoßen ganz verschwunden. Das Ding ändert seine Lage im Raum genauso schlagartig wie ich den Knüppel anstoße und bleibt ohne Überschwinger so stehen.

Die Einstellbarkeit habe ich so realisiert:

Wenn die Motoren auf Halt stehen zeigt das Display die 9 Werte an.

Miit einem Tastschalter kann ich die Werte nacheinander auswählen. Mit einem 2 Stufen Schalter wird der "Program" Mode ausgewählt. Der Tastschalter läßt die Auswahl dann nicht weiter springen. Ein weiterer 3 Stufen Schalter "WriteUse" bestimmt was dann passieren soll. Wenn letzterer Schalter auf Mittelstellung ist wird im Eintrag der gerade selektiert ist ein neuer Wert angezeigt, der mit einem Drehknopf "Variable" passend skaliert einstellbar ist. Wenn der "WriteUse" Schalter unten ist wird dieser Wert fortlaufend in die RAM Varialble geschrieben. Die neuen Werte sind dabei nur für die aktuelle Session gültig.

Wenn der "WriteUse" Schalter in der oberen Position und "Program" on ist, bewirkt der Tastschalter ein abspeichern aller Werte in eine der oberen Flashseiten. Wenn diese Schalterstellung beim Anstecken des Akkus besteht, werden die Werte aus der oberen Flashseite in RAM kopiert. Bei allen anderen Stellungen werden die RAM Werte aus konstanten Werten im Programmtext erzeugt.

Auf diese Weise habe ich auch ohne Editieren 2 alternative Sets von Werten am Flugfeld. Die konstanten default Werte kann ich
dann später zu Hause anpassen.

Gruß
Dieter
 

nichtgedacht

Erfahrener Benutzer
#7
Hi

Inzwischen habe ich als RC Protokoll UDI16(Jeti) aka SRXL(Multiplex) implementiert. Damit ist die Auflösung doppelt so hoch (max 4095 Schritte)

Da ich gerade eine neue Platine mache, diesmal mit mehr Überlegung und alles gesockelt, habe ich mal die Verbindungen dokumentiert.

Der Klotz auf der Oberseite ist übrigens ein TSR-1 2450 5V 1A Schaltregler. Das Display und der IMU Baustein werden aber
aus den 3.3V vom Maple mine clone gespeist. Der Längsregler auf dessen Platine kann 1,5A.

Der Beeper ist elektrodynamisch und für 5V vorgesehen. Daher der Transistor. Als Verpolungsschutz sitzt noch eine Schottkydiode an den Versorgungsstiften.

Gruß
Dieter
 

Anhänge

Zuse

Erfahrener Benutzer
#8
Hallo Dieter,
eine feine Sache!
Hat mich veranlasst, System Workbench for STM32 auf dem LMDE2 aufzusetzen und mich damit etwas mehr zu befassen.
Auch CubeMX steht bereit, auch wenn ich bis auf die Takt-Teiler Geschichten die meisten Geheimnisse noch nicht aufgedeckt habe.
(Früher, zu Windows Zeiten, hatte ich CoIDE, aber das gibt es ja nicht für die Linuxwelt).
Seit längerem liegt hier ein "Entwicklungsboard" von abusemark mit einem STM32F103CBT6 herum und blinkt ... immerhin...
sollte eigentlich mit einem MPU6050 Platinchen eine "Naze für Arme" geben ;-) .
Vielleicht verstehe ich irgendwann einmal ein wenig von Deinem Programmgerüst, um auch eigene Projekte zum guten Ende zu bringen.
Weiterhin gutes Gelingen!

Gruß
Manfred
 

nichtgedacht

Erfahrener Benutzer
#9
Seit längerem liegt hier ein "Entwicklungsboard" von abusemark mit einem STM32F103CBT6 herum und blinkt ... immerhin...
sollte eigentlich mit einem MPU6050 Platinchen eine "Naze für Arme" geben ;-) .
Vielleicht verstehe ich irgendwann einmal ein wenig von Deinem Programmgerüst, um auch eigene Projekte zum guten Ende zu bringen.
Hallo Manfred,

dann kannst Du ja mein Projekt einfach vom GIT importieren und fast 1:1 übernehmen. Da müssen doch höchstens ein paar Ports geändert werden, die vielleicht von Deiner Hardware schon anderweitig in Verwendung sind.
Das MCU-Platinchen das ich verwende ist andererseits klein und billig. Davon kann man schon ein paar auf Halde legen.

Du kannst ja auch großflächig die Sachen entfernen die Du nicht brauchst, wie Display oder SD-Card.

Ich erkläre Dir gerne den Code, wenn Du Fragen hast.

Ich will jetzt auch eine Version ohne Display machen und einen Bootloader der per DFU über USB die Software vom PC lädt.
Dann könnte man über den Mechanismus auch ein Konfigurationstool laufen lassen. Dem User ist ja nicht zuzumuten, dass er einen Debugadapter anschließt;-) Der Bootloader an sich ist kinderleicht und funktioniert schon, aber das DFU Geraffel hat es in sich.

Anbei noch ein paar ergänzende Bilder.

Gruß
Dieter
 

Anhänge

Zuse

Erfahrener Benutzer
#10
Moin Dieter,

dann kannst Du ja mein Projekt einfach vom GIT importieren und fast 1:1 übernehmen. Da müssen doch höchstens ein paar Ports geändert werden, die vielleicht von Deiner Hardware schon anderweitig in Verwendung sind.
dieser Import Schritt war der einfachste ;-)
im Moment ist noch nichts belegt, außer gedanklich. So, wie Zeit ist, taste ich mich durch Deine Kreation ...
Hattest Du einen Textfile mit der Belegung der Ports? Ich glaubte, einen solchen gesehen zu haben, finde ihn aber nicht mehr.

Das MCU-Platinchen das ich verwende ist andererseits klein und billig. Davon kann man schon ein paar auf Halde legen.
Stimmt, leider habe ich inzwischen so einiges auf Halde, aber das bleibt wohl nicht aus, wenn man in Fernost bestellt ...
Meist habe ich mehr Ideen als Zeit.
Inzwischen habe ich auch ein Breakout mit der MPU9250 (und Kompass u. Baro) im Bestand, aus DE. Ob sich für die 6050 Platinchen noch ein Verwendungszweck finden wird, muss sich zeigen.
Ich komme aus der Arduino-Welt, davor Atmega; was die Copter angeht, habe ich mit MultiWii und dem Wii-Sensor angefangen :)

Du kannst ja auch großflächig die Sachen entfernen die Du nicht brauchst, wie Display oder SD-Card.
Ich erkläre Dir gerne den Code, wenn Du Fragen hast.
Werde ich machen, wird aber nicht zeitnah werden ... im August ist überwiegend Urlaub angesagt und dann ist Basteln keine sehr gute Idee ;-)
Danke und bis dann!

Gruß
Manfred
 

Rangarid

Erfahrener Benutzer
#11
Habe mir auch mal ein paar dieser Boards bestellt. Danke für deinen Code, werde die Basis davon nehmen, um meinen open360tracker auf STM32 upzugraden.
 

nichtgedacht

Erfahrener Benutzer
#12
Hi

ich habe das Teil jetzt weitgehend konfigurierbar gemacht.
Siehe https://github.com/nichtgedacht/configurator101
Steckt zwar noch in den Kinderschuhen, ist aber schon nützlich.

Das ist schon möglich:
Man kann die Firmware Datei aussuchen und flashen. Dafür wird intern einfach dfu-util benutzt.
Man kann den Sensor 90 Grad weise verdrehen und so in 18 verschiedenen Stellungen einbauen.
Man kann die Settings aus dem Controller auslesen, verändern und wieder zurück pushen.
Man kann zwischen SRXL und SBUS Empfänger wählen.
Man kann die Drehrichtung der Propeller umkehren.
Man kann das Seitenverhältnis einstellen.
Man kann die Anschlüsse der Motoren vertauschen.
Man kann die PID Werte und Drehraten einstellen. was nach wie vor auch über die Fernsteuerung möglich ist.
Man kann die RC-Kanäle frei zuordnen.

Generell geht das verwendete QT5 Framework auf allen Platformen und man ist durch das Config Tool nicht
wie bei base- clean- beta-flight mit google (cromium) verheiratet.

Gruß
Dieter
 

Anhänge

nichtgedacht

Erfahrener Benutzer
#13
Hi

Jetzt hab ich mal einen richtigen Racer mit meiner Steuerung realisiert. Diesmal ohne Display aber mit gesteuerter Beleuchtung.
Die Software und das Config Tool habe ich natürlich auch weiter getrieben.

https://github.com/nichtgedacht/mini-sys

Gruß
Dieter
 

Anhänge

#15
Hi Dieter, echt cooles Projekt, Respekt!

Die STM32 Boards sehen interessant aus, klein und leicht, welche Programmiersprache verstehen die?

Lg!
 
#17
Dein Projekt macht mir wirklich Mut den Umstieg von Arduino auf STM32 zu wagen. Die Boards haben laut Google und Youtube richtig Leistung, und sind trotzdem klein und leicht.

Gibt es eine Möglichkeit den Gyrochip direkt auf oder unter den STM zu löten, um Platz und Lochrasterplatine zu sparen, oder sind die benötigten Pins zu weit versetzt?

Für mich als RC Einsteiger stellen sich dann noch einige Fragen, zB lässt sich Betaflight auf diese Boards flashen? Was gibt es Hard- und Softwaretechnisch zu beachten, zB Kompatibilitätsprobleme mit 5/3.3V Spannung und Receivern?

Lg!
 

nichtgedacht

Erfahrener Benutzer
#18
Hi

ich habe noch kein breakout Platinchen mit Gyros gefunden das noch zwischen die Beine vom Maple mini passt.
Man könnte sicher die Hardware so aufbauen, dass cleanflight darauf funktionieren würde. Ich würde eher den umgekehrten Weg gehen und meine Software auf eines der fertigen Boards anpassen. Ich finde es schlimm, dass man zum Racekopterfliegen Google braucht.

Gruß
Dieter
 
#19
Naja, an der GUI solltest noch arbeiten und ein oder zwei Farben verwenden :p

Ansonsten tiptop, würd ich sofort ausprobieren wenn du Ibus realisierst. Falls du noch ein Board + Gyro übrig hast bitte PN, hab keine Lust 1 Monat warten bis die Teile endlich aus China kommen.

Ibus Code: https://github.com/povlhp/iBus2PPM/blob/master/iBus2PPM.ino


Hast du Lust meinen Code zur Datenübertragung miteinzubauen? Habe schon mehrere Varianten durchprobiert, ich schicke Pulse mit definierter Länge oder Morsesignale von der Funke über einen RC-Kanal, und schalte damit am Quad Pins, Events oder schreibe auf ein Display. Dazu habe ich den Ibus Code erweitert, und nach den rcValue[]-Berechnungen einfach den gewünschten Kanal angeschaut und anhand dessen Signal was gemacht.

Wenn du mir deinen Code ein bisschen erklärst und mir zeigst wo du die RC-Values abgreifst, kann ich dir auch gern dabei helfen.

Lg
 

nichtgedacht

Erfahrener Benutzer
#20
...würd ich sofort ausprobieren wenn du Ibus realisierst. Falls du noch ein Board + Gyro übrig hast bitte PN, hab keine Lust 1 Monat warten bis die Teile endlich aus China kommen.
Hi

Da IBUS auch nur ein serielles Protokoll ist, kannst Du es superleicht in meinen Code einbauen.

In src/usart.c eine weitere Function zur Initialisierung nach dem Muster von
void MX_SBUS_USART1_UART_Init(void) {...}

In src/main.c eine weitere Fallunterscheidung implementieren bei
if (p_settings->receiver == SBUS) { ...
Hier wird festgelegt wieviel Bytes bis zum Interrupt Callback von UART gelesen werden sollen, der Vorgang initial gestartet und der Name(Adresse) von der neuen Callback Function in rc.c als aktive Callback Function zugewiesen.

In Src/rc.c eine Callback Function schreiben die nach Empfang der passenden Anzahl von Bytes vom Interrupt Handler automatisch aufgerufen wird. nach Muster von
void HAL_UART_RxCpltCallback_SRXL { ... }

In Inc/config.h einen weiteren Type hinzufügen in
enum { SBUS, SRXL }; // receiver index

Ergänzung:
Im config tool configurator101 gibt es in mainwindow.h den gleichen enum.
Mit dem zusätzlichen Wort IBUS oder so und in mainwindow.c bei
ui->rx_select_comboBox->addItems(QStringList() << "SBUS" << "SRXL");
auch das Wort hinzufügen in sind hier die Änderungen schon erledigt

Ich könnte Dir Platinchen zum Selbstkostenpreis + Porto zusenden.

Gruß
Dieter
 
Zuletzt bearbeitet:
RCLogger

FPV1

Banggood

Oben