Workbench

Datum

Verfasst von

Workbench

Qpico

Datum

Erstmals veröffentlicht

October 13, 2024

Quilter bietet mehrere Beispieldesigns auf Grundlage offener Hardware. Eines davon ist ein „Klon“ des beliebten Raspberry Pi Pico. Wir nennen dieses Beispiel „Qpico“.

Eine vollständig platzierte und geroutete Platinendatei ist das eine. Der wirkliche Beweis liegt jedoch in der Praxis. Also sah ich mir die zu 100% platzierten und gerouteten Kandidaten eines Kompilierungslaufs an und wählte einen für Fertigung und Inbetriebnahme aus.

Anerkennung für das Originaldesign

Zunächst möchte ich würdigen, wem die Anerkennung gebührt: Dieses Projekt basiert auf dem quelloffenen „AvocadoPi“, einer Raspberry-Pi-PICO-Variante mit USB-Type-C-Anschluss, die der Designer Sindre Hovland auf GitHub veröffentlicht hat.

Dieser wiederum basiert auf dem ursprünglichen Raspberry Pi PICO von Raspberry Pi Ltd, den Entwicklern des RP2040-Mikrocontrollers. Das Design ist sorgfältig ausgearbeitet und enthält hochwertige Footprints mit 3D-Modellen.

Kurzfassung: Quilters Qpico-Design, gefertigt und bestückt von JLCPCB, startet einwandfrei.

Hier das Ergebnis: vollständig bestückte blaue Pi Picos mit USB-C-Host-Anschlüssen, zu 100% von Quilter geroutet:

The fully assembled QPICO board from JLCPCB
Die vollständig bestückte QPICO-Platine von JLCPCB

Das obligatorische „blink“-Beispiel aus dem Raspberry Pi PICO SDK wird geladen:

Details zum Qpico-Projekt

Qpico soll eines unserer „Instant Examples“ werden. Da Raspberry Pi Ltd. kürzlich den Dual-Core-Mikrocontroller der nächsten Generation, RP2350, vorgestellt hat, werde ich eine neue Version mit diesem Chip erstellen, sobald ich Muster bekomme. Vorerst bleibt der RP2040 eine sehr attraktive Plattform für viele Projekte!

Diese Qpico-Version ist unkompliziert:

  • RP2040-Mikrocontroller (Dual ARM Cortex-M0+)
  • USB-Type-C-Host-Schnittstelle
  • Schaltregler von USB VBUS auf 3.3V
  • 16 Mbit QSPI-Flash für Programme und nichtflüchtige Datenspeicherung
  • Eine besonders helle grüne LED an GPIO25
  • Verschiedene ergänzende Bauteile für Takt, Entkopplung und Startvorgang.

Der ursprüngliche Zweck dieses Designs ist, den Pi Pico mit einem USB-Type-C-Host-Anschluss zu verbessern, der dem ursprünglichen USB-Micro-B-Anschluss deutlich überlegen ist. Da Quilter jetzt Differenzpaare unterstützt, ist das Routing von USB 2.0 auf solchen Platinen einfach, sogar durch Serienterminierungswiderstände hindurch.

Ich änderte Sindres ursprünglichen Schaltplan geringfügig, um schneller Ergebnisse zu bekommen und einige Engpässe für Quilter zu beseitigen. Sehen wir uns das genauer an. Wenn Sie mitmachen möchten, können Sie die Dateien hier ansehen oder herunterladen.

Änderungen am Schaltplan

Das ursprüngliche offizielle Raspberry-Pi-PICO-Design enthält einige Testpunkte für das USB-Paar DP/DM sowie LED (GPIO25), GPIO23, den QSPI-SS-Pin und natürlich GND.

Ich brauche und nutze diese Testpunkte nicht. Deshalb deckte ich zunächst alle im Schaltplan mit „Compile Masks“ in Altium ab. Dadurch werden Objekte unter den Masken nicht platziert und nicht als Footprints in die Platinendatei übernommen. Unten zeigt die Maske die abgedeckten USB-Testpunkte:

image.png
Schaltplan der geänderten USB-C-Anschlussbelegung.

USB-Type-C-Footprint-Trick und vorplatzierte Bauteile

Vielleicht fällt Ihnen beim zweiten Blick auf das USB-Anschlusssymbol auf, dass die Pins 5 und 6 in der regulären Reihenfolge fehlen. Das liegt daran, dass ich Symbol und Footprint des USB-Type-C-Anschlusses geändert habe.

