From ec3afd336c22a239bd3f24fae04d92fabbbf47ef Mon Sep 17 00:00:00 2001 From: Stefan Staub Date: Mon, 13 Apr 2020 12:42:52 +0200 Subject: [PATCH] Update faderwing.ino --- faderwing/faderwing.ino | 155 +++++++++++++++++++++++++--------------- 1 file changed, 98 insertions(+), 57 deletions(-) mode change 100755 => 100644 faderwing/faderwing.ino diff --git a/faderwing/faderwing.ino b/faderwing/faderwing.ino old mode 100755 new mode 100644 index 1fb16cb..8858fe3 --- a/faderwing/faderwing.ino +++ b/faderwing/faderwing.ino @@ -1,5 +1,5 @@ // Copyright (c) 2017 Electronic Theatre Controls, Inc., http://www.etcconnect.com -// Copyright (c) 2019 Stefan Staub +// Copyright (c) 2020 Stefan Staub // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -23,7 +23,7 @@ fader is a linear 10kOhm, from Bourns or ALPS and can be 45/60/100mm long put 10nF ceramic capitors between ground and fader levelers to prevent analog noise +5V to the top (single pin) of the fader (100%) -GND to button pin (2 pins, the center is normaly for the leveler) of the fader (0%) +GND to the center button pin (2 pins, the outer pin is normaly for the leveler) of the fader (0%) put 100nF ceramic capitors between ground and the input of the buttons */ @@ -40,6 +40,27 @@ put 100nF ceramic capitors between ground and the input of the buttons SLIPEncodedSerial SLIPSerial(Serial); #endif +// PINs setup +#define FADER_1_LEVELER A0 +#define FADER_1_FIRE_BUTTON 2 +#define FADER_1_STOP_BUTTON 8 +#define FADER_2_LEVELER A1 +#define FADER_2_FIRE_BUTTON 3 +#define FADER_2_STOP_BUTTON 9 +#define FADER_3_LEVELER A2 +#define FADER_3_FIRE_BUTTON 4 +#define FADER_3_STOP_BUTTON 10 +#define FADER_4_LEVELER A3 +#define FADER_4_FIRE_BUTTON 5 +#define FADER_4_STOP_BUTTON 11 +#define FADER_5_LEVELER A4 +#define FADER_5_FIRE_BUTTON 6 +#define FADER_5_STOP_BUTTON 12 +#define FADER_6_LEVELER A5 +#define FADER_6_FIRE_BUTTON 7 +#define FADER_6_STOP_BUTTON 13 + + // constants and macros #define SUBSCRIBE 1 #define UNSUBSCRIBE 0 @@ -50,16 +71,18 @@ put 100nF ceramic capitors between ground and the input of the buttons #define PING_AFTER_IDLE_INTERVAL 2500 #define TIMEOUT_AFTER_IDLE_INTERVAL 5000 -#define FADER_BANK 1 +#define FADER_BANK 1 +#define NUMBER_OF_FADERS 6 + +#define FADER_UPDATE_RATE_MS 40 // update each 40ms const int16_t THRESHOLD = 4; // Jitter threshold of the faders +uint32_t updateTime; + const String HANDSHAKE_QUERY = "ETCOSC?"; const String HANDSHAKE_REPLY = "OK"; const String PING_QUERY = "faderwing_hello"; - -const String EOS_INIT_FADERBANK = "/eos/fader/1/config/6"; // 6 faders - const String EOS_FADER = "/eos/fader"; // variables @@ -80,6 +103,7 @@ struct Fader { String analogPattern; String firePattern; String stopPattern; + uint32_t updateTime; } fader1, fader2, fader3, fader4, fader5, fader6; /** @@ -108,6 +132,23 @@ void issueFilters() { SLIPSerial.endPacket(); } +/** + * @brief initialize a fader bank + * + * @param bank number of the fader bank + * @param faders number of faders in this bank + */ +void initFaders(uint8_t bank, uint8_t faders) { + String faderInit = "/eos/fader/"; + faderInit += bank; + faderInit += "/config/"; + faderInit += faders; + OSCMessage faderBank(faderInit.c_str()); + SLIPSerial.beginPacket(); + faderBank.send(SLIPSerial); + SLIPSerial.endPacket(); + } + /** * @brief * Init the console, gives back a handshake reply @@ -124,10 +165,7 @@ void initEOS() { issueFilters(); // activate a fader bank - OSCMessage faderBank(EOS_INIT_FADERBANK.c_str()); - SLIPSerial.beginPacket(); - faderBank.send(SLIPSerial); - SLIPSerial.endPacket(); + initFaders(FADER_BANK, NUMBER_OF_FADERS); } /** @@ -176,6 +214,7 @@ void initFader(struct Fader* fader, uint8_t bank, uint8_t number, uint8_t analog fader->analogPattern = EOS_FADER + '/' + String(fader->bank) + '/' + String(fader->number); fader->firePattern = EOS_FADER + '/' + String(fader->bank) + '/' + String(fader->number) + "/fire"; fader->stopPattern = EOS_FADER + '/' + String(fader->bank) + '/' + String(fader->number) + "/stop"; + fader->updateTime = millis(); } /** @@ -184,53 +223,55 @@ void initFader(struct Fader* fader, uint8_t bank, uint8_t number, uint8_t analog * @param fader */ void updateFader(struct Fader* fader) { - int16_t raw = analogRead(fader->analogPin) >> 2; // reduce to 8 bit - int16_t current = THRESHOLD; - int16_t delta = raw - current; - if (delta <= -THRESHOLD) current = raw + THRESHOLD; - if (delta >= THRESHOLD) current = raw - THRESHOLD; - if (current != fader->analogLast) { - float value = ((current - THRESHOLD) * 1.0 / (255 - 2 * THRESHOLD)) / 1.0; // normalize to values between 0.0 and 1.0 - fader->analogLast = current; - - OSCMessage faderUpdate(fader->analogPattern.c_str()); - faderUpdate.add(value); - SLIPSerial.beginPacket(); - faderUpdate.send(SLIPSerial); - SLIPSerial.endPacket(); - } - - if((digitalRead(fader->firePin)) != fader->fireLast) { - OSCMessage fireUpdate(fader->firePattern.c_str()); - if(fader->fireLast == LOW) { - fader->fireLast = HIGH; - fireUpdate.add(EDGE_UP); - } - else { - fader->fireLast = LOW; - fireUpdate.add(EDGE_DOWN); + if((fader->updateTime + FADER_UPDATE_RATE_MS) < millis()) { + int16_t raw = analogRead(fader->analogPin) >> 2; // reduce to 8 bit + int16_t current = THRESHOLD; + int16_t delta = raw - current; + if (delta <= -THRESHOLD) current = raw + THRESHOLD; + if (delta >= THRESHOLD) current = raw - THRESHOLD; + if (current != fader->analogLast) { + float value = ((current - THRESHOLD) * 1.0 / (255 - 2 * THRESHOLD)) / 1.0; // normalize to values between 0.0 and 1.0 + fader->analogLast = current; + + OSCMessage faderUpdate(fader->analogPattern.c_str()); + faderUpdate.add(value); + SLIPSerial.beginPacket(); + faderUpdate.send(SLIPSerial); + SLIPSerial.endPacket(); } - SLIPSerial.beginPacket(); - fireUpdate.send(SLIPSerial); - SLIPSerial.endPacket(); - } - if((digitalRead(fader->stopPin)) != fader->stopLast) { - OSCMessage stopUpdate(fader->stopPattern.c_str()); - if(fader->stopLast == LOW) { - fader->stopLast = HIGH; - stopUpdate.add(EDGE_UP); + if((digitalRead(fader->firePin)) != fader->fireLast) { + OSCMessage fireUpdate(fader->firePattern.c_str()); + if(fader->fireLast == LOW) { + fader->fireLast = HIGH; + fireUpdate.add(EDGE_UP); + } + else { + fader->fireLast = LOW; + fireUpdate.add(EDGE_DOWN); + } + SLIPSerial.beginPacket(); + fireUpdate.send(SLIPSerial); + SLIPSerial.endPacket(); } - else { - fader->stopLast = LOW; - stopUpdate.add(EDGE_DOWN); + + if((digitalRead(fader->stopPin)) != fader->stopLast) { + OSCMessage stopUpdate(fader->stopPattern.c_str()); + if(fader->stopLast == LOW) { + fader->stopLast = HIGH; + stopUpdate.add(EDGE_UP); + } + else { + fader->stopLast = LOW; + stopUpdate.add(EDGE_DOWN); + } + SLIPSerial.beginPacket(); + stopUpdate.send(SLIPSerial); + SLIPSerial.endPacket(); } - SLIPSerial.beginPacket(); - stopUpdate.send(SLIPSerial); - SLIPSerial.endPacket(); + fader->updateTime = millis(); } } - /** * @brief setup arduino * @@ -248,12 +289,12 @@ void setup() { initEOS(); // init of hardware elements - initFader(&fader1, FADER_BANK, 1, A0, 2, 8); - initFader(&fader2, FADER_BANK, 2, A1, 3, 9); - initFader(&fader3, FADER_BANK, 3, A2, 4, 10); - initFader(&fader4, FADER_BANK, 4, A3, 5, 11); - initFader(&fader5, FADER_BANK, 5, A4, 6, 12); - initFader(&fader6, FADER_BANK, 6, A5, 7, 13); + initFader(&fader1, FADER_BANK, 1, FADER_1_LEVELER, FADER_1_FIRE_BUTTON, FADER_1_STOP_BUTTON); + initFader(&fader2, FADER_BANK, 2, FADER_2_LEVELER, FADER_2_FIRE_BUTTON, FADER_2_STOP_BUTTON); + initFader(&fader3, FADER_BANK, 3, FADER_3_LEVELER, FADER_3_FIRE_BUTTON, FADER_3_STOP_BUTTON); + initFader(&fader4, FADER_BANK, 4, FADER_4_LEVELER, FADER_4_FIRE_BUTTON, FADER_4_STOP_BUTTON); + initFader(&fader5, FADER_BANK, 5, FADER_5_LEVELER, FADER_5_FIRE_BUTTON, FADER_5_STOP_BUTTON); + initFader(&fader6, FADER_BANK, 6, FADER_6_LEVELER, FADER_6_FIRE_BUTTON, FADER_6_STOP_BUTTON); } /**