pedalSHIELD UNO is a lo-fi programmable guitar pedal that works with the Arduino UNO / Genuino UNO Board. The project is Open Source & Open Hardware and aimed for guitarists, hackers, and programmers that want to learn about digital signal processing, effects, synthesizers and experiment without deep knowledge on DSP, electronics or hardcore programming.
You can program your own effects in C/C++ or get inspired using the ready-to-play effects from the online forum.
How Does the Circuit Work?
The shield has three parts:
- The Input Stage: Amplifies and filters the guitar signal making it ready for the Arduino Uno ADC (Analog to Digital Converter).
- Arduino Board: It takes the digitalized waveform from the ADC and does all the Digital Signal Processing (DSP) creating effects (distortion, fuzz, volume, metronome...).
- The Output Stage: Once the new waveform is created, the signal is taken from the Arduino digital outputs (two PWMs combined) and prepared to be sent to the next pedal or the guitar amp.
Specifications.
- Based on Arduino / Genuino UNO (16MHz, 2KB RAM).
- Analog stages using TL972 rail-to-rail operational amplifier.
- ADC: 10bits.
- Output Stage: 16 bits (2x8bits PWMs running in parallel)
- Interface:
- 2 Configurable push buttons.
- 1 Configurable switch.
- 1 programmable blue led.
- True Bypass Foot-switch
- Connectors:
- Input Jack, 1/4 inch unbalanced, Zin=0.5MΩ.
- Output Jack, 1/4 inch unbalanced, Zout=0.1Ω.
- Power supply: power taken from the Arduino UNO board.
How to Program it?
The idea is to make it as easy as possible, the shield is programmed in C/C++ using the standard Arduino functions and software platform (Linux/Windows/Mac). All tools and programs are free/open source.
Basic knowledge of C is needed. The best way to illustrate how to program it is showing a simple example pedal with a Volume/Booster effect:
Clean Volume/Booster Pedal:
The block diagram of the software looks like this:
The real code used looks like this:
// CC-by-www.Electrosmash.com // Based on OpenMusicLabs previous works. // pedalshield_uno_booster.ino: pressing the pushbutton_1 or 2 turns the volume up or down. //defining harware resources. #define LED 13 #define FOOTSWITCH 12 #define TOGGLE 2 #define PUSHBUTTON_1 A5 #define PUSHBUTTON_2 A4 //defining the output PWM parameters #define PWM_FREQ 0x00FF // pwm frequency - 31.3KHz #define PWM_MODE 0 // Fast (1) or Phase Correct (0) #define PWM_QTY 2 // 2 PWMs in parallel //other variables int input, vol_variable=512; int counter=0; unsigned int ADC_low, ADC_high; void setup() { //setup IO - inputs/outputs pins configurations and pull-ups pinMode(FOOTSWITCH, INPUT_PULLUP); pinMode(TOGGLE, INPUT_PULLUP); pinMode(PUSHBUTTON_1, INPUT_PULLUP); pinMode(PUSHBUTTON_2, INPUT_PULLUP); pinMode(LED, OUTPUT); // setup ADC- configured to be reading automatically the hole time. ADMUX = 0x60; // left adjust, adc0, internal vcc ADCSRA = 0xe5; // turn on adc, ck/32, auto trigger ADCSRB = 0x07; // t1 capture for trigger DIDR0 = 0x01; // turn off digital inputs for adc0 // setup PWM - for more info about this config check the forum. TCCR1A = (((PWM_QTY - 1) << 5) | 0x80 | (PWM_MODE << 1)); // TCCR1B = ((PWM_MODE << 3) | 0x11); // ck/1 TIMSK1 = 0x20; // interrupt on capture interrupt ICR1H = (PWM_FREQ >> 8); ICR1L = (PWM_FREQ & 0xff); DDRB |= ((PWM_QTY << 1) | 0x02); // turn on outputs sei(); // turn on interrupts - not really necessary with arduino } void loop() { //Turn on the LED if the effect is ON. if (digitalRead(FOOTSWITCH)) digitalWrite(LED, HIGH); else digitalWrite(LED, LOW); //nothing more here, all happens in the Timer 1 interruption. } ISR(TIMER1_CAPT_vect) //Timer 1 interruption. { // read the ADC input signal data: 2 bytes Low and High. ADC_low = ADCL; // Low byte need to be fetched first ADC_high = ADCH; //construct the input sumple summing the ADC low and high byte. input = ((ADC_high << 8) | ADC_low) + 0x8000; // make a signed 16b value // The push-buttons are checked now: counter++; //to save resources, the push-buttons are checked every 100 times. if(counter==100) { counter=0; if (!digitalRead(PUSHBUTTON_1)) { if (vol_variable<1024) vol_variable=vol_variable+1; //increase the vol } if (!digitalRead(PUSHBUTTON_2)) { if (vol_variable>0) vol_variable=vol_variable-1; //decrease vol } } //the amplitude of the signal is modified following the vol_variableusing the Arduino map fucntion input = map(input, 0, 1024, 0, vol_variable); //write the PWM output signal OCR1AL = ((input + 0x8000) >> 8); // convert to unsigned, send out high byte OCR1BL = input; // send out low byte }
pedalSHIELD UNO Hardware Design.
The complete project is Open Source Hardware, the design was done using KiCad, an open-source GNU free of charge electronic design CAD tool. All the project files, schematics, and bill of materials are public. The circuit can be broken down into 5 simpler blocks: Power Supply, Input Stage, Output Stage, User Interface and Arduino Connectors:
The functionality is simple; 1 op-amp will prepare the signal to be digitized and also 1 opamp will recover the signal from the Arduino UNO microcontroller. One ADCs is used to read the guitar signal and two PWM signals are used to generate the output signal.
- Input Stage: The guitar signal is amplified for better acquisition by the first op-amp which follows the MicroAmp guitar pedal design. The trimmer VR1 adjusts the gain of this amplifier from 1 to 21, so the guitar level can be optimized. The signal pass through 3 low pass filters (formed by R3&C2, R5&C4, R6&C5) that will remove the excess of high harmonics that can create aliasing during the ADC signal acquisition (fc=5KHz).
- Output State: Uses a Sallen & Key 3rd order low pass filter which removes harmonics above 5KHz. Two PWM signals are used in parallel improving the bit resolution (2x8bits). If you want to read more about the PWM audio generation read the forum topic dedicated to the PWM configuration options. There is a fantastic research done by OpenMusic Labs referring to this topic.
- Power Supply: The pedal uses the +5V from Arduino Uno to feed the rail-to-rail operational amplifier and achieve design simplicity and maximum signal swing without clipping. A resistor divider R7&R8 generates 2.5V for virtual ground and the cap C6 remove ripple on the power line.
- User Interface: The player can use 2 configurable push-buttons, 1 configurable toggle switch, 3PDT true-bypass footswitch, and a programmable LED.
- Arduino Uno Connectors: pin headers will link the shield with Arduino Uno transferring the signals and power supply.
There are 2 options in the online shop:
- Order only the PCB. It uses easy-to-find standard components and you can build the kit yourself. The bill of materials is public with all the references and the Mouser part numbers.
- Order the Full Kit: This kit includes the PCB, cover and all the components to build pedalSHIELD at home (you just need to add the Arduino UNO board).
All the transactions are done through PayPal for maximum security (credit card also accepted).
If you have any question, contact us.
The components are easy-to-find through-hole parts with the minimum number of references:
pedalSHIELD UNO Bill of Materials. | ||||
Reference | Qty | Value | Description | Mouser Reference |
Capacitors | ||||
C5,C2, C7, C8, C9 | 5 | 6.8n | ceramic cap | SR211C682MARTR1 |
C3, C6, C10 | 3 | 4.7u | electrolytic cap | ECE-A1EKA4R7 |
C1, C11 | 2 | 100n | ceramic cap | SR211C104KARTR1 |
C4 | 1 | 270p | ceramic cap | D271K20Y5PH63L6R |
Resistors | ||||
R12,R13, R10, R9, R6, R4, R3 | 7 | 4.7K | Resistor, 1%,1/4W | MFR-25FRF52-4K7 |
R5, R7, R8, | 3 | 100K | Resistor, 1%,1/4W | MFR-25FRF52-100K |
R1, R2 | 2 | 1M | Resistor, 1%,1/4W | MFR-25FRF52-1M |
R11 | 1 | 1M2 | Resistor, 1%,1/4W | MFR-25FRF52-1M2 |
Others | ||||
RV1 | 1 | 500K | resistor trimmer | 3319W-1-504 |
D1 | 1 | Led 3mm blue | blue led 3mm | SSL-LX3044USBC |
U1 | 1 | TL972 pdip-8 | op-amp rail-to-rail | 595-TL972IP |
IC Socket | 1 | dip 8 socket | socket dor dip8 | 1-2199298-2 |
SW1 | 1 | 3DPT footswitch | 3PDT footsitch | 107-SF17020F-32-21RL |
SW2 | 1 | Toggle switch | SPDT toogle switch | 612-100-A1111 |
SW3, SW4 | 2 | Pushbutton | off-on pushbutton | 103-1013-EVX |
Conn1,2,3,4 | 1 | 40 pin header | 2.54 pitch pin header | 710-61304011121 |
J1, J2 | 2 | 1/4 Jack audio | stereo 6.35mm jack | NMJ6HCD2 |
Frequently Asked Questions (FAQ):
What is Arduino Uno / Genuino UNO?
- Arduino UNO is a single-board microcontroller to make using electronics in multidisciplinary projects more accessible. The hardware and software are open-source.
Where can I buy Arduino UNO board?
- All major suppliers like Mouser, element-14, Digikey, RS-Online have it in their catalog and also you can find it on eBay, Amazon and physical electronic shops like Maplin or Radioshark.
Is pedalSHIELD Uno compatible with all Arduino boards?
- No, only with Arduino Uno and Genuino UNO. We also have an upgraded pedalSHIELD DUE that works with Arduino DUE.
Is pedalSHIELD UNO suitable for bass players?
- Yes, but you need to swap 1 capacitor (C1) from 0.1uF to 0.47uF, allowing lower frequencies into the circuit, that is all.
Can I plug headphones directly into pedalSHIELD UNO?
- No, pedalSHIELD UNO is not an amplifier. It needs to be plugged into a guitar amplifier or to a multi-effects (Line 6 pods, etc..).
Thanks for reading, all feedback is appreciated
Some Rights Reserved, you are free to copy, share, remix and use all material.
Trademarks, brand names and logos are the property of their respective owners.