Forum: Mikrocontroller und Digitale Elektronik Gibt es schon skalierbare Arduino 16-Segent Font-Lib ?


von Das R. (Firma: Verliererland) (verlierer)


Lesenswert?

Ich bin langsam all diese bitmap fonts leid:
1
*  FONT6X8  = 764 bytes
2
*  FONT8X16 = 1776 bytes
3
*  FONT16X32= 1334 bytes and only , - . / 1 2 3 4 5 6 7 8 9 0 :
Der Attiny85 stellt ja nur 5710 Bytes zur Verfügung und auch bei Arduino 
Mini oder ESP8266 wünsch ich mir schon seit Jahren skalierbare Fonts.

Also ich könnte wohl unter einer Woche eine Micro-SSD1306-lib schreiben 
die voll skalierbare  16-Segment Fonts (vielleicht auch 24-Segment) ohne 
RAM direkt zum OLED schickt. Wäre nur so 5x langsamer.
Und da ich dafür eine Subroutine für schräge Linien bräuchte, kämen 
Grafikbefehle quasi kostenlos.

Und damit das Freude macht eine 100€ Kickstarter Kampagne damit ich die 
lib open source stelle.

Aber da werdet Ihr jetzt bestimmt sagen, dass es so eine Mikro-Lib schon 
längst gibt.

Also bitte jetzt den Link dorthin.

das Roland
und Dankeschön :-)


P.S. kann man beim SSD1306 eigentlich OR oder XOR zum OLED schicken ? 
Also Grafik-Linien übereinander malen..

von Leider nicht Krösus (Gast)


Lesenswert?

So etwas in ein paar 100 Bytes quetschen ist ja eine interessante 
Herausforderung. Aber warum sollte ich jemanden dafür bezahlen.

Platinchen mir 32Bit MCs kosten das selbe. In die aufgeblähte 
Entwicklungsumgebung einarbeiten ist auch nicht soooo wild. Dann brauche 
ich mir um Speicher und Geschwindigkeit der grafischen Ausgabe keine 
Gedanken mehr machen.

Wenn ich einfach nur umfangreichere Programme mit grafischer Oberfläche 
realisieren will – warum sollte ich mich dann an deiner Kickstarter 
Kampagne beteiligen?

von Das R. (Firma: Verliererland) (verlierer)


Lesenswert?

Hab jetzt mal in die 
https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf geschaut.
In y-Richtung kann man wohl nur in 8 pixel "page" Schritten adressieren.
Dann würde ich mich wohl doch auf 8px, 16px, 32px, 40px, 48px, 56px und 
64px hohe fonts beschränken. 8, 16, 32, 64 würde auch reichen.

Wobei ich natürlich besser den Attiny85 in die Mülltonne stopfen sollte.

Hab für meine Mini-Lötstation aber inzwischen mit den 6 IO pins einmal 
20xGain-ADC + drei DigitalIn + ein DigitalOut + I2C hinbeommen.
Könnte also neben dem OLED auch noch einen INA226 an den 1€ Attiny85 
anschließen.

Das geht aber nur mit Vektor-Fonts.

Also Ihr Besserwisser, gibt es schon so eine Lib oder nicht ?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Für einen HP-GL Emulator habe ich das vor Jahrzehnten mal gemacht. Das 
war eine Punkt-Verbindungsroutine als Ausgabe und jeder Buchstabe war 
als Koordinatenfeld angelegt. Wenns dafür 100k Euro gibt - feine Sache, 
her damit.
Die Punktverbindungsroutine war ein aus Sinclair Basic nach Z80 
Assembler portierter Simpelalgorithmus.

von Das R. (Firma: Verliererland) (verlierer)


Lesenswert?

Leider nicht Krösus schrieb:
> Platinchen mir 32Bit MCs kosten das selbe. In die aufgeblähte
> Entwicklungsumgebung einarbeiten ist auch nicht soooo wild.

Ja die Blue Pill hab ich mir schon längst mal geordert. Aber genau auf 
diese aufgeblähte Keil IDE hab ich keinen Bock. Wollte auch schon länger 
den nrf51.. programmieren. Aber wenn ich google was da die armen 
Anfänger für Schwierigkeiten und fast gar keine Hilfe haben.. seufz da 
bleib ich lieber bei der Arduino IDE

von Das R. (Firma: Verliererland) (verlierer)


Lesenswert?

Matthias S. schrieb:
> Für einen HP-GL Emulator habe ich das vor Jahrzehnten mal gemacht.

Ich bin ja noch die C64 Generation. Sonst würde mich so eine lib auch 
nicht reizen.
Mit 16 Segmenten ähnlich https://de.ffonts.net/LED-16-Segment.font
gäbe es 6 "Bereiche" mit horizontalem Rechteck, 6 Bereiche mit 
vertikalem Rechteck und 4 Bereiche mit diagonaler Linie.

Da ich immer gleich mit einem byte eine "page"-höhe (64px display höhe = 
8 "pages", besser 8 "Zeilen") von 8 pixeln schreiben muss, überlappen 
sich bis zu 3 Bereiche.
Daraus könnte ich eine Abfolge generieren bei der ich mit &-Operation 
mit den 16bit des Buchstabens erkenne wie die Teilbereiche gefüllt 
werden.

Also wenn ich ein "E" mit 3px dicken Linien schreiben möchte, dann wäre 
das erste (vertikale) Byte nicht 0b11100000 sondern eben 0b11100000 | 
0b11111111
Das nächste Byte in X-Richtung wäre wieder 0xff und nochmal 0xff aber 
dann wäre der Bereich der Überschneidung verlassen und es ginge mit 
0b1110000 weiter.

Bei dem "S" aus 
https://d144mzi0q5mijx.cloudfront.net/img/L/E/LED-16-SegmentA.png 
hingegen würde es nach 3x 0b11100000 mit der Überlagerung von 0b11100000 
und dem Anfang der Diagonale weiter gehen.

Einfach wird das sicher nicht !

von Marc (Gast)


Lesenswert?

>Ja die Blue Pill hab ich mir schon längst mal geordert. Aber genau auf
>diese aufgeblähte Keil IDE hab ich keinen Bock.

Wieso Keil? Dafür gibt es mindestens 3 Arduino Frameworks.

Und für die ILI-Arduino-TFT's gibt's so weit ich weiß auch schon 
Vectorfonts:
https://www.instructables.com/id/Arduino-TFT-display-and-font-library/

von Stefan F. (Gast)


Lesenswert?

Das R. schrieb:
> Ja die Blue Pill hab ich mir schon längst mal geordert. Aber genau auf
> diese aufgeblähte Keil IDE hab ich keinen Bock...
> da bleib ich lieber bei der Arduino IDE

Keil kenne ich nicht, ich kann Dir allerdings die auf Eclipse basierte 
IDE "SystemWorkbench for STM32" empfehlen.

Wer Eclipse immer noch zu "aufgebläht" findet, benutzt den GCC im 
Konsole Fenster und als Editor Notepad++.

> Aber wenn ich google was da die armen Anfänger
> für Schwierigkeiten und fast gar keine Hilfe haben

Gerade für dieses Board gibt es jede Menge Hilfe. Ich glaube, wer damit 
nicht klar kommt, der sollte wirklich besser bei Arduino mit AVR 
blieben.

Hier findest du Anfängerfreundliche Einstiegshilfe:
http://stefanfrings.de/mikrocontroller_buch2/index.html
http://stefanfrings.de/stm32/index.html

Dieser STM32F103 hat ein paar Eigenschaften, die für Anfänger sogar 
hilfreich sind:

- Der STM32 keinen speziellen Programmieradapter. Damit fangen bei AVR 
ja schon oft die Probleme an. Zu viel Auswahlmöglichkeit und die 
billigen taugen nicht für alle Fälle.
- Der Adapter zum Debuggen kostet original ab 12€, aus Asien ab 2,50€ 
(bei AVR jedoch ab 50€)
- Der STM32 hat keine Fuses, mit welchen man den Chip versehentlich 
unbrauchbar macht.
- Integer Variablen sind Atomar (gilt bei AVR nur für short integer, 
8bit). Das vereinfacht die Programmierung von Zählern in 
Interruptroutinen - besonders für Anfänger.

Die gleichen Vorteile bieten auch alle anderen Mikrocontroller mit "ARM 
Cortex M" Kern.

von Axel S. (a-za-z0-9)


Lesenswert?

Das R. schrieb:
> ich könnte wohl unter einer Woche eine Micro-SSD1306-lib schreiben
> die voll skalierbare 16-Segment Fonts (vielleicht auch 24-Segment) ohne
> RAM direkt zum OLED schickt.

Machen. Zeigen. Oder Klappe halten.

> Aber da werdet Ihr jetzt bestimmt sagen, dass es so eine Mikro-Lib
> schon längst gibt.

