Close
0%
0%

Sound Processing Shield for Arduino

Add reverb and other effects to a mike input, and have it ready on a speaker output

Public Chat
Similar projects worth following
This Arduino Shield project takes sound processing on the Spin Semiconductor FV-1 and applies it to a microphone input, then sends it to a speaker output. While the effects (including a separate volume control) are controlled by I2C, the audio signal itself never leaves the board until the end.

Intro

This Shield brings sound in through a Maxim MAX4468 microphone pre-amp, sends it straight to a Spin Semiconductor FV-1, and then out through an ON Semiconductor NCS2211 speaker amplifier.

Purpose

There are several applications one could use this Shield for in an Arduino project:

  • Wearable/portable voice changer
  • Musical instrument effects unit
  • Portable personal stereo

I'm sure others can come up with other ideas, including as just one element in a much larger and more complex project. (The wearable voice changer is my pet project, but I also plan to make this Shield as broadly applicable as I can.)

Details

The FV-1's settings are controlled via a Maxim MAX11312 I2C controller. That same controller also operates an ON Semiconductor FSA2211 data switch, which serves as an electronic DPDT switch. The same signal that operates the switch changes the 24LC32 EEPROM chip from its normal connection to the FV-1, storing "external" programs as a Read-only chip, to a Write-capable chip connected directly to the I2C bus so those external programs can be loaded onto it. The switch connects the EEPROM to the FV-1 when in Read-Only mode, or to the main I2C bus when in Write-Capable mode.

There's also an option for adding a Bluetooth Low Energy (BLE) capability to a project, via Adafruit's BLE SPI Friend. The header for this connects the Friend's pins to the GPIO pins used in the breakout's provided sample code (as shown in the Wiring section of its tutorial; these are 4, 7, 8, 11, 12, and 13). If you don't want to use the Friend for any reason, just don't include it; those GPIO pins will then be left open, so other Shields can use them.

Besides the GPIO pins mentioned in the preceding paragraph, the only pins used by this Shield are those that can be easily shared with other Shields: Power (both 3.3V and 5V), Ground, ARef (analog reference), and the I2C pins.

One of the MAX11312's ports controls the MAX4468's Shutdown function; another is connected to the Friend's DFU (Device Firmware Update) pin; another controls whether the EEPROM is Read-Only or Write-Capable. All the MAX11312's other ports connect to the FV-1 (including one to read the CLIP function and another intercepting the mike input).

A Microchip MCP4652-503 dual 50kΩ digital rheostat -- with a separate I2C address -- controls the mike and speaker volume.

There are three ways that the audio signal can leave the board. The "normal" way is through a 3.5mm TRRS audio jack (the four leads carrying IN+, OUT-, OUT+, and IN- respectively). In case the user is building something with the mike and speaker in the same enclosure as the Shield, there's also a pair of two-lead right-angle headers to connect them.

Finally, should the user want to process a signal through more than one FV-1, a pair of connectors allow the user to send the output of one directly to the input of the next. While the MAX11312 is capable of up to eight I2C addresses, the selection on this board is limited to four; it's highly unlikely anyone will want more than two.

