This is the code that i am using in the second demo video, demonstrating the rotary disks. This code may be still a mess, and there may be some stupid solutions, but so far it works.
I am not reading in all the touch sensors as for this example i only need a few.
For reading the touch sensors, i simply use the "touchRead()" operator that is working with Teensyduino (Teensy 3.0 and higher). This is working quite good, but I have to tell you, that the pin readings change drastically when i touch, for example, the housing of my laptop computer. I will try to make some changes and improve my design. I posted another project log entry on this topic.
The two switches change a mode that is represented by the first 4 LEDs. The higher the mode (LEDMode: 0, 1, 2, 3, 4), the slower the values change when disks are spun. So it decreases the sensitivity of the wheels, making the wheel movements more precise.
When both switches are pressed, a second mode (LED5Mode) is changed (0, 1), displayed by LED number 5.
If you wonder about all the Serial.print() operators at the end of the sketch, this is how the data is being sent to Processing (see Processing code).
// ***** wheelController Software *****
// ******** Jan Godde, 2015 ********
// ARDUINO SETTINGS FOR processingReceiveWheels SKETCH
// USING PHASE VOCODER IN PD IN soundWheel.pd SKETCH
#include <Encoder.h>
#include <Bounce.h>
#define ENCODER_OPTIMIZE_INTERRUPTS
#define REVOL 308 // resolution optimized: 4 x (77 black bars)
int LEDMode = 0;
int LED5Mode = 0;
int switch1last, switch2last;
int LEDState[5][5] = { {LOW, LOW, LOW, LOW, LOW}, {HIGH, LOW, LOW, LOW, LOW},
{LOW, HIGH, LOW, LOW, LOW},
{LOW, LOW, HIGH, LOW, LOW}, {LOW, LOW, LOW, HIGH, LOW} };
Encoder knobLeft(9, 10);
Encoder knobRight(11, 12);
Bounce switch1 = Bounce(2, 5); // (pin number, 5 ms debounce time)
Bounce switch2 = Bounce(3, 5); // switch 1: D2, switch2: D3
// int sensorPin[20] = { A7, A6, A14, A20, A10, A11, A15, A16, //fader - fsr - knobs
// 0, 1, 15, 16, 17, 18, 19, 22, 23, 25, 32, 33 }; //touchPins
int sensorPin[13] = { A7, A6, A14, A20, A10, A11, A15, A16, //fader - fsr - knobs
0, 33, 32, 1, 25}; // 3 touchPins & 2 wheelTouch
int ribbonPin[2] = {A0, A19};
int ribbonValue[2] = {0, 0};
int ribbonTouched[2] = {0, 0};
int LEDPin[5] = {4, 5, 6, 7, 8};
int outputValue[15]; //with wheel encoder at last two positions
int positionLeft = 0;
int positionRight = 0;
//int newLeft, newRight;
void setup() {
Serial.begin(57600);
pinMode(A14, INPUT_PULLUP);//fsr1
pinMode(A20, INPUT_PULLUP);//fsr2
pinMode(A0, INPUT_PULLUP);//ribbon1
pinMode(A19, INPUT_PULLUP);//ribbon2
pinMode(2, INPUT_PULLUP); //switch1
pinMode(3, INPUT_PULLUP); //switch2
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
}
void loop() {
LEDStateChange();
if (switch1.update()){
if(switch1.fallingEdge()) {
switch1last = 1;
LEDMode = mod((LEDMode-1),5);
if (switch2last == 1){
wheel2StateChange();
}
}
if(switch1.risingEdge()) {
switch1last = 0;
}
}
if (switch2.update()){
if(switch2.fallingEdge()) {
switch2last = 1;
LEDMode = mod((LEDMode+1),5);
if (switch1last == 1){
wheel2StateChange();
}
}
if(switch2.risingEdge()) {
switch2last = 0;
}
}
//Serial.print(switch1last);
//Serial.print(" ");
//Serial.println(switch2last);
// COLLECT SENSOR DATA:
for(int i = 0; i < 8; i++){
outputValue[i] = analogRead(sensorPin[i]);
}
for(int i = 8; i < 13; i++){
outputValue[i] = touchRead(sensorPin[i]);
}
ribbonRead();
int newLeft, newRight;
newLeft = knobLeft.read();
newRight = knobRight.read();
//newLeft = newLeft + 1;
//newRight = newRight + 2;
if (newLeft != positionLeft || newRight != positionRight) {
newLeft = mod(newLeft, (LEDMode+1)*REVOL);
newRight = mod(newRight, (LEDMode+1)*REVOL);
//knobLeft.write(0);
//knobRight.write(0);
positionLeft = newLeft;
positionRight = newRight;
}
//**************************//
for(int i = 0; i < 13; i++){
Serial.print(outputValue[i]); // fader, fsr, knobs, some touchpins
Serial.print(" ");
}
Serial.print(newLeft); // wheel position left
Serial.print(" ");
Serial.print(newRight); // wheel position right
Serial.print(" ");
Serial.print(LEDMode); // LED Mode (0 - 4)
Serial.print(" ");
Serial.print(LED5Mode); // fifth LED Mode (0, 1)
Serial.print(" ");
Serial.print(ribbonValue[0]); // ribbon1
Serial.print(" ");
Serial.print(ribbonValue[1]); // ribbon2
Serial.println(" ");
delay(5);
Serial.flush();
//**************************//
}
void ribbonRead() {
for (int i = 0; i < 2; i++) {
int readSensor = analogRead(ribbonPin[i]);
if (readSensor >= 950) {
ribbonTouched[i] = 0;
}
else if (readSensor < 950) {
ribbonTouched[i] = 1;
ribbonValue[i] = readSensor;
}
}
}
void LEDStateChange(){
digitalWrite(4, LEDState[LEDMode][0]);
digitalWrite(5, LEDState[LEDMode][1]);
digitalWrite(6, LEDState[LEDMode][2]);
digitalWrite(7, LEDState[LEDMode][3]);
}
void wheel2StateChange(){
if (LED5Mode == 0){
digitalWrite(8, HIGH);
LED5Mode = 1;
}
else if (LED5Mode == 1){
digitalWrite(8, LOW);
LED5Mode = 0;
}
}
int mod(int n, int x){ // MODULO function
return ((n%x)+x)%x;
}
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.