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);
}