Der gewöhnliche STM32F0-Prototyp
Dieses Projekt entstand aus meinem Unmut gegenüber den existierenden Development Boards und als preiswerte Prototypenangebote bei chinesischen Fertigern zu erscheinen begannen. Der Weg nach vorn war also klar, trotzdem möchte ich am Anfang, beim Problem, das ich lösen wollte, einsteigen.
Mit „Development Boards“ nehme ich hier auf Platinen nach Art der Teensy- oder Feather-Modelle oder der Blue Pill Bezug: Platinen um einen Mikrocontroller mit sehr wenig externer Beschaltung; ein „kleinster gemeinsamer Nenner“ typischer Projekte um diese Controller, wenn man so möchte. Evaluation Boards mit interessanteren Komponenten sind zwar gut geeignet um einen Mikrocontroller und seine Peripherie kennenzulernen, liegen aber außerhalb des Rahmens dieses Beitrags.
Meist legen Development Boards wie diese Wert auf kleine Abmessungen, während sie alle nützlichen Pins ihres Mikrocontrollers auf 2,54 mm-Pinleisten führen. Wenn man auf einem Steckbrett arbeitet oder fertige Module für alle Bauteile hat, ist das natürlich die beste Variante. Mit frei verfügbaren Softwarebibliotheken für alle Module ist alles schnellstmöglich aufgestellt und in Betrieb.
Zusätzlicher Platinenplatz dagegen wird nur als Add-On angeboten, obwohl er, meiner Meinung nach, eine sehr sinnvolle Ergänzung für nicht wenige Fälle darstellen würde. Ohne solchen muss man sich schon bei einem externen Treibertransistor entscheiden, ob man ihn mit losem Draht anschließt oder eigens ein Stück Lochraster anfügt. Selbst wenn alle Bauteile mit ihren eigenen Platinen kommen, ist es nicht unwahrscheinlich dass der Aufbau als unübersichtliches, fragiles Drahtgestrüpp endet, außer natürlich man möchte sich auf die Module des Ökosystems um die verwendete Entwicklungsplatine beschränken.
Dieses Projekt hatte daher den Anspruch, meine kleinen Prototypen ohne zusätzlichen Aufwand und ohne die Flexibilität einzuschränken kompakt und halbwegs robust zu halten.
Zielsetzung
Bevor wir zum Platinenlayout kommen, braucht es einige handfeste Ziele für das Design. Aus dem Gedankengespräch oben folgen für mich diese Hauptanliegen:
Ziele
- Kosten: Die Platine sollte so günstig wie möglich sein, damit man nicht darüber nachdenken muss, sie in einem Projekt zu lassen.
- Vielseitigkeit: Eine Prototypenplatine sollte nicht auf einen bestimmten Zweck hin ausgerichtet sein. Im Gegenteil, sie darf einen nicht bei ihrer Anwendung einschränken.
- Selbstständigkeit: Für einfache Aufbauten muss eine Platine ausreichen. Zusätzliche Lochrasterabschnitte oder Drahtbrücken dürfen nicht jedes Mal nötig sein.
- Erweiterbarkeit: Kleine Projekte sollten einfach bleiben, aber komplexe immer noch möglich.
- Übersichtlichkeit: Der Einstieg sollte so schnell wie möglich sein, ebenso das Messen und die Fehlersuche.
- Kleine Größe: Die Platine sollte klein bleiben, damit sie flexibel einsetzbar ist.
Nicht-Ziele
- Abdeckung jeder möglichen Konfiguration und jedes Verwendungszwecks: Die Vorgaben sollten sinnvoll sein, aber Drahtbrücken sind ein erwartbarer Teil der Entwicklung und müssen nicht um jedes Preis verhindert werden.
- Massenproduktion (zumindest zunächst): Die Idee ist eine unbestückte Platine oder ein Bausatz. Man bestückt nur, was man gerade für einen Aufbau braucht (was auch die Kosten pro Platine weiter senkt).
- Anfänger-Lötbarkeit: Während die Platine nicht nur von Profis zu Löten sein sollte, würde eine Beschränkung auf 1206-Komponenten sie doch merklich größer ausfallen lassen ohne für den größten Teil der Nutzer einen Vorteil zu bieten.
Designentscheidungen
Genug nun von den generellen Ideen hinter dem und Zielen des Projekts. Um den Gestaltungsraum zu beschränken, stehen als erstes zwei wichtige Entscheidungen an.
Der Mikrocontroller
Als erstes (und wichtigstes) Bauteil wurde der zentrale Mikrocontroller als ein STM32F030F4P6, ein 48 MHz-ARM-Cortex-M0 mit 16 KiB Flash, 2 KiB SRAM und, unter anderem, einen USART, I2C und SPI, neun ADC-Kanäle und vier Timer festgelegt. Mit einem solchen kleinen und gut beherrschbaren Mikrocontroller kann die Platine eine günstige und einfache Lösung für kleine Prototypen, einfache Automatisierungsaufgaben, Messdatenerfassung, etc. werden.
Ganz bewusst darf hier ein eher kleiner Controller zum Einsatz kommen, da er sich schon für einen großen Teil meiner Projekte als ausreichend zeigen konnte. Persönlich setze ich weniger gern einen deutlich überdimensionierten Mikrocontroller in ein Projekt, nur weil es sowieso ein Einzelstück wird und die Mehrkosten nicht auffallen; die Optimierung der Software, bis alles auf einen kleineren Chip passt, ist für mich Teil des Vergnügens. Zudem kann bei einem kleinen Controller auch die Platine klein sein, ohne einen davon abzuhalten, alle Möglichkeiten des Mikrocontrollers auszuschöpfen. So ist zum Beispiel die Entscheidung, welche der Pins herausgeführt werden sollen, überflüssig, weil ausreichend Platz für alle da ist.
Formfaktor
Besonders kleine Breakout Boards für verschiedene Mikrocontroller gibt es bereits in ausreichender Menge und mit diesen konkurrieren zu wollen wäre unnötig. Eine Entwicklungsplatine mit einem Prototyping-Feld als Schlüsselmerkmal muss außerdem die richtige Größe zwischen einer winzigen, auf der kaum zusätzliche Bauelemente Platz haben und einer unpraktisch großen, treffen.
Wie am Anfang angemerkt, waren Angebote für die Platinen-Prototypenfertigung ein entscheidender Faktor zu Beginn des Projekts. Damit, und mit dem vorigen Grund, legte ich die Abmessungen recht schnell auf 5 mal 5 cm fest. Das zeigte sich auch als groß genug für ein Prototyping-Feld, aber auch klein genug um noch in Prototypen zu landen.
Erstes Design
So sieht die erste Version aus (nebenbei, alle Platinen-Renders wurden mit dem Tracespace-Viewer, erstellt):


