/ Flying_Fader_Arduino / Flying_Fader_Arduino.ino
Flying_Fader_Arduino.ino
1 // SPDX-FileCopyrightText: 2022 John Park for Adafruit Industries 2 // SPDX-License-Identifier: MIT 3 // Motorized fader demo 4 // capsense implementation by @todbot / Tod Kurt 5 6 #include <Bounce2.h> 7 8 const int pwmA = 12; // motor pins 9 const int pwmB = 11; 10 11 const int fader = A0; // fader pin 12 int fader_pos = 0; 13 float filter_amt = 0.75; 14 float speed = 1.0; 15 16 int saved_positions[] = { 230, 180, 120, 60 } ; 17 int current_saved_position = 1 ; 18 19 const int num_buttons = 4; 20 const int button_pins[num_buttons] = {10, 9, 8, 7}; // feather silk != arduino pin number. 10, 9, 6, 5 on board 21 Bounce buttons[num_buttons]; 22 bool motor_release_state = false; // to handle motor release 23 24 class FakeyTouch 25 { 26 public: 27 FakeyTouch( int apin, int athreshold = 300 ) { // tune the threshold value to your hardware 28 pin = apin; 29 thold = athreshold; 30 } 31 void begin() { 32 baseline = readTouch(); 33 } 34 int readTouch() { 35 pinMode(pin, OUTPUT); 36 digitalWrite(pin,HIGH); 37 pinMode(pin,INPUT); 38 int i = 0; 39 while( digitalRead(pin) ) { i++; } 40 return i; 41 } 42 bool isTouched() { 43 return (readTouch() > baseline + thold); 44 } 45 int baseline; 46 int thold; 47 int pin; 48 }; 49 50 const int touchpin_F = A3; 51 FakeyTouch touchF = FakeyTouch( touchpin_F ); 52 53 54 void setup() { 55 Serial.begin(9600); 56 delay(1000); 57 pinMode (pwmA, OUTPUT); 58 pinMode (pwmB, OUTPUT); 59 analogWriteFreq(100); 60 analogWrite(pwmA, 0); 61 analogWrite(pwmB, 0); 62 for (uint8_t i=0; i< num_buttons; i++){ 63 buttons[i].attach( button_pins[i], INPUT_PULLUP); 64 } 65 } 66 67 int last_fader_pos = fader_pos; 68 69 70 void loop() { 71 for (uint8_t i=0; i< num_buttons; i++){ 72 buttons[i].update(); 73 if( buttons[i].fell()) { 74 current_saved_position = i; 75 go_to_position(saved_positions[current_saved_position]); 76 } 77 } 78 79 if( touchF.isTouched()){ 80 motor_release_state = true; 81 analogWrite(pwmA, 0); 82 analogWrite(pwmB, 0); 83 delay(60); 84 } 85 else{ 86 motor_release_state = false; 87 go_to_position(saved_positions[current_saved_position]); 88 } 89 90 fader_pos = int( (filter_amt * last_fader_pos) + ( (1.0-filter_amt) * int(analogRead(fader) / 4 )) ); 91 if (abs(fader_pos - last_fader_pos) > 1) { 92 Serial.println(fader_pos); 93 if (motor_release_state==false){ 94 go_to_position(saved_positions[current_saved_position]); 95 } 96 last_fader_pos = fader_pos; 97 } 98 } 99 100 void go_to_position(int new_position) { 101 fader_pos = int(analogRead(fader) / 4); 102 while (abs(fader_pos - new_position) > 4) { 103 if (fader_pos > new_position) { 104 speed = 2.25 * abs(fader_pos - new_position) / 256 + 0.2; 105 speed = constrain(speed, -1.0, 1.0); 106 if (speed > 0.0) { 107 analogWrite(pwmA, 255); 108 analogWrite(pwmB, 0); 109 } 110 } 111 if (fader_pos < new_position) { 112 speed = 2.25 * abs(fader_pos - new_position) / 256 - 0.2; 113 speed = constrain(speed, -1.0, 1.0); 114 if (speed > 0.0) { 115 analogWrite(pwmA, 0); 116 analogWrite(pwmB, 255); 117 } 118 } 119 120 fader_pos = int(analogRead(fader) / 4); 121 122 } 123 analogWrite(pwmA, 0); 124 analogWrite(pwmB, 0); 125 }