Wie Sie vermutlich wissen, kann ein USB-Type-C-Kabel in beiden Orientierungen eingesteckt werden. Die mittleren Pins oben und unten bilden das umkehrbare Paar D_P und D_N. Normalerweise muss das USB-2.0-Differenzpaar deshalb zu beiden Pinpaaren oben und unten am Anschluss geroutet werden, was eine Überkreuzung erfordert. Der Screenshot unten zeigt Sindres ursprüngliche Lösung. Die Vias des Differenzpaars führen zur Unterseite, wo sich die Testpunkte befinden:

image.png
USB-C-Footprint der ursprünglichen Platine: Beachten Sie die überkreuzten Verbindungen des USB-2.0-Signalpaars in der Anschlussmitte.

Quilter unterstützt zwar inzwischen Differenzpaare, doch wir trainieren es noch für solche komplexeren Strukturen und Lagenwechsel. Zum Zeitpunkt dieses Artikels habe ich den USB-C-Footprint deshalb einfach so neu erstellt, dass die gekreuzten Verbindungen bereits zum Footprint gehören. Das funktioniert perfekt!

Hier ist der Footprint:

image.png
Ich erreichte dasselbe, indem ich die USB-2.0-Überkreuzung fest in den PCB-Footprint des Anschlusses integrierte.

Außerdem habe ich die Eingangsschutzdiode D1 und den Abwärts-Spannungsregler (U1 mit L1 und C16) bewusst vorplatziert. Dadurch lässt sich steuern, wie Quilter diese Stromversorgung routet, und die Stromschleifen zwischen U1, der Spule L1 und dem Ausgangskondensator C16 bleiben klein.

Der USB-C-Anschluss und der 40-polige „DIP“-Modulfootprint mit Halblochkontakten waren natürlich ebenfalls entsprechend den Originalabmessungen und der Pinbelegung des Raspberry Pi Pico vorplatziert.

Quilter-Eingaben und Randbedingungen

Eingabedateien

Vor dem Hochladen der Altium-Quelldokumente stellte ich sicher, dass Schaltplan und PCB keine weiteren Synchronisierungsprobleme aufwiesen. Nach der wichtigen Vorplatzierung des Pico-Moduls mit Halblochkontakten (J1), des USB-C-Anschlusses und des Abwärtsreglers konnte der Rest bearbeitet werden.

image.png
Altium-Designer-PCBDoc-Quelldatei mit vorplatzierten Bauteilen auf der Platinenfläche.

Ich platzierte auch den BOOT-Taster vor, wie oben im Altium-Designer-PCBDoc zu sehen. Die Designregeln der Quelldatei änderte ich nicht, da Quilter die Regelsätze für jeden Lagenaufbau und Fertiger automatisch neu zuweist.

Entwerfen mit Quilter

Die Qpico-Platine mit der vordefinierten Platzierung wurde in die Quilter-App hochgeladen. Eine kurze Sichtprüfung zeigt, dass der vorplatzierte USB-C-Anschluss bereit ist:

2024-09-09_17-06-28.png
Prüfung des vorplatzierten USB-C-Anschlusses in Quilter.ai

Physikalische Randbedingungen

Nachdem PcbDoc- und SchDoc-Dateien in einen neuen Quilter-Layoutauftrag hochgeladen waren, legte ich folgende Routing-Vorgaben fest:

  • Regeln für Hochstromnetze (Breite):
    • VBUS
    • VBUS → 500mA (USB-Spezifikation)
    • VSYS → 500mA (VBUS durch die Schutzdiode)
    • NetL1_1 → 300mA (Schaltknoten des Abwärtsreglers zur Ausgangsspule L1)
    • 3V3 → 300mA (Versorgung der GPIOs und des FLASH-Speichers)
    • 1V1 → 200mA (interne Versorgung des CPU-Kerns)*
  • Differenzpaare:
    • P_P:P_N → 85 Ohm
    • USB_P:USB_N → 85 Ohm

USB spezifiziert eine differentielle Impedanz der Verbindung zwischen 75 und 100 Ohm. Für gute Signalintegrität empfiehlt es sich im Allgemeinen jedoch, bei 85 oder 90 zu bleiben.

ℹ️

*Hinweis: Laut RP2040-Datenblatt verbrauchen beide laufenden CPU-Kerne bei voller Taktfrequenz (133 MHz) und Auslastung (Dual-Core-FFT-Algorithmus) höchstens etwa 40mA. Ich gebe dennoch 200mA vor, um Reserve zu haben und die Impedanz des Versorgungsnetzes der CPU-Kerne zu reduzieren.

2024-09-06_13-56-45.png
Sichtprüfung der Eingabe vor dem Eintragen der Randbedingungen.

