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

Nicht-Ziele

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):

Der Schaltplan ist einfach gehalten, es passiert ja auch nicht allzu viel auf der Platine.

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

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:

Der Schaltplan, weitgehend unverändert.

Abgesehen davon blieb die Platine dieselbe:

Revision 3: Eine grundlegende Überarbeitung

An den letzten beiden Revisionen störten mich ein paar kleine Dinge:

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:

Der Schaltplan der neuen Revision ist in Funktionsblöcke aufgeteilt und enthält ein paar zusätzliche Anmerkungen (Klick führt zum PDF).

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.

Zu guter Letzt, ein Bild der voll bestückten Revision 3.1.

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.


  1. Naja, fast alle. Die EVENTOUT-Pins musste ich überspringen, aber die sind auch nicht allzu nützlich. ↩︎