-2

After researching a solution to a problem I want to solve, I'm hoping the third time posting is a charm. :)

I'd like to use an Arduino to control a vintage floppy disk drive. I'm looking to use it as a testing platform to first make sure that various basic functions (Motor spinning, stepping in, stepping out,going back to track 0) all work, and as a bonus I'd like to be able to test writing and reading data. Hopefully by using the Arduino I have more control over the functions instead of attaching it to a system and trying "dir" or "copy" and hoping things are happening correctly.

In my research, I found an article from 2014 (Controlling Floppy Disk Drive with Arduino and another in 2017 Simple reading and writing on Floppy Disk. The first article never was able to get the basic functionality working, the second article (Based on the first one) seemed to skip over the basic functions and go straight to reading/writing.

The first poster's issue was -

I am expecting the Index to pulse when the disk motor makes a rotation, and for Track 0 to change when I am at the outside of the disk, but they are both always LOW. Am I missing something?

They don't specifically say it, but they never confirmed the stepping was working.

I'm using the code directly from the first article with the suggested tweak by @geometrikal as -

//https://arduino.stackexchange.com/questions/3702/controlling-floppy-disk-drive-with-arduino
//
//constants
static const int IN = LOW;
static const int OUT = HIGH;
static const int pulseDelayTime = 6;

//pins
int indexPin = 2; //8 on the drive INDEX
int track0Pin = 3; //26 on the drive. TRACK 0
int dirPin = 6; //18 on the drive. DIRECTION
int stepPin = 7; //20 on the drive. STEP
int motorEnableBPin = 9; //16 on the drive. MOTOR ENABLE B

unsigned long motorSpinTime = 1000UL; //in ms


void setup() {

  //initial delay
  delay(3000);

  //setup serial monitor
  Serial.begin(9600);      

  //setup pins.
  pinMode(dirPin, OUTPUT);
  pinMode(stepPin, OUTPUT);
  pinMode(motorEnableBPin, OUTPUT);
  //pinMode(indexPin, INPUT); - Original code from @jeffctown
  //pinMode(track0Pin, INPUT); - Original code from @jeffctown
  //Code suggested by @geometrikal in https://arduino.stackexchange.com/a/3706/106869
  pinMode(indexPin, INPUT_PULLUP); 
  pinMode(track0Pin, INPUT_PULLUP);
  //turn the motor off initially
  digitalWrite(motorEnableBPin, HIGH);

  //print state here.
  printState("Setup done.");

  //spin the disk some.
  printState("Begin to spin motor");
  spinMotorForThisManyMs(motorSpinTime);
  spinMotorForThisManyMs(motorSpinTime);
  printState("Done spinning motor");

  //step read/write head all the way in.
  stepAllTheWayIn();

  //spin the disk some more.
  printState("Begin to spin motor");
  spinMotorForThisManyMs(motorSpinTime);
  spinMotorForThisManyMs(motorSpinTime);
  printState("Done spinning motor");

  //step read/write head all the way out.
  stepAllTheWayOut();

  //spin the disk even more.
  printState("Begin to spin motor");
  spinMotorForThisManyMs(motorSpinTime);
  spinMotorForThisManyMs(motorSpinTime);
  printState("Done spinning motor");

  //never completes.
  waitForIndex();
}

void loop() {
}

//spins the disk motor for a number of ms and prints the state
void spinMotorForThisManyMs(unsigned long msToSpin) {

  //start spinning
  digitalWrite(motorEnableBPin,LOW);

  //delay.. keep printing the state
  unsigned long maxTimeMs = millis() + msToSpin;  
  while(millis() < maxTimeMs ) {
    printState("Spinning");    
  }

  //stop spinning
  digitalWrite(motorEnableBPin,HIGH);
}



//step the read/write head all the way to the center
void stepAllTheWayIn() {
  for(int i=0;i<100;i++) {
    printState("Stepping In");
    stepInALittle();
  }
}

//step the read/write head all the way to the outside
void stepAllTheWayOut() {
  for(int i=0;i<100;i++) {
    printState("Stepping Out");
    stepOutALittle();
  }
}

//print the state of the index and track
void printState(const char* charPrint) {
  Serial.print(" Index:");
  Serial.print(digitalRead(indexPin));
  Serial.print(" Track:");
  Serial.print(digitalRead(track0Pin));
  Serial.print(" ");
  Serial.println(charPrint);
}

//move the head towards the outside a little
void stepOutALittle() {
  digitalWrite(dirPin,HIGH);
  stepPulse();
}

//move the head towards the center a little
void stepInALittle() {
  digitalWrite(dirPin,LOW);
  stepPulse();
}

//pulse the step pin
void stepPulse() {
  digitalWrite(stepPin,LOW);
  delay(pulseDelayTime);
  digitalWrite(stepPin,HIGH);
}

//waits for the index to trigger. this never gets completed.
void waitForIndex() {

  printState("beginning to wait for index pin to pulse");

  //start spinning
  digitalWrite(motorEnableBPin,LOW);

  //wait for pulse
  while(digitalRead(indexPin));
  //wait for end of pulse 0
  while(!digitalRead(indexPin));

  printState("end of waiting for index pin to pulse");

  //stop spinning
  digitalWrite(motorEnableBPin,HIGH);
}

And the same exact pinouts from the first article too.

The breadboard in this circuit diagram represents the IDC connector that is plugged into the floppy drive.

For track stepping, it first sets-

pinMode(stepPin, OUTPUT);

and later on does -

digitalWrite(dirPin,HIGH);
// Step routine
digitalWrite(stepPin,LOW);
delay(pulseDelayTime);
digitalWrite(stepPin,HIGH);

It should step out, and by setting dirPin to LOW it should step in. Neither one of these functions seem to be happening with my setup. I've checked the wiring 1/2 a dozen times and reviewed the code with no luck.

The second article (Based on the first) was concentrating more on read/write, which means they may not have paid attention to stepping.(Not to mention they weren't able to write).

I checked the pinning, and the code, and there isn't anything I can understand that might be causing the issues.

Wondered if anyone understands why what's expected isn't happening or has found or created their own code to be able to put a drive through some of its paces.

Thanks, Tuc

13
  • You say you can't understand what it causing the issue. What issue? You never say what you are trying to do or make happen or what is going wrong. Are you trying to write files to a floppy drive?
    – Delta_G
    Commented Oct 18 at 0:52
  • 1
    Wondered if anyone has found a solution to this issue. that is a chat suitable for a forum, but this site is not a forum ... a question about the problem is required here
    – jsotola
    Commented Oct 18 at 1:13
  • Welcome to SE/Arduino! You took the tour, which is rare. Very good! Now you might want to read "How to Ask" and other pages of the help center, too. This is not a forum to discuss things. This site collects questions and answers. Commented Oct 18 at 9:22
  • If you edit your post and make it an on-topic question, it will be re-opened. Please read the reason of closing and how to resolve carefully. Commented Oct 18 at 9:24
  • Please extend your code snippets to a minimal, complete, and reproducible sketch. And please add a schematic of your hardware setup. Commented Oct 19 at 8:04

1 Answer 1

0

Now that we see your complete source, the error seems clear. You don't enable the drive at all. You can check by the drive's activity LED at its front.

Each floppy drive has a "drive select" signal. According to the Wikipedia page about the floppy disk drive interface there are two pins, DRVSA and DRVSB on pins 14 and 12, respectively.

You need to select the drive matching the "motor enable" you use, so it's DRVSB on pin 12. Please make sure that your drive is jumpered to be drive B. Otherwise use the pins labeled "A".

For a first experiment I would reduce the sketch to simply "blink" the drive select signal. Only if you see that on the drive's front, do the next experiment, for example enable the motor.


Actually I experimented with the built-in drive of my Atari 1040STFM way back in the eighties. A little assembly program used a PWM algorithm to modulate the drive's LED slowly from off to on and back. It was spooky.

1
  • So I added a pin from the Uno on pin 10 to the DS line on my device. I set the signal HIGH on startup, and LOW when I was doing a drive specific action. I got the stepper running fine on a Gotek, and a 5.25, but had an issue with an 8". The 8" was recently repaired, so it should be working, but don't know if it needs anything extra that the Gotek/5.25 aren't looking for.
    – Tuc
    Commented Oct 31 at 17:39

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.