Ausgabedatei

Nach Abschluss des Quilter-Auftrags standen mehrere zu 100% fertige Kandidaten zur Auswahl. Ich wählte Kandidat 56, nachdem ich nach 4 Lagen, Vias mit mindestens 10mil Bohrungsdurchmesser und mindestens 5mil Abstand gefiltert hatte. Diese Konfiguration eignet sich für Macrofab und die meisten anderen schnellen PCB-Fertiger. Die 2 Innenlagen sind hier GND, sodass alle Signalleiterbahnen Mikrostreifenleitungen sind.

Ich lud Kandidat 56 herunter und fügte das PCBDoc meinem ursprünglichen Altium-Designer-Projekt hinzu. Zur Orientierung hier die Kupferansichten der Ober- und Unterseite:

Obere Kupferlage der Qpico-Platine mit roten Leiterbahnen und Kupferfläche.
Ansicht von oben (links) und unten (rechts) nach erneutem Füllen der Polygone.
Untere Kupferlage der Qpico-Platine mit blauen Leiterbahnen und Kupferfläche.

Mit dem Altium-Designer-Befehl Report » Measure Distance führe ich einige schnelle Prüfungen auf der Platine durch, insbesondere der Abmessungen und Abstände des 85-Ohm-Differenzpaars. Diese stimmen mit der Impedanzberechnung für den in Quilter definierten Lagenaufbau überein. Alles ist also korrekt.

Obwohl Leiterbahnbreite und Abstand des Differenzpaars für eine bestimmte Zielimpedanz und einen bestimmten Lagenaufbau berechnet werden, sorgen mich mögliche Abweichungen hier wenig. Der RP2040 unterstützt nur USB-1.1-Geschwindigkeit (12Mbit/s), und die USB-Spezifikation für Version 1.1 erlaubt einen breiten Bereich differentieller Impedanzen von 75 bis 120 Ohm.

Designvalidierung und Nachbearbeitung

Obwohl dieses Design die Vorgaben für Lagenaufbau und Fertigungsabstände erfüllt, muss vor der Produktion noch einiges bereinigt werden:

  • Die GND-Polygone auf Signallagen enthalten mehrere unverbundene „Inseln“.
  • Beschriftungstexte und -elemente sind nicht platziert und brauchen manuelle Bearbeitung.
  • Einige Stege der Lötstoppmaske sind zu schmal.

Ein Design Rule Check der Kandidatenplatine in Altium Designer zeigt diese Probleme:

Qpico-Layout in Altium mit Einstellungen zur Siebdruckvorbereitung und einem Designregel-Verstoßbericht.

Deshalb verschob ich fast alle Beschriftungstexte, also die Bauteilbezeichner, manuell. Außerdem „schummelte“ ich etwas, indem ich die Standardregeln für Beschriftungsabstände und Lötstoppmaskenstege leicht lockerte. Die Lötstoppmaskenerweiterung setzte ich auf 0 mils. Damit reicht die Maske bei jedem Pad genau bis an den Rand. Das setzt theoretisch eine perfekte Ausrichtung der Fertigungsbilder voraus. In der Praxis akzeptieren Fertiger das heute aber meist und nehmen bei Bedarf kleine Anpassungen vor.

Außerdem musste ich Altium Designers Abstandsregeln um zusätzliche Abstände für das Differenzpaar erweitern. Quilter hatte das Paar bereits gemäß Impedanzprofil freigestellt, diese Polygonabstände aber nicht in die PCB-Designregeln übernommen. Ein erneutes Füllen der Polygone würde den für die Impedanzkontrolle nötigen Freiraum beseitigen.

Außerdem ergänzte ich auf der Unterseite das Quilter-Logo und den Text „Qpico“ im Bestückungsdruck.

Nach diesen kleinen Änderungen und der Nachbearbeitung meldet der DRC in Altium Designer null Fehler:

Überarbeitetes Qpico-Layout neben einem Altium-Bericht ohne Warnungen oder Regelverstöße.

Jetzt ist die Platine bereit für die Fertigung.

Qpico in die Fertigung bringen

Ursprünglich sollten unsere Freunde bei Macrofab die Platine mit ihrem regulären 4-Lagen-Service fertigen. Beim Bereinigen der Stückliste (BOM) stieß ich auf einige Schwierigkeiten:

  1. Der USB-Type-C-Anschluss ist in den USA nicht ohne Weiteres ab Lager erhältlich, in Asien dagegen weit verbreitet.
  2. Der RP2040-Mikrocontroller ist bei den gängigsten US-Distributoren nicht vorrätig; häufiger wird er direkt von Raspberry Pi Ltd. verkauft.
  3. Das Quelldesign sah einen Quarz in Baugröße 2016 vor. Für den RP2040 sind jedoch 12MHz erforderlich, und 2016 ist physisch zu klein für einen 12MHz-Quarz.

