11. Januar 2021 · Kommentare deaktiviert für Herzlich Willkommen auf meiner Website! · Kategorien: Allgemein

Diese Website ist ein rein privates Projekt. Es verfolgt keinerlei kommerzielle Ziele. Deshalb werden von mir auch keine persönlichen Daten gespeichert. Deshalb kann sich auch niemand auf dieser Website anmelden und Kommentare hinterlassen. Der Provider (1blu.de) speichert die Verbindungsdaten für einen begrenzten Zeitraum.

Dieser Blog dient mir dazu meine Projekte zu dokumentieren und meine Erfahrungen damit festzuhalten. Er ist im Internet frei zugänglich, damit auch Andere von meinen Erfahrungen profitieren können. Schließlich muss nicht jeder das Rad selbst erfinden.

Mein Beiträge sind keine Bauanleitungen! Es besteht kein Anspruch darauf, dass die vorgestellten Projekte bei einem Nachbau funktionieren! Sollten dabei Schäden entstehen, so ist dafür der Nachbauer verantwortlich. Schließlich sollte jeder wissen was er tut. Ich schließe jede Haftung aus.

Die Beiträge können nur als Anregung angesehen werden.

Wenn Du mir etwas mitteilen möchtest, so schicke mir unter peter@peters-bastelkiste.de eine Email.

Viel Spaß beim Stöbern.

Peter

Mit dieser Zeile in Python/Micropython lässt sich ein Verzeichnisinhalt so aufbereiten, dass es von ESP32 als Webseite ausgeliefert werden kann:

>>> import os
>>> verzeichnis_liste = ' Bytes</br>'.join([' - '.join([x[0], str(x[3])]) for x in os.ilistdir()])
>>> verzeichnis_liste
'apps - 0 Bytes</br>blocks - 0 Bytes</br>boot.py - 77 Bytes</br>emojiImg - 0 Bytes</br>img - 0 Bytes</br>main.py - 169 Bytes</br>res - 0 Bytes</br>temp.py - 85 Bytes</br>test.py - 0 Bytes</br>update - 0'
>>> 

Allerdings fügt .join() am Ende kein Trennungsstring mehr ein. Dieser muss dann noch hinzugegügt werden:

>>> verzeichnis_liste = ' Bytes</br>'.join([' - '.join([x[0], str(x[3])]) for x in os.ilistdir()]) + ' Bytes</br>'
>>> verzeichnis_liste
'apps - 0 Bytes</br>blocks - 0 Bytes</br>boot.py - 77 Bytes</br>emojiImg - 0 Bytes</br>img - 0 Bytes</br>main.py - 169 Bytes</br>res - 0 Bytes</br>temp.py - 85 Bytes</br>test.py - 0 Bytes</br>update - 0 Bytes</br>'

Nun ist es so wie es sein soll und kann in das HTML-Gerüst eingefügt werden.

Namensräume bei mehreren hintereinander ausgeführten Scripts.

Version 1.11.8

Wenn 2 Scripte nacheinander ausgeführt werden ohne den ESP32 zwischenzeitlich neu zu booten, so sind im M5Stick C Plus die Namen der Objekte des zuerst ausgeführten Scripts im anschließend ansgeführten Script bekannt.

Beim M5STAMP Pico ist das nicht der Fall! offenbar wird vor dem Start des zweiten Scripts hier der Speicher geleert. Der freie Speicher war nach dem Ausführen von 2 Scripten genauso groß wie nach dem Ausführen nur des zweiten Scriptes. Das gilt nur für die REPL! Im Normalbetrieb sind in main.py die Objekte aus boot.py sichtbar.

libs.urequests beim M5ATOM Lite funktioniert nicht.

Beim M5Stick C Plus und beim M5STAMP Pico tut sie was sie soll.


Diese Seite ist noch nicht für die Öffentlichkeit nutzbar, da alles noch in der Entwicklung ist.


Die Umgebung erstellen.

Als Erstes müssen diese Dateien im Dateisystem des Gerätes erezugt werden. Dazu dient das Micropython Script mk_json.py. Dieses wird am Besten auf das Gerät kopiert. Dann im Editorfenster von Thonny geöffnet und die erforderlichen Daten eingetragen. Von Thonny aus wird es dann auf dem Gerät ausgeführt und erzeugt so die erforderlichen Dateien.

mk_json.py kann auch aus dem PC heraus ausgeführt werden. Dann besteht aber die Gefahr, dass falsche / alte Daten auf des Gerät gelangen, wenn man mit dem Script verschiedene Geräte vorbereitet.

Die erforderlichen Dateien:

Der OTA Updater benötigt einige Informationen, die ihm in verschiedenen Dateien bereitgestellt werden.

Diese Dateien sind meist im Json-Format gespeichert und haben dann die Endung .json.

Die erforderlichen Dateien sind:

Weiterlesen »

Die Installationsroutine von Thonny lässt es nicht zu, 2 Versionen von Thonny auf einem Rechner zu installieren. Wenn schon ein Thonny-Verzeichnis, ggf. auch mit anderem Namen existiert wird immer dorthin installiert und die alte Version gelöscht.


Nun gibt es derzeit das Problem, dass die M5Stack Geräte nicht mit der Version 4 von Thonny zusammenarbeiten. Es gibt wohl ein Problem mit der Größe der übertragenen Blöcke. Das kann man durch einen Eintrag in einer Config-Datei umgehen – allerdings nur bis zum nächsten Neustart des M5Stack Gerätes. Deshalb hätte ich gerne die Versionen 4.x.x und 3.3.13 auf meinem Rechner.


Ich habe die neue Version (hier 4.0.2) auf dem Rechner installiert in einem Verzeichnis Thonny_4. Dann habe ich ein weiteres Verzeichnis mit dem Namen Thonny_3 angelegt. Dahinein habe ich das Zip-file der Portabelversion 3.3.13 entpackt.

Das funktioniert.

Die Übersetzungen auf dieser Seite wurden mit DeepL.com vorgenommen und ggf. von mir korrigiert.

Es gibt verschiedene Stellen im Internet bei denen man Micropython für das Lilygo T-Device S3 finden kann. Zuerst beim „Original“ Micropython.org. Hier gibt es 3 Versionen für den S3

https://micropython.org/download/GENERIC_S3/

https://micropython.org/download/GENERIC_S3_SPIRAM_OCT/

https://micropython.org/download/GENERIC_S3_SPIRAM/

Dann gibt es noch eine Version mit integriertem ST7789 Modul:

