Arduino Stepper

/*

Sketch for European Style Piston Sequencer at St. John the Divine

==========================

The four manual Casavant organ at St. John's has a multi-level Syndyne combination action. It is 24 years old,

and although it continues to function well, it lacks the sequencer capabilities built into the newer systems.

Hence the need for adding this external sequencer. This is a European style sequencer that steps through

the general pistons in sequence. On the continent, this is referred to as a stepper.

The combination action has allowance for up to 16 generals of which only 15 are used. The corresponding pistons

are located in three groups of five, below the Antiphonal, Swell and Great keyboards.

A two digit 7 segment display indicates the count (1 - 15) of the last general piston activated by the sequencer.

Zero is displayed only after startup only. After advancing the count beyond 15, the sequencer advances the memory

level by one and returns the piston counter to 1. The 16th relay performs the memory advance.

In this version, a control line connected to pin 59 causes the Memory Controller Switch to briefly switch to the 64 step

electronic controller every time a general piston is activated, after which control is returned to the 12 step rotary controller.

On the piston rail are two sequencer pistons: [<] and [>]. (both pistons are duplicated by toe studs.)

The [>] piston advances the count on the display by one and operates the general piston corresponding to that count.

The [<] piston reduces the count by one and also operates the general piston corresponding to that new count.

The pistons are operated by briefly closing one of the 15 relays on relay output boards.

Equipment: Arduino Mega, Dual seven segment display, and two 8 relay driver boards

created 2020 Jan 6

modified 2020 Aug 11

by John Coenraads

*/

// Declarations==========================================

byte pistonNumber; //general piston currently active

//activate relays

void activate1() { switchOn(); digitalWrite (52, LOW); debounce(); digitalWrite (52, HIGH); switchOff();}

void activate2() { switchOn(); digitalWrite (50, LOW); debounce(); digitalWrite (50, HIGH); switchOff();}

void activate3() { switchOn(); digitalWrite (48, LOW); debounce(); digitalWrite (48, HIGH); switchOff();}

void activate4() { switchOn(); digitalWrite (46, LOW); debounce(); digitalWrite (46, HIGH); switchOff();}

void activate5() { switchOn(); digitalWrite (44, LOW); debounce(); digitalWrite (44, HIGH); switchOff();}

void activate6() { switchOn(); digitalWrite (42, LOW); debounce(); digitalWrite (42, HIGH); switchOff();}

void activate7() { switchOn(); digitalWrite (40, LOW); debounce(); digitalWrite (40, HIGH); switchOff();}

void activate8() { switchOn(); digitalWrite (38, LOW); debounce(); digitalWrite (38, HIGH); switchOff();}

void activate9() { switchOn(); digitalWrite (36, LOW); debounce(); digitalWrite (36, HIGH); switchOff();}

void activate10() { switchOn(); digitalWrite (34, LOW); debounce(); digitalWrite (34, HIGH); switchOff();}

void activate11() { switchOn(); digitalWrite (32, LOW); debounce(); digitalWrite (32, HIGH); switchOff();}

void activate12() { switchOn(); digitalWrite (30, LOW); debounce(); digitalWrite (30, HIGH); switchOff();}

void activate13() { switchOn(); digitalWrite (28, LOW); debounce(); digitalWrite (28, HIGH); switchOff();}

void activate14() { switchOn(); digitalWrite (26, LOW); debounce(); digitalWrite (26, HIGH); switchOff();}

void activate15() { switchOn(); digitalWrite (24, LOW); debounce(); digitalWrite (24, HIGH); switchOff();}

void activateMemAdv() {digitalWrite (22,LOW); debounce(); digitalWrite (22, HIGH);} //Memory Advance relay (16)

void debounce() {delay (90); while ((digitalRead(57) == LOW) || (digitalRead(58) == LOW)){}; delay (90);}

void switchOn() { digitalWrite (59, HIGH); delay (10);} //Switch to 64 step electronic controller

void switchOff() { digitalWrite (59, LOW); delay (10);} //Switch back to 12 step rotary controller

//define segments to be lit for 0 to 15

void display0() {digitalWrite (62, LOW); digitalWrite (63, LOW); digitalWrite (64, LOW); digitalWrite (65, LOW);

digitalWrite(66, LOW);digitalWrite(67, LOW); digitalWrite(68, HIGH);digitalWrite(60, HIGH);digitalWrite (61, HIGH);}

