// simple_motor_sketch version 1.0 J.Luke (RobotBits.co.uk) // // A simple sketch to help you get started with the Arduino Motor Shield // in robotics applications // // This example has been written for any mobile robotics platform that uses // two bi-directional motors controlled by an Arduino and a Motor Shield // // This sketch includes a series of functions that perform the different // types of movement for your robot including: // // forward, reverse, stop, rotate clock-wise, rotate counter clock-wise, // turn_left and turn_right // // To program the movement of your robot simply call the functions as needed // from the main loop // // This example loop below moves your robot in a "square" figure or eight // // For support, please contact support@robotbits.co.uk // define the pins used by the motor shield int speedA = 10; // pin 10 sets the speed of motor A (this is a PWM output) int speedB = 11; // pin 11 sets the speed of motor B (this is a PWM output) int dirA = 12; // pin 12 sets the direction of motor A int dirB = 13; // pin 13 sets the direction of motor B // define the direction of motor rotation - this allows you change the direction without effecting the hardware int fwdA = LOW; // this sketch assumes that motor A is the right-hand motor of your robot (looking from the back of your robot) int revA = HIGH; // (note this should ALWAYS be opposite the fwdA) int fwdB = LOW; // int revB = HIGH; // (note this should ALWAYS be opposite the fwdB) // define variables used int dist; int angle; int vel; void setup() { // sets up the pinModes for the pins we are using pinMode (dirA, OUTPUT); pinMode (dirB, OUTPUT); pinMode (speedA, OUTPUT); pinMode (speedB, OUTPUT); } void stop() { // stop: force both motor speeds to 0 (low) digitalWrite (speedA, LOW); digitalWrite (speedB, LOW); } void forward(int dist, int vel) { // forward: both motors set to forward direction digitalWrite (dirA, fwdA); digitalWrite (dirB, fwdB); analogWrite (speedA, vel); // both motors set to same speed analogWrite (speedB, vel); delay (dist); // wait for a while (dist in mSeconds) } void reverse(int dist, int vel) { // reverse: both motors set to reverse direction digitalWrite (dirA, revA); digitalWrite (dirB, revB); analogWrite (speedA, vel); // both motors set to same speed analogWrite (speedB, vel); delay (dist); // wait for a while (dist in mSeconds) } void rot_cw (int angle, int vel) { // rotate clock-wise: right-hand motor reversed, left-hand motor forward digitalWrite (dirA, revA); digitalWrite (dirB, fwdB); analogWrite (speedA, vel); // both motors set to same speed analogWrite (speedB, vel); delay (angle); // wait for a while (angle in mSeconds) } void rot_ccw (int angle, int vel) { // rotate counter-clock-wise: right-hand motor forward, left-hand motor reversed digitalWrite (dirA, fwdA); digitalWrite (dirB, revB); analogWrite (speedA, vel); // both motors set to same speed analogWrite (speedB, vel); delay (angle); // wait for a while (angle in mSeconds) } void turn_right (int angle, int vel) { // turn right: right-hand motor stopped, left-hand motor forward digitalWrite (dirA, revA); digitalWrite (dirB, fwdB); digitalWrite (speedA, LOW); // right-hand motor speed set to zero analogWrite (speedB, vel); delay (angle); // wait for a while (angle in mSeconds) } void turn_left (int angle, int vel) { // turn left: left-hand motor stopped, right-hand motor forward digitalWrite (dirA, fwdA); digitalWrite (dirB, revB); analogWrite (speedA, vel); digitalWrite (speedB, LOW); // left-hand motor speed set to zero delay (angle); // wait for a while (angle in mSeconds) } void loop() { forward (2000, 100); // move forward for two seconds (2000 mS) at speed 100 (100/255ths of full speed) rot_cw (325, 100); // rotate clock-wise for 325 mS (about 90 deg) at speed 100 forward (2000, 100); // move forward for 2000 mS at speed 100 rot_cw (325, 100); // rotate clock-wise for 325 mS at speed 100 forward (2000, 100); // move forward for 2000 mS at speed 100 rot_cw (325, 100); // rotate clock-wise for 325 mS at speed 100 forward (2000, 100); // move forward for 2000 mS at speed 100 rot_cw (325, 100); // rotate clock-wise for 325 mS at speed 100 forward (2000, 100); // move forward for 2000 mS at speed 100 rot_ccw (325, 100); // rotate counter clock-wise for 325 mS at speed 100 forward (2000, 100); // move forward for 2000 mS at speed 100 rot_ccw (325, 100); // rotate counter clock-wise for 325 mS at speed 100 forward (2000, 100); // move forward for 2000 mS at speed 100 rot_ccw (325, 100); // rotate counter clock-wise for 325 mS at speed 100 forward (2000, 100); // move forward for 2000 mS at speed 100 rot_ccw (325, 100); // rotate counter clock-wise for 325 mS at speed 100 stop(); // stop the robot delay(1000); // wait one second (1000 mS) before restarting }