https://github.com/russhughes/st7789s3_mpy

Zu guter Letzt noch eine Version auf die LILYGO verweist. Diese muss aber noch selbst kompiliert werden.

https://github.com/Xinyuan-LilyGO/lilygo-micropython

Zu beachten ist, dass die Startadresse beim ESP32-S3 0 ist. Beim ESP32 ist sie ansonsten 0x1000. Dieser Wert steht auch in vielen Anleitungen. Mir hat das mindestens einen Tag Probiererei gekostet, bis ich dahinter gekommen bin.

LILYGO T-Display Layout

Quelle: https://github.com/Xinyuan-LilyGO/T-Display-S3 Hier gibt es auch das Schaltbild.


Die Grafikbefehle – wird gerade bearbeitet!

Von https://github.com/russhughes/st7789s3_mpy/tree/main kopiert und mit DeepL.com übersetzt.

  • st7789.ST7789(d7, d6, d5, d4, d3, d2, d1, d0, wr, rd, width, height, dc, reset, cs, backlight, rotations, rotation, color_order, inversion, options, buffer_size)
    • Erforderliche positionsbezogene Argumente:
      • d7: 8-bit data bus pin bit 7 (Most significant bit)
      • d6: 8-bit data bus pin bit 6
      • d5: 8-bit data bus pin bit 5
      • d4: 8-bit data bus pin bit 4
      • d3: 8-bit data bus pin bit 3
      • d2: 8-bit data bus pin bit 2
      • d1: 8-bit data bus pin bit 1
      • d0: 8-bit data bus pin bit 0 (Least significant bit)
      • wr: write strobe pin
      • rd: read strobe pin
      • width display width
      • height display height
      • Erforderliche Schlüsselwortargumente:
        • dc 
        • legt den Pin fest, der mit dem Daten-/Befehlseingang der Anzeige verbunden ist. Dieser Parameter ist immer erforderlich.
      • Optionale Schlüsselwortargumente:
        • reset 
          • legt den Pin fest, der mit dem Hardware-Reset-Eingang des Displays verbunden ist. Wenn der Reset-Pin des Displays auf High geschaltet ist, ist der Reset-Parameter nicht erforderlich.
        • cs 
          • legt den Pin fest, der mit dem Chip-Select-Eingang des Displays verbunden ist. Wenn der CS-Pin des Displays auf Low geschaltet ist, muss das Display das einzige Gerät sein, das mit dem SPI-Port verbunden ist. Das Display ist immer das ausgewählte Gerät, und der cs-Parameter ist nicht erforderlich.
        • backlight 
          • legt den Pin fest, der mit dem Eingang für die Hintergrundbeleuchtung des Displays verbunden ist. Der Eingang für die Hintergrundbeleuchtung des Displays kann oft potentialfrei bleiben oder nicht angeschlossen werden, da die Hintergrundbeleuchtung bei einigen Displays immer eingeschaltet ist und nicht ausgeschaltet werden kann.
        • rotations 
          • setzt die Orientierungstabelle. Die Orientierungstabelle ist eine Liste von Tupeln für jede Drehung, die verwendet wird, um das MADCTL-Register, die Anzeigebreite, die Anzeigehöhe, die start_x- und start_y-Werte zu setzen:
          • Display
            • Standardausrichtungstabellen
          • 240×320
            • [(0x00, 240, 320, 0, 0), (0x60, 320, 240, 0, 0), (0xc0, 240, 320, 0, 0), (0xa0, 320, 240, 0, 0)]
          • 170×320
            • [(0x00, 170, 320, 35, 0), (0x60, 320, 170, 0, 35), (0xc0, 170, 320, 35, 0), (0xa0, 320, 170, 0, 35)]
          • 240×240
            • [(0x00, 240, 240, 0, 0), (0x60, 240, 240, 0, 0), (0xc0, 240, 240, 0, 80), (0xa0, 240, 240, 80, 0)]
          • 135×240
            • [(0x00, 135, 240, 52, 40), (0x60, 240, 135, 40, 53), (0xc0, 135, 240, 53, 40), (0xa0, 240, 135, 40, 52)]
          • 128×160
            • [(0x00, 128, 160, 0, 0), (0x60, 160, 128, 0, 0), (0xc0, 128, 160, 0, 0), (0xa0, 160, 128, 0, 0)]
          • 128×128
            • [(0x00, 128, 128, 2, 1), (0x60, 128, 128, 1, 2), (0xc0, 128, 128, 2, 3), (0xa0, 128, 128, 3, 2)]
          • other
            • [(0x00, width, height, 0, 0)]
            • You may define as many rotations as you wish.
        • rotation 
          • stellt die Anzeigendrehung gemäß der Orientierungstabelle ein.
          • Die Standardausrichtungstabelle definiert vier Drehungen gegen den Uhrzeigersinn für 240×320-, 240×240-, 134×240-, 128×160- und 128×128-Displays, bei denen sich das Flachbandkabel des LCDs an der Unterseite des Displays befindet. Die Standarddrehung ist Hochformat (0 Grad).
            • Index — Rotation
            • 0 — Hochformat (0 Grad)
            • 1 — Landschaft (90 Grad)
            • 2 — Umgekehrtes Hochformat (180 Grad)
            • 3 — Umgekehrtes Querformat (270 Grad)
        • color_order 
          • setzt die vom Treiber verwendete Farbreihenfolge (st7789.RGB oder st7789.BGR)
        • inversion 
          • Legt den Modus für die Farbumkehrung der Anzeige fest, wenn True, und löscht den Modus für die Farbumkehrung der Anzeige, wenn False.
        • options
          • Setzt Treiberoptionsflags.
            • Option
              • Beschreibung
            • st7789.WRAP
              • Pixel, Linien, Polygone und Hershey-Text werden sowohl horizontal als auch vertikal um die Anzeige herumgezogen.
            • st7789.WRAP_H
              • Pixel, Linien, Polygone und Hershey-Text werden horizontal um die Anzeige gewickelt.
            • st7789.WRAP_V
              • Pixel, Linien, Polygone und Hershey-Text werden vertikal um die Anzeige herumgeführt.
        • buffer_size 
          • Wenn keine Puffergröße angegeben wird, wird ein dynamisch zugewiesener Puffer erstellt und bei Bedarf wieder freigegeben. Wenn eine buffer_size festgelegt wird, muss sie groß genug sein, um das größte verwendete Bitmap, Schriftzeichen und dekodierte JPG-Bild zu enthalten (Zeilen * Spalten * 2 Byte, 16-Bit-Farben in RGB565-Notation). Die dynamische Zuweisung ist langsamer und kann zu einer Fragmentierung des Heaps führen, weshalb die Garbage Collection (GC) aktiviert werden sollte.
  • deinit()
    • Gibt den von den Puffern verwendeten Speicher frei und löscht das dedizierte GPIO-Bündel. Diese Methode sollte vor der Reinitialisierung des Displays aufgerufen werden, ohne den Mikrocontroller hart zurückzusetzen.
  • inversion_mode(bool)
    • Legt den Modus für die Farbumkehrung der Anzeige fest, wenn er True ist, und löscht den Modus für die Farbumkehrung der Anzeige, wenn er False ist.
  • madctl(value)
    • Gibt den aktuellen Wert des MADCTL-Registers zurück oder setzt das MADCTL-Register, wenn ein Wert an die Methode übergeben wird. Das MADCTL-Register wird zur Einstellung der Anzeigendrehung und der Farbreihenfolge verwendet.
  • init()
    • Muss aufgerufen werden, um die Anzeige zu initialisieren.
  • on()
    • Schaltet den Pin für die Hintergrundbeleuchtung ein, wenn dieser bei init definiert wurde.
  • off()
    • Deaktiviert den Pin für die Hintergrundbeleuchtung, falls ein solcher bei init definiert wurde..
  • sleep_mode(wert)
    • Wenn der Wert True ist, wird die Anzeige in den Ruhezustand versetzt, andernfalls wird sie aufgeweckt, wenn der Wert False ist. Während des Ruhezustands bleibt der Inhalt des Displays möglicherweise nicht erhalten.
  • fill(farbe)
    • Füllen Sie die Anzeige mit der angegebenen Farbe.
  • pixel(x, y, farbe)
    • Setzt das angegebene Pixel auf die angegebene Farbe.
  • line(x0, y0, x1, y1, color)
    • Zeichnet eine einzelne Linie mit der angegebenen Farbe von (x0y0) bis (x1y1).
  • hline(x, y, length, color)
    • Zeichnet eine einzelne horizontale Linie mit der angegebenen Farbe und Länge in Pixel. Zusammen mit vline ist dies eine schnelle Version mit weniger SPI-Aufrufen.
  • vline(x, y, length, color)
    • Zeichnet eine einzelne horizontale Linie mit der angegebenen Farbe und Länge in Pixel.
  • rect(x, y, width, height, color)
    • Zeichnet ein Rechteck aus (xy) mit den entsprechenden Abmessungen
  • fill_rect(x, y, width, height, color)
    • Füllen eines Rechtecks ab den Koordinaten (xy)
  • circle(x, y, r, color)
    • Zeichnet einen Kreis mit Radius r zentriert an den Koordinaten (xy) in der angegebenen Farbe.
  • fill_circle(x, y, r, color)
    • Zeichnet einen gefüllten Kreis mit Radius r zentriert an den Koordinaten (xy) in der angegebenen Farbe.
  • blit_buffer(buffer, x, y, width, height)
    • Kopiert den Inhalt von bytes() oder bytearray() in den internen Speicher des Bildschirms. Hinweis: Jede Farbe benötigt 2 Bytes im Array
  • text(font, s, x, y[, fg, bg])
    • Schreibt Text auf den Bildschirm unter Verwendung der angegebenen Bitmap font mit den Koordinaten als linke obere Ecke des Textes. Die optionalen Argumente fg und bg können die Vorder- und Hintergrundfarben des Textes festlegen; andernfalls ist die Vordergrundfarbe standardmäßig WHITE und die Hintergrundfarbe standardmäßig BLACK. Siehe README.md im fonts/bitmap Verzeichnis für Beispielschriftarten.
  • write(bitmap_font, s, x, y[, fg, bg, background_tuple, fill_flag])
    • Schreibt Text in die Anzeige unter Verwendung des angegebenen Proportional- oder Monospace-Bitmap-Fontmoduls mit den Koordinaten als linke obere Ecke des Textes. Die Vorder- und Hintergrundfarbe des Textes kann mit den optionalen Argumenten fg und bg festgelegt werden, andernfalls ist die Vordergrundfarbe standardmäßig WHITE und die Hintergrundfarbe standardmäßig BLACK.Transparenz kann emuliert werden, indem ein background_tuple mit (bitmap_buffer, width, height) angegeben wird. Dies ist das gleiche Format, das von der Methode jpg_decode verwendet wird. Siehe examples/T-DISPLAY/clock/clock.py für ein Beispiel, siehe auch README.md im truetype/fonts Verzeichnis für Beispielschriftarten. Gibt die Breite der Zeichenkette wie gedruckt in Pixel zurück. Das Hilfsprogramm font2bitmap erzeugt kompatible Bitmap-Module mit 1 Bit pro Pixel aus Proportional- oder Monospaced-True-Type-Schriften. Die Zeichengröße, die Vorder- und Hintergrundfarben und die Zeichen im Bitmap-Modul können als Parameter angegeben werden. Verwenden Sie die Option -h für Details. Wenn Sie bei der Initialisierung der Anzeige eine Puffergröße angeben, muss diese groß genug sein, um das breiteste Zeichen (HEIGHT * MAX_WIDTH * 2) aufzunehmen.
  • write_len(bitap_font, s)
    • Gibt die Breite der Zeichenkette in Pixeln zurück, wenn sie in der angegebenen Schriftart gedruckt wird.
  • draw(vector_font, s, x, y[, fg, scale])
    • Zeichnet Text auf dem Display unter Verwendung der angegebenen Hershey-Vektorschriftart mit den Koordinaten als untere linke Ecke des Textes. Die Vordergrundfarbe des Textes kann mit dem optionalen Argument fg eingestellt werden. Ansonsten ist die Vordergrundfarbe standardmäßig WHITE. Die Größe des Textes kann durch Angabe eines Skala Wertes skaliert werden. Der skalieren Wert muss größer als 0 sein und kann ein Fließkomma- oder ein Ganzzahlwert sein. Der Skala -Wert ist standardmäßig 1.0. Siehe die README.md im Verzeichnis vector/fonts für Beispielschriften und das Verzeichnis utils für ein Schriftkonvertierungsprogramm.
  • draw_len(vector_font, s[, scale])
    • Gibt die Breite der Zeichenkette in Pixeln zurück, wenn sie mit der angegebenen Schriftart gezeichnet wurde.
  • jpg(jpg_filename, x, y [, method])
    • Zeichnen Sie eine JPG-Datei auf dem Bildschirm an den angegebenen x und y Koordinaten als linke obere Ecke des Bildes. Der Speicherbedarf für die Dekodierung und Anzeige eines JPG-Bildes kann beträchtlich sein, da ein bildschirmfüllendes 320×240-JPG mindestens 3100 Byte für den Arbeitsbereich + 320 * 240 * 2 Byte Speicher für die Pufferung des Bildes benötigt. JPG-Bilder, die einen Puffer benötigen, der größer ist als der verfügbare Speicher, können durch Übergabe von SLOW für die Methode gezeichnet werden. Die SLOW Methode zeichnet das Bild Stück für Stück unter Verwendung der Minimum Coded Unit (MCU, normalerweise ein Vielfaches von 8×8) des Bildes.
  • jpg_decode(jpg_filename [, x, y, width, height])
    • Dekodiert eine jpg-Datei und gibt sie oder einen Teil davon als Tupel bestehend aus (buffer, width, height) zurück. Der Puffer ist ein mit color565 blit_buffer kompatibles Byte-Array. Wenn die optionalen Parameter x, y, width und height angegeben werden, wird der Puffer nur den angegebenen Bereich des Bildes enthalten. Siehe examples/T-DISPLAY/clock/clock.py examples/T-DISPLAY/toasters_jpg/toasters_jpg.py für Beispiele.
  • png(png_filename, x, y [, mask])
    • Zeichnet eine PNG-Datei auf dem Bildschirm mit der linken oberen Ecke des Bildes an den angegebenen Koordinaten. Das PNG wird nicht beschnitten, es muss vollständig auf den Bildschirm passen, sonst wird es nicht gezeichnet. Der Speicherbedarf für die Dekodierung und Anzeige eines PNGs kann beträchtlich sein. Daher wird das PNG entweder eine Zeile nach der anderen gezeichnet oder so viele Zeilen, wie in den Puffer Puffergröße passen, wenn dieser bei der Initialisierung des Displays angegeben wurde. Da der Treiber keinen Framebuffer enthält, wird Transparenz nicht unterstützt. Die Angabe eines True Wertes für den mask Parameter verhindert, dass Pixel mit einem Alphakanalwert von Null angezeigt werden. Das Zeichnen von maskierten PNGs ist langsamer als nicht maskierte, da jedes sichtbare Liniensegment separat gezeichnet wird. Ein Beispiel für die Verwendung einer Maske finden Sie im Programm alien.py im Ordner examples/png.
  • polygon_center(polygon)
    • Gibt den Mittelpunkt des Polygons als (x, y) Tupel zurück. Das Polygon sollte aus einer Liste von (x, y) Tupeln bestehen, die ein geschlossenes konvexes Polygon bilden.
  • fill_polygon(polygon, x, y, color[, angle, center_x, center_y]) (angle = 0 … <2*PI)
    • Zeichne ein gefülltes Polygon an den x, und y Koordinaten in der Farbe angegebenen. Das Polygon kann im Winkel Bogenmaß um den center_x und center_y Punkt gedreht werden. Das Polygon sollte aus einer Liste von (x, y) Tupeln bestehen, die ein geschlossenes konvexes Polygon bilden, siehe TWATCH-2020 watch.py Demo für ein Beispiel.
  • polygon(polygon, x, y, color, angle, center_x, center_y) (angle = 0 … <2*PI)
    • Zeichne ein Polygon an den x, und y Koordinaten in der Farbe gegeben. Das Polygon kann im Winkel Bogenmaß um den center_x und center_y Punkt gedreht werden. Das Polygon sollte aus einer Liste von (x, y) Tupeln bestehen, die ein geschlossenes konvexes Polygon bilden, siehe T-Display roids.py für ein Beispiel.
  • bounding({status, as_rect})
    • Bounding aktiviert oder deaktiviert die Verfolgung des Anzeigebereichs, in den geschrieben wurde. Anfänglich ist die Nachverfolgung deaktiviert; übergeben Sie einen True-Wert, um die Nachverfolgung zu aktivieren, und False, um sie zu deaktivieren. Die Übergabe eines True- oder False-Parameters setzt das aktuelle Begrenzungsrechteck auf (display_width, display_height, 0, 0) zurück. Gibt ein vierstelliges Tupel zurück, das (min_x, min_y, max_x, max_y) enthält und den Bereich der Anzeige angibt, in den seit der letzten Löschung geschrieben wurde.Wenn as_rect Parameter True ist, enthält das zurückgegebene Tupel (min_x, min_y, width, height) Werte.Siehe die TWATCH-2020 watch.py Demo für ein Beispiel.
  • bitmap(bitmap, x , y [, index])
    • Zeichnet bitmap unter Verwendung der angegebenen xy Koordinaten als linke obere Ecke der bitmap. Der optionale Parameter index bietet eine Methode zur Auswahl aus mehreren Bitmaps, die ein bitmap -Modul enthält. Der index wird verwendet, um den Versatz zum Anfang des gewünschten Bitmaps zu berechnen, indem die Werte HEIGHT, WIDTH und BPP des Moduls verwendet werden.Die imgtobitmap.py erzeugt kompatible Bitmap-Module mit 1 bis 8 Bit pro Pixel aus Bilddateien unter Verwendung der Pillow Phyton Imaging Library.The monofont2bitmap.py erzeugt kompatible Bitmap-Module mit 1 bis 8 Bit pro Pixel aus Monospaced True Type-Schriften. Siehe die inconsolata_16.pyinconsolata_32.py und inconsolata_64.py Dateien im examples/lib Ordner für Beispielmodule und die mono_font.py Programm für ein Beispiel, das die generierten Module verwendet. Die Zeichengrößen, Bit pro Pixel, Vorder- und Hintergrundfarben und die Zeichen, die in das Bitmap-Modul aufgenommen werden sollen, können als Parameter angegeben werden. Verwenden Sie die Option -h für Details. Bits pro Pixel-Einstellungen, die größer als eins sind, können verwendet werden, um Zeichen mit Antialiasing zu erzeugen, was jedoch zu Lasten des Speichers geht. Wenn Sie bei der Initialisierung der Anzeige eine Puffergröße angeben, muss diese groß genug sein, um ein Zeichen (HEIGHT * WIDTH * 2) aufzunehmen.
  • width()
    • Gibt die aktuelle logische Breite der Anzeige zurück. (z. B. ist eine 135×240-Anzeige um 90 Grad gedreht 240 Pixel breit)
  • height()
    • Gibt die aktuelle logische Höhe der Anzeige zurück. (d.h. eine um 90 Grad gedrehte 135×240-Anzeige ist 135 Pixel hoch)
  • rotation(r)
    • Mit dieser Einstellung wird die logische Anzeige gegen den Uhrzeigersinn gedreht. 0-Porträt (0 Grad), 1-Landschaft (90 Grad), 2-Umgekehrt-Porträt (180 Grad), 3-Umgekehrt-Landschaft (270 Grad)
  • offset(x_start, y_start)
    • Der Speicher des ST7789-Controllers ist für ein 240×320-Display konfiguriert. Wenn Sie ein kleineres Display wie 240×240 oder 135×240 verwenden, muss ein Offset zu den x- und y-Parametern hinzugefügt werden, damit die Pixel in den Speicherbereich geschrieben werden, der dem sichtbaren Display entspricht. Die Offsets müssen eventuell angepasst werden, wenn die Anzeige gedreht wird. z.B. ist das TTGO-TDisplay 135×240 und verwendet die folgenden Offsets.Rotationx_starty_start05240140532534034052Wenn die Rotationsmethode aufgerufen wird, passt der Treiber die Offsets für eine 135×240 oder 240×240 Anzeige an. In diesem Fall verwenden Sie die Methode offset nach der Methode rotation um die Offset-Werte einzustellen. Eine Methode besteht darin, einen Rahmen in der Größe der Anzeige zu zeichnen und dann kleine Änderungen an den Offsets vorzunehmen, bis die Anzeige korrekt aussieht. Siehe das Programm cfg_helper.py im Ordner examples für weitere Informationen.
  • Das Modul bietet vordefinierte Farben: 
    • BLACKBLUEREDGREENCYANMAGENTAYELLOW, und WHITE

