// Arduino pins for the shift register #define MOTORLATCH 12 #define MOTORCLK 4 #define MOTORENABLE 7 #define MOTORDATA 8 // 8-bit bus after the 74HC595 shift register // (not Arduino pins) // These are used to set the direction of the bridge driver. #define MOTOR1_A 2 #define MOTOR1_B 3 #define MOTOR2_A 1 #define MOTOR2_B 4 #define MOTOR3_A 5 #define MOTOR3_B 7 #define MOTOR4_A 0 #define MOTOR4_B 6 // Arduino pins for the PWM signals. #define MOTOR1_PWM 11 #define MOTOR2_PWM 3 #define MOTOR3_PWM 6 #define MOTOR4_PWM 5 #define SERVO1 10 #define SERVO2 9 void shiftWrite(int output, int high_low) { static int latch_copy; static int shift_register_initialized = false; // Do the initialization on the fly, // at the first time it is used. if (!shift_register_initialized) { // Set pins for shift register to output pinMode(MOTORLATCH, OUTPUT); pinMode(MOTORENABLE, OUTPUT); pinMode(MOTORDATA, OUTPUT); pinMode(MOTORCLK, OUTPUT); // Set pins for shift register to default value (low); digitalWrite(MOTORDATA, LOW); digitalWrite(MOTORLATCH, LOW); digitalWrite(MOTORCLK, LOW); // Enable the shift register, set Enable pin Low. digitalWrite(MOTORENABLE, LOW); // start with all outputs (of the shift register) low latch_copy = 0; shift_register_initialized = true; } // The defines HIGH and LOW are 1 and 0. // So this is valid. bitWrite(latch_copy, output, high_low); // Use the default Arduino 'shiftOut()' function to // shift the bits with the MOTORCLK as clock pulse. // The 74HC595 shiftregister wants the MSB first. // After that, generate a latch pulse with MOTORLATCH. shiftOut(MOTORDATA, MOTORCLK, MSBFIRST, latch_copy); delayMicroseconds(5); // For safety, not really needed. digitalWrite(MOTORLATCH, HIGH); delayMicroseconds(5); // For safety, not really needed. digitalWrite(MOTORLATCH, LOW); } void motors_init() { //PWMS pinMode(MOTOR1_PWM, OUTPUT); pinMode(MOTOR2_PWM, OUTPUT); pinMode(MOTOR3_PWM, OUTPUT); pinMode(MOTOR4_PWM, OUTPUT); } void motor1_set(int speed) { speed = constrain(speed, -255, 255); if (speed == 0) { shiftWrite(MOTOR1_A, 0); shiftWrite(MOTOR1_B, 0); } else if (speed < 0) { shiftWrite(MOTOR1_A, 0); shiftWrite(MOTOR1_B, 1); speed *= -1; } else { shiftWrite(MOTOR1_A, 1); shiftWrite(MOTOR1_B, 0); } analogWrite(MOTOR1_PWM, speed); } void motor2_set(int speed) { speed = constrain(speed, -255, 255); if (speed == 0) { shiftWrite(MOTOR2_A, 0); shiftWrite(MOTOR2_B, 0); } else if (speed < 0) { shiftWrite(MOTOR2_A, 0); shiftWrite(MOTOR2_B, 1); speed *= -1; } else { shiftWrite(MOTOR2_A, 1); shiftWrite(MOTOR2_B, 0); } analogWrite(MOTOR2_PWM, speed); } void motor3_set(int speed) { speed = constrain(speed, -255, 255); if (speed == 0) { shiftWrite(MOTOR3_A, 0); shiftWrite(MOTOR3_B, 0); } else if (speed < 0) { shiftWrite(MOTOR3_A, 0); shiftWrite(MOTOR3_B, 1); speed *= -1; } else { shiftWrite(MOTOR3_A, 1); shiftWrite(MOTOR3_B, 0); } analogWrite(MOTOR3_PWM, speed); } void motor4_set(int speed) { speed = constrain(speed, -255, 255); if (speed == 0) { shiftWrite(MOTOR4_A, 0); shiftWrite(MOTOR4_B, 0); } else if (speed < 0) { shiftWrite(MOTOR4_A, 0); shiftWrite(MOTOR4_B, 1); speed *= -1; } else { shiftWrite(MOTOR4_A, 1); shiftWrite(MOTOR4_B, 0); } analogWrite(MOTOR4_PWM, speed); } void motor1_stop() { shiftWrite(MOTOR1_A, 1); shiftWrite(MOTOR1_B, 1); } void motor2_stop() { shiftWrite(MOTOR2_A, 1); shiftWrite(MOTOR2_B, 1); } void motor3_stop() { shiftWrite(MOTOR3_A, 1); shiftWrite(MOTOR3_B, 1); } void motor4_stop() { shiftWrite(MOTOR4_A, 1); shiftWrite(MOTOR4_B, 1); } void go(int m1, int m2, int m3, int m4) { motor1_set(m1); motor2_set(m2); motor3_set(m3); motor4_set(m4); } void motors_stop() { motor1_stop(); motor2_stop(); motor3_stop(); motor4_stop(); } void setup() { motors_init(); } void loop() { go(255, 255, 255, 255); }