void display1() {digitalWrite (62, HIGH); digitalWrite (63, LOW); digitalWrite (64, LOW); digitalWrite (65, HIGH);

digitalWrite(66, HIGH);digitalWrite(67, HIGH); digitalWrite(68, HIGH);digitalWrite(60, HIGH);digitalWrite (61, HIGH);}

void display2() {digitalWrite (62, LOW); digitalWrite (63, LOW); digitalWrite (64, HIGH); digitalWrite (65, LOW);

digitalWrite(66, LOW);digitalWrite(67, HIGH); digitalWrite(68, LOW);digitalWrite(60, HIGH);digitalWrite (61, HIGH);}

void display3() {digitalWrite (62, LOW); digitalWrite (63, LOW); digitalWrite (64, LOW); digitalWrite (65, LOW);

digitalWrite(66, HIGH);digitalWrite(67, HIGH); digitalWrite(68, LOW);digitalWrite(60, HIGH);digitalWrite (61, HIGH);}

void display4() {digitalWrite (62, HIGH); digitalWrite (63, LOW); digitalWrite (64, LOW); digitalWrite (65, HIGH);

digitalWrite(66, HIGH);digitalWrite(67, LOW); digitalWrite(68, LOW);digitalWrite(60, HIGH);digitalWrite (61, HIGH);}

void display5() {digitalWrite (62, LOW); digitalWrite (63, HIGH); digitalWrite (64, LOW); digitalWrite (65, LOW);

digitalWrite(66, HIGH);digitalWrite(67, LOW); digitalWrite(68, LOW);digitalWrite(60, HIGH);digitalWrite (61, HIGH);}

void display6() {digitalWrite (62, HIGH); digitalWrite (63, HIGH); digitalWrite (64, LOW); digitalWrite (65, LOW);

digitalWrite(66, LOW);digitalWrite(67, LOW); digitalWrite(68, LOW);digitalWrite(60, HIGH);digitalWrite (61, HIGH);}

void display7() {digitalWrite (62, LOW); digitalWrite (63, LOW); digitalWrite (64, LOW); digitalWrite (65, HIGH);

digitalWrite(66, HIGH);digitalWrite(67, HIGH); digitalWrite(68, HIGH);digitalWrite(60, HIGH);digitalWrite (61, HIGH);}

void display8() {digitalWrite (62, LOW); digitalWrite (63, LOW); digitalWrite (64, LOW); digitalWrite (65, LOW);

digitalWrite(66, LOW);digitalWrite(67, LOW); digitalWrite(68, LOW);digitalWrite(60, HIGH);digitalWrite (61, HIGH);}

void display9() {digitalWrite (62, LOW); digitalWrite (63, LOW); digitalWrite (64, LOW); digitalWrite (65, HIGH);

digitalWrite(66, HIGH);digitalWrite(67, LOW); digitalWrite(68, LOW);digitalWrite(60, HIGH);digitalWrite (61, HIGH);}

void display10() {digitalWrite (62, LOW); digitalWrite (63, LOW); digitalWrite (64, LOW); digitalWrite (65, LOW);

digitalWrite(66, LOW);digitalWrite(67, LOW); digitalWrite(68, HIGH);digitalWrite(60, LOW);digitalWrite (61, LOW);}

void display11() {digitalWrite (62, HIGH); digitalWrite (63, LOW); digitalWrite (64, LOW); digitalWrite (65, HIGH);

digitalWrite(66, HIGH);digitalWrite(67, HIGH); digitalWrite(68, HIGH);digitalWrite(60, LOW);digitalWrite (61, LOW);}

void display12() {digitalWrite (62, LOW); digitalWrite (63, LOW); digitalWrite (64, HIGH); digitalWrite (65, LOW);

digitalWrite(66, LOW);digitalWrite(67, HIGH); digitalWrite(68, LOW);digitalWrite(60, LOW);digitalWrite (61, LOW);}

void display13() {digitalWrite (62, LOW); digitalWrite (63, LOW); digitalWrite (64, LOW); digitalWrite (65, LOW);

digitalWrite(66, HIGH);digitalWrite(67, HIGH); digitalWrite(68, LOW);digitalWrite(60, LOW);digitalWrite (61, LOW);}

void display14() {digitalWrite (62, HIGH); digitalWrite (63, LOW); digitalWrite (64, LOW); digitalWrite (65, HIGH);

digitalWrite(66, HIGH);digitalWrite(67, LOW); digitalWrite(68, LOW);digitalWrite(60, LOW);digitalWrite (61, LOW);}

