Skip to main content

How to Program Chassis Robot Motors with Arduino

Development Tools Needed

Programming

Step 1: Include the following libraries so we can communicate with the motors of the Chassis. Write out these variable which we will use later on in the program.

#include <Wire.h>
#include <Adafruit_MotorShield.h>

int maxSpeed = 150;
uint8_t i;

Step 2: Create an object for each motor so that we have an object to reference to when communicating with the motors

// Create the motor shield object 
Adafruit_MotorShield AFMS = Adafruit_MotorShield();

// Create an object for each motor with a corresponding 1-4 in the
// brackets to indicate which motor is which
Adafruit_DCMotor *myMotor1 = AFMS.getMotor(1);
Adafruit_DCMotor *myMotor2 = AFMS.getMotor(2);
Adafruit_DCMotor *myMotor3 = AFMS.getMotor(3);
Adafruit_DCMotor *myMotor4 = AFMS.getMotor(4);

Step 3: In the step up we will specify the speed and direction the motors of the chassis shall travel in NOTE: the motors that will be the 'back' of the robot will have to set as moving backwards in order for the robot to travel forwards and vice versa to travel backwards.

void setup(){
Serial.begin(9600); // access to serial monitor

AFMS.begin(); // create with the default frequency 1.6KHz

// Set the speed to start, from 0 (off) to 255 (max speed)
// Front wheel
myMotor1->setSpeed(150);
myMotor1->run(FORWARD);

// Back wheel
myMotor2->setSpeed(150);
myMotor2->run(BACKWARD);

// Back wheel
myMotor3->setSpeed(150);
myMotor3->run(BACKWARD);

// Front wheel
myMotor4->setSpeed(150);
myMotor4->run(FORWARD);

// turn on motor
myMotor1->run(RELEASE);
myMotor2->run(RELEASE);
myMotor3->run(RELEASE);
myMotor4->run(RELEASE);
}

Step 4: Lets create functions for commands we want our robot to perform. Mess around with the value of 'i' in the for loops to change the degree the robot will turn.

//MOVE FORWARDS
void move_forward(){
//sets direction the motor should move
myMotor1->run(FORWARD);
myMotor2->run(BACKWARD);
myMotor3->run(BACKWARD);
myMotor4->run(FORWARD);
// runs motor at set speed
myMotor1->setSpeed(maxSpeed);
myMotor2->setSpeed(maxSpeed);
myMotor3->setSpeed(maxSpeed);
myMotor4->setSpeed(maxSpeed);

}

//MOVE BACKWARDS
void move_backward(){
//sets direction the motor should move
myMotor1->run(BACKWARD);
myMotor2->run(FORWARD);
myMotor3->run(FORWARD);
myMotor4->run(BACKWARD);
// runs motor at set speed
myMotor1->setSpeed(maxSpeed);
myMotor2->setSpeed(maxSpeed);
myMotor3->setSpeed(maxSpeed);
myMotor4->setSpeed(maxSpeed);
}

//TURN RIGHT
void turn_right(){
myMotor1->run(BACKWARD);
myMotor2->run(FORWARD);
myMotor3->run(BACKWARD);
myMotor4->run(FORWARD);
// runs motor at set speed
for (i=0; i<maxSpeed; i++) {
myMotor1->setSpeed(i);
myMotor2->setSpeed(i);
myMotor3->setSpeed(i);
myMotor4->setSpeed(i);
delay(10);
}
// runs motor at set speed
for (i=maxSpeed; i!=0; i--) {
myMotor1->setSpeed(i);
myMotor2->setSpeed(i);
myMotor3->setSpeed(i);
myMotor4->setSpeed(i);
delay(10);
}
}

//TURN LEFT
void turn_left(){
myMotor1->run(FORWARD);
myMotor2->run(BACKWARD);
myMotor3->run(FORWARD);
myMotor4->run(BACKWARD);
// runs motor at set speed
for (i=0; i<maxSpeed; i++) {
myMotor1->setSpeed(i);
myMotor2->setSpeed(i);
myMotor3->setSpeed(i);
myMotor4->setSpeed(i);
delay(10);
}
// runs motor at set speed
for (i=maxSpeed; i!=0; i--) {
myMotor1->setSpeed(i);
myMotor2->setSpeed(i);
myMotor3->setSpeed(i);
myMotor4->setSpeed(i);
delay(10);
}
}

Step 5: Finally, we can now call our functions in the loop() method and have our robot move in a way we want.