Wegen Punkt 3 musste ich den Quarzfootprint auf Baugröße 2520 ändern. Glücklicherweise war das ohne Eingriff ins Routing möglich: Das 2520-Gehäuse passte mit ausreichendem Abstand an dieselbe Stelle, ohne Leiterbahnen zu verschieben. Lediglich das obere Massepolygon musste neu gefüllt werden. Der DRC bestand weiterhin.

Macrofab bot an, die RP2040-Chips und USB-C-Anschlüsse als beigestellte Teile zu verwenden. Ich hätte sie dafür in Asien bestellen, auf den Versand warten und sie anschließend als Kit an Macrofab weiterleiten müssen. So lange wollte ich nicht warten, also entschied ich mich für diesen Lauf für JLCPCB.

Die Organisation der Bestückung war bei JLCPCB etwas umständlicher, weil ich einen neuen Service auswählte: Für zusätzlich $10 suchte JLCPCB passende generische Widerstände und Kondensatoren aus. Ich wartete etwa anderthalb Tage. Danach musste ich die Platine nur erneut mit Bestückungsservice bestellen und die einfach formatierte Stückliste sowie die Pick-and-Place-CSV-Dateien hochladen.

Danach folgte eine kurze Stücklistenprüfung. Ich musste nur noch die Artikelnummern für USB-C-Anschluss und RP2040 auf der LCSC-Beschaffungswebsite angeben. Dann konnte es losgehen. Nach anderthalb Wochen hielt ich die vollständig bestückten Qpico-Platinen in Händen:

Bestückte blaue Qpico-Platine im Fertigungsnutzen.

Inbetriebnahme und Validierung

Ich bin etwas ungeduldig. Doch da das Design vom bekannten und gründlich getesteten Raspberry Pi Pico stammt und ich die Schaltpläne sorgfältig geprüft hatte, rechnete ich nicht mit Problemen.

Ich nahm also die erste der 10 bestellten Platinen und schloss sie per USB-C an meinen Host-PC an. Zur Belohnung ertönte der vertraute Windows-Klang für ein neues Gerät, gefolgt von der Meldung eines neuen USB-Laufwerks: M: (RPI-RP2). Hurra!

Stromversorgung

Obwohl ich recht hohe Stromvorgaben für die Leiterbahnen gewählt hatte, erlaubt der Rechner bei 20°C Temperaturanstieg noch relativ schmale Bahnen. Zudem liegt die Vorgabe von 500mA weit über dem tatsächlichen Verbrauch dieser Platine und ihres Mikrocontrollers. Laut RP2040-Datenblatt benötigt ein vollständig ausgelasteter Kern etwas weniger als 18mA. Bei voller Auslastung beider Kerne bleibt der Strom unter 40mA. Die Vorgabe von 200mA für die 1.1V-Kernversorgung ist also überdimensioniert – bewusst, damit die Leiterbahnen nicht schmaler werden, als mir lieb ist.

Der DC-DC-Wandler für die 3.3V-Platinenversorgung arbeitet sehr gut und versorgt auch das externe 1.8”-TFT-Display samt Hintergrundbeleuchtung zuverlässig.

TFT-Beispiel

Um etwas Anspruchsvolleres als ein Blinkprojekt zu zeigen, folgt ein Bibliotheksbeispiel mit dem TFT-Displaytreiber ST7735S. Es nutzt die Schnittstelle SPI 1: eine Hardware-SPI-Peripherie des RP2040 mit eigenen Takt- und Daten-I/O-Pins.

Der Quellcode der ST7735S-Displaydemo ist herunterladbar unter https://github.com/bablokb/pico-st7735-demo – vielen Dank an bablokb für diese Ressource.

Ich verwendete die Hardware-SPI-1-Pinbelegung, die im Makefile des Demoprojekts definiert ist:

# library configuration (override if necessary, see pico-st7735 for a complete list)
set(SPI_TFT_PORT "spi1" CACHE STRING "TFT spi port-name")
set(SPI_TFT_CS   "9"    CACHE STRING "TFT CS  pin number")
set(SPI_TFT_DC   "10"   CACHE STRING "TFT DC  pin number")
set(SPI_TFT_RST  "11"   CACHE STRING "TFT RST pin number")
set(TFT_OPTIONS TFT_ENABLE_BLACK TFT_ENABLE_RESET TFT_ENABLE_TEXT TFT_ENABLE_SHAPES
               TFT_ENABLE_ROTATE TFT_ENABLE_SCROLL
           CACHE STRING "TFT options/functions")

