Added support for Adafruit Motor Shield V2 and Arduino Motor Shield V3

This commit is contained in:
Patrick Goebel 2016-03-15 07:49:35 -07:00
parent 453eae91b5
commit 038e0cf9b4
2 changed files with 85 additions and 11 deletions

View File

@ -6,3 +6,38 @@ void initMotorController();
void setMotorSpeed(int i, int spd);
void setMotorSpeeds(int leftSpeed, int rightSpeed);
/**********
* Pin assignments for the Arduino Motor Shield R3
*/
#ifdef ARDUINO_MOTOR_SHIELD_R3
#define LEFT_MOTOR_PIN_DIR 12
#define LEFT_MOTOR_PIN_BRAKE 9
#define LEFT_MOTOR_PIN_SPEED 3
#define RIGHT_MOTOR_PIN_DIR 13
#define RIGHT_MOTOR_PIN_BRAKE 8
#define RIGHT_MOTOR_PIN_SPEED 11
#endif
#ifdef ADAFRUIT_MOTOR_SHIELD_V2
#define LEFT_MOTOR_HEADER 1
#define RIGHT_MOTOR_HEADER 2
#include <Wire.h>
#include <Adafruit_MotorShield.h>
// Create the motor shield object with the default I2C address
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
// Or, create it with a different I2C address (say for stacking)
// Adafruit_MotorShield AFMS = Adafruit_MotorShield(0x61);
// Select which 'port' M1, M2, M3 or M4. NOTE: M1 and M2 conflict with the Robogaia 3-axis encoder shield.
Adafruit_DCMotor *myLeftMotor = AFMS.getMotor(LEFT_MOTOR_HEADER);
Adafruit_DCMotor *myRightMotor = AFMS.getMotor(RIGHT_MOTOR_HEADER);
#endif

View File

@ -32,6 +32,7 @@
setMotorSpeed(LEFT, leftSpeed);
setMotorSpeed(RIGHT, rightSpeed);
}
#elif defined POLOLU_MC33926
/* Include the Pololu library */
#include "DualMC33926MotorShield.h"
@ -55,19 +56,53 @@
setMotorSpeed(LEFT, leftSpeed);
setMotorSpeed(RIGHT, rightSpeed);
}
#elif defined ADAFRUIT_MOTOR_SHIELD_V2
/* Wrap the motor driver initialization */
void initMotorController() {
AFMS.begin();
}
/* Wrap the drive motor set speed function */
void setMotorSpeed(int i, int spd) {
if (i == LEFT) {
if (spd < 0) {
myLeftMotor->run(BACKWARD);
spd = -spd;
}
else myLeftMotor->run(FORWARD);
myLeftMotor->setSpeed(spd);
}
else {
if (spd < 0) {
myRightMotor->run(BACKWARD);
spd = -spd;
}
else myRightMotor->run(FORWARD);
myRightMotor->setSpeed(spd);
}
}
// A convenience function for setting both motor speeds
void setMotorSpeeds(int leftSpeed, int rightSpeed) {
setMotorSpeed(LEFT, leftSpeed);
setMotorSpeed(RIGHT, rightSpeed);
}
#elif defined ARDUINO_MOTOR_SHIELD_R3
/* Include the pin definitions for the shield */
#include "arduino_motor_shield_r3.h"
/* Wrap the motor driver initialization */
void initMotorController() {
/* If the brake function is enabled */
#ifdef USE_ARDUINO_MOTOR_SHIELD_R3_BRAKE
pinMode(LEFT_MOTOR_PIN_BRAKE, OUTPUT); // Initiates Brake Channel A pin
pinMode(RIGHT_MOTOR_PIN_BRAKE, OUTPUT); // Initiates Brake Channel B pin
#endif
// Set up Channel A - LEFT
pinMode(LEFT_MOTOR_PIN_DIR, OUTPUT); // Initiates Motor Channel A pin
pinMode(LEFT_MOTOR_PIN_BRAKE, OUTPUT); // Initiates Brake Channel A pin
pinMode(LEFT_MOTOR_PIN_DIR, OUTPUT); // Initiates Motor Channel A pin
// Set up Channel B - RIGHT
pinMode(RIGHT_MOTOR_PIN_DIR, OUTPUT); // Initiates Motor Channel B pin
pinMode(RIGHT_MOTOR_PIN_BRAKE, OUTPUT); // Initiates Brake Channel B pin
}
/* Wrap the drive motor set speed function */
@ -76,17 +111,21 @@
if (spd < 0) digitalWrite(LEFT_MOTOR_PIN_DIR, LOW);
else digitalWrite(LEFT_MOTOR_PIN_DIR, HIGH);
if (spd == 0) digitalWrite(LEFT_MOTOR_PIN_BRAKE, HIGH);
else digitalWrite(LEFT_MOTOR_PIN_BRAKE, LOW);
#ifdef USE_ARDUINO_MOTOR_SHIELD_R3_BRAKE
if (spd == 0) digitalWrite(LEFT_MOTOR_PIN_BRAKE, HIGH);
else digitalWrite(LEFT_MOTOR_PIN_BRAKE, LOW);
#endif
analogWrite(LEFT_MOTOR_PIN_SPEED, spd);
}
else {
if (spd < 0) digitalWrite(RIGHT_MOTOR_PIN_DIR, LOW);
else digitalWrite(RIGHT_MOTOR_PIN_DIR, HIGH);
if (spd == 0) digitalWrite(RIGHT_MOTOR_PIN_BRAKE, HIGH);
else digitalWrite(RIGHT_MOTOR_PIN_BRAKE, LOW);
#ifdef USE_ARDUINO_MOTOR_SHIELD_R3_BRAKE
if (spd == 0) digitalWrite(RIGHT_MOTOR_PIN_BRAKE, HIGH);
else digitalWrite(RIGHT_MOTOR_PIN_BRAKE, LOW);
#endif
analogWrite(RIGHT_MOTOR_PIN_SPEED, spd);
}