void display15() {digitalWrite (62, LOW); digitalWrite (63, HIGH); digitalWrite (64, LOW); digitalWrite (65, LOW);

digitalWrite(66, HIGH);digitalWrite(67, LOW); digitalWrite(68, LOW);digitalWrite(60, LOW);digitalWrite (61, LOW);}

//Initialize =========================================================

void setup ()

{

pistonNumber = 0;

display0();

// Initialize pins 60 through 68 for outputs to LED display.

pinMode (60, OUTPUT); pinMode (61, OUTPUT); pinMode (62, OUTPUT);

pinMode (63, OUTPUT); pinMode (64, OUTPUT); pinMode (65, OUTPUT);

pinMode (66, OUTPUT); pinMode (67, OUTPUT); pinMode (68, OUTPUT);

// Initialize pins 52, 50, .... 22 for outputs to relay boards.

pinMode (52, OUTPUT); pinMode (50, OUTPUT); pinMode (48, OUTPUT); pinMode (46, OUTPUT);

pinMode (44, OUTPUT); pinMode (42, OUTPUT); pinMode (40, OUTPUT); pinMode (38, OUTPUT);

pinMode (36, OUTPUT); pinMode (34, OUTPUT); pinMode (32, OUTPUT); pinMode (30, OUTPUT);

pinMode (28, OUTPUT); pinMode (26, OUTPUT); pinMode (24, OUTPUT); pinMode (22, OUTPUT);

// Initialize pins 52, 50, .... 22 for outputs to HIGH

digitalWrite (52, HIGH); digitalWrite (50, HIGH); digitalWrite (48, HIGH); digitalWrite (46, HIGH);

digitalWrite (44, HIGH); digitalWrite (42, HIGH); digitalWrite (40, HIGH); digitalWrite (38, HIGH);

digitalWrite (36, HIGH); digitalWrite (34, HIGH); digitalWrite (32, HIGH); digitalWrite (30, HIGH);

digitalWrite (28, HIGH); digitalWrite (26, HIGH); digitalWrite (24, HIGH); digitalWrite (22, HIGH);

//Initialize Memory Swap Line for Output

pinMode (59, OUTPUT);

digitalWrite (59, LOW); // LOW means 12 step rotary unit in control

//Initialize Stepper UP (57), and Stepper DN (58) for Input

pinMode (57, INPUT_PULLUP);

pinMode (58, INPUT_PULLUP);

//Initialize inputs for pistons on pins 53, 51, ...,25

pinMode (53, INPUT_PULLUP); pinMode (51, INPUT_PULLUP); pinMode (49, INPUT_PULLUP); pinMode (47, INPUT_PULLUP);

pinMode (45, INPUT_PULLUP); pinMode (43, INPUT_PULLUP); pinMode (41, INPUT_PULLUP); pinMode (39, INPUT_PULLUP);

pinMode (37, INPUT_PULLUP); pinMode (35, INPUT_PULLUP); pinMode (33, INPUT_PULLUP); pinMode (31, INPUT_PULLUP);

pinMode (29, INPUT_PULLUP); pinMode (27, INPUT_PULLUP); pinMode (25, INPUT_PULLUP);

}

//Main Loop ===========================================================

void loop()

