I have 4 x 28BYJ-45 5V Motors with their accompanying ULN2003 driver boards connected to and Arduino Uno.
When I connect all 4 motors they tend to judder on occasion.
It is more stable with 3 but I need to run 4.
They are activated on a light sensor and at times all 4 may be running, but only for a quarter-turn.
I have the Uno running on a 12V mains supply.
The driver cards have a separate 12V supply running all 4.
It seems like a power issue but is there any way round this?
Many thanks
Matt
Here is my code:
#include <AccelStepper.h>
#define HALFSTEP 8
// motor pins
#define motorPin1 4 // IN1 on the ULN2003 driver 1
#define motorPin2 5 // IN2 on the ULN2003 driver 1
#define motorPin3 6 // IN3 on the ULN2003 driver 1
#define motorPin4 7 // IN4 on the ULN2003 driver 1
#define motorPin5 8 // IN1 on the ULN2003 driver 2
#define motorPin6 9 // IN2 on the ULN2003 driver 2
#define motorPin7 10 // IN3 on the ULN2003 driver 2
#define motorPin8 11 // IN4 on the ULN2003 driver 2
#define motorPin9 A1 // IN1 on the ULN2003 driver 3
#define motorPin10 A2 // IN2 on the ULN2003 driver 3
#define motorPin11 A3 // IN3 on the ULN2003 driver 3
#define motorPin12 A4 // IN4 on the ULN2003 driver 3
#define motorPin13 2 // IN1 on the ULN2003 driver 4
#define motorPin14 3 // IN2 on the ULN2003 driver 4
#define motorPin15 12 // IN3 on the ULN2003 driver 4
#define motorPin16 13 // IN4 on the ULN2003 driver 4
// Initialize with pin sequence IN1-IN3-IN2-IN4 for using the AccelStepper with 28BYJ-48
AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
AccelStepper stepper2(HALFSTEP, motorPin5, motorPin7, motorPin6, motorPin8);
AccelStepper stepper3(HALFSTEP, motorPin9, motorPin11, motorPin10, motorPin12);
AccelStepper stepper4(HALFSTEP, motorPin13, motorPin15, motorPin14, motorPin16);
int stepperSpeed = 500; //speed of the stepper (steps per second)
// For the light sensor
int sensorPin = A0; // select the input pin for the potentiometer
//int ledPin = 13; // select the pin for the LED
int sensorValue = 0; // variable to store the value coming from the sensor
const int sensorMin = 10; // photosensor minimum, discovered through experiment
const int sensorMax = 600; // photosensor maximum, discovered through experiment
void setup() {
// initialize serial communication at 9600 bits per second:
//Serial.begin(9600);
delay(1000); //sime time to put the robot down after swithing it on
stepper1.setMaxSpeed(2000.0);
stepper1.move(1);
stepper1.setSpeed(stepperSpeed);
stepper2.setMaxSpeed(2000.0);
stepper2.move(1);
stepper2.setSpeed(stepperSpeed);
stepper3.setMaxSpeed(2000.0);
stepper3.move(1);
stepper3.setSpeed(stepperSpeed);
stepper4.setMaxSpeed(2000.0);
stepper4.move(1);
stepper4.setSpeed(stepperSpeed);
}
void loop() {
/*
if (digitalRead(0) == HIGH){
stepper1.move(10);
stepper1.setSpeed(stepperSpeed);
stepper1.run();
}
*/
// read the sensor:
int sensorReading = analogRead(A0);
// map the sensor range to a range of four options:
int range = map(sensorReading, sensorMin, sensorMax, 0, 4);
// read the value from the sensor:
sensorValue = analogRead(sensorPin);
//Serial.println(sensorValue);
switch (range) {
case 0: // No light
stepper1.moveTo(1024); //Open
stepper1.setSpeed(stepperSpeed);
stepper1.runSpeedToPosition();
stepper2.moveTo(1024); //Open
stepper2.setSpeed(stepperSpeed);
stepper2.runSpeedToPosition();
stepper3.moveTo(1024); //Open
stepper3.setSpeed(stepperSpeed);
stepper3.runSpeedToPosition();
stepper4.moveTo(1024); //Open
stepper4.setSpeed(stepperSpeed);
stepper4.runSpeedToPosition();
break;
case 1: // Low Light
stepper1.moveTo(0); //Closed
stepper1.setSpeed(stepperSpeed);
stepper1.runSpeedToPosition();
stepper2.moveTo(1024); // Open
stepper2.setSpeed(stepperSpeed);
stepper2.runSpeedToPosition();
stepper3.moveTo(1024); //Open
stepper3.setSpeed(stepperSpeed);
stepper3.runSpeedToPosition();
stepper4.moveTo(1024); //Open
stepper4.setSpeed(stepperSpeed);
stepper4.runSpeedToPosition();
break;
case 2: // Medium Light
//Serial.println("dim");
//if (Shade1Closed == true){
//OpenShade1(); //Open Shade 1
//}
stepper1.moveTo(0); //Closed
stepper1.setSpeed(stepperSpeed);
stepper1.runSpeedToPosition();
stepper2.moveTo(0); //Closed
stepper2.setSpeed(stepperSpeed);
stepper2.runSpeedToPosition();
stepper3.moveTo(1024); //Open
stepper3.setSpeed(stepperSpeed);
stepper3.runSpeedToPosition();
stepper4.moveTo(1024); //Open
stepper4.setSpeed(stepperSpeed);
stepper4.runSpeedToPosition();
break;
case 3: // High light
stepper1.moveTo(0); //Closed
stepper1.setSpeed(stepperSpeed);
stepper1.runSpeedToPosition();
stepper2.moveTo(0); //Closed
stepper2.setSpeed(stepperSpeed);
stepper2.runSpeedToPosition();
stepper3.moveTo(0); //Closed
stepper3.setSpeed(stepperSpeed);
stepper3.runSpeedToPosition();
stepper4.moveTo(1024); //Open
stepper4.setSpeed(stepperSpeed);
stepper4.runSpeedToPosition();
break;
case 4: // Maximum light
stepper1.moveTo(0); //Closed
stepper1.setSpeed(stepperSpeed);
stepper1.runSpeedToPosition();
stepper2.moveTo(0); //Closed
stepper2.setSpeed(stepperSpeed);
stepper2.runSpeedToPosition();
stepper3.moveTo(0); //Closed
stepper3.setSpeed(stepperSpeed);
stepper3.runSpeedToPosition();
stepper4.moveTo(0); //Closed
stepper4.setSpeed(stepperSpeed);
stepper4.runSpeedToPosition();
break;
}
delay(3); // delay in between reads for stability
}