Calculate the correct current limit for driver A4988

I have now made the circuit @groundFungus suggested. I works fine running ULN2003 with only two pins.

The noise is gone when it is idle but the motor gets very hot!

However I have some problems with the changing of direction which is not relieable and only works 3 times out of 5. Any suggestions to improve the code?

And is it possible to run it with some library?

here is my code:

const int coilA = 2;
const int coilB =  3;
const int ms = 500;
int inc = 0;
bool changeDir = false;

void setup() {
  Serial.begin(9600);

  pinMode(coilA, OUTPUT);
  pinMode(coilB, OUTPUT);
  digitalWrite(coilA, LOW);
  digitalWrite(coilB, LOW);
}

void loop() {
  if (inc % 500 == 0) {
    changeDir = !changeDir;
    delay(100);
  }
  if (changeDir == 1) {
    cw();
  } else if (changeDir == 0) {
    ccw();
  }
  inc++;
}

void cw() {
  step1();
  step2();
  step3();
  step4();
}

void ccw() {
  step1b();
  step2b();
  step3b();
  step4b();
}

void step1b () {
  digitalWrite(coilB, LOW);
  delayMicroseconds(ms);
  digitalWrite(coilA, HIGH);
  delayMicroseconds(ms);
}

void step2b () {
  digitalWrite(coilB, HIGH);
  delayMicroseconds(ms);
  digitalWrite(coilA, HIGH);
  delayMicroseconds(ms);
}

void step3b () {
  digitalWrite(coilB, LOW);
  delayMicroseconds(ms);
  digitalWrite(coilA, HIGH);
  delayMicroseconds(ms);
}

void step4b () {
  digitalWrite(coilB, LOW);
  delayMicroseconds(ms);
  digitalWrite(coilA, LOW);
  delayMicroseconds(ms);
}

void step1 () {
  digitalWrite(coilA, LOW);
  delayMicroseconds(ms);
  digitalWrite(coilB, HIGH);
  delayMicroseconds(ms);
}

void step2 () {
  digitalWrite(coilA, HIGH);
  delayMicroseconds(ms);
  digitalWrite(coilB, HIGH);
  delayMicroseconds(ms);
}

void step3 () {
  digitalWrite(coilA, HIGH);
  delayMicroseconds(ms);
  digitalWrite(coilB, LOW);
  delayMicroseconds(ms);
}

void step4 () {
  digitalWrite(coilA, LOW);
  delayMicroseconds(ms);
  digitalWrite(coilB, LOW);
  delayMicroseconds(ms);
}