After the midi episode, it was time to write the code to get the pedal press signals and control the LEDs for feedback.
The pedal switches use what is called a resistor ladder: each switch is linked to a particular resistor, in series, and in theory, reading the resistor value at the end of the wire lets you guess which pedal was pressed. This particular board is wired in such a way that if you press more than one pedal, only the lowest value registers. This prevents bizarre values from being transmitted to the output wire. But, the engineers at Line 6 decide that ONE particular pair of pedals could be pressed and a distinct resistor value should be passed to the output (pedals associated to switches 6 and 7).
Measuring the values was easy with a multimeter. I measured between ground and pin 10 on the 12 pin connector. I wrote the values on the board. Interestingly, pin 9 is also showing the readings, but with 220 Omh added to the readings. Although, sometimes, it’s not 220 Omh but a subtraction! There must be a purpose to this, but it eludes me.
With a bit of trial and error, using a potentiometer to vary the pull up resistor value, I was able to reliably read the values of the resistance associated to each pedal (and the combined press of switches 6 & 7) and write a simple test sketch for the Arduino.
The schematic for the Arduino-Pedal board connection is as follows:
The 9 other pins on the connector are linked directly to each of the nine LEDs on the switch board. Each LED has a resistor in series to control current. I was then fairly straightforward to write the code to turn each LED when a particular pedal press is detected.
/*Line 6 floor board Connect the resistor ladder from the switches (pedals) to an analog pin and read the resistor value Connect the 9 LEDs from the board to separate digital pins Robert Turenne 2011/04/4 */ int led1=11; int led2=12; int led3=3; int led4=4; int led5=5; int led6=6; int led7=7; int led8=8; int led9=9; int led10=10; int swresist=0; int resistValue; void setup() { Serial.begin(9600); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(led4, OUTPUT); pinMode(led5, OUTPUT); pinMode(led6, OUTPUT); pinMode(led7, OUTPUT); pinMode(led8, OUTPUT); pinMode(led9, OUTPUT); pinMode(led10,OUTPUT); } void loop() { //process resistor lader value resistValue = analogRead(swresist); // Serial.println(resistValue); if (resistValue < 10) digitalWrite(led10, HIGH); else digitalWrite(led10, LOW); if (resistValue >= 35 & resistValue < 50) digitalWrite(led2, HIGH); else digitalWrite(led2, LOW); if (resistValue >= 142 & resistValue < 155) digitalWrite(led3, HIGH); else digitalWrite(led3, LOW); if (resistValue >= 205 & resistValue < 215) digitalWrite(led4, HIGH); else digitalWrite(led4, LOW); if (resistValue >= 270 & resistValue < 280) digitalWrite(led5, HIGH); else digitalWrite(led5, LOW); if (resistValue >= 350 & resistValue < 360) digitalWrite(led6, HIGH); else digitalWrite(led6, LOW); if (resistValue >= 575 & resistValue < 585) digitalWrite(led1, HIGH); else digitalWrite(led1, LOW); if (resistValue >= 640 & resistValue < 650) digitalWrite(led7, HIGH); else digitalWrite(led7, LOW); if (resistValue >= 710 & resistValue < 720) digitalWrite(led8, HIGH); else digitalWrite(led8, LOW); }
The code above is for testing purposes, and it worked! Any switch press was decoded and linked to a LED lighting. The values in the “table” were measured using a simple sketch from the standard Arduino environment (Analog Input) and then printed on the terminal window. I chose resistor values, by trial and error, until the readings were spread as much as possible. The values range from 0 to 705, with 966 when no switch is pressed (18.5 K Omh) out of 1024 possible values. I adjusted each “if” statement to allow for a little fluctuation in the reading. Keeping this interval small gives better timing on switch presses.
The final version of the sketch will use arrays and better logic, with debouncing on the switch presses. This was enough for testing “my” logic.
Leave a Reply