Surviving the Great Chip Shortage of 2022
Component choices and PCB layouts for improved manufacturabilityNo matter whether you're a hobbyist or a giant multinational, 2021 was a nightmare for manufacturing electronics, with many common components completely unavailable or costing several times their normal price. And 2022 isn't looking like it will be any better. Tesla actually increased their EV deliveries during 2021 by being agile enough to pivot to different components and rewrite firmware at short notice, whereas other car companies shut down entire factories for weeks or months at a time.
A common I/O expander IC was suddenly unavailable everywhere, with an 18 month lead-time
This article shares some tips for designing around suddenly hard-to-find/expensive components. Tip #0 is to use a resource like Octopart for sourcing components to quickly check prices across multiple distributors, instead of relying on just one.
1. Using “Jellybean” components
These are pin-compatible components with the same package size from multiple manufacturers (usually with high stock levels), making it far less likely that all of them are unavailable. If your design can use them, they make great drop-in replacements. Dave from EEVblog gives some examples in his video below:
2. Component with different package sizes
A component is typically available in multiple package sizes (eg, theMCP23018 is available in PDIP, SOIC, SSOP or QFN), and you may be able to combine the footprints on your PCB so that you have more options when sourcing that component for manufacturing. You can even combine surface mount and through-hole footprints.
One of my projects uses a nRF51822-based Bluetooth module but (trying to reduce the cost as much as possible), I ended up with modules that had the same pin-out, but different physical sizes. The blue official Waveshare Core51822(B) measures 17×20.8mm, while the black clone YJ-14015 is 15×20mm. To support both module sizes, I created a combined PCB footprint with extended pads:
3. Plug-in daughter boards / modules
If your main PCB is complex/expensive, but you want the flexibility of quickly replacing certain components due to shortages (or future upgrades), then using a socket for a daughter board might be suitable. The daughter board could be something custom with multiple components, or just a generic breakout board for a single component. There are cheap breakout boards available for most SMD package types and are typically double-sided. eg, the top side of a “SOP24” breakout board might support SOP/SO/SOIC packages with up to 24 pins and 1.27mm pin pitch, while the other side is for SSOP/TSSOP packages with 0.65mm pin pitch. So the same socket on your main PCB could potentially support a component in all those package types.
My WiFi-controlled stepper motors with ESP8266 product includes 2× plug-in A4988-based motor driver modules, as well as ESP8266 and voltage converter modules that are soldered directly to the PCB. These modules are mass-produced in vast numbers (by multiple manufacturers) so are cheaper than buying the individual components in small volume, as well as requiring less soldering.
Many motor driver modules use a common physical size & pin-out, allowing the same main PCB to easily swap to a different driver. eg, A4988, DRV8825, or TMC2208.
4. Multiple components with incompatible pin outs
Example PCB layout for an I2C 16-channel I/O expander
One my projects uses the MCP23017, a common 28-pin I/O expander IC that was suddenly unavailable everywhere, with an 18 month lead-time
. So I started looking at alternatives that were available (and not outrageously expensive) and came up with 6 components from 4 different manufacturers that shared similar 24-pin package sizes & functionality.
These aren't fully pin-compatible, so there are some small compromises made in order to support all of them: in particular only 1 pin is available for setting the I2C slave address, and features like the voltage level translation specific to the PCA(L)6416A can't be used. I plan to integrate this design into my main PCB to save board space, but it works equally well as the plug-in daughter board that is presented below:
Pin-mapping table
| Board pin # | MCP23018 | PCA9535 PCA9555 | TCA9535 | PCA(L)6416A | |||||
|---|---|---|---|---|---|---|---|---|---|
| 1 | INT | 16 | INTA2 | 1 | INT | 1 | INT | 1 | INT |
| 2 | Vdd | 10 | VDD | 2 | AD13 | 2 | A13 | 2 | VDD(I2C)4 |
| 3 | RST | 14 | RESET | 3 | AD25 | 3 | A25 | 3 | RESET |
| 4 | P0.0 | 17 | GPA0 | 4 | IO0_0 | 4 | P00 | 4 | P0_0 |
| 5 | P0.1 | 18 | GPA1 | 5 | IO0_1 | 5 | P01 | 5 | P0_1 |
| 6 | P0.2 | 19 | GPA2 | 6 | IO0_2 | 6 | P02 | 6 | P0_2 |
| 7 | P0.3 | 20 | GPA3 | 7 | IO0_3 | 7 | P03 | 7 | P0_3 |
| 8 | P0.4 | 21 | GPA4 | 8 | IO0_4 | 8 | P04 | 8 | P0_4 |
| 9 | P0.5 | 22 | GPA5 | 9 | IO0_5 | 9 | P05 | 9 | P0_5 |
| 10 | P0.6 | 23 | GPA6 | 10 | IO0_6 | 10 | P06 | 10 | P0_6 |
| 11 | P0.7 | 24 | GPA7 | 11 | IO0_7 | 11 | P07 | 11 | P0_7 |
| 12 | GND | 1 | VSS | 12 | VSS | 12 | VSS | 12 | VSS |
| 13 | P1.0 | 2 | GPB0 | 13 | IO1_0 | 13 | P10 | 13 | P1_0 |
| 14 | P1.1 | 3 | GPB1 | 14 | IO1_1 | 14 | P11 | 14 | P1_1 |
| 15 | P1.2 | 4 | GPB2 | 15 | IO1_2 | 15 | P12 | 15 | P1_2 |
| 16 | P1.3 | 5 | GPB3 | 16 | IO1_3 | 16 | P13 | 16 | P1_3 |
| 17 | P1.4 | 6 | GPB4 | 17 | IO1_4 | 17 | P14 | 17 | P1_4 |
| 18 | P1.5 | 7 | GPB5 | 18 | IO1_5 | 18 | P15 | 18 | P1_5 |
| 19 | P1.6 | 8 | GPB6 | 19 | IO1_6 | 19 | P16 | 19 | P1_6 |
| 20 | P1.7 | 9 | GPB7 | 20 | IO1_7 | 20 | P17 | 20 | P1_7 |
| 21 | ADDR1 | 13 | ADDR1 | 21 | AD0 | 21 | A0 | 21 | ADDR1 |
| 22 | SCL | 11 | SCL | 22 | SCL | 22 | SCL | 22 | SCL |
| 23 | SDA | 12 | SDA | 23 | SDA | 23 | SDA | 23 | SDA |
| 24 | Vdd | 10 | VDD | 24 | VDD | 24 | VDD | 24 | VDD(P) |
| NC | 15 | INTB | |||||||
1ADDR is analog voltage for I2C slave address (8 values), but needs to be full ON (7) or OFF (0) for compatibility with ICs that have digital A0/AD0.
2INTA should be configured as active low, for compatibility with other ICs. INTB is not connected.
3AD1/A1 is always 1, since connected to Vdd for compatibility with other ICs.
4VDD(I2C) is connected to VDD(P), so no voltage level translation can be used.
5AD2/A2 is normally 1 for compatibility with other ICs. There is no reset feature in this IC.
Firmware support
Supporting multiple incompatible components obviously needs additional libraries, pin mapping table and ideally an abstraction layer so the bulk of the code is component-agnostic. It may be possible to auto-identify the exact component at boot time, but that results in larger code size as all the different libraries must be included. Alternatively, compile a different firmware version for each incompatible component. eg, with#ifdef statements.
My new article More ESP8266 GPIO pins with IOexpander library documents a library that provides a common interface for multiple incompatible chips, auto-identified at boot time.
Download files
Note how theMCP23018 footprint is rotated 180° and actually overlaps the other footprint to give the cleanest layout as well as reducing board space. It also uses the wider SSOP24 package, while the others are TSSOP24:
- KiCad project, schematic & PCB files (zip archive)
- GERBERS PCB manufacture files (zip archive)
- Microchip MCP23018 documentation (PDF)
- onsemi PCA9535E documentation (PDF)
- NXP PCA9555 documentation (PDF)
- TI TCA9535 documentation (PDF)
- NXP PCA6416A documentation (PDF)
- NXP PCAL6416A documentation (PDF)
Nikki Smith, January 2022.





