Modern development boards are more advanced than ever. Yet identifying the correct pin can still be surprisingly difficult.
A microcontroller is inherently complex. Finding the correct GPIO pin shouldn’t be.
Engineers already use visual design principles everywhere. It seems that it is often not applied to PCBs.
PCB silkscreen is often treated as a purely technical artefact rather than a communication medium. In both cases, usability work is frequently seen as secondary to the “real” engineering. We need more focus on the User Experience (or Developer Experience) to make things better for everyone, including beginner and expert developers. This is not necessarily a trade-of, it can be better for beginners and experts even just by spending a bit more time on designing and testing a pcb without necessarily increasing hardware cost.
Since the silkscreen is the user interface, we should give space to this. In most dev kits the components are all on the top of the PCB. This is almost like putting the screen of a laptop on the bottom of the laptop; so you constantly have to flip the device or use an external monitor. Some components like pushbuttons, LEDs and jumpers could mounted reversed or on the side to avoid having to solder components on both sides (which costs a bit more and takes up more space on the top side).
All elements are soldered on the bottom side; giving the top side a flat appearance and room for graphics. This could be done by reverse-soldering the LEDS, applying a laminated board type of USB-C connector. It also meant that basically all the connections of the ESP32-S3 module needed to be reversed on the PCB which adds a bit of length and crosstalk to the lines. The buttons (for BOOT and RESET are now sticking out on the USB side; so they can be pressed when the board is on a breadboard. The user LED is placed next to the pin triggering it; also showing this form follows function concept.
2. Create visual hierarchyThe GND and VCC are shown with the boldest font. This should warn the user about using this pins; but also make it easy to find. On the coloured version the GND and VCC are also shown in black/white and red or orange to indicate the different voltages.
The green pins (or white background pins) are the ones you should use first; they don’t connect to anything else and have full functions. Analog inputs and touch sensing pins are marked. Good to note that some green pins that are not marked as analog inputs also could function as analog inputs, but only when the wifi is not used. Since the ESP32-S3 is mostly used as a WiFi-enabled board I choose to not mention this to avoid confusion and these pins can still be used for digital in and outputs or touch sensing.
The pins that are more risky to use, since they have behaviour during boot or are connected to components, are the third layer. You don’t want people to connect an LED to the USB D+ pin, since this might make it impossible to update the firmware on the board. I thought about putting warning icons next to it, but it might be better to highlight which pins should be used instead, since it could easily become a overload of warning symbols.
3. Put labels in readable placesLabels are always placed next to the pins on the top side, on the bottom side some of the pins are just not labelled due to the ESP module being in the way. The pin number is never overlapped with a track on the copper layer, some of the other text or labels is. A solution to this would be to move the top layer to one of the middle layers. This will lead to a nice and clean ground plane on the top. Which would also support more copper-coloured text.
4. Use consistent namingFor the naming I always had the GPIO number first since this is the number you would use in platformIO or Arduino to address this pin, than additional information if beneficial.
5. Reduce numbering complexityIn this case I chose to not change the order of the pins; which makes the whole layout, grouping and numbering still messy; which still remains problematic when you want to use pin 4 till pin 8, you can not just enumerate through but need to create a custom array in the code.
Manufacturing lessonsAbove you can clearly see that the silkscreen on the left functions more like a fluid, while the printed colourful version more like a powder. Inverted blocks clearly show that the text becomes visually thinner. On the right side the font weight is already compensated semi-bold for white text and bold for black text; but still the white text looks way bolder than the black text. You can also clearly see that some of the smaller text on the colourful version is not clearly readable in comparison to the white silkscreen. This compensation needs to be even more.
The white/green marked pins should have a legend item to it saying “use me” or “use first” so it is clear why they are marked white/green.
JLC PCB was also not able to produce the colourful silk screen without a white margin around every hole, component or edge. This created some ugly outlines on the board due to the white silkscreen being applied before the printer prints the colourful ink. Also to use the colourful silkscreen I needed to choose specific (more expensive) options such as emersion nickel gold treatment, based on these experiences I would not recommend coloured PCBs yet.
In my current design I also applied an green LED instead of an RGB led since I could not find a reversible RGB led with WS2812 module included. I can just place a WS2812 next to it. My idea was that BUILTIN_LED would not work with this RGB led, but the Arduino ESP32 library fixed that. And RGB led’s on connected products can indicate much more than just a green LED.
The power LED should have a way to disconnect it by scraping away some copper. This could be beneficial for low power applications, or where you don’t want the LED to give a visible glare.
I realised than ON is the wording on the Arduino UNO, which I like more than power. The power LED also needs more than a 1K resistor to dim it more. Currently it is creating so much light that it becomes hard to read the silkscreen during daytime.
ConclusionPCB designers often optimise for routing, density and manufacturability. Those constraints matter. But the board itself is also a representation and user interface that deserve design. A PCB should communicate what you need to know, where you need to know it.
If users need to constantly consult a pinout diagram, the board is doing a poor job of communicating.
If users need to constantly consult a pinout diagram, the board is doing a poor job of communicating.
This project is based on this article (a bit more elaborate) by the same author.


Comments