Skip to content

Commit

Permalink
Update faderwing.ino
Browse files Browse the repository at this point in the history
  • Loading branch information
sstaub committed Apr 13, 2020
1 parent 28809b6 commit ec3afd3
Showing 1 changed file with 98 additions and 57 deletions.
155 changes: 98 additions & 57 deletions faderwing/faderwing.ino
100755 → 100644
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
*/
Expand All @@ -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
Expand All @@ -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
Expand All @@ -80,6 +103,7 @@ struct Fader {
String analogPattern;
String firePattern;
String stopPattern;
uint32_t updateTime;
} fader1, fader2, fader3, fader4, fader5, fader6;

/**
Expand Down Expand Up @@ -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
Expand All @@ -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);
}

/**
Expand Down Expand Up @@ -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();
}

/**
Expand All @@ -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
*
Expand All @@ -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);
}

/**
Expand Down

0 comments on commit ec3afd3

Please sign in to comment.