/// the robot will move forwards for 10 seconds and them will turn to the right
// then the robot will move backwards for 5 seconds and then turn to the left
void loop(){
move_forward();
delay(10000);//will run forwards for 10 seconds
turn_right();
move_backward();
delay(5000); // will run backwards for 5 seconds
turn_left();
}

Full Code

#include <Wire.h>
#include <Adafruit_MotorShield.h>

int maxSpeed = 150;
uint8_t i;

// Create the motor shield object
Adafruit_MotorShield AFMS = Adafruit_MotorShield();

// Create an object for each motor with a corresponding 1-4 in the
// brackets to indicate which motor is which
Adafruit_DCMotor *myMotor1 = AFMS.getMotor(1);
Adafruit_DCMotor *myMotor2 = AFMS.getMotor(2);
Adafruit_DCMotor *myMotor3 = AFMS.getMotor(3);
Adafruit_DCMotor *myMotor4 = AFMS.getMotor(4);

void setup(){
Serial.begin(9600); // access to serial monitor

AFMS.begin(); // create with the default frequency 1.6KHz

// Set the speed to start, from 0 (off) to 255 (max speed)
// Front wheel
myMotor1->setSpeed(150);
myMotor1->run(FORWARD);

// Back wheel
myMotor2->setSpeed(150);
myMotor2->run(BACKWARD);

// Back wheel
myMotor3->setSpeed(150);
myMotor3->run(BACKWARD);

// Front wheel
myMotor4->setSpeed(150);
myMotor4->run(FORWARD);

// turn on motor
myMotor1->run(RELEASE);
myMotor2->run(RELEASE);
myMotor3->run(RELEASE);
myMotor4->run(RELEASE);
}

//MOVE FORWARDS
void move_forward(){
//sets direction the motor should move
myMotor1->run(FORWARD);
myMotor2->run(BACKWARD);
myMotor3->run(BACKWARD);
myMotor4->run(FORWARD);
// runs motor at set speed
myMotor1->setSpeed(maxSpeed);
myMotor2->setSpeed(maxSpeed);
myMotor3->setSpeed(maxSpeed);
myMotor4->setSpeed(maxSpeed);

}

//MOVE BACKWARDS
void move_backward(){
//sets direction the motor should move
myMotor1->run(BACKWARD);
myMotor2->run(FORWARD);
myMotor3->run(FORWARD);
myMotor4->run(BACKWARD);
// runs motor at set speed
myMotor1->setSpeed(maxSpeed);
myMotor2->setSpeed(maxSpeed);
myMotor3->setSpeed(maxSpeed);
myMotor4->setSpeed(maxSpeed);
}

//TURN RIGHT
void turn_right(){
myMotor1->run(BACKWARD);
myMotor2->run(FORWARD);
myMotor3->run(BACKWARD);
myMotor4->run(FORWARD);
// runs motor at set speed
for (i=0; i<maxSpeed; i++) {
myMotor1->setSpeed(i);
myMotor2->setSpeed(i);
myMotor3->setSpeed(i);
myMotor4->setSpeed(i);
delay(10);
}
// runs motor at set speed
for (i=maxSpeed; i!=0; i--) {
myMotor1->setSpeed(i);
myMotor2->setSpeed(i);
myMotor3->setSpeed(i);
myMotor4->setSpeed(i);
delay(10);
}
}

//TURN LEFT
void turn_left(){
myMotor1->run(FORWARD);
myMotor2->run(BACKWARD);
myMotor3->run(FORWARD);
myMotor4->run(BACKWARD);
// runs motor at set speed
for (i=0; i<maxSpeed; i++) {
myMotor1->setSpeed(i);
myMotor2->setSpeed(i);
myMotor3->setSpeed(i);
myMotor4->setSpeed(i);
delay(10);
}
// runs motor at set speed
for (i=maxSpeed; i!=0; i--) {
myMotor1->setSpeed(i);
myMotor2->setSpeed(i);
myMotor3->setSpeed(i);
myMotor4->setSpeed(i);
delay(10);
}
}


// the robot will move forwards for 10 seconds and them will turn to the right
// then the robot will move backwards for 5 seconds and then turn to the left
void loop(){
move_forward();
delay(10000);//will run forwards for 10 seconds
turn_right();
move_backward();
delay(5000); // will run backwards for 5 seconds
turn_left();
}

Next Steps

Now that you have the basic functions needed to move your robot, you can try on your own to modify the code to make the robot move in different ways.