Gibt es nicht. Weil sowas keiner braucht. 16-Segment Fonts sehen einfach 
nur ScheiXe aus. Sowas benutzt man nur dann, wenn man kein richtiges 
Display hat, sondern auf die festverdrahteten 16 Segmente angewiesen 
ist.

Für Punktmatrix Displays gibt es deutlich schönere Fonts, die auch bei 
vergleichsweise geringer Auflösung gut lesbar sind. Einen 7-Segment Font 
kann man zwar in einer 7x5 Matrix unterbringen, aber im Vergleich zu 
einem normalen 7x5 Font sieht der einfach nur grausam aus. 16 Segmente 
sind unter 16 Pixel Breite gar nicht vernünftig zu rendern. Wenn man 
Details wie die leicht geneigten Ziffern und die angespitzten Enden der 
Segmente nachbilden will, reicht das noch nicht mal.

Wenn man für ein Projekt den Retro-Charme der 80er haben will, kann man 
auch gleich den ganzen Schritt gehen und 16-Segment Hardware verbauen.

Und was skalierbare Fonts generell angeht: es ist an sich schon schwer, 
so einen Font schön zu rendern. Frag mal Microsoft, die haben Jahre 
gebraucht, bis sie mit Truetype wenigstens annähernd den Anschluß an 
vorgerenderte Bitmap-Fonts (wie unter X11 üblich) gefunden haben. Für 
kleine Auflösungen und schwarz-weiß sind handgemalte Fonts nach wie vor 
das Nonplusultra. Mit Graustufen wird es etwas einfacher, mit RGB Pixeln 
dann aber gleich wieder aufwendiger. Das packt man nicht in einen µC. 
Schon gar nicht, wenn es darum geht, den Flash-Verbrauch von 
Bitmap-Fonts zu kompensieren.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Das R. schrieb:
> Daraus könnte ich eine Abfolge generieren bei der ich mit &-Operation
> mit den 16bit des Buchstabens erkenne wie die Teilbereiche gefüllt
> werden.

Ich habe damals ein Byte als Koordinaten in einem 16*16 Feld benutzt, 
HighNibble war Y und LowNibble war X. Die Hardware (Mupid Z80) war 
damals so angelegt, das Y=0 oben war und Y=0 links. Dann wurde ein Z 
'z.B.' mit 4 Bytes definiert. Da es einem Bildschirm nichts ausmacht, 
wenn eine Linie doppelt gefahren wurde, musste z.B. beim Querstrich fürs 
'A' auch nicht abgesetzt werden. 'Z' hatte also 4 Bytes plus Endmarker 
und das 'A' 5 Bytes.
Wie gesagt, das war ein Spässchen lange vor Truetype und PS.

von Das R. (Firma: Verliererland) (verlierer)


Angehängte Dateien:

Lesenswert?

Matthias S. schrieb:
> Ich habe damals ein Byte als Koordinaten in einem 16*16 Feld benutzt,

Danke dass wenigstens einer mit denkt!
"nur alleine.. verliert man.. immer." (Robo Durden)

Da der Attiny85 nur 512 Bytes RAM hat kann ich so ein vierpunkt "Z" 
nicht erst in einen Buffer schreiben.
Ich werde jetzt auch nicht mehr 16-Segment Font sagen weil ich natürlich 
immer 16bit Font gemeint habe. Also ein Font aus 16 sklaierbaren 
Vektoren.
Wobei ich gerade mal 24 Vektoren gezeichnet habe. Siehe Anhang.

Solche 24 Vektoren kann ich beim Schreiben der 8bit hohen Zeilen 
("pages") leicht per &-Operator testen und in die 8bit aufnehmen.

Als Bonus würde ich die ascii-Kleinbuchstaben um 50% nach unten 
versetzen.
Außerdem könnte ich leicht die linken 9 Vektoren mit 0b11111111 und 
0b10000000 testen und falls im Buchstaben nicht vorhanden den Buchstaben 
nur mit "halber" Breite schreiben.
Dazu noch testen ob gar nur die rechten 5 Vektoren aktiv sind, dann kann 
ich Satzzeichen wie "." und ":" und "!" noch schmäler ausgeben.

Seit über 15 Jahren brauchen die Maker eine 8px-64px Font-Lib unter 1 
kB.
Und mit dem Attiny85 + SSD1306 ist der Bedarf nach wie vor da.

Irgendwie unfassbar dass es da anscheinend immer noch nichts gibt.
Naja, nicht wenn man wie immer hier die Antworten sieht.

von Stefan F. (Gast)


Lesenswert?