Die Platine erhielt den Namen leshy, kurz für less expensive STM32-hosting prototypes. Auch wenn ein böser Waldgeist vielleicht nicht der beste Namenspatron für ein freundliches Development Board ist, war das die beste (aussprechbare) Abkürzung, die mir einfiel.
Weitere Designentscheidungen
- Der untere Teil der Platine ist ein 1,27 mm-Lochrasterfeld, welches einfach abgebrochen werden kann. Der Gedanken war, sowohl THT- als auch SMT-Komponenten auflöten zu können (das Raster passt sehr gut zu SOIC-Gehäusen).
- Der grüne Lötstopp wurde bewusst gewählt: Anders als andere Farben sind die darunterliegenden Leiterbahnen gut sichtbar. Zudem scheint grün unter Development Boards eine hervortretende Farbe zu sein, obwohl, oder, gerade weil, es die häufigste Farbe für normale Platinen ist. Aber vor allem passt sie zum Namen.
- Mit den GPIOs sind fünf LEDs und ein Taster verbunden. Die Pins wurden sorgfältig ausgewählt, damit man das meiste aus der Peripherie des Mikrocontrollers herausholen kann. LEDs kann man außerdem bei der Bestückung auch einfach weglassen, falls sie in der Anwendung stören sollten.
- Es können zwei verschiedene Linearregler bestückt werden: Ein MCP1700 (oder ein pin-kompatibler, wie ein XC6206) in SOT-23 mit kleinem Ruhestrom oder ein 1117 in SOT-223 für höhere Eingangsspannung und größeren Ausgangsstrom.
- Es gibt kein Quarz auf der Platine, obwohl eines zwischen PF0 und PF1 angeschlossen werden könnte. Der interne Oszillator ist für das meiste genau genug, besonders da der UART automatische Baudratenerkennung unterstützt. Mir passiert es bei diesem Controller eher, dass mir die Pins ausgehen als dass ich einen Quarzoszillator brauche, weswegen nach außen geführte Pins die höhere Priorität bekamen.
- Für alles, was man sinnvoll abtrennen und anders verbinden kann, wurden Lötbrücken vorgesehen, so zum Beispiel für den Taster. Alle Lötbrücken sind mit einer dünnen Leiterbahn kurzgeschlossen, die man einfach mit einem Skalpell durchtrennen kann.
- Die Entscheidung, einen microSD-Sockel vorzusehen, mag zuerst vielleicht seltsam erscheinen. Auf der anderen Seite ist dieser sehr nützlich für Datenaufzeichnung, da SD- bzw. microSD-Sockel sehr unpraktisch auf Lochraster zu löten sind. Im Gegensatz zu, zum Beispiel, FFC-Steckern für Display-Module muss man auch nur eine Pinbelegung berücksichtigen. Der Footprint ist zu einigen bei chinesischen Händlern verfügbaren Sockeln, z. B. TFP09-2-12B, MTCONN MCTF-0403, Atom MR01A-01211, Suntech ST-TF-003A und Shenzen Best TF-01, kompatibel.
- Die SWD-Pinleiste beinhaltet eine Verbindung zum Reset-Pin. Dadurch ist Flashen unter Reset, was notwendig ist wenn man SWDIO und/oder SWCLK als normale GPIOs verwendet, vereinfacht.
- Die Platine ist nicht direkt steckbrettkompatibel, kann es aber werden wenn man einige Pins weglässt. Andernfalls würde das Steckbrett die Versorgungsspannung kurzschließen. Alle Pins befinden sich auf einem 2,54 mm-Raster.
- Die Platine lässt so viel Platz wie möglich um die Montagebohrungen. Viele verbreitete Breakout Boards lassen hier sehr wenig Platz; manchmal hat nicht mal der Kopf einer M3-Schraube Platz.
Zweite Revision
Als mir die Platinen auszugehen begannen, nutzte ich die Gelegenheit um das Design ein wenig zu optimieren. Es änderte sich aber nicht allzu viel:
- Meistens ist der Reset-Taster unnötig. Daher erhielt auch er mit J4 eine Lötbrücke, womit er von NRST getrennt und mit einem anderen Pin verbunden werden kann.
- Eine SD-Karte kann auch im Standby einiges an Strom verbrauchen. Deswegen kam der p-Kanal-MOSFET Q1 dazu, der die microSD-Karte von der Spannungsversorgung trennen kann, wenn sie nicht gebraucht wird. Die Lötbrücken J5 und J6 erlauben es ihn zu überbrücken oder sein Gate mit einem anderen Pin zu verbinden.
- Zusätzlicher Siebdrucktext auf der Rückseite zeigt an, welche Pins mit der SD-Karte verbunden sind und wofür die Lötbrücken zuständig sind.
- Die Platine zeigt nun ihren Namen. Ein weißes Rechteck dient für individuelle Markierungen (z. B. in welchen Prototypen sie gehört).