Ab hier herrscht noch Baustellenchaos – nicht weiterlesen!


Microphyton auf dem T-Display S3 zum Laufen zu bekommen ist ein wahrer Hürdenlauf.

Erster Versuch

Meine erste Suche führte mich zu dieser (https://github.com/Xinyuan-LilyGO/lilygo-microphyton) Seite. Hier gibt es ein aktuelles Micropython (V.1.19) speziell für den T-Display S3. Allerdings muss dieses erst kompiliert werden. Das war für mich neu. Aber mit fachkundiger Unterstützung ging es ganz einfach:

Zuerst musste ich das Repository von Github herunterladen. Dazu muss Git auf dem Rechner installiert sein. Die Anleitung auf o.a. Seite bezieht sich nur auf Linux Rechner. Zu Glück habe ich einen. Nun muss zuerst das Verzeichnis angesteuert oder erzeugt werden in dem das Repo abgelegt werden soll:

cd repoverzeichnis

Dann kann das Verzeichnis von Github geclonet werden:

git clone https://github.com/Xinyuan-LilyGO/lilygo-microphyton.git

Im repoverzeichnis wird beim Clonen der Ordner lilygo-micropython angelegt. In diesen mus nun gewechselt werden:

cd lilygo-microphyton

Dann die beiden folgen Zeilen nacheinander ausführen:

$ cp config_T-DisplayS3 config
$ make

Nach ca. 20 Minuten – je nach Rechner – findet man unter

bin/esp32s3/LILYGO_T-DisplayS3

eine Datei mit diesem oder einem ähnlichen Namen:

LilyGo-MicroPhyton_esp32s3_LILYGO_T-DisplayS3_MPY-d7919ea71_IDF-e8bdaf9198_B20230427_039ab10285.bin

Das ist nun die Datei, die Micropython auf dem T-Display S3 ermöglichen soll.

Micropython auf den T-Display S3 schaffen.

Mein erster Versuch wurde mit Thonny unternommen und endete mit einer Fehlermeldung:

"C:\Program Files (x86)\Thonny\python.exe" -u -m esptool --port COM23 erase_flash
esptool.py v3.1
Serial port COM23

Connecting…
Detecting chip type… ESP32-S3(beta3)
Chip is ESP32-S3(beta3)

Features: WiFi, BLE
Crystal is 40MHz
MAC: 00:00:00:00:00:00
Uploading stub…
Running stub…
Stub running…
Erasing flash (this may take a while)…

A fatal error occurred: Invalid head of packet (0x50)

Erase command returned with error code 2

Das hat mich also nicht weiter gebracht. Meine Suche im Internet nach error code 2 und Invalid head of packet bliebt erfolglos.

Auf dieser (https://github.com/russhughes/st7789s3_mpy) habe ich dann Hinweise auf den Umgang mit esptools.py gefunden:

pip3 install esptool
esptool.py --port COM3 erase_flash
esptool.py --chip esp32s3 --port COM3 write_flash -z 0x1000 firmware.bin

Der Chiptype musste noch auf esp32s3 geändert werden. Die COM-Ports müssen natürlich die aktuellen sein.

C:\Users\kpsto\Lilygo>esptool.py --port COM23 erase_flash
esptool.py v4.5.1
Serial port COM23
Connecting…
Detecting chip type… ESP32-S3
Chip is ESP32-S3 (revision v0.1)
Features: WiFi, BLE
Crystal is 40MHz
MAC: 34:85:18:71:49:f8
Uploading stub…
Running stub…
Stub running…
Erasing flash (this may take a while)…
Chip erase completed successfully in 38.4s
Hard resetting via RTS pin…

Löschen hat schon mal geklappt.

C:\Users\kpsto>esptool.py --chip esp32s3 --port COM23 write_flash -z 0x1000 Lilygo\firmware.bin
esptool.py v4.5.1
Serial port COM23
Connecting…
Chip is ESP32-S3 (revision v0.1)
Features: WiFi, BLE
Crystal is 40MHz
MAC: 34:85:18:71:49:f8
Uploading stub…
Running stub…
Stub running…
Configuring flash size…
Flash will be erased from 0x00001000 to 0x0019afff…
Compressed 1678864 bytes to 1043763…
Wrote 1678864 bytes (1043763 compressed) at 0x00001000 in 15.4 seconds (effective 874.9 kbit/s)…
Hash of data verified.

Leaving…
Hard resetting via RTS pin…

Schreiben offenbar auch. Mal sehen was Thonny jetzt sagt.

Thonny kann keine REPL-Verbindung herstellen. Nach einem Reset stellt Windows eine Verbindung her, diese wird aber gleich wieder abgebrochen und das Spiel beginnt von Neuem. Also wieder nichts. Ein erneutes Löschen funktionier, der Effekt bleibt aber erhalten.

C:\Users\kpsto>esptool.py --port COM23 erase_flash

Nun noch einen Versuch mit dem anfangs kompiliertem File:

C:\Users\kpsto>esptool.py --chip esp32s3 --port COM23 write_flash -z 0x1000 Lilygo\LilyGo-MicroPython_esp32s3_LILYGO_T-DisplayS3_MPY-d7919ea71_IDF-e8bdaf9198_B20230427_039ab10285.bin

esptool.py v4.5.1
Serial port COM23
Connecting…
Chip is ESP32-S3 (revision v0.1)
Features: WiFi, BLE
Crystal is 40MHz
MAC: 34:85:18:71:49:f8
Uploading stub…
Running stub…
Stub running…
Configuring flash size…
Flash will be erased from 0x00001000 to 0x00188fff…
Compressed 1601744 bytes to 1017788…
Wrote 1601744 bytes (1017788 compressed) at 0x00001000 in 14.7 seconds (effective 869.0 kbit/s)…
Hash of data verified.

Leaving…
Hard resetting via RTS pin…

Auch hiernach wieder die nervige An-Ab-Prozedur in Windows.

Nun noch ein Versuch mit dem Originalen Micropython:

C:\Users\kpsto>esptool.py --chip esp32s3 --port COM23 write_flash -z 0 Lilygo\GENERIC_S3-20220618-v1.19.1.bin
esptool.py v4.5.1
Serial port COM23
Connecting…
Chip is ESP32-S3 (revision v0.1)
Features: WiFi, BLE
Crystal is 40MHz
MAC: 34:85:18:71:49:f8
Uploading stub…
Running stub…
Stub running…
Configuring flash size…
Flash will be erased from 0x00000000 to 0x00157fff…
Compressed 1406576 bytes to 928185…
Wrote 1406576 bytes (928185 compressed) at 0x00000000 in 12.4 seconds (effective 903.8 kbit/s)…
Hash of data verified.

Leaving…
Hard resetting via RTS pin…

Nun ist Ruhe. Reset drücken. Der T-DiplayS3 hat nun einen neuen COM-Port (COM24). Und was macht Thonny?

MicroPython v1.19.1 on 2022-06-18; ESP32S3 module with ESP32S3

Type "help()" for more information.

3 + 5
8

Micropython funktioniert!!!

Ein Etappensieg

Im Programmiermode COM23 Im normalen Mode COM24!

Und es geht doch …

Das war der eine falsche Startadresse beim Hochladen -z 0x1000 ist falsch! Richtig ist -z 0 so wie es in der Mircropython.org Dokumentation angegeben ist!

MicroPython v1.19-dirty on 2023-04-27; LILYGO T-DisplayS3 with ESP32S3

Type "help()" for more information.

3 + 5
8
help('modules')
main gc uasyncio/stream urandom
_boot inisetup ubinascii ure
_onewire lcd ubluetooth uselect
_thread logo ucollections usocket
_uasyncio math ucryptolib ussl
_webrepl micropython uctypes ustruct
apa106 neopixel uerrno usys
btree network uhashlib utime
builtins ntptime uheapq utimeq
cmath onewire uio uwebsocket
dht uarray ujson uzlib
ds18x20 uasyncio/init umachine webrepl
esp uasyncio/core uos webrepl_setup
esp32 uasyncio/event upip websocket_helper
flashbdev uasyncio/funcs upip_utarfile

framebuf uasyncio/lock uplatform
Plus any modules on the filesystem

Ich brauche eine Elektronische Last mit der ich ein altes PC-Netzteil testen möchte. Von einem früherem Projekt habe ich noch einen großen Kühlkörper mit 18 x IFR540 darauf. Das Teil möchte ich als Basis nehmen.

Weitwinkel und Vorsatzlinse vertragen sich nicht so gut.

Vorüberlegungen

Umladezeit der MOS-FET-Gates

Um die Umladeströme der MOES-FET-Gatekapazitäten einzuschätzen habe ich ein bischen mit Thonny in Micropython auf einem ESP23 herumgespielt. Die folgeneden Berechnungen sind nicht exakt. Sie geben nur einen Überblick über die zu erwartenden Ströme:

>>> # Q = C*U
>>> # Q = I*t
>>> # c*u = i*t
>>> # i = (c*u)/t
>>> c = 2E-9     # max. Eingangskapazität des IRF540  [F]
>>> u = 12       # durchschnittliche Spannung am Gate [V]
>>> t = 1E-3     # Schaltzeit hier 1 ms               [s]
>>> (c*u)/t
2.4e-05          # 24 µA
>>> t = 1E-6     # Schaltzeit hier 1 µs
>>> (c*u)/t
0.024            # 24 mA
>>> 12/0.024
500.0            # Widerstand bei 12 V und 24 mA = 500 Ohm
>>> 500 * 2E-9
1e-06            # Zeitkonstante 2nF und 500 Ohm zur Kontrolle
>>> (7*c*u)/t    # Es sollen später 7x IRF540 parallel angesteuert werden
0.168            # 168 mA
>>> 

Um später eine Lastumschaltzeit in der Größenordnung 1 µs zu bekommen muss an dem Gate jedes MOS-FET mindestens 24 mA fließen können.

Bei der ursprünglichen Planung habe ich die Transistoren BD649/650 vorgesehen. Inzwischen bin ich auf das komplementäre MOS-FET-Pärchen IRF7507 gestoßen, die hier geeigneter sein könnten.

1. Versuch

Zuerst möchte ich mit nur einem MOS-FET anfangen und diesen als Last testen. Er soll einen Source-Widerstand von 0,1 Ohm / 0,5 Watt / 1% erhalten. Dieser kann maximal 2,2 Ampere vertragen. Das ist ein guter Ausgangspunkt.

Belastbarkeit der 0,1 Ohm Widerstände:

  • 0,5 Watt, 2,2 Ampere, 0,22 Volt
  • 10 Watt, 10 Ampere, 1 Volt

Für die Gesamtstrommessung befinden sich auf dem Kühlkörper auch noch 2 Messwiderstände 0,1 Ohm / 10 Watt / 0,5%. Damit lassen sich maximal 10 Ampere pro Widerstand messen, also gesamt 20 Ampere.

Die Transistoren bekommen später jeder einen 0,1 Ohm Widerstand in die Sourceleitung zum Ausgleich von Toleranzen. Somit kann jeder Transistor maximal 2,2 A fließen lassen.

Der 10 Watt Messwiderstand dient als Stromfühler. Er stellt den IST-Wert bereit. Bei 2,2 Ampere sind das 220 mV. Es macht wohl Sinn, diese Spannung zu verstärken, bevor sie mit der Referenzspannung verglichen wird.

Schaltwandler sind universelle Spannungversorgungseinheiten, die sich immer größerer Beliebtheit erfreuen und in den meisten Fällen den analogen Reglern vorgezogen werden, da sie wesentlich effektiver arbeiten. Leider erfolgt die Einstellung der Ausgangsspannung bisher immer noch analog mittels Potentiometer/Trimmer. Das ist ein Problem, wenn man die Ausgangsspannung mittels Microcontroller einstellen möchte. Ich habe mir drei Lösungsmöglichkeiten für dieses Problem angesehen:

  • Umschaltbare Widerstände
  • PWM
  • DAC mit externem Komparator

Hinweise zur Simulation

Ich habe die Simulationen mit dem kostenlosen LTspice XVII erstellt. Als Grundlage habe ich das Beispiel 1938.asc eingesetzt. Das habe ich ausgewählt, weil die Simulation damit relativ problemlos funktionierte. Es ist nur ein Beispiel und hat nichts mit dem später eingesetzten IC’s zu tun. Auch der Operationsverstärker OP07 ist nur ein Beispiel. Später werde ich eher den LM358 oder LM324 einsetzen. Diese sind aber bei LTspice nicht dabei.

Die Simulationen sind nur ein erster Versuch mit der Materie vertraut zu werden. Die wirklichen Ergebnisse werde ich später bei echten Aufbauten erhalten.

Die Bilder und Plots aus LTspice sind auf der Website nur sehr schlecht zu erkennen. Ein Linksklick mit der Mouse ins Bild zeigt es in voller Größe und dann ist auch alles gut zu erkennen.

Zum Nachvollziehen werde ich die Dateien am Ende der Kapitel anhängen, so dass Ihr sie herunterladen könnt.

Die Originalschaltung

In der Standardschaltung wird aus R1 und R2 ein Sapnnungsteiler gebildet der die Ausgangsspannung bestimmt.

Standardschaltung aus dem Beispielfile 1938.asc

Hier die Standardbeschaltung mit Impulslast.
Der Plot der Standardbeschaltung mit Impulslast.

Umschaltbare Widerstände

Noch nicht bearbeitet.

PWM

Noch nicht bearbeitet.

DAC mit externem Komparator

Die Schaltwandler IC’s besitzen einen eingebauten Komparator, der die mittels Spannungsteiler heruntergeteilte Ausgangsspannung mit einer internen Referenzspannung vergleicht und so den Schalttransistor ansteuert. Wenn eine externe Referenz möglich wäre, könnte man darüber die Ausgangsspannung mittels DAC einstellen. Da diese Möglichkeit nicht besteht, muss ein externer Komparator eingesetzt werden. Der besteht im einfachsten Fall aus einem Operationsverstärker. Der -Eingang wird mit dem DAC verbunden, der +Eingang mit der Ausgangsspannung und der Ausgang mit dem Feedback-Eingang (FB) des IC’s.

Schaltbild der Simulation in LTspice

Im obigen Schaltbild befindet sich der Operationsverstärker in der Bildmitte (OP07). V2 entspricht dem DAC. Rechts habe ich mi I1 eine Impulsstromsenke hinzugefügt. So wird der Strom zwischen 200 mA und 1,7A hin und her geschaltet. Das habe ich eingefügt, weil mich das Regelverhalten der veränderten Schaltung interessiert.

Das Ergebnis der Simulation für 3,3 Volt ausgangsspannung ist im folgenden Plot dargestellt:

Ergebnis der Simulation

Die blaue Line zeigt die Ausgangsspannung, die rote Linie den Ausgangsstrom und die grüne Linie die Spannung am FB-Eingang des IC’s. Die Reaktion der Ausgangsspannung auf die Laständerung ist dieser Darstellung kaum wahrnehmbar.

Plot mit besserer Auflösung der Ausgangsspannung.

Auch bei besserer Auflösung geht der Einfluß der Stromänderung in den systembedingten Spannungsschwankungen unter. Nur im Einschaltmoment bricht die Spannung kurz auf 3,0 Volt ein.

Allerdings ist deutlich angestiegener Rippel zu erkennen. Das dürfte an der Slew Rate von 0.3 V/μs des OP07 liegen. Für LM358/324 ist der selbe Wert im Datenblatt zu finden.

Ich habe die Simulation mit 5 Volt wiederholt. Auch dabei zeigte sich, dass die Pannung im Einschaltmoment für einen kurzen Zeitraum unter die -5%-Grenze (4,75 Volt) von 5 Volt absinkt.

Plot bei 5 Volt

Hier sind es 4,63 Volt. Nun interessiert mich, ob der 100R Widerstand in der FB-Zuleitung einen Einfluß hat:

Nun habe ich den Widerstand 0R gemacht. Da das bei LTspice nicht geht habe ich den Wert auf 0,000001R gesetzt. Damit ergibt sich tatsächlich eine kleine Veränderung. Der Wert liegt jetzt bei 4,69 Volt. 60 mV machen den Kohl nicht wirklich fett.

Dieser Spannungseinbruch dauert ca. 50 µS.

Wahrscheinlich lässt sich dieser Spannungseinbruch durch einen Stützkondensator direkt an der Last reduzieren.

Zusammenfassung und Ausblick

Grundsätzlich funktioniert dieses Konzept. Als Operationsverstärker kommen aber nur sehr schnelle Typen in Frage. Bei der Simulation wurden die Eigenschaften des IC’s durch den Operationsverstärker deutlich verschlechtert.

Simulation mit schnellem OP

ADA4891 mit 190 V/µs

Sonderbarerweise zeigte der erste Plot völlig absurde Linienzüge. Die 3,3 Volt wurden nicht erreicht. Schließlich konnte ich durch verlängern der Beobachtungszeit dann doch noch ein brauchbares Ergebnis sehen. Der Start dauert >3 ms bis die 3,3 Volt erreicht sind. Dann sieht alles normal aus.

Um alle Störfaktoren auszuschalten hatte ich die Impulsstromsenke abgekniffen. Nun da alles Funktioniert miot einem neuen Timing ein neuer Versuch:

Sonderbarer Weise schaft es die Schaltung nicht die Last von 1,5A auszuregeln. Bei den vorherigen Simulationen funktionierte das einwandfrei.

Das Problem hat der Elko C5 mit 220µF gemacht, den ich bei den ersten Simulationen mit einem OP hinzugefügt hatte, um den Rippel zu reduzieren. Warum dort das Problem nicht aufgetreten ist, erschließt sich mir nicht.

Mit nur 22µF funktioniert es wie es soll. Die FB-Spannung habe ich ausgeblendet weilsie sonst alles andere überdeckt.

Nun ist der Rippel wieder größer aber die Schaltung funktioniert.

Hier wurde C1 von 22 auf 100 µF erhöht. Das funktioniert auch noch Problemlos. Der Spannungseinbruch bei Last ist < 20 mV.
Der Schaltplan der obigen Simulation.

Einen LDO-Regler nachschalten

Es wird empfohlen für eine besonders saubere Spannung einen analogen LDO-Regler nachzuschalten. Das wollte ich natürlich auch simulieren.

Links:

Es werden von chinesischen Herstellern und Händlern diverse günstige AC/DC-Wandler angeboten. Die Frage ist wie es um Störspannungen auf der Netz- und Niederspannungsseite bestellt. Kürzlich bin ich auf Schaltungsvorschläge zur Entstörung dieser kleinen Netzteile gestoßen. Das habe ich mir bei Hi-Link einmal näher angesehen:

und die entsprechenden Bauteileempfehlungen:

Hi-Link schlägt für alle Modelle diese Entstörmaßnahme vor.

Wobei ich aber auch andere Vorschläge gefunden habe. So findet sich bei FEIYANG für das HKL-5M05 Modul diese asymmetrische Entstörung:

DC/DC-Wandler

Für DC/DC-Wandler habe ich sogar diesen aufwändigen Vorschlag gefunden (https://de.aliexpress.com/item/4000418841792.html?spm=a2g0o.store_pc_groupList.8148356.2.657672e6qpr5vC):

Bauteile

Das der ADC der ESP’s ziemlich umbrauchbar ist ist inzwischen hinlänglich bekannt. Allerdings benötigt man ja nicht immer eine hohe Genauigkeit. Zum Ein- und Ausschalten eines Lüfters kommt es meist ein 1, 2 Grad nicht an. Genau das ist meine Anwendung. Ich möchte einen Lüfter bei ca 45 °C ein- und bei ca. 35 °C wieder ausschalten. Dazu bedarf es keiner exakten Werte, sondern nur Schwellwerte, die ggf. per Test ermittelt werden können. Genauigkeit und Linearität des ADC spielen hier keine Rolle. Deshalb scheint mir der intere ADC des ESP32 dafür geeignet zu sein. Das möchte ich hier ausprobieren.

Hier noch ein paar interessante Infos über den ADC aus dem Programmierhandbuch von Espressif (Link unten):

Rauschen minimieren

Der ESP32 ADC kann empfindlich auf Rauschen reagieren, was zu großen Diskrepanzen in den ADC-Messwerten führen kann. Um das Rauschen zu minimieren, kann der Anwender einen 0,1uF-Kondensator an das verwendete ADC-Eingangspad anschließen. Multisampling kann auch verwendet werden, um die Auswirkungen des Rauschens weiter zu minimieren.

ADC-Kalibrierung

Die API esp_adc_cal/include/esp_adc_cal.h bietet Funktionen zur Korrektur von Unterschieden in den gemessenen Spannungen, die durch Variation der ADC-Referenzspannungen (Vref) zwischen den Chips verursacht werden. Per Design ist die ADC-Referenzspannung 1100mV, die tatsächliche Referenzspannung kann jedoch zwischen 1000mV und 1200mV bei verschiedenen ESP32 liegen.

Die Kurve von randomnerdtutorials.com zeigt auch noch eine ausgeprägte Nichtlinearität im oberen Bereich:

Test

Für den Test habe ich eine kleine Platine gebaut. Sie ist für einen M5Stack C bzw. M5Stack C Plus vorgesehen. Sie enthält eine Reihe Vorwiderstände, die mittels Jumper umgesteckt werden können, einen 3poligen Sockel für den NTC. Der parallele Sockel ermöglicht es die Spannung am NTC direkt zu messen.

Um die Temperatur am NTC zu messen habe ich ein Termoelement daran montiert.

Für den Test habe ich eine Heissluftpistole benutzt und für die Temperatureinstellung den Abstand zum NTC variiert.

Diese Schaltung habe ich angewendet:

Meine Tests haben die folgenden Werte erbracht.

  • 21,4 °C – 2850
  • 35 °C – 2200
  • 45 °C – 1750
  • 50 °C – 1500
  • 60 °C – 1150

Dabei muss man berücksichtigen, dass die Messwerte des ADC schwanken (siehe oben).

Software:

Dieses Programm ließt die Temperatur und reagiert auf das Über- und Unterschreiten der Grenzwerte, die ich hier als Raw-Werte des ADC eingesetzt habe.

Das die Abfragen in einer Interrupt-Service-Routine laufen hat mit diesem Thema hier nichts zu tun. Sie gehören üblicherweise in die Mainloop.

Links:

Schraubendreher u.ä.

Hier habe ich eine Aufstellung gemacht welche Werkzeuge für Schrauben von M2, M2,5 und M3 sinnvoll sind um alle Erfordernisse abzudecken:

  • Imbus
    • M2 => SW1,5
    • M2,5 => SW2,0
    • M3 => SW2,5
  • 6-Kant Mutter und Schraubenkopf
    • M2 SW4
    • M2,5 SW5
    • M3 SW5,5
  • Kreuzschlitz (PH)
    • M2 PH1
    • M2,5 PH1
    • M3 PH1
  • Protzi (PZ)
    • M2 PZ1
    • M2,5 PZ1
    • M3 PZ2
  • Schlitz
    • M2 0,5×3,8
    • M2,5 0,6×4,5
    • M3 0,8×5,5
  • Torx
    • M2 T6
    • M2,5 T8
    • M3 T10
  • Maul- und Ringschlüssel
    • M2 SW4
    • M2,5 SW5
    • M3 SW5,5

Zangen und Greifwerkzeuge

  • Seitenschneider
  • Kombizange
  • Spitzzange
  • Pinzetten
  • Abisolierer

Lötutensilien

Fixierungen