#program configuration
set(SPI_PORT "spi1" CACHE STRING "spi port-name")
set(SPI_RX   "12"   CACHE STRING "RX  pin number")
set(SPI_TX   "15"   CACHE STRING "TX  pin number")
set(SPI_SCK  "14"   CACHE STRING "SCK pin number")

Steckbrett-Verdrahtungsplan zwischen einer Pico-Platine und einem kleinen Farb-TFT-Display.

Dieses Diagramm aus Circkit Designer entspricht im Wesentlichen meinem Steckbrettaufbau.

Damit kann ich den Code in meinem Pico Dev Container kompilieren. Um Zeit zu sparen, können Sie die UF2-Programmdateien aus den folgenden Testbeispielen herunterladen.

Wenn Sie die Pico-Platine oder einen beliebigen Raspberry Pi Pico bei gedrücktem BOOT-Taster anschließen, erscheint sie als Massenspeicherlaufwerk. Ziehen Sie die gewünschte UF2-Datei auf dieses Laufwerk, um die Platine zu programmieren. Sie startet automatisch neu und führt die Firmware aus.

blink.uf2

pwm_led_fade.uf2

pico-st7735-demo.uf2

Fazit

Im Laufe dieses Prozesses wurde mir klar, wie einfach sich Quilter auch als Werkzeug für ein „maßgeschneidertes Steckbrett“ nutzen lässt. Bei vielen meiner digitalen Elektronikprojekte widerstrebt mir der Gedanke, mit einem herkömmlichen Steckbrett und Unmengen von „Dupont“-Drähten anzufangen.

Obwohl das oft die einzige Möglichkeit ist, eine einfache Schaltung kurzfristig zu testen, würde ich lieber Quilter und einen schnellen Prototypenservice nutzen. Durch die inneren Masseflächen ist die Signalintegrität dem Steckbrettaufbau deutlich überlegen. Außerdem entstehen viel seltener Fehler, und meine unbeholfenen Finger stoßen keine Drähte mehr an.

Designverbesserungen

Die einzigen Hindernisse dieses Designs betrafen die Teileverfügbarkeit. Beim nächsten Entwurf verwende ich einen breit verfügbaren Quarz der Baugröße 2520, einen gängigeren Taster für den Bootloading-Modus und einen alternativen USB-Type-C-Anschluss, der bei Lieferanten in den USA wie in Asien erhältlich ist.

Nächste Schritte

Insgesamt funktioniert das sehr gut. Das neue Raspberry-Pi-RP2350-Musterkit ist fast bei mir. Bleiben Sie gespannt auf ein frisches QPICO2-Design auf Basis des RP2350-Mikrocontrollers mit Dual ARM Cortex-M33 / Dual Hazard3.

Ressourcen

Hier finden Sie die archivierten Ressourcen genau in der Form, in der ich sie zum Bau bei JLCPCB verwendet habe, sowie die Testfirmware und zugehörige Raspberry-Pi-RP2040-Dokumentation.

Altium-Projekt:

JLCPCB-Stückliste und Pick-and-Place-Dateien

Quilter selbst ausprobieren

Project Speedrun zeigte, wie autonomes Layout in der Praxis aussieht und welche Zeitersparnis Quilter ermöglicht. Erleben Sie es jetzt mit Ihrer eigenen Hardware.

Jetzt starten

Validierung des Designs

Nach der Nachbearbeitung bleibt die entscheidende Frage: Funktioniert die Hardware? Beim Einschalten zeigen sich die meisten elektrischen Fehler. Auf diesen Moment freuen sich Ingenieure ebenso, wie sie ihm nervös entgegenblicken.

Weiter zu Teil 4

Nachbearbeitung des Designs

Autonomes Layout liefert ein vollständiges, DRC-geprüftes Design. Die Nachbearbeitung ist ein kurzer Präzisionsdurchlauf, der es für die Fertigung finalisiert.

Weiter zu Teil 3

Kompilieren des Designs

Nach der Vorbereitung wird das Design an Quilter übergeben. In klassischen Abläufen klärt hier ein Ingenieur die Entwurfsabsicht mit einem Layoutspezialisten. Quilter ersetzt dieses Gespräch durch Schaltungsverständnis: Sie laden das Projekt hoch, prüfen die Interpretation der Randbedingungen und starten den Auftrag.

Weiter zu Teil 2