(For those who might want to connect the mike and speaker through separate mono audio jacks or bare-wire connectors, a separate version of this will feature those options in place of the TRRS jack and right-angle headers. That's why the board is labeled Sound Processing Shield 1; the other one will be Sound Processing Shield 2. That will be the only difference, so all sketches should work equally well with both.)

As a bonus, the board also has three Qwiic connectors... because, well, you can never have too many Qwiic connectors.

Usage

This Shield is designed to be usable with either an electret or piezoelectric microphone. By default, it's set up for an electret; to use it with a piezo (without it sounding tinny), just switch the "Mic Type" solder jumper on the underside from "E" to "P."

The 10kΩ Pull-Up resistors are connected by default. If you have other I2C boards with their own Pull-Up resistors, you may...

Read more »

Sound Processing Shield 1.fzz

Fritzing file for the project. Anyone familiar with the chips and other components used here is invited to make useful comments.

- 172.94 kB - 08/26/2020 at 14:37

Download

  • 1 × PCB from the Fritzing file provided
  • 1 × Spin Semiconductor FV-1
  • 1 × 2.2KΩ resistor R19
  • 2 × 1uF capacitor C3, C10
  • 1 × ON Semiconductor NCS2211

View all 35 components

  • Prototype Ordered!

    bobgreenwade05/07/2021 at 21:56 0 comments

    I've finally gotten to where I could purchase the prototype for this board. A whole new estimate was needed; the total I spent was $262, including $5 for an unrelated test board and a $12 bank processing fee. If I get any more, I may see about using a company other then PCBWay; they're wonderful (especially the customer service reps), but the price seems awfully high.

    I'm figuring it'll be mid-June before the board arrives. I'd better start getting the other components ready for testing!

  • Finally, a little progress

    bobgreenwade03/08/2021 at 22:58 0 comments

    After quite a bit of work and component purchasing, I've finally managed to get a combination of screen and board to work together properly. This will be vital for not only the larger project I'm working on this for, but also for controlling and operating the Sound Processing Shield as I work up its sketch library.

    The bad news is that I don't really expect to be able to buy my assembled test board until April, or until the COVID relief money comes (whichever is first, though at this rate I'm expecting the latter). So I probably won't be able to do any serious work on this until May... and I'm starting to feel kind of eager to get going!

  • 91

    bobgreenwade12/18/2020 at 16:17 0 comments

    As of today, I have 91 Followers for this Project. I just thought I'd mention that, since 91 is my favorite number (the explanation of that would be too long to go into here).

    On another note, some of you Followers may have noticed a lack of progress here. For one thing, I've had to change apartments -- another long tale, and mostly irrelevant other than how it took up the money I might've spent on the prototype board. For another, the other components I got for my larger voice-changer project -- Arduino board, battery charger, and touchscreen -- are stubbornly not working, and I need them just to test the Sound Processing Shield.

    At the end of this month, I'm going to get an alternative for the board, to address a couple of possible issues. That'll take a little while to implement, so it'll be late January at best, and more likely some time in February, before I can send off for the prototype (which of course will take a few weeks to arrive).

  • Spendier than I'd expected

    bobgreenwade11/01/2020 at 15:13 0 comments

    It turns out that the prototype board will be more expensive than I'd thought. For some reason the boards had to be upgraded in terms of minimum trace width (even though that hasn't changed since the test boards) to an extra $55 cost, and the components that I thought would cost about $30 are just over $100. In short, the total that I'd expected to be around $70 is instead almost $200.

    I can't blame PCBWay, at least for the latter trouble; they're in China (just outside Hong Kong), and importing most of the components.

    I'll still get this prototype, but it won't be until December, and if I have these produced in batches I'll probably go to another company.

  • The sample boards arrived!

    bobgreenwade10/27/2020 at 01:51 0 comments

    This afternoon's mail included my sample boards (a batch of 5) from PCBWay, and I'm very happy with their work:

    Again, this is a somewhat earlier version of the board; most of the components have been shuffled around, and some have been deleted (and a couple added) since I sent this design. This is mostly to confirm that I got the placement of the Arduino headers correctly -- which, somehow, I did... though I plan to recheck and re-recheck it just to make extra sure.

    Now, over the next couple of weeks, I'll be preparing the Gerber and Centroid files for an actual (hopefully) working prototype based on the current layout.

    And, by the time that arrives, I hope to have other parts of my larger project working as well.

  • A couple more adjustments

    bobgreenwade10/26/2020 at 15:29 0 comments

    Besides the typical minor tweaks to the layout, I made a couple of significant adjustments to the board over the weekend. For one thing, I corrected the values of the pull-up resistors from 1M to 10k. I also moved the location of the Clip LED to a spot next to the TRRS plug, where both could be visible from the same end of the enclosure (if any).

    Weaving the signal wire for the latter change has me thinking more and more that rotating the FV-1 90 degrees clockwise might be worth the effort after all.

    With the opening up of space near the Arduino RX/TX pins, I'm also back to contemplating an I2S interface for this board; I'm just not sure yet how to do it.

  • Want Synchronized Lights?

    bobgreenwade10/15/2020 at 14:17 0 comments

    It occurred to me just a little while ago that an end user might want to have synchronized lights or some other effect with the voice, so I've connected the mike input at the FV-1 to the one remaining port on the MAX11312. Maybe it should go to one of the speaker output ports; I'm not sure. I may change to that later, especially if someone speaks up.

    Also, I removed the extra output connections besides the TRRS jack. Using just one or the other port is a more likely thing for the SPS2. Before I finalize this version of the project, I may bring the right-angle headers back, or put bare-wire terminals in their place.

    This is in addition to the rerouting of leads to make wiring more efficient.

    I'm also considering a row of connections to allow a user to put in jumpers, connecting the FV-1's input and output directly to the analog I/O -- but not yet.

  • Sent for the Preliminary PCB

    bobgreenwade10/01/2020 at 21:51 0 comments

    This morning I ordered the PCBs that I'll be using to make sure all of the headers are aligned correctly. They won't have the components on them (what a waste that'd be if the headers are on wrong!), but they'll get here relatively quickly (2-3 weeks, from China, as opposed to half again that with the components) and enable me to take the next step forward: the prototype!

  • Rerouting

    bobgreenwade09/23/2020 at 15:09 0 comments

    I've been making minor, unlogged updates to the Fritzing file all along, but here's a big change: I moved the EEPROM Read-Write function from IO7 (on the MAX11312) to IO1. This means less crossing of traces, shorter leads, and fewer vias. It also means a few changes to the programming notes, which is why I'm logging it.

    Those minor, unlogged updates will probably continue, for much the same reasons (as well as to maximize ground plating), at least until I send off for a prototype.

  • Hopefully... though still not quite sure.

    bobgreenwade09/16/2020 at 14:43 0 comments

    I don't think just a bypass resistor is going to be enough to keep the piezo mic from sounding tinny, so I hunted down a schematic for a better circuit and plugged that in. The person who made it meant it for a guitar pickup at 9V, but I think it should work for a throat mike at 3.3V as well. I don't think I'll actually know for sure how well it works until I have the board in hand, with components.

    I think this (once I've double-checked the routing) probably will be the version of the board that I have printed (sans components) to check header placement. I'm particularly uncertain about the SPI header (at the right-hand end), though the standard Arduino headers may be a tiny bit off as well.

View all 23 project logs

  • 1
    Solder Headers to the Shield

    As presented, the Sound Processing Shield has no headers attached to it for connecting to other Arduino boards. You may use either male or through headers, depending on whether another Shield is going on top of it.

    The procedure for doing this is the same as with any other Shield.

  • 2
    Solder Headers onto the BLE SPI Friend (Optional)

    If you don't already know how to do it, the instructions for attaching headers to the BLE SPI Friend can be found on Adafruit's website (here).

    However, unless the Sound Processing Shield is going on the top of the stack (and probably even if it is), do not use the headers provided with the breakout; instead, use short male headers, sold separately.

    Once it's all done, plug the Friend into its slot on the Shield.

  • 3
    Programming

    Eventually this step will include Python code for setting up and controlling this Shield, or at least instructions on modifying it for your own purposes (with the full code going into the Files section). Until that's ready (or close to it), this spot will be a placeholder for notes on that.

    First, the I2C addresses will need to be declared. The defaults:

    MAX11312 = 0111000
    MCP4652  = 0101000
    EEPROM   = 1010000

    The FV-1 can only address the EEPROM at 1010000, so that one is immutable. The other two can change, depending on how the jumpers are connected. (One can still have two to four of these Shields and program the EEPROMs separately, since their Write Protect functions are controlled through the MAX11312. Just be sure that no more than one of them is Write-Capable at a time!)

    Then the MAX11312 will need instructions on how to handle its I/O ports. (For purposes of these "placeholder notes," I'm using the variable names from the chip's data sheet.)

    DACCTL       : 1 [DACs in immediate update mode]
    DACREF       : 0 [DAC uses external reference]
    
    TMPCTL       : 3 [int & 1st ext temperature monitors enabled]
    THSHDN       : 0 [thermal shutdown function disabled]
    TMPINTMONCFG : 2 [16 samples to average for current temp]
    TMPINTHI     : 320 [max temp for int temp is 100C]
    TMPINTLO     : 0 [min temp for int temp is 0C]
    TMPEXT1HI    : 228 [max temp for ext temp 1 is 67.5C]
    TMPEXT1LO    : 20 [min temp for ext temp 1 is 2.5C]
    
    FUNCPRM_5    : 512
    FUNCPRM_6    : 512
    FUNCPRM_7    : 512 [all DACs set to -5 to +5V]
    FUNCPRM_11   : 512 [ADC set to -5 to +5V]
    
    FUNCID_0     : 3 [GPO] [Mike Preamp Shutdown]
    FUNCID_1     : 3 [GPO] [EEPROM Read/Write]
    FUNCID_2     : 3 [GPO]
    FUNCID_3     : 3 [GPO]
    FUNCID_4     : 3 [GPO] [These 3 are FV-1 Program Select]
    FUNCID_5     : 5 [DAC]
    FUNCID_6     : 5 [DAC]
    FUNCID_7     : 5 [DAC] [These 3 control the FV-1 Pot inputs]
    FUNCID_8     : 3 [GPO] [FV-1 Int/Ext program select]
    FUNCID_9     : 1 [GPI] [FV-1 "Clip" signal]
    FUNCID_10    : 3 [GPO] [BLE Friend DFU]
    FUNCID_11    : 7 [ADC] [Mike input]
    

    The temperature monitors are normally used to reset the MAX11312 itself if it overheats. However, this can screw up the settings, so for this instance it will instead generate an interrupt sequence that shuts down the mike preamp and/or sends an alert to the user interface. The internal one monitors the MAX11312; the external one monitors the space next to the FV-1, where it's covered by the BLE SPI Friend (if that breakout is attached).

    A function will be needed to translate program selection from a single digit (1-8 on the user's screen) into binary on pins 2, 3, and 4. A related (either inclusive or separate) function can select a larger number (1-16) into the same binary with an additional digit on pin 8.

    I also hope to include something that will store and recall "presets," setting not only the program as above (pins 2, 3, 4, and 8) but also the levels of the pots (pins 5, 6, and 7) and the volume levels on the MCP4652.

View all 3 instructions

Enjoy this project?

Share

Discussions

bobgreenwade wrote 08/29/2020 at 16:36 point

At this time there are still two ports available on the MAX11312, and space for a few more ICs if I want to add them, so if anyone has any suggestions for functions or capabilities to add to this Shield, by all means feel free to post them.

  Are you sure? yes | no

bobgreenwade wrote 09/05/2020 at 14:11 point

Correction: one available port on the MAX11312.

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates