Hallo liebe MCU-Gurus,
ich studiere Informatik und schreib gerade meine Bachelor-Arbeit zum
Thema: "KI in verteilten Systemen".
Ich entwickle einen Dronen-Schwarm der von einer KI gesteuert wird, die
dezentral durch die Gesammtheit des Schwarms realisiert wird
-- wie eine Art "Schwarm-Intelligenz". Name: Skynet :D
Im Großen und Ganzen läuft eig. alles ganz Gut. -- zumendest wenn man
die Kolataralschäden ignoriert (Fensterscheiben, Drohnen die Selbstmord
begehen usw. ).
Aber zur Sache. Weshalb ich hier bin:
Ich bin auf der suche nach einer guten LCD/LED Display+Controller
Kombination bei der die einz. Pixel "Matrixähnlich" ansteuern kann
(Auflösung grob so um die 50x100).
Und zu dem ein anständiges Framework existiert, das die Display
steuerung "so weit wie hald möglich" vereinfacht.
Und ich mich nich endlos mit Bit-OPs, Bit-Modulationen
,Signallaufzeiten, usw. rumschlagen muss.
Das macht mich echt fertig ^^
Respekt für den der das drauf hat.
Am schönsten wäre sowas in der Art wie:
// PseudoCode:
//(MC über Ports mit LCD-Modul/Controller verbunden):
import ValhallaTec.LcdController;
// innerhalb irgendeiner Objekt-Methode
LcdController controller = new LcdController("LcdModulXYZ");
controller.Initialize();
controller.ActivatePixel(15,59);
MethodeFubar();
controller.DeActivatePixel(15,59);
// Ende!!! xD
OK, so leicht wird's wohl bestimmt nich werden xD, aber so grob in die
Richting evt. ? -- Für verwöhnte Hochsprachen-Entwickler eben ;)
Ich mein da muss es doch irgendwas geben, ich bin doch bestimmt nich der
einzige den das in den Wahnsinn treibt -- Nich mehr lange und ich beiß
in den Tisch.
Mein Problem is, mir läuft so langsam die Zeit davon, ich hab die
Thematik gewaltig unterschätzt und viel zu wenig Zeit dafür eingeplant.
Wenn ich nich bald was finde muss ich mir n'Plan B ausdenken.
Ich könnt eure Hilfe wirklich gebrauchen :)
Danke Kevin.
Laß den Informatik-Bachelor sausen und bewirb dich für den RTL-Bachelor.
Die intellektuellen Anforderungen entsprechen dort deinem Level und der
Softwarewelt entsteht kein Verlust. Win/Win.
> Kombination bei der die einz. Pixel "Matrixähnlich" ansteuern kann> (Auflösung grob so um die 50x100).> Und zu dem ein anständiges Framework existiert, das die Display
Das ist weitestgehend quatsch. :-)
Displays mit 128x64 werden ueblicherweise mit SPI oder I2C angesteuert.
DA muss man nichts gross frameworken.
Wenn du unbedingt willst kannst du dies hier nutzen:
https://github.com/lvgl/lvgl
Aber bei so einem kleinen Display ist man gerade an der Grenze wo das
anfaengt sinnvoll zu werden.
Olaf
Das ist kein Hexenwerk, ein SetPixel ist die primitivste aller
Zeichenprimitiven und das können alle Grafiklibs.
Die einfachen TFT mit den integrierten Controllern brauchen eine Init
Sequenz und dann schickt man Kommandos um zB die Schreibposition zu
setzen und schiebt dann die Pixeldaten in den Controller.
Da reichen die billigen Kombinationen aus Mega256 + Aufsteckdisplay oder
auch verschiedene Cortex-M 32 Bitter. Bekannte Libs sind ug8 oder
AdafruitGFX. Auch die schon genannte lvgl ist super, die setzt aber auch
auf setPixel Funktionen auf.
> Das ist kein Hexenwerk, ein SetPixel ist die primitivste aller> Zeichenprimitiven und das können alle Grafiklibs.
Nicht ganz. Ein Framework nimmt dir ja schon etwas arbeit ab was die
Grafikelemente angeht. Sobald man also komplexere Dinge macht kann das
schon nett sein. Aber man muss sich da halt auch erstmal reinarbeiten
und bei kleinen Anwendungen wie man sie auf einem 128x64er Display
verwirklicht wird sich der Aufwand meist nicht lohnen. Haengt ein
bisschen davon ab was man damit macht.
> Auch die schon genannte lvgl ist super, die setzt aber auch> auf setPixel Funktionen auf.
Jein. Die schreibt, jedenfalls wenn du es fuer dein Display so
implementiert, schon blockweise in den Speicher. Allerdings wird man das
auch so machen wenn man selber ein Display anspricht. Ich z.B hab immer
einen Buffer fuer 128x64pixel im Ram, setze da einzelne Pixel und eine
Interruptroutine im Hintergrund prueft ob sich etwas in einem
32Byte-Block geaendert hat und uebergibt denn dann ans Display. Damit
wird dann in der Regel beim setzen von 8Pixel nur einmal auf das Display
zugegriffen und printf Aufrufe in der Anwendung sind sehr schnell,
koennen also ueberrall im Source gemacht werden.
Oh..und auch bei lvgl muss man die Lowlevelsachen natuerlich erstmal
selber implementieren. .-) Ausserdem braucht lvgl einiges an Resourcen.
Das sollte der Microcontroller mindestens 10k Ram haben.
Olaf
WoW,
danke für die goße Ressonanz :) -- Nach nur 4h, Hammer ^^
Das hilft mir weiter.
Jetzt hab endlich mal n'paar gute Anhaltspunkte nach denen ich suchen
kann.
Und'n ganzen Haufen Links zum durchwühlen :D
Die Fragen kommen dann wenn ich das Alles durch hab ^^
Auf jeden Fall, schon mal 2^10 x Danke :)
Ihr seid Mega, keep Rockin.
========================================================================
There are only 10 types of people in this world.
Those who understand binary and those who don't. ?
========================================================================
Jupiter Q. schrieb:> There are only 10 types of people in this world.> Those who understand binary and those who don't.
I really love my Apple computer,
but my girlfriend has the best software!
Olaf schrieb:> Nicht ganz.
doch, ganz und gar. Zeichenprimitive sind Punkt, Linien, Rechteck,
Kreis. Und evtl. noch Zeichenausgabe und Bitmap darstellen. Und alle
können mit einem setPixel() realisiert werden. Alle Zeichenprimitive
sind ein bisschen Mathematik die die Pixel zwischen Punkten berechnet
und dann per setPixel() set. Controllerabhängig kann man evtl. noch
optimieren, das beherrschen u8glib und AdafruitGFX auch.
Olaf schrieb:> Ich z.B hab immer> einen Buffer fuer 128x64pixel im Ram, setze da einzelne Pixel und eine> Interruptroutine im Hintergrund prueft ob sich etwas in einem> 32Byte-Block geaendert
unnötig, dann hast du die Doku zu lvgl bzw. der Treiberimplementierung
nicht gelesen oder nicht verstanden.
Die Optimierung macht lvgl nämlich selber schon. Die Zeichenfunktionen
rendern auf eine virtuelle Tapete die sogar grösser sein kann als der
Darstellungsbereich auf deinem Display. lvgl erkennt dann welche
Bereiche geändert wurden und ruft für diese die low level Darstellung
auf. Das ist im einfachen Fall das Setzen der Pixel für einen
rechteckigen Bereich mit setPixel. Weil viele Controller wie ILI und Co.
rechteckige Zeichenbereiche mit autoinkrekment unterstützen, kann man
die Ausgabe optimieren indem man einmalig den Ausgabebreich setzt und
dann in einer Schleife die Pixel für X,Y rausfeuert. Oder als
Optimierung alternativ GPU / DMA benutzt wenn es die Hardware hergibt.
Es muss ein Framebuffer (einfach oder doppelt) angelegt werden, der muss
aber nur min. 10 Zeilen hoch sein. Da ist lvgl sehr clever was das
Display aktualisieren angeht.
Und lvgl kann kann auch transparente Bitmaps malen. Damit könnte man die
Dronen auch als kleine Symbole über das Display fliegen lassen.
Johannes S. schrieb:> Damit könnte man die> Dronen auch als kleine Symbole über das Display fliegen lassen.
Auf 128 Pixeln Breite, ja das macht Spass.
Bitte mehr solche Vorschläge.
JupiterQ schrieb:> Am schönsten wäre sowas in der Art wie:>> // PseudoCode:> //(MC über Ports mit LCD-Modul/Controller verbunden):> import ValhallaTec.LcdController;> // innerhalb irgendeiner Objekt-Methode> LcdController controller = new LcdController("LcdModulXYZ");> controller.Initialize();> controller.ActivatePixel(15,59);
Jaja, Schwarm-Intelligenz im Drohnenschwarm als Bachelor-Arbeit ... und
dann sowas hier wie "ActivatePixel(x,y)". Was hast du in den vergangenen
Semestern denn bloß gemacht?
Ich geb dir mal nen Abriss in dürren Worten:
Also, als allerunterste Stufe braucht man für ein GUI die
Lowlevel-Hardware-Treiber, die das Display physisch in Gang setzen - und
das sind keine Objekte, die man per new(Tsowieso) kreiert, sondern es
sind Hardware-treiber!!!. Das sollte dir klar sein.
Da obendrauf werkelt ein GDI, also eine Schicht, die Kringel malen kann,
also Linien, Kreise, Flächen, Schrift - und das in verschiedenen
Farben/Graustufen und verschiedenen Fonts. Sowas ist auch KEIN Objekt!
Da obendrauf sollte dann ein Menüsystem sitzen - und dort kommt dann die
objektorientierte Programmierung und ereignisgesteuerte Programmierung
dazu. Die Objekte sind die grafischen Elemente, also die diversen
Kringel, die sich auf der Bildfläche tummeln sollen.
Aber da das Ganze ja in einem µC stattfinden soll und nicht im PC,
sollte das Menüsystem im Flash angeordnet sein, so daß man dafür nicht
noch extra den ganzen Kram im RAM aufbauen muß. Was Objekte sind, was
Methoden von Objekten sind und was Properties von Objekten sind,
solltest du selber wissen. Und wie man bei Objekten, bei denen nicht nur
die jeweiligen VMT im Flash liegen sondern das ganze Objekt, die den
Properties zugrundeliegenden internen Variablen realisiert, das solltest
du dir selber ausdenken können. Sowas kann man zu Fuß auch in C machen.
Ich hatte vor Jahren eben dieses in der Lernbetty demonstriert.
Wenn du also derartiges noch garnicht beherrschst, dann lies dir dort
an, wie man sowas machen kann. Von dem, was du im Eröffnungspost
geschrieben hast, habe ich jedoch den Eindruck erhalten, daß du noch
nicht reif für den Informatik-Bachelor bist.
W.S.
> die Ausgabe optimieren indem man einmalig den Ausgabebreich setzt und> dann in einer Schleife die Pixel für X,Y rausfeuert. Oder als
Bei den einfachen Display uebergibst du aber immer ein Byte mit 8Pixel.
Da ist es schon sinnvoll wenigsten diese 8Pixel am Stueck zu setzen.
> 128 Pixel kam nicht vom TO. Der wollte nur 50 x 100 :)
Ich hab das mal grosszuegig aufgerundet weil diese Anfaenger ja garnicht
wissen mit welchen Zahlensystemen Hardwareentwickler denken. :-)
Mittlerweile sind die Display aber so preiswert geworden das ich auch
eher empfehlen wuerde etwas mit 240x128 oder 320x240 zu nehmen. Aber
dann darauf achten dieses Display immer noch mit spi angesprochen werden
kann.
Olaf
inglischman schrieb:> Auf 128 Pixeln Breite, ja das macht Spass.Olaf schrieb:> ich hab das mal grosszuegig aufgerundet
soso, noch so Chameleon das die Forenuser mit wechselnden Namen
verarscht.
Olaf schrieb:> Bei den einfachen Display uebergibst du aber immer ein Byte mit 8Pixel.
und weil die Displaycontroller Autoinkrement können muss man nicht jede
Adresse vor der Pixelausgabe wieder neu setzen, das war gemeint.
W.S. schrieb:> Jaja, Schwarm-Intelligenz im Drohnenschwarm als Bachelor-Arbeit ... und> dann sowas hier wie "ActivatePixel(x,y)". Was hast du in den vergangenen> Semestern denn bloß gemacht?
Wieder völlig am Thema vorbei.
Wieweit soll die Fertigungstiefe bei der Bachelorarbeit gehen? Chips
selber designen und fertigen?
Und deine Lernbettys haben dafür auch alle K.I. und sind schwarmfähig?
Auch der Rest der Antwort ist purer Anachronismus. Grafiktreiber können
sehr gut als Objekt modelliert werden und die Mittel von C++
(Mehrfachvererbung) unterstützen das wie in den genannten Beispielen.
Der 'Treiber' bzw. das Displayobjekt setzt sich aus Schnittstellenklasse
und Klasse für Zeichenfunktionen zusammen. Damit lässt sich beides
unabhängig voneinander implementieren und die gleichen Zeichenfunktionen
können mit SPI, Parallel oder µC spezifischem wie FSMC arbeiten.
Der Vorteil schon auf diesem Level mit Objekten zu arbeiten ist, das es
mehrere Instanzen von Displays geben kann. Fest vernagelte Treiber sind
einfach nur Mist.
Und von Menusystemen war hier nie die Rede in der Anforderung.
Johannes S. schrieb:> soso, noch so Chameleon das die Forenuser mit wechselnden Namen> verarscht.
Nö, ich != Olaf.
Das wird jeder Moderator bestätigen können.
Olaf schrieb:> Aber dann darauf achten dieses Display immer noch mit spi angesprochen> werden kann.
Warum? Wenn man genügend Portpins frei hat so ist der 16-Bit Parallelbus
durchaus vertretbar. Dann kann man alle 16 RGB-Bits mit nur einem Clock
raushauen. Das geht deutlich schneller als SPI.
Was lernt man im Studiengang Informatik überhaupt? Mit logischen Denken
kann man sich doch das ein/ausschalte einzelner Pixel herleiten. Auch
die Wahl der Displayauflösung ist doch nicht auf denken in Binärzahlen
zurück zu führen. Aber ich erkenne das der TO wenigstens den Begriff
Schwarmwissen versteht, denn etwas anderes will er hier nicht anzapfen -
wann sind wir an dem Punkt wo die Bachelorarbeit als Multiple
Choice-Test geschrieben wird?
Johannes S. schrieb:> Auch der Rest der Antwort ist purer Anachronismus. Grafiktreiber können> sehr gut als Objekt modelliert werden und die Mittel von C++> (Mehrfachvererbung) unterstützen das wie in den genannten Beispielen.
Witzbold. Wer soll denn da was vererben - bei Hardware? Und hier geht es
wohl nicht um's Modellieren, sondern um's reale Machen. Ist ein
ziemlicher Unterschied. Und die Lernbetty konnte zwar nicht schwärmen,
aber sie konnte Grafik und Sound (jedenfalls soweit, wie die HW reicht).
Aber wenn du so gut drauf bist mit dem Modellieren von Displays und der
dazu passenden Software auf einem µC und in allen Schichten, dann zeig
doch mal, was du tatsächlich kannst mit einem geposteten Projekt hier in
diesem Forum.
W.S.
Der Unwissende schrieb:> wann sind wir an dem Punkt wo die Bachelorarbeit als Multiple> Choice-Test geschrieben wird?
Ich denke mal, der Herr v.Guttenberg hat uns schon vor Jahren den
aktuellen Weg aufgezeigt.
Aber das soll hier nicht das Thema sein. Es war zu meiner Studienzeit so
und wird vermutlichst auch heute noch so sein, daß die akademische
Hierarchie so angelegt ist, daß wohl fast jede Arbeit immer nur eine
Zuarbeit für die nächst höhere Liga und ein Sub-Themen-Geber für die
darunter liegende Liga ist. Deshalb sind Bachelor-Arbeiten nicht so
aufzufassen, daß dabei jedesmal etwas wie e=m*c^2 herauskommt.
Kurzum: Es ist normal, daß bei Bachelor- und Master-Arbeiten eben etwas
kleinere Brötchen gebacken werden. Eben Teilbereiche. Das ist völlig
normal.
Nun soll der TO eine Arbeit zu "KI in verteilten Systemen" schreiben,
was (soweit zu erkennen) trotz des sehr hochgestochenen Titels darauf
hinausläuft, ein paar echte ferngesteuerte Drohnen durch einen
"Leit"-Mikrocontroller steuern zu lassen, so daß sie irgendwo
hinfliegen, ohne sich gegenseitig anzurempeln. Und für diesen Steuer-µC
sucht er nun die Komponenten, die er für's Display braucht. Kann man ja
verstehen, ist auch nur Mittel zum Zweck, weil sein Thema das
gegenseitige Nichtanrempeln sein dürfte. Aber er hat von den
Software-Schichten, die zwischen den Kringeln, die er auf der Glotze
sehen will und der Glotze selbst liegen, noch keinen Überblick, weswegen
er auf den gezeigten hanebüchenen Ansatz kam. Da ist noch ne Menge
Arbeit drin, wenn er das alles selber entwickeln will. Aber dazu braucht
er erstmal ein Konzept und ein Aufteilen in einzelne abarbeitbare Teile.
W.S.
> Dann kann man alle 16 RGB-Bits mit nur einem Clock> raushauen. Das geht deutlich schneller als SPI.
Das ist voll cool wenn man Videos darstellen will. Wenn man aber nur
etwas
Text und eine Messkurve darstellen will ist das viel zuviel Aufwand,
EMV, kabel zum Display, einfach kacke. Erst recht fuer einen Anfaenger
der nur Informatiker ist. .-)
Olaf
W.S. schrieb:> dann zeig> doch mal, was du tatsächlich kannst mit einem geposteten Projekt hier in> diesem Forum.
Code in diesem Forum zu posten (bis auf kurze snippets) ist auch
Anachronismus, dafür gibt es github & Co.
Test mit AdafruitGFX und Portierung auf Mbed für ein STM32F407VE
Chinaboard oder LPC1347:
https://github.com/JojoS62/mbed-os-example-
blinky_STM32F407VE/tree/master/lib/Adafruit_TFTLCD_16bit_STM32-master/sr
c
Für den LPC mit dem anderen Display wird die Zeile
1
Adafruit_TFTLCD_16bit_STM32tft(NC);
ausgetauscht, alles andere bleibt.
das zeigt sowas an:
https://www.youtube.com/watch?v=cM-VeylqiPc
Unter mbed2 hatte ich die Lib auch schon benutzt:
https://os.mbed.com/users/JojoS/code/Adafruit_GFX/
für das Display UC1601S, das dir vielleicht bekannt vorkommt. Nur bei
mir funktioniert das mit 128x32.
Auch die bekannten OLED funktionieren mit Adafruit, hier mit einem
LPC824. Der hat genug Speicher für einen Framebuffer.
https://www.youtube.com/watch?v=2aIS2tJxsAA
lvgl Treiber für einige STM32 Boards sind noch hier:
https://github.com/JojoS62/Test-lvgl/tree/master/libs/Display/lvglDriver
noch für lvgl v6, da gibt es mittlerweile auch eine v7 die ich noch
nicht angesehen habe. Es funktioniert auch auf dem F407 rasend schnell
ohne DMA, damit könnte die CPU nochmal entlastet werden. Für F746 oder
F469 habe ich die DMA aus dem BSP für diese Boards benutzt. Kann man
rauswerfen und direkt in die nötigen Klassen einbauen, aber bei 1-2
MByte Flash sind solche Optimierungen zweitranging.
Und im Netz gibt es reichlich Beispiele für einfache Anwendungen für
AdafruitGFX oder u8glib. In den Repos sind auch Beispiele drin die
genauso arbeiten wie der TO sich das vorstellt. Der gemeine Arduino User
(und das dürften viele tausend oder gar zigtausend sein) weiss sicher
nicht was da alles hintersteckt, aber die Anwendung ist sehr simpel und
mit ein paar Zeilen Code hat man Punkte gesetzt oder einfache Objekte
gezeichnet.
Ein Nextion ist schon sehr unterfordert mit einem simplen
'setPixel(color)'. Dazu der Overhead den ganzen Befehl erstmal in einen
String zu verpacken und im Display zu dekodieren und auszuführen. Oder
gibt es auch einen Binärmode für die Ansteuerung?
Wenn das Update der Pixel langsam ist und es nicht zuviele sind, dann
geht das sicher. Vor allem wenn der Skynet Master ein PC ist kann er
einfach per USB angeschlossen werden. Aber über diesen Part hatte der TO
ja nichts geschrieben. Und so Drohnen bewegen sich ja im 3D Raum, da ist
die Pixelmap doch nur wenig aussagekräftig?
W.S. schrieb:> Was hast du in den vergangenen> Semestern denn bloß gemacht?
Offensichtlich hat er mehr C/C++ gelernt als du in deinem bisherigen
Leben ;)
W.S. schrieb:> Witzbold. Wer soll denn da was vererben - bei Hardware?
Mal wieder nichts gecheckt?
Es gibt zB ein Interface für Pixelausgabe und das kann verschieden
implementiert werden: FSMC, Parabus, HUB75 oder vllt sogar kranke sachen
wie Artnet (Ethernet).
Wer Treiber für ARM schreibt wie "UART1", "UART2", etc sollte bei sonem
Thema einfach mal leise sein. (Son ARM µC/SoC kann ziemliche viele UARTs
haben)
Wir wissen, dass du nichts kannst, das musst du nicht immer aufs Neue
bestätigen!
Mw E. schrieb:> Wir wissen, dass du nichts kannst, das musst du nicht immer aufs Neue> bestätigen!
Na vielleicht solltet ihr euch auch mal auf ein Bier zusammensetzen, die
Fehde ist doch wohl schon alt genug...
Und Informatiker sind auch Leute die Datenbankgedöns,
Warenwirtschaftssysteme, ERP CRM und so ein Zeug programmieren. Die
haben sicher auch keinen Spaß an Bitschieberei und Compileroptionen
einstellen, und trotzdem sind das keine schlechten Menschen.
Und wer Software schreiben kann um sowas zu koordinieren der muss für
ein popeliges Display wohl auch erstmal umdenken:
https://www.youtube.com/watch?v=ggs1XRrCnlEhttps://www.youtube.com/watch?v=7mISNNEARkA
Johannes S. schrieb:> Na vielleicht solltet ihr euch auch mal auf ein Bier zusammensetzen
Lieber nich ;)
Ich frag mich eher wo der arbeitet.
Bei uns wär der nach ein paar solcher Behauptungen und dem Magic Number
Code mit gotos hochkant rausgeflogen.
Wenn bei dem selbst memcpy des Teufels ist o0?
Zudem gibts ja von vielen hier Gegenwind.
Johannes S. schrieb:> Und Informatiker sind auch Leute die Datenbankgedöns,> Warenwirtschaftssysteme, ERP CRM und so ein Zeug programmieren. Die> haben sicher auch keinen Spaß an Bitschieberei und Compileroptionen> einstellen, und trotzdem sind das keine schlechten Menschen.
So siehts auch aus, aber das begreift er ja nicht.
(Wie so vieles nicht)
Die embedded Spezis sind dann "technische Informatiker".
Vom Bitwackeln auf Fußpilzebene über Prozessorenbau bis hoch zu
Betriebssystem(auf)bau ist da auch alles bei.
Nicht zu vergessen sind die ganzen Etechnik Kurse.
Icke ®. schrieb:> Laß den Informatik-Bachelor sausen und bewirb dich für den RTL-Bachelor.> Die intellektuellen Anforderungen entsprechen dort deinem Level und der> Softwarewelt entsteht kein Verlust. Win/Win.
Gibt es einen Grund, so beleidigend zu sein?
JupiterQ schrieb:> ich studiere Informatik und schreib gerade meine Bachelor-Arbeit zum> Thema: "KI in verteilten Systemen".> Ich entwickle einen Dronen-Schwarm der von einer KI gesteuert wird, die> dezentral durch die Gesammtheit des Schwarms realisiert wird> -- wie eine Art "Schwarm-Intelligenz". Name: Skynet :DJupiterQ schrieb:> Und zu dem ein anständiges Framework existiert, das die Display> steuerung "so weit wie hald möglich" vereinfacht.> Und ich mich nich endlos mit Bit-OPs, Bit-Modulationen> ,Signallaufzeiten, usw. rumschlagen muss.> Das macht mich echt fertig ^^>> Respekt für den der das drauf hat.
Finde den Widerspruch!