Für Version 2 habe ich die gleichen LED-Module benutzt, die ich bereits zuvor im Prototyp verwendet habe. Es handelt sich um RGB-LEDs vom Typ WS2812; das sind die gleichen, die Adafruit in ihren NeoPixel-Modulen einsetzt, weshalb praktisch vollsändige Softwarekompatibilität zu den zahlreichen NeoPixel-Bibliotheken besteht. Kaufen kann man die von mir verwendeten Module z.B. bei roboter-bausatz.de; sie kosten nur wenige Euro. Der LED-Ring besitzt 12 Segmente und einen Außendurchmesser von ca. 50 Millimetern. Die Matrix ist quadratisch mit einer Kantenlänge von 65 Millimetern und beherbergt 8 x 8 LEDs. Die Module, die ich bisher gekauft habe, sind relativ exakt gearbeitet, nur an den runden Leiterplatten findet man noch Reste der Verbindungsstege. Diese kann man entweder abfeilen, oder einfach dran lassen -- ich habe mein Gehäuse so designt, dass diese Stellen keine Probleme verursachen sollten.
Die Module werden mit 5 Volt Gleichspannung versorgt und erwarten eigentlich auch 5-Volt-Signale. Im Tutorial Getting Started with Raspberry Pi Pico and CircuitPython gibt es einen Verdrahtungsplan, bei dem ein NeoPixel-Modul direkt über die Portpins angesteuert wird; das hat bei mir ebenfalls funktioniert und meine Schaltung basiert auch darauf. Im Adafruit NeoPixel Überguide gibt es einen Abschnitt Logic Level Shifting der das Thema etwas differenzierter betrachtet und zu folgender Zusammenfassung kommt:
If you want a NeoPixel project to be maximally robust and bulletproof, logic level shifting ensures reliable signaling. [...]
Quite often though you can get away without level shifting, as when using a lower supply voltage. With a 5V supply and no shifting, you're taking that small chance of unreliable operation, or "works on-desk but not in-field." That might be good enough for casual, non-critical projects. Ask yourself if failure is an option!
Ich habe entschieden, dass "works on-desk" für mich bis auf weiteres ausreicht, zumal ich bisher keine anderslautende Erfahrung gemacht habe und die Einsparung eines Level-Shifters einfach zu verlockend ist. Sollten beim Nachbau unerklärliche Probleme auftreten, dann wäre dies zumindest eine gute Stelle, um bei der Fehlersuche anzusetzen.
Was die Schaltung selbst angeht, ist sie wie bei vielen Mikrocontroller-Projekten relativ simpel und verbindet eigentlich nur ein paar Komponenten mit Portpins. Ich habe mich für einen Aufbau auf Lochraster entschieden, damit die Hürde für den Nachbau geringer ausfällt. Dazu verwende ich eine 4 x 6 cm große Lochraster-Platine mit Beschriftung, Bohrungen und Lötflächen im Randbereich, die es z.B. ebenfalls bei roboter-bausatz.de gibt, aber auch beim Makershop, BerryBase, Reichelt und den anderen üblichen Verdächtigen.
Die LED-Module werden bei mir über Steckboard-Verbindungsleitungen an einen Pin-Header angeschlossen, um Zusammenbau und Komponententausch zu vereinfachen. Der Header hat 7 Pins und folgt dieser Belegung (auf meinem Board ebenfalls von links nach rechts zählend angeordnet):
Ring | Matrix | ||||||
Pin # | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Funktion | Data in | +5 Volt | Ground | Data out | Data in | +5 Volt | Ground |
Jede WS2812-LED besitzt einen Daten-Eingang und einen Daten-Ausgang. Schlau designte Module machen sich das zu Nutze und bieten ebenfalls die Möglichkeit, mehrere Module zu verbinden. In meinem Fall habe ich das Ring-Modul zuerst platziert und die Matrix darauf folgen lassen, weil die Anschlüsse bequemer zu erreichen waren. Auf dem Board können die Pins 4 und 5 direkt gebrückt werden.
Ich habe einen Button vorgesehen, der später für den Setup-Modus genutzt werden kann. Dieser zieht einfach einen Portpin auf Masse (der Pico verfügt über interne Pullup-Widerstände).
Ein Piezo-Buzzer soll später zum Signalisieren von Fehlern oder Hinweisen genutzt werden. Er wird ebenfalls über einen beliebigen Portpin angeschlossen (im Pico sind alle GPIO-Pins auch PWM-fähig). Achtung beim Anschließen: Piezo-Buzzer sind polar, der Portpin kommt an den Pluspol. Die Piezo-Buzzer sind übrigens ziemlich laut, weshalb ich bei meinem den Schutzaufkleber vorerst drauf gelassen habe.
Zur Erkennung der Umgebungshelligkeit habe ich einen LDR als Spannungsteiler eingebaut. Aus praktischen Gründen im Lochraster-Aufbau habe ich den Spannungsteiler so designt, dass der LDR im unteren Zweig sitzt, also bei Belichtung stärker nach Masse zieht als im Dunkeln. Im Prinzip ginge es aber auch andersherum, spielt keine Rolle und kann in der Software durch andere Werte in der Kennlinie angepasst werden.
Ein großer Vorteil bei der Umstellung auf den Pi Pico war der geringere Platzbedarf. Einerseits brauchen die Komponenten weniger Platz (insbesondere der eingesparte Level-Shifter), andererseits wird der Pico auch nicht so warm und ich habe weniger Skrupel ihn in ein engeres Gehäuse zu quetschen. An dem Prinzip der Frontplatten-Gestaltung mit den verdeckten Sacklöchern für die LEDs habe ich festgehalten; ursprünglich war hier aus der Not eine Tugend gemacht worden, weil mein 3D-Drucker die kleinen Ringe nicht sauber auslegen konnte, die man für "echte" Löcher gebraucht hätte. Nachdem ich aber etwas Erfahrung mit dem Durchleuchten von weißem PLA sammeln konnte, hat mir das Prinzip sehr gut gefallen.
Ursprünglich wollte ich Einsteckgewinde und Maschinenschrauben nutzen (das Gehäuse ist dafür auch vorbereitet), habe dann aber festgestellt, dass Mehrzweckschrauben (aka. Holzschrauben, 2,0 x 16 mm) prima durch den Einsteck-Bereich hindurch passen und in ein weiteres, dahinter liegendes Sackloch greifen können. Somit sind die gleichen Gehäuseteile für beide Methoden nutzbar, wobei man bedenken muss, dass die Mehrzweckschrauben nach ein paar Montagevorgängen nicht mehr so gut greifen (vor allem, wenn man sie einmal zu fest angezogen hat).
Ebenfalls neu ist die Art der Leiterplatten-Befestigung. Ich habe einen Querträger gebaut, auf dem eine Art Podest sitzt, das die Leiterplatte aufnimmt und durch Nasen auf drei Seiten ausrichtet (die vierte Seite kollidiert mit dem USB-Anschluss). Darauf werden Klammern gesteckt, die verhindern sollen, dass das Board nach oben (bzw. in der späteren Ausrichtung hinten) raus fällt.
Das funktioniert allerdings nur so mittelprächtig: wenn man stark am Board ruckelt (z.B. beim Ein- und Ausstecken eines sehr hartnäckigen USB-Steckers) kann so eine Klammer schon mal abfallen und ist dann je nach Stelle sehr schwierig wieder aufzusetzen. Inzwischen habe ich etwas mehr Erfahrung im Design von flexiblen Bauteilen und würde das eher als Clip machen, der von oben eingesteckt wird und sich dann auf Grund seiner Spannkraft formschlüssig festhält. Aber im großen und ganzen funktioniert es, und wenn jemand das Gerät "für die Ewigkeit" aufbauen möchte, dann kann ein Tröpfchen Heißkleber auch nicht schaden.
Die Display-Module liegen auf der Frontplatte auf, wobei die Matrix durch vier Wände geführt wird und der Ring auf einem Kreuz aufliegt, das an vier Stellen zwischen die LEDs greift. Mit dem passenden Anpressdruck von hinten hält das einwandfrei. Die Dicke der Matrix-Leiterplatte ist etwas geringer als die der Ring-Leiterplatte. Ich habe deshalb ein weiteres Teil gedruckt, das auf die Matrix gelegt wird, um diese Differenz auszugleichen und ein Klappern zu vermeiden. Es hat seitwärts etwas Spiel und lässt sich beim Zusammenbau relativ leicht einfügen, wenn man es sich zuvor richtig ausgerichtet hinlegt.
Der Querträger greift links und rechts in die Aussparung der Frontplatte sowie in der Mitte zwischen den beiden LED-Modulen. Bei meinem Drucker kommen die Teile so raus, dass diese Verbindung genügend Reibung erzeugt und stabil ist. Zusätzlich stabilisiert wird der Querträger durch die Rückseite, die das Rausrutschen nach oben (später hinten) verhindert. Doch bevor die Rückseite aufgesetzt wird, muss ein winzig kleines Teilchen eingesetzt werden, das ich "Plunger" (Stempel / Stößel) genannt habe. Dieses liegt auf dem Button auf und betätigt ihn, wenn man mit einer Büroklammer o.ä. durch das Loch in der Rückseite piekst. Ich hatte zuerst darüber nachgedacht, einfach nur ein Loch in die Rückseite zu machen, aber dann war mir bei dem Gedanken etwas unwohl, dass jemand ohne was zu sehen mit einem Metallteil auf dem Board herumstochert. Geführt wird der Plunger durch eine rechteckige Röhre an der Gehäuserückseite, die somit einen Kanal bildet, aus dem man beim normalen Betätigen nicht ausbrechen können sollte.
Die hier gezeigte Rückseite wurde im Draft-Modus ausgedruckt und verzichtet auf die eigentliche Abdeckung. Einerseits weil es schneller zu drucken ist, andererseits weil man während der Entwicklung besser ans Board kommt. Die finale Rückseite hat Lüftungsschlitze und einen Durchlass für das USB-Kabel, welches im Draft-Modus einfach irgendwie raushängt. Gedanken an eine gute Zugentlastung habe ich noch keine verschwendet, vielleicht folgt später noch ein Aufbau auf dem Querträger, der eine Verschraubung, Klemmung oder einfach einen Kabelbinder unterstützt. Bis dahin sorgt die Schlaufe im Kabel zumindest dafür, dass der Zug auf den Stecker nicht zu groß wird und man durch einen sanften Widerstand daran erinnert wird, nicht zu fest am Kabel zu zerren.
Ich benutze OpenSCAD, zusammen mit Visual Studio Code und der Extension OpenSCAD Language Support. Um die STL-Dateien nur zu generieren oder kleine Modifikationen durchzuführen reicht OpenSCAD selbst vollkommen aus.
Die meisten Abmessungen ergeben sich direkt aus der Größe der Komponenten, weshalb sie beim Nachbau mit den gleichen Teilen passen sollten. Aber es gibt ein paar benannte Konstanten, mit denen man etwas herumspielen kann und je nach Drucker vielleicht sogar muss:
circle_precision
wird als das $fn
bei circle
und
rotate_extrude
eingesetzt und bestimmt die Anzahl der Teilstücke (fragments), mit
denen ein Kreis angenähert wird. Ich verwende hier während der Entwicklung einen niedrigen Wert
(z.B. 12), weil dies das Rendern enorm beschleunigt. Zum Drucken darf es dann mehr sein (z.B. 64).
draft
taucht vielerorts als Parameter auf und bewirkt, dass Teile weggelassen oder vereinfacht
werden. Für einen richtigen Ausdruck sollte draft = false
benutzt werden.
print
taucht manchmal auf, wenn die Orientierung eines Teils zum Entwickeln anders als beim
Drucken ist. Beispiel: die Rückseite liegt beim Drucken mit den Lüftungsschlitzen auf der
Bauplattform auf (print = true
), während der Entwicklung will ich diese aber von oben sehen
können, wenn ich die Rückseite auf die Frontplatte lege (print = false
).
pcb_tolerance
und pla_tolerance
fangen so ziemlich alle Toleranzen auf, damit die
Teile später zusammen passen, insbesondere weil sich das PLA beim Drucken etwas verziehen kann. Je nach
Drucker könnte es notwendig sein, hier etwas zu experimentieren.
led_window_thickness
steuert die Dicke der Frontplatte vor den LED-Löchern. Ich habe mit
0,75 mm gute Erfahrungen gemacht, aber je nach Filament möchte man hier vielleicht andere Werte
ausprobieren.
solder_keepout
(Platz unter der Leiterplatte) und board_headroom
(Platz für Komponenten nach oben) noch etwas Volumen reduziert werden. Aber zu klein will man das sicher
auch nicht machen, damit das Display später nicht zu leicht umkippt.
Ansonsten liegen alle Einzelteile unter components/
und können von dort aus direkt ausgedruckt
werden; aber nicht alle Komponenten werden als Druckteil benötigt (Schrauben, Platzhalter für
LED-Module, etc.). Benötigt wird:
Bauteil | Dateiname | Hinweise |
---|---|---|
Rückseite | back.scad | Mit Lüftungsschlitzen auf Bauplattform (print = true ) |
Leiterplatten-Klammer | board_clamp.scad | Wird 3 mal benötigt, liegend drucken mit Schlitz nach oben |
Querträger mit Leiterplatten-Podest | board_clip.scad | |
Frontplatte | front.scad | |
Ausgleich der Leiterplattendicke (Matrix) | matrix_inlay.scad | |
Stößel für Button | plunger.scad | Liegend drucken (T-förmig) |
Die Ausrichtung sollte eigentlich aus der entstehenden STL-Datei hervorgehen, aber meine Druck-Software versucht
manchmal schlau zu sein und stellt Teile auf, die eigentlich liegen sollen. Die Druckzeit beträgt mit
meinem Adventurer 3 zusammengenommen ungefähr 10 Stunden und benötigt laut Druck-Software ca. 80 Gramm
Material (in der Endversion mit draft = false
).