Abgesehen davon blieb die Platine dieselbe:
Revision 3: Eine grundlegende Überarbeitung
An den letzten beiden Revisionen störten mich ein paar kleine Dinge:
- Obwohl grundsätzlich gut für SMT-Teile, hatte das Lochrasterfeld seine Probleme: Wegen der kleinen Abstände kam es leicht zu Lötbrücken. Außerdem lief das Lötzinn gern durch die durchkontaktierten Bohrungen und sammelte sich auf der Unterseite. Diese Probleme waren allerdings unvermeidbar: Nachdem für größtmögliche THT-Kompatibilität die Bohrungen einen großen Durchmesser haben sollten, konnte ich sie nicht einfach verkleinern um die Tendenz des Lötzinns, durchzufließen, zu verringern und die Abstände zwischen den Pads vergrößern zu können.
- Widerstände und Kondensatoren benutzten denselben Footprint. Fürs Löten per Hand ist das nicht sehr wichtig, aber fürs Reflowlöten kann das zum Problem werden.
- Es gab nur einen Anschlusspunkt für die Eingangsspannung. Mindestens ein weiterer, möglichst nah am Lochrasterfeld wäre manchmal sehr praktisch.
Seit der letzten Revision wandte ich mich außerdem von KiCad ab und hin zu Horizon EDA. Obwohl noch in einer frühen Entwicklungsphase, ist Horizon meiner Meinung nach bereits angenehmer als andere EDA-Programme. Ich entschloss mich daher, das komplette Design in Horizon erneut zu erstellen, was mir ein paar Kniffe erlaubte, die in KiCad umständlich gewesen wären.
Das in obiger Auflistung erste Problem war auch das wichtigste und ich ging es daher auch als erstes an. Ich ließ mich durch die „ALio Prototyping Platform“ inspirieren, die eine strikte Verbesserung gegenüber dem existierenden Lochrasterfeld versprach. Die versetzten Löcher erlauben gleichzeitig größere Bohrungen (zumindest in einem der beiden Raster) und größere Abstände. Die nicht durchkontaktierten kleineren Löcher senken das Risiko, dass beim SMD-Löten das Zinn durchsickert. Darüber hinaus dürften die horizontalen und vertikalen Verbindungen nur mit Zinnbrücken sehr praktisch sein.
Ich übertrug die Geometrie der ALio-Boards allerdings nicht exakt in mein parametrisierbares Design. Die wesentliche Änderung sind nicht-gleichmäßige Abstände zwischen den Pads: An den für die horizontalen/vertikalen Lötbrücken vorgesehenen Stellen sind sie größer, um ungewollte Brücken zu verhindern.