Das R. schrieb:
> Irgendwie unfassbar dass es da anscheinend immer noch nichts gibt.

Wenn es etwas noch nicht gibt, dann in der Regel deswegen, dass es 
entweder schlecht ist oder niemand braucht.

Du löst da ein Problem, das niemand hat. Wir längst Mikrocontroller mit 
reichlich Speicher, die sogar weniger kosten, als deine Zielplattform. 
Dazu kommt, dass Vektor Fonts auf so wenigen s/w Pixeln einfach schlecht 
aussehen. Wobei deine x-Segment Variante noch schlechter ist, weil sie 
auf allen Displays schlecht aussieht.

Als Machbarkeitsstudie ist dein Projekt durchaus interessant. Ich gehe 
davon aus, das alle Interessenten sehen wollen, was dabei heraus kommt, 
aber wirklich benutzen wird es kaum keiner.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Naja, wenn du dich unbedingt auf die 16 Segmente beschränken willst, 
kannst du weiter komprimieren, indem du den 9 möglichen Zielpunkten eine 
Nummer gibst, die deine Plotroutine vorher weiss. Ein Buchstabe besteht 
dann nur noch aus den Nummern für die 9 Ziele, die per Linienzeichnen 
verbunden werden.
Mir war das damals zu unflexibel, weswegen ich die Koordinaten in das 
16x16 Feld eingetragen hatte.
M.E. besteht die 'Library' dann aus 3 Hauptroutinen:
Nummer 1: Plotte einen Pixel bei Y,X (Attribut AND = Löschen, XOR = 
Invertieren, OR = rübermalen)
Nummer 2: Ziehe mit Routine Nummer 1 eine Linie von Y1,X1 nach Y2,X2 
(Attribute siehe Nummer 1)
Nummer 3: Zeichne Buchstabe 'X' mit Skalierung an Punkt Y,X (Wieder mit 
den Attributen) unter Verwendung von Routine Nummer 2.

Damit wäre nur Nummer 1 anzupassen auf die Eigenarten des Displays.

Das war damals beim Mupid simpel, denn das war ein straighter 
Framebuffer - in Z80 Assembler ein reiner Glücksfall und überhaupt der 
Grund, warum ich diesen Unsinn gemacht habe.

: Bearbeitet durch User
von test (Gast)


Lesenswert?

Da brauchts keine Machbarkeitsstudie, schon alles von vielen Leuten 
schon zig mal probiert -> immer gescheitert.

Displays mit geringer Auflösung brauchen einen handoptimierten 
Bitmapfont (für jede Fontgrösse) wenns brauchbar aussehen soll.


BTW: Wenns nur um den Speicher geht könnte man sich eine Kompression für 
die Bitmapfonts ausdenken. Ich könnte mir vorstellen das sich 
Experimente in dieser Richtung eher lohnen.

von Das R. (Firma: Verliererland) (verlierer)


Lesenswert?

Matthias S. schrieb:
> ...Ein Buchstabe besteht
> dann nur noch aus den Nummern für die 9 Ziele, die per Linienzeichnen
> verbunden werden.
> Nummer 2: Ziehe mit Routine Nummer 1 eine Linie von Y1,X1 nach Y2,X2
> (Attribute siehe Nummer 1)

Ich kann nicht einzelne Pixel der Reihe nach zum Display schicken, dass 
dauert zu lange. Und für das Zeichnen im temporären Buffer fehlt das 
RAM.
Außerdem bräuchte ich für die 9 Ziele auch 4bit. Das "Z" mit seinen 4 
Punkten ergäbe dann zwar nur 16bit aber das "W" wären 20bit. Dazu immer 
ein paar Bit um die Länge der variablen Buchstaben zu kodieren :-(
Da ist es geschickter ich belege für jeden Buchstaben 3 Byte und kann 
dann leicht mit & testen welche der 24 Vektoren in dem 8px hohen 
Streifen gemalt werden.

Ich sehe durchaus ein dass der STM32 die bessere Wahl ist wenn man eh 
zwei oder mehr I2C module anschließen will.

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Das R. schrieb:
> Und für das Zeichnen im temporären Buffer fehlt das
> RAM.

Ja, das war natürlich damals bei mir kein Problem, da der Framebuffer 
selber gross genug war und einfach im Speicherbereich des Z80 abgelegt 
war. Um den Bildaufbau hat sich die Hardware alleine gekümmert (das war 
so ein BTX-Display-Chip).
Ist ja auch nur als Diskussionsbeitrag gedacht.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.