If you are reading these lines, you are probably into DIY audio. A big part of DIY audio is building DACs. Since these last few years DACs have become fairly complex, sometimes they can benefit from being controlled by microcontrollers. I myself own two such DACs, a Buffalo III and a Soekris dam1021. I have written code to control them with the help of Arduinos, but early on I realized that I also needed to have electrical isolation between the Arduino and the DAC, in order to eliminate the possibility of interference and/or noise. To accomplish that I had designed a little Arduino shield.
The years passed and my needs changed with the introduction of the dam1021 DAC and its serial interface. Even though this interface is electrically isolated from the dam board, it is not isolated from the USB to I2S interface. This means that my Arduino would have to share a common ground with my XMOS-based USB interface. I did not want that to happen.
My first thought was to design a new shield specific to the dam but then I thought “why not design a universal isolator shield?”. It would provide electrical isolation for both I2C as well as serial signalling.
The original design was completed around September 2015, but since then there has been a lot of interest in this design so I have been further optimizing it.
The result of this optimization was a short run of Rev. 1.1 boards (very similar to the original design) and then finally this PCB:
It’s called “the Rev. 1.2”. I have introduced it in this post, detailing the changes from the original design. The following documentation pertains to the newer design. The documentation for the original design (in archive form) can be found here: Universal Signal Isolator shield for the Arduino DUE (Rev.1).pdf (1032 downloads)
So, what does this thing do?
- Electrical isolation of I2C signals, complete with support of 8 isolated inputs or outputs (via an MCP23008 IC). Three of the MCP’s pins are high current outputs (up to 100mA).
- Electrical isolation of up to 2 serial ports (implemented with an Si8642).
- Electrical isolation of the second I2C interface of the DUE (implemented with an ADUM1250).
- Powered either by 5VDC, 8-15VDC (non-regulated) or 7-12VAC (includes support for on-board rectification and filtering).
- Support of a 5VDC power-on relay (up to 100mA).
- Header for connecting a Nextion display (for future use – not yet supported by any of my code!).
- On-board EEPROM memory (24LC256).
- Passthrough for the DUE’s SPI header and relevant CS pins.
- And of course full compatibility with the previous shield (same pinouts for the encoders, IR, TFT, etc.).
Schematic & PCB
This is the schematic & PCB of the board in Eagle format (v1.37, a.k.a. “Rev.1.2”): USI Schematic & PCB (1147 downloads)
|U1||24LC256 SO-08||EEPROM chip|
|U2||Si8605 SOIC-16||I2C Isolator|
|U3||MCP23008 SO-18W||8 input/output port expander|
|U4||Si8642 QSOP-16||Serial port isolator|
|U5||ADUM1250 SOIC-8||I2C Isolator|
|Q1||BC807, BC808 or other equivalent PNP SOT-23||TFT backlight control|
|Q2||BC856, BC808 or other equivalent PNP SOT-23||port expander transistor|
|Q3||BC856, BC808 or other equivalent PNP SOT-23||port expander transistor|
|Q4||BC856, BC808 or other equivalent PNP SOT-23||port expander transistor|
|Q5||AO3400 or other equivalent N-Channel MOSFET SOT-23||power relay mosfet|
|B1||Bridge rectifier 1A DB107 DIP-4|
|R2||2K 1206||pull-up resistor (optional)|
|R3||2K 1206||pull-up resistor (optional)|
|R7||2K 0805||pull-up resistor (optional)|
|R8||2K 0805||pull-up resistor (optional)|
|L1||Ferrite Bead, low DC resistance, 3216|
|L2||Ferrite Bead, low DC resistance, 3216|
|Reset||PCB-mount momentary switch|
How do I make it work?
You have five ways of powering your Arduino & Shield:
- Through one of the Arduino’s USB ports. I use this way only for testing – it’s not very practical once you have your Arduino inside a chassis. Still, it will work just fine and you do not need to install any of the power-related parts of the shield.
- Through the DUE’s DC in jack.
- Through the DC_5V header. Here you need to supply 5VDC. No more, no less. Your power supply needs to be regulated and be capable of supplying between 250-350mA of power, depending on whether you will be driving a power relay or not. You need to solder on L2 and the relevant header.
DC_5V Pin No. Function 1 5VDC 2 GND
- Through the DC_UNR header. Here you need to supply between 8 and 15 VDC, but it may be non-regulated. The Arduino’s reg will do the regulation.You need to solder on L1 and the relevant header.
DC_UNR Pin No. Function 1 8-15VDC 2 GND
- Through the AC_IN header. Here you may connect a transformer with a secondary winding of 7-12VAC, rated at at least 5VA. If you choose to go this way, you need to install B1, C1, C11 and L1 besides the relevant header. The shield takes care of the rectification and the filtering but the Arduino does the regulation.
If you will be using the shield with a 3.2″ TFT, you will need to install R1, Q1 and TFT_POWER. This is the pinout of TFT_POWER:
|1||TFT backlight (+)|
The current versions of TFT HiFiDuino and ArDAM1021 still make use of only one of the two supported rotary encoders, so you can get away with installing only ROTENC1.
If you will be using an IR control (what are the chances of you not using one, right?), you will need to install C10 and the IR header.
If you will be controlling a power on/off relay, you will need to install R9, Q5, D1 and the POWER_RELAY header.
Isolated I2C ports
You may enable either the first I2C port (I2C) or the second one (I2C1) or both.
- To enable the basic functionality of the first port, you need to install U2, C2 and C3. The resistors R2 & R3 are pullup resistors and you may need to install them depending on your DAC’s I2C lines. If they already have pullup resistors (like in the case of the TPA Buffalo III) you do not need them. Power to the isolated side is provided by I2C_ISOL1, pins 1 (+) and 6 (-).
I2C_ISOL1 Pin No. Function 1 Vcc (isolated) 2 SDA 3 OUT 4 IN 5 SCL 6 GND (isolated)
- To enable the 8 isolated inputs/outputs, you need to also install U3, C5, R4, R5, R6, Q2, Q3, Q4 and of course the MCP_INTERFACE header. In this case, power to the isolated side my be provided either through the I2C_ISOL1 header or through the MCP_INTERFACE header (pin 1 (+), pin 10 (-)).
MCP_INTERFACE Pin No. Function 1 Vcc (isolated) 2 GP0 3 GP1 4 GP2 5 GP3 6 GP4 7 GP5 (only output, 100mA max) 8 GP6 (only output, 100mA max) 9 GP7 (only output, 100mA max) 10 GND (isolated)
- To enable the second port, you need to install U5, C8 and C9. The resistors R7 & R8 are optional pullup resistors (see first case above). Power to the isolated side is provided by I2C_ISOL2, pins 1 (+) and 4 (-).
I2C_ISOL2 Pin No. Function 1 Vcc (isolated) 2 SDA1 3 SCL1 4 GND (isolated)
Isolated Serial Ports
The shield supports two (2) isolated serial ports, SERIAL2 and SERIAL3. They share one power supply and have a common ground, since they are both supplied from the same one isolator IC, U4. You will also need to install C6, C7 and the SER_ISOL header. Power to the isolated side is provided by pins 6 (+) and 5 (-).
The shield supports passthrough of the DUE’s SPI port, in case your design has a use for it. It is provided by soldering on an SPI header and the SPI_CS header.
Do you have one for me?
I try to keep a few boards around, since friends ask for them all the time. Contact me.