This sketch is used by Exercise: DRV8833 Dual DC Motor Driver.
Full Source Code
The full code is all in one file WheelDrive.ino.
// WheelDrive - move a pair of DC motors at varying rate and direction
//
// Copyright (c) 2016, Garth Zeglin. All rights reserved. Licensed under the
// terms of the BSD 3-clause license as included in LICENSE.
//
// This program assumes that:
//
// 1. A DRV8833 dual DC motor driver module is connected to pins 5, 6, 9, and 10.
// 2. A pair of motors is attached to the driver.
// 3. The serial console on the Arduino IDE is set to 9600 baud communications speed.
// ================================================================================
// Define constant values and global variables.
// Define the pin numbers on which the outputs are generated.
#define MOT_A1_PIN 5
#define MOT_A2_PIN 6
#define MOT_B1_PIN 10
#define MOT_B2_PIN 9
// ================================================================================
/// Configure the hardware once after booting up. This runs once after pressing
//// reset or powering up the board.
void setup(void)
{
// Initialize the stepper driver control pins to output drive mode.
pinMode(MOT_A1_PIN, OUTPUT);
pinMode(MOT_A2_PIN, OUTPUT);
pinMode(MOT_B1_PIN, OUTPUT);
pinMode(MOT_B2_PIN, OUTPUT);
// Start with drivers off, motors coasting.
digitalWrite(MOT_A1_PIN, LOW);
digitalWrite(MOT_A2_PIN, LOW);
digitalWrite(MOT_B1_PIN, LOW);
digitalWrite(MOT_B2_PIN, LOW);
// Initialize the serial UART at 9600 bits per second.
Serial.begin(9600);
}
// ================================================================================
/// Set the current on a motor channel using PWM and directional logic.
/// Changing the current will affect the motor speed, but please note this is
/// not a calibrated speed control. This function will configure the pin output
/// state and return.
///
/// \param pwm PWM duty cycle ranging from -255 full reverse to 255 full forward
/// \param IN1_PIN pin number xIN1 for the given channel
/// \param IN2_PIN pin number xIN2 for the given channel
void set_motor_pwm(int pwm, int IN1_PIN, int IN2_PIN)
{
if (pwm < 0) { // reverse speeds
analogWrite(IN1_PIN, -pwm);
digitalWrite(IN2_PIN, LOW);
} else { // stop or forward
digitalWrite(IN1_PIN, LOW);
analogWrite(IN2_PIN, pwm);
}
}
// ================================================================================
/// Set the current on both motors.
///
/// \param pwm_A motor A PWM, -255 to 255
/// \param pwm_B motor B PWM, -255 to 255
void set_motor_currents(int pwm_A, int pwm_B)
{
set_motor_pwm(pwm_A, MOT_A1_PIN, MOT_A2_PIN);
set_motor_pwm(pwm_B, MOT_B1_PIN, MOT_B2_PIN);
// Print a status message to the console.
Serial.print("Set motor A PWM = ");
Serial.print(pwm_A);
Serial.print(" motor B PWM = ");
Serial.println(pwm_B);
}
// ================================================================================
/// Simple primitive for the motion sequence to set a speed and wait for an interval.
///
/// \param pwm_A motor A PWM, -255 to 255
/// \param pwm_B motor B PWM, -255 to 255
/// \param duration delay in milliseconds
void spin_and_wait(int pwm_A, int pwm_B, int duration)
{
set_motor_currents(pwm_A, pwm_B);
delay(duration);
}
// ================================================================================
/// Run one iteration of the main event loop. The Arduino system will call this
/// function over and over forever.
Read more: Arduino Sketch Wheel Drive
