This project is a shield board that plugs into an Arduino Uno and provides a 2-in/4-out DSP board. The board is designed to sit in-between the Uno and a generic LCD/keypad board. The LCD provides the user interface to select various crossover frequencies, BSC, EQ and volume trimming. The Uno monitors the LCD keypad inputs and provides all of the control functions for the ADAU1701. The Uno loads the code into the DSP and it calculates the biquad coefficients to implement a range of crossover frequencies and slopes, BSC and 9-band EQ. A completed board is shown below:
When the boards are stacked together, they look like this:
Schematics, BOM and PCB files:
You can make your own boards by simply sending the zip file in the link to ITEAD studio. Before the tariffs, you can buy 10 bare boards for $43 including shipping. I haven’t bought any of these specific boards recently, but the last boards I purchased from ITEAD that were about the same size were substantially more expensive–about $65. Even so, that’s not a bad price.
If you want to make changes to the design, you will need to install DesignSpark (a free download) and open up the ADAU1701_shield_RCA.prj file. The schematic and PCB files will need to be in the same directory as the project file (.prj). The schematic may not have the exact part numbers, because I wasn’t overly careful about updating every library part. However, the Excel file should have the right part numbers, along with Digikey’s ordering numbers.
I should probably get some beer icons to indicate how many beers you will need to consume to assemble the boards. I’d give this one a 2-beer rating. It turns out these boards aren’t all that time-consuming if you have a basic hot air rework station. I just put some solder paste on the SMD pads and placed the parts on the solder with the tweezers, cleaning the tweezers periodically with denatured alcohol to keep the parts from sticking. Every part on the part is 0805 or larger, so you won’t go blind. The ADAU1701 chip is probably best soldered on by hand using a temperature-controlled iron and a fine tip. Just get a few pins soldered to hold the chip in place, and then use lots of solder and flux to make sure each pin is soldered to the board. Of course, that will create lots of solder bridges, but use fine braid to remove the bridges, and touch up by using extra flux and heating up each pin with the tip of the iron. I’ve ruined an ADAU1701 by trying to solder it with the hot air tool, but I’ve soldered at least 30 of those 64-pin chips using the hand soldering method described above, with no problems. Notice that I put a rectangular opening in the ground plane under the chip, so you can shine a strong flashlight from the back of the board to inspect the solder joints.
Hardware and Software Features
There aren’t any surprises in this design–it is the same as the reference circuit in the ADAU1701 data sheet, which is basically the same as the miniDSP 2×4 board. There are three ways the board differs from the miniDSP product or the reference design: 1) it uses an Arduino board instead of a PIC controller to program the DSP; 2) it doesn’t have a separate EEPROM for programming, as the DSP code is converted to a “.h” file and compiled with the Arduino sketch; and 3) there are no expansion connectors to allow adding devices to the DSP.
That point about the lack of EEPROM is worth emphasizing. This shield board is programmed with a “generic DSP architecture” that includes 11 shared biquads (applied to all channels), plus 8 biquads for each individual channel plus delay and volume control for each channel. For most applications of this board, no additional DSP resources will be needed and hence there is no need to use SigmaStudio to change the DSP. However, if changes are desired, the user doesn’t need a separate programmer, as the SigmaStudio program is included in the Arduino code, and the Arduino CPU programs the ADAU1701. This approach to loading the ADAU1701 is described in Article 4 on this website.
When this board was first designed–back in March of 2015, there weren’t as many contributed libraries for Arduino as there are now, especially for menu systems. All of the ones I looked at were fairly simple and didn’t provide the amount of control over the display that this project needed. So I used the same type of menu system that I had used for several years that was originally written in 6801 assembly language. I updated the code for the Arduino IDE and tried to make it as logically organized as possible, but there are probably better supported and easier to use menu systems available now that could replace this code. All of the options for the menu system are packed in tables, organized as pages and fields. The original code was used for an 8-line display, and although the current display is only a 2×16 LCD, the design will accommodate much larger displays. The pages and fields are shown below:
This set of HCI options has worked well for a number of different speakers. However it really isn’t that hard to change the number of options and their values. For example, the code to calculate the biquad coefficients for the crossover supports Butterworth, Bessel and Linkwitz-Riley topologies up to 14-pole (L-R 14), and adding these additional crossover types would be relatively easy, since the hard work of calculating the filter specifications is already done. Also, if you wanted a crossover at 2005Hz or some other odd value, that could be added by changing some simple switch-case statements.
A nice feature of this software design is that the Arduino saves its state in its own EEPROM memory, so that if you hit the reset button or if power is interrupted, the Arduino restores the DSP and returns to the same screen and same settings as the last save. However, EEPROM has a finite number of writes that can be made, so in order to keep the number of writes to a minimum, the state is only saved when going to a new page. So whenever you change a value such as the volume or crossover frequency, you should cursor over to the next page of options in order to save that change.
Clearance sale (9/23/2019)
I had made a small run of the Arduino shield boards about 3 to 4 years ago back when I was on the Parts Express Speaker Design Team. I had proposed a “learning project” called the Active Speaker Test Bed, which used these boards. There was a companion PowerPoint briefing that I submitted, showing how I wanted to use these boards to make nice two-way speakers as a way of having fun learning DSP and active speaker basics. Unfortunately, the project was viewed as overly ambitious, and I ended up completing my PE commitments in a different way. I’ve used a couple of those boards, however, I still have a number of them that have been collecting dust. Now my wife is saying I have too much stuff and that I need to clean up my storage drawers. So those remaining boards are now available for sale.
There were two different designs for the ADAU1701 Arduino Shield board. The first used a connector on the board for I/O, which required making a small cable to go from the connector to standard RCA jacks. The second design put the RCA jacks on the board, and the PCB files in the links in the previous section. That made the board somewhat bigger but easier to use.
I made a couple of both types of boards, and they are shown in the picture below. These boards are for sale at a price that is lower than the MiniDSP or the comparable freeDSP board: $60 each. That’s less than my cost, probably by a lot. They come with the CPU already programmed with useful software, an LCD display and an I/O cable for the original version of the board. You just need to provide power via the USB connector or power connector on the Arduino board and they will make a fine 2-way stereo crossover/EQ/BSC that you can control with the keypad on the LCD display.
Of course, these boards would be even more cool if they came with the Arduino source code so that you could make changes. However, when I tried loading the code for these, I discovered that I hadn’t finished the code before moving on to the stereo 3-way boards, so I had to spend quite a few hours retrofitting these with some of the new code. Also, I removed all of the serial interface code that communicated with the ASD program. This code was removed because much of this code changed when I made the interface a Bluetooth or WiFi interface for the stereo 3-way board, and it was going to take too much time to update this code and adapt it for the unique features of this board. Also, it required a lot of code that gets close to the 64K limit of these 8-bit CPU’s. So these boards can’t be controlled via a cell phone app. If you want that feature, wait until I have a clearance sale on the stereo 2×6 boards that use the teensy3.2 board instead of the Arduino Uno. There is one completed assembly on the right in the picture ready to go and I’ve got at least 3 more LCD’s and CPU’s to make more assemblies. If enough people want these, I’ll buy some more LCD’s and CPU’s from AliExpress (I have 8 shield boards total).
Given how much time it took to get the code in good working order, I’m not receptive to giving away the source code for free. However, if you want to buy the source code, I’ll sell a personal-use only license for another $100. That will also get you a simple .NET application that can convert the output of the SigmaStudio compiler to two files that you need for the Arduino code: the SigmaStudio code that gets loaded into the ADAU1701 by the micro and a cell map that allows you to reference the ADAU1701 cell addresses symbolically from the Arduino code. These boards, with the source code, are a great way to understand the details of programming the ADAU1701 and other similar chips, and they provide a practical introduction to DSP.
I’m charging for this code because it is somewhat complicated stuff that isn’t very easy to follow (that’s just the nature of this type of code), and I expect that anyone who buys it will expect some help and support. I will provide up to 3 emails of support along with the code, so you can ask me questions, but make sure there are no more than 2 questions per email–please be respectful of my time. I’ll try to help you understand the code enough to make modifications, but I’m not able to do the work for you, and I can’t give you extensive personal training on DSPs or Arduinos. But I’ll do what I can to help you master the code. I’ve posted a LOT of information in the articles on this site, and I would expect you to read that information before contacting me.
If you want a less restrictive license for commercial use, send me an email to firstname.lastname@example.org