Updated Arduino code for 8 floppy drives.
This commit is contained in:
parent
2d01e01a65
commit
ec145cee8f
|
@ -4,7 +4,7 @@ boolean firstRun = true; // Used for one-run-only stuffs;
|
||||||
|
|
||||||
//First pin being used for floppies, and the last pin. Used for looping over all pins.
|
//First pin being used for floppies, and the last pin. Used for looping over all pins.
|
||||||
const byte FIRST_PIN = 2;
|
const byte FIRST_PIN = 2;
|
||||||
const byte PIN_MAX = 9;
|
const byte PIN_MAX = 17;
|
||||||
#define RESOLUTION 40 //Microsecond resolution for notes
|
#define RESOLUTION 40 //Microsecond resolution for notes
|
||||||
|
|
||||||
|
|
||||||
|
@ -21,28 +21,28 @@ are used for control, so only even numbers need a value here. 3.5" Floppies hav
|
||||||
half a position (use 158 and 98).
|
half a position (use 158 and 98).
|
||||||
*/
|
*/
|
||||||
byte MAX_POSITION[] = {
|
byte MAX_POSITION[] = {
|
||||||
0,0,158,0,158,0,158,0,158,0};
|
0,0,158,0,158,0,158,0,158,0,158,0,158,0,158,0,158,0};
|
||||||
|
|
||||||
//Array to track the current position of each floppy head. (Only even indexes (i.e. 2,4,6...) are used)
|
//Array to track the current position of each floppy head. (Only even indexes (i.e. 2,4,6...) are used)
|
||||||
byte currentPosition[] = {
|
byte currentPosition[] = {
|
||||||
0,0,0,0,0,0,0,0,0,0};
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
|
||||||
|
|
||||||
/*Array to keep track of state of each pin. Even indexes track the control-pins for toggle purposes. Odd indexes
|
/*Array to keep track of state of each pin. Even indexes track the control-pins for toggle purposes. Odd indexes
|
||||||
track direction-pins. LOW = forward, HIGH=reverse
|
track direction-pins. LOW = forward, HIGH=reverse
|
||||||
*/
|
*/
|
||||||
int currentState[] = {
|
int currentState[] = {
|
||||||
0,0,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW
|
0,0,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW
|
||||||
};
|
};
|
||||||
|
|
||||||
//Current period assigned to each pin. 0 = off. Each period is of the length specified by the RESOLUTION
|
//Current period assigned to each pin. 0 = off. Each period is of the length specified by the RESOLUTION
|
||||||
//variable above. i.e. A period of 10 is (RESOLUTION x 10) microseconds long.
|
//variable above. i.e. A period of 10 is (RESOLUTION x 10) microseconds long.
|
||||||
unsigned int currentPeriod[] = {
|
unsigned int currentPeriod[] = {
|
||||||
0,0,0,0,0,0,0,0,0,0
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
};
|
};
|
||||||
|
|
||||||
//Current tick
|
//Current tick
|
||||||
unsigned int currentTick[] = {
|
unsigned int currentTick[] = {
|
||||||
0,0,0,0,0,0,0,0,0,0
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -57,7 +57,15 @@ void setup(){
|
||||||
pinMode(6, OUTPUT); // Step control 3
|
pinMode(6, OUTPUT); // Step control 3
|
||||||
pinMode(7, OUTPUT); // Direction 3
|
pinMode(7, OUTPUT); // Direction 3
|
||||||
pinMode(8, OUTPUT); // Step control 4
|
pinMode(8, OUTPUT); // Step control 4
|
||||||
pinMode(9, OUTPUT); // Direction 5
|
pinMode(9, OUTPUT); // Direction 4
|
||||||
|
pinMode(10, OUTPUT); // Step control 5
|
||||||
|
pinMode(11, OUTPUT); // Direction 5
|
||||||
|
pinMode(12, OUTPUT); // Step control 6
|
||||||
|
pinMode(13, OUTPUT); // Direction 6
|
||||||
|
pinMode(14, OUTPUT); // Step control 7
|
||||||
|
pinMode(15, OUTPUT); // Direction 7
|
||||||
|
pinMode(16, OUTPUT); // Step control 8
|
||||||
|
pinMode(17, OUTPUT); // Direction 8
|
||||||
|
|
||||||
Timer1.initialize(RESOLUTION); // Set up a timer at the defined resolution
|
Timer1.initialize(RESOLUTION); // Set up a timer at the defined resolution
|
||||||
Timer1.attachInterrupt(tick); // Attach the tick function
|
Timer1.attachInterrupt(tick); // Attach the tick function
|
||||||
|
@ -127,6 +135,34 @@ void tick()
|
||||||
currentTick[8]=0;
|
currentTick[8]=0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (currentPeriod[10]>0){
|
||||||
|
currentTick[10]++;
|
||||||
|
if (currentTick[10] >= currentPeriod[10]){
|
||||||
|
togglePin(10,11);
|
||||||
|
currentTick[10]=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (currentPeriod[12]>0){
|
||||||
|
currentTick[12]++;
|
||||||
|
if (currentTick[12] >= currentPeriod[12]){
|
||||||
|
togglePin(12,13);
|
||||||
|
currentTick[12]=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (currentPeriod[14]>0){
|
||||||
|
currentTick[14]++;
|
||||||
|
if (currentTick[14] >= currentPeriod[14]){
|
||||||
|
togglePin(14,15);
|
||||||
|
currentTick[14]=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (currentPeriod[16]>0){
|
||||||
|
currentTick[16]++;
|
||||||
|
if (currentTick[16] >= currentPeriod[16]){
|
||||||
|
togglePin(16,17);
|
||||||
|
currentTick[16]=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -178,14 +214,33 @@ void reset(byte pin)
|
||||||
}
|
}
|
||||||
currentPosition[pin] = 0; // We're reset.
|
currentPosition[pin] = 0; // We're reset.
|
||||||
digitalWrite(pin+1,LOW);
|
digitalWrite(pin+1,LOW);
|
||||||
currentPosition[pin+1] = LOW; // Ready to go forward.
|
currentPosition[pin+1] = 0; // Ready to go forward.
|
||||||
}
|
}
|
||||||
|
|
||||||
//Resets all the pins
|
//Resets all the pins
|
||||||
void resetAll(){
|
void resetAll(){
|
||||||
|
|
||||||
|
// Old one-at-a-time reset
|
||||||
|
//for (byte p=FIRST_PIN;p<=PIN_MAX;p+=2){
|
||||||
|
// reset(p);
|
||||||
|
//}
|
||||||
|
|
||||||
|
// New all-at-once reset
|
||||||
|
for (byte s=0;s<80;s++){ // For max drive's position
|
||||||
|
for (byte p=FIRST_PIN;p<=PIN_MAX;p+=2){
|
||||||
|
digitalWrite(p+1,HIGH); // Go in reverse
|
||||||
|
digitalWrite(p,HIGH);
|
||||||
|
digitalWrite(p,LOW);
|
||||||
|
}
|
||||||
|
delay(5);
|
||||||
|
}
|
||||||
|
|
||||||
for (byte p=FIRST_PIN;p<=PIN_MAX;p+=2){
|
for (byte p=FIRST_PIN;p<=PIN_MAX;p+=2){
|
||||||
reset(p);
|
currentPosition[p] = 0; // We're reset.
|
||||||
}
|
digitalWrite(p+1,LOW);
|
||||||
|
currentState[p+1] = 0; // Ready to go forward.
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user