Abgesehen vom Jumper zur Messung der Stromaufnahme (J3, „IDD“ in der vorigen Revision) ist das neue Layout mechanisch und pin-kompatibel. Dennoch waren einige Verbesserungen möglich:
-
Die Anzahl der Anschlusspunkte für Versorgungsspannungen ist deutlich gestiegen. Es gibt nun VIN-Pads nahe an der Prototyping-Fläche. Ein direktes Versorgen mit 3,3 V ist jetzt ebenso komfortabler. Dazu ist ein Eingangsspannungsanschluss (K3 in Revision 1 und 2) nun mit J3 und J5 auf beiden Seiten der Platine verfügbar und der SWD-Stecker erhielt einen VIN-Pin, womit man 5 V über einen Debugger einspeisen kann.
-
Die Lötjumper sind nicht mehr standardmäßig kurzgeschlossen. Stattdessen haben sie einen Footprint, der sowohl die Bestückung eines 0 Ω-Widerstands als auch das Schließen mit einer Lötbrücke bequem möglich macht.
-
Die beiden Montagebohrungen auf der oberen Seite erhielten Pads und Lötbrücken, um Masse über die Schrauben mit einem Gehäuse verbinden zu können.
-
Die beiden Taster wurden durch geringfügig kleinere ersetzt, die außerdem etwas angenehmer zu betätigen sind.
-
Alle Lötbrücken zwischen Mikrocontroller-Pins und Bauteilen auf der Platine sind nun auf der Vorderseite und so eng beieinander wie möglich, um ein Ändern der Pinbelegung zu vereinfachen.
-
Der IDD-Jumper wurde durch eine Lötbrücke ersetzt. Ich benötigte ihn in den vorigen Revisionen kaum und sah den belegten Platinenplatz nicht gerechtfertigt. Stattdessen setzte ich einen 0805-Widerstandsfootprint (R12) parallel dazu, welcher für einen Shunt verwendet werden kann.
-
Die Dokumentation im Siebdruck konnte deutlich erweitert werden: Die Pinbelegung des microSD-Sockels, die in Revision 2 dazu kam, wurde wieder entfernt, denn sie ist hauptsächlich relevant, wenn man gerade eine Speicherkartenbibliothek implementiert, sonst aber kaum hilfreich. Andere Details wären nützlicher gewesen: Ich musste so gut wie jedes mal den Schaltplan zur Hand nehmen, wenn ich eine der Platinen verwendete.
In der neuen Revision konnte ich alle1 alternativen Funktionen der Pins aufnehmen, indem die Peripherieelemente abgekürzt aufgelistet wurden (ADC → „A“, TIM → „T“, etc.). Die letzte Zeile des auffälligen Textblocks auf der Rückseite weist auf die 5 V-toleranten Pins hin. Alle Lötjumper haben nun ihre Beschriftung direkt daneben.
Mit der ausgedehnten Beschriftung kann man nun bequem entscheiden, welche Pins man verwenden möchte, ohne in den Schaltplan sehen zu müssen.
-
Vias, mit Ausnahme von Massevias und Vias unter dem Mikrocontroller, sind nun nicht mehr vom Lötstopp bedeckt. Meistens ist das nicht relevant, aber im Fall der Fälle kann ein offenliegendes Via als zusätzlicher Mess-/Anschlusspunkt nützlich sein.
-
Das weiße Rechteck für zusätzliche Anmerkungen wurde über die beiden Taster verschoben und kann jetzt auch dafür verwendet werden, den Zweck der Knöpfe zu benennen.
-
Einige kleine Details wurden behoben: Der SWD-Stecker bekam seine Beschriftung auch auf der Rückseite, der microSD-Sockel seine Kupfer-Freiflächen und Widerstands- und Kondensatorfootprints sollten nun korrekt sein.