{

//respond to piston input

if (digitalRead(53) == LOW) {pistonNumber = 1; display1(); activate1();delay (200);}

if (digitalRead(51) == LOW) {pistonNumber = 2; display2(); activate2();delay (200);}

if (digitalRead(49) == LOW) {pistonNumber = 3; display3(); activate3();delay (200);}

if (digitalRead(47) == LOW) {pistonNumber = 4; display4(); activate4();delay (200);}

if (digitalRead(45) == LOW) {pistonNumber = 5; display5(); activate5();delay (200);}

if (digitalRead(43) == LOW) {pistonNumber = 6; display6(); activate6();delay (200);}

if (digitalRead(41) == LOW) {pistonNumber = 7; display7(); activate7();delay (200);}

if (digitalRead(39) == LOW) {pistonNumber = 8; display8(); activate8();delay (200);}

if (digitalRead(37) == LOW) {pistonNumber = 9; display9(); activate9();delay (200);}

if (digitalRead(35) == LOW) {pistonNumber = 10; display10(); activate10();delay (200);}

if (digitalRead(33) == LOW) {pistonNumber = 11; display11(); activate11();delay (200);}

if (digitalRead(31) == LOW) {pistonNumber = 12; display12(); activate12();delay (200);}

if (digitalRead(29) == LOW) {pistonNumber = 13; display13(); activate13();delay (200);}

if (digitalRead(27) == LOW) {pistonNumber = 14; display14(); activate14();delay (200);}

if (digitalRead(25) == LOW) {pistonNumber = 15; display15(); activate15();delay (200);}

//response to UP stepper

if ((digitalRead(57) == LOW) && (pistonNumber == 0)) {display1(); pistonNumber = 1; activate1();}

if ((digitalRead(57) == LOW) && (pistonNumber == 1)) {display2(); pistonNumber = 2; activate2();}

if ((digitalRead(57) == LOW) && (pistonNumber == 2)) {display3(); pistonNumber = 3; activate3();}

if ((digitalRead(57) == LOW) && (pistonNumber == 3)) {display4(); pistonNumber = 4; activate4();}

if ((digitalRead(57) == LOW) && (pistonNumber == 4)) {display5(); pistonNumber = 5; activate5();}

if ((digitalRead(57) == LOW) && (pistonNumber == 5)) {display6(); pistonNumber = 6; activate6();}

if ((digitalRead(57) == LOW) && (pistonNumber == 6)) {display7(); pistonNumber = 7; activate7();}

if ((digitalRead(57) == LOW) && (pistonNumber == 7)) {display8(); pistonNumber = 8; activate8();}

if ((digitalRead(57) == LOW) && (pistonNumber == 8)) {display9(); pistonNumber = 9; activate9();}

if ((digitalRead(57) == LOW) && (pistonNumber == 9)) {display10(); pistonNumber = 10; activate10();}

if ((digitalRead(57) == LOW) && (pistonNumber == 10)) {display11(); pistonNumber = 11; activate11();}

if ((digitalRead(57) == LOW) && (pistonNumber == 11)) {display12(); pistonNumber = 12; activate12();}

if ((digitalRead(57) == LOW) && (pistonNumber == 12)) {display13(); pistonNumber = 13; activate13();}

if ((digitalRead(57) == LOW) && (pistonNumber == 13)) {display14(); pistonNumber = 14; activate14();}

if ((digitalRead(57) == LOW) && (pistonNumber == 14)) {display15(); pistonNumber = 15; activate15();}

if ((digitalRead(57) == LOW) && (pistonNumber == 15)) {display1(); pistonNumber = 1; activateMemAdv();activate1();}

//response to DN stepper

if ((digitalRead(58) == LOW) && (pistonNumber == 0)) {display1(); pistonNumber = 0; activate1();}

if ((digitalRead(58) == LOW) && (pistonNumber == 1)) {display1(); pistonNumber = 1; activate1();}

if ((digitalRead(58) == LOW) && (pistonNumber == 2)) {display1(); pistonNumber = 1; activate1();}

if ((digitalRead(58) == LOW) && (pistonNumber == 3)) {display2(); pistonNumber = 2; activate2();}

if ((digitalRead(58) == LOW) && (pistonNumber == 4)) {display3(); pistonNumber = 3; activate3();}

if ((digitalRead(58) == LOW) && (pistonNumber == 5)) {display4(); pistonNumber = 4; activate4();}

if ((digitalRead(58) == LOW) && (pistonNumber == 6)) {display5(); pistonNumber = 5; activate5();}

if ((digitalRead(58) == LOW) && (pistonNumber == 7)) {display6(); pistonNumber = 6; activate6();}

if ((digitalRead(58) == LOW) && (pistonNumber == 8)) {display7(); pistonNumber = 7; activate7();}

if ((digitalRead(58) == LOW) && (pistonNumber == 9)) {display8(); pistonNumber = 8; activate8();}

if ((digitalRead(58) == LOW) && (pistonNumber == 10)) {display9(); pistonNumber = 9; activate9();}

if ((digitalRead(58) == LOW) && (pistonNumber == 11)) {display10(); pistonNumber = 10; activate10();}

if ((digitalRead(58) == LOW) && (pistonNumber == 12)) {display11(); pistonNumber = 11; activate11();}

if ((digitalRead(58) == LOW) && (pistonNumber == 13)) {display12(); pistonNumber = 12; activate12();}

if ((digitalRead(58) == LOW) && (pistonNumber == 14)) {display13(); pistonNumber = 13; activate13();}

if ((digitalRead(58) == LOW) && (pistonNumber == 15)) {display14(); pistonNumber = 14; activate14();}

}