diff --git a/Flying_Fader_Arduino/.feather_rp2040.test.only b/Flying_Fader_Arduino/.feather_rp2040.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/Flying_Fader_Arduino/Flying_Fader_Arduino.ino b/Flying_Fader_Arduino/Flying_Fader_Arduino.ino new file mode 100644 index 000000000..4bcc024c4 --- /dev/null +++ b/Flying_Fader_Arduino/Flying_Fader_Arduino.ino @@ -0,0 +1,125 @@ +// SPDX-FileCopyrightText: 2022 John Park for Adafruit Industries +// SPDX-License-Identifier: MIT +// Motorized fader demo +// capsense implementation by @todbot / Tod Kurt + +#include + +const int pwmA = 12; // motor pins +const int pwmB = 11; + +const int fader = A0; // fader pin +int fader_pos = 0; +float filter_amt = 0.75; +float speed = 1.0; + +int saved_positions[] = { 230, 180, 120, 60 } ; +int current_saved_position = 1 ; + +const int num_buttons = 4; +const int button_pins[num_buttons] = {10, 9, 8, 7}; // feather silk != arduino pin number. 10, 9, 6, 5 on board +Bounce buttons[num_buttons]; +bool motor_release_state = false; // to handle motor release + +class FakeyTouch +{ + public: + FakeyTouch( int apin, int athreshold = 300 ) { // tune the threshold value to your hardware + pin = apin; + thold = athreshold; + } + void begin() { + baseline = readTouch(); + } + int readTouch() { + pinMode(pin, OUTPUT); + digitalWrite(pin,HIGH); + pinMode(pin,INPUT); + int i = 0; + while( digitalRead(pin) ) { i++; } + return i; + } + bool isTouched() { + return (readTouch() > baseline + thold); + } + int baseline; + int thold; + int pin; +}; + +const int touchpin_F = A3; +FakeyTouch touchF = FakeyTouch( touchpin_F ); + + +void setup() { + Serial.begin(9600); + delay(1000); + pinMode (pwmA, OUTPUT); + pinMode (pwmB, OUTPUT); + analogWriteFreq(100); + analogWrite(pwmA, 0); + analogWrite(pwmB, 0); + for (uint8_t i=0; i< num_buttons; i++){ + buttons[i].attach( button_pins[i], INPUT_PULLUP); + } +} + +int last_fader_pos = fader_pos; + + +void loop() { + for (uint8_t i=0; i< num_buttons; i++){ + buttons[i].update(); + if( buttons[i].fell()) { + current_saved_position = i; + go_to_position(saved_positions[current_saved_position]); + } + } + + if( touchF.isTouched()){ + motor_release_state = true; + analogWrite(pwmA, 0); + analogWrite(pwmB, 0); + delay(60); + } + else{ + motor_release_state = false; + go_to_position(saved_positions[current_saved_position]); + } + + fader_pos = int( (filter_amt * last_fader_pos) + ( (1.0-filter_amt) * int(analogRead(fader) / 4 )) ); + if (abs(fader_pos - last_fader_pos) > 1) { + Serial.println(fader_pos); + if (motor_release_state==false){ + go_to_position(saved_positions[current_saved_position]); + } + last_fader_pos = fader_pos; + } +} + +void go_to_position(int new_position) { + fader_pos = int(analogRead(fader) / 4); + while (abs(fader_pos - new_position) > 4) { + if (fader_pos > new_position) { + speed = 2.25 * abs(fader_pos - new_position) / 256 + 0.2; + speed = constrain(speed, -1.0, 1.0); + if (speed > 0.0) { + analogWrite(pwmA, 255); + analogWrite(pwmB, 0); + } + } + if (fader_pos < new_position) { + speed = 2.25 * abs(fader_pos - new_position) / 256 - 0.2; + speed = constrain(speed, -1.0, 1.0); + if (speed > 0.0) { + analogWrite(pwmA, 0); + analogWrite(pwmB, 255); + } + } + + fader_pos = int(analogRead(fader) / 4); + + } + analogWrite(pwmA, 0); + analogWrite(pwmB, 0); +}