Revision 3.1
Revision 3.1 ist größtenteils identisch zu 3.0. Die einzige Änderung waren einige Vias, die verschoben wurden um dem Siebdrucktext auf der Rückseite mehr Platz zu geben. So sieht damit die grundlegend überarbeitete Platine aus:
Software
Der STM32F030 ist ein relativ kleiner Mikrocontroller und naturgemäß ziehe ich ein hardwarenahes Programmieren vor. Seine Peripherie ist nicht sehr komplex, weshalb er auch ohne Hardwareabstraktionsschicht oder andere Hilfsbibliotheken gut verwendbar ist.
Trotzdem ist es natürlich praktisch einen Einstiegspunkt und anderen wiederverwendbaren Code zu haben, weshalb ich im Repository des Projekts eine kleine Sammlung von Beispielprojekten begonnen habe, die ich ergänze, wenn mir in einem Projekt Code mit Wiederverwendungspotential unterkommt.
In Verwendung
Abschließend möchte ich einige Beispiele, die die Möglichkeiten mit dieser Platine hervorheben, anführen. Die meisten dieser kleinen Projekte finden sich im zuvor genannten Beispielverzeichnis.
Die Minimalbeschaltung im kleinen Gehäuse
Es braucht nicht viel um WS2812B- oder SK6812-LEDs zu treiben: Ein Pullup an einem 5 V-toleranten Pin genügt. Hier benutzte ich einen Footprint, der ursprünglich für einen LED-Vorwiderstand vorgesehen war, für diesen und konnte so ganz auf das Lochrasterfeld verzichten. Mit drei Potentiometern ist eine LED-Streifen-HSV-Steuerung schnell fertig:


Einfache Zustandsautomaten
Viele Automationsaufgaben brauchen nur einige wenige externe Komponenten zur Signalaufbereitung und zum Treiben externer Aktuatoren. Für diesen Zeitgeber für einen Lötpasten-Dispenser brauchte es nur zwei MOSFETs für die Magnetventile und ein paar Schutzdioden:


Erstaunlich viel Platz
Ich brauchte einen einfachen Regler für einen Hakko-907-Lötkolben. Eine geradlinige Lösung war es, eine Siebensegmentanzeige, einen MOSFET für das Heizelement und einen Drehencoder mit einem Mikrocontrollerboard zu verbinden. Hier passt alles bis auf den Drehencoder und die Buchse für den Lötkolben auf das Lochrasterfeld. Code und Schaltplan finden sich auf GitHub.


Zusammenfassung
Nachdem ich die Platinen nun schon in einigen Projekten verwendet habe, verbuche ich das Projekt auf jeden Fall als Erfolg. Obwohl es sicher noch einige kleiner Details zu verbessern gibt, sind die Boards schon deutlich praktischer als andere existierende Lösungen. Für mich füllt leshy sehr gut die Lücke zwischen Machbarkeitsstudien, bei denen ich in einem Ökosystem bleiben kann, und weniger spontanen Projekten, für die ich eine Platine ätze oder bestelle.
Ich kann mir vorstellen, auf der Idee aufbauend weitere Platinen im gleichen Formfaktor für andere Mikrocontroller zu erstellen. Vielversprechende Kandidaten wären etwa der ESP8266 für WLAN-Prototypen, die ATSAMD11-Serie, die USB böte, oder STM8-Mikrocontroller für Low-Cost-Designs.

Links
Schaltplan, Layout und Firmware-Beispiele finden sich im GitHub-Repository des Projekts. Etwas Prosa über die Revisionen 1 und 2 ist auf der Hackaday.io-Seite zu lesen.
-
Naja, fast alle. Die EVENTOUT-Pins musste ich überspringen, aber die sind auch nicht allzu nützlich. ↩︎