upm  0.5.1
Sensor/Actuator repository for libmraa (v0.9.1)
 All Data Structures Files Functions Variables Enumerations Enumerator Macros Groups Pages
Public Types | Public Member Functions | Protected Attributes
GroveMD Class Reference

API for the Grove I2C Motor Driver. More...

Detailed Description

This class implements support for the Grove I2C Motor Driver. This device can support a single 4-wire stepper motor, or two 2-wire DC motors. The device contains an Atmel* ATmega8L microcontroller that manages an L298N H-bridge driver chip.

This device supports an I2C bus speed of 100Khz only.

The module does not provide any telemetry or status - it only accepts I2C commands for its various operations.

This module was tested with version 1.3 of the Grove I2C Motor Driver.

For stepper operation, this driver can run in one of two modes - Mode 1, where this driver handles the stepping operation, and Mode 2, where this driver simply sends commands to the Grove Motor Driver, and it handles the stepping operation. Mode2 requires updated (and working) firmware to be loaded onto the device.

The default stepper operation mode is Mode1, which is generally more flexible and is supported on all firmware revisions.

grovemd.jpg

An example showing the use of a DC motor

// Instantiate an I2C Grove Motor Driver on I2C bus 0
upm::GroveMD *motors = new upm::GroveMD(GROVEMD_I2C_BUS,
GROVEMD_DEFAULT_I2C_ADDR);
// set direction to CW and set speed to 50%
cout << "Spin M1 and M2 at half speed for 3 seconds" << endl;
motors->setMotorDirections(upm::GroveMD::DIR_CW, upm::GroveMD::DIR_CW);
motors->setMotorSpeeds(127, 127);
sleep(3);
// counter clockwise
cout << "Reversing M1 and M2 for 3 seconds" << endl;
motors->setMotorDirections(upm::GroveMD::DIR_CCW, upm::GroveMD::DIR_CCW);
sleep(3);

An example showing the use of a 4-wire stepper

// Instantiate an I2C Grove Motor Driver on I2C bus 0
upm::GroveMD *motors = new upm::GroveMD(GROVEMD_I2C_BUS,
GROVEMD_DEFAULT_I2C_ADDR);
// This example demonstrates using the GroveMD to drive a stepper motor
// configure it, for this example, we'll assume 200 steps per rev
motors->configStepper(200);
// set for half a rotation
motors->setStepperSteps(100);
// let it go - clockwise rotation, 10 RPM speed
motors->enableStepper(upm::GroveMD::STEP_DIR_CW, 10);
sleep(3);
// Now do it backwards...
motors->setStepperSteps(100);
motors->enableStepper(upm::GroveMD::STEP_DIR_CCW, 10);
// now disable
motors->disableStepper();

Public Types

enum  REG_T {
  SET_SPEED = 0x82, SET_PWM_FREQ = 0x84, SET_DIRECTION = 0xaa, SET_MOTOR_A = 0xa1,
  SET_MOTOR_B = 0xa5, STEPPER_ENABLE = 0x1a, STEPPER_DISABLE = 0x1b, STEPPER_NUM_STEPS = 0x1c
}
 
enum  STEP_DIRECTION_T { STEP_DIR_CCW = 0x01, STEP_DIR_CW = 0x00 }
 
enum  DC_DIRECTION_T { DIR_CCW = 0x02, DIR_CW = 0x01 }
 
enum  STEP_MODE_T { STEP_MODE1 = 0x00, STEP_MODE2 = 0x01 }
 

Public Member Functions

 GroveMD (int bus=GROVEMD_I2C_BUS, uint8_t address=GROVEMD_DEFAULT_I2C_ADDR)
 
 ~GroveMD ()
 
bool writePacket (REG_T reg, uint8_t data1, uint8_t data2)
 
bool setMotorSpeeds (uint8_t speedA, uint8_t speedB)
 
bool setPWMFrequencyPrescale (uint8_t freq=0x03)
 
bool setMotorDirections (DC_DIRECTION_T dirA, DC_DIRECTION_T dirB)
 
bool enableStepper (STEP_DIRECTION_T dir, uint8_t speed)
 
bool disableStepper ()
 
bool setStepperSteps (unsigned int steps)
 
void configStepper (unsigned int stepsPerRev, STEP_MODE_T mode=STEP_MODE1)
 

Protected Attributes

mraa::I2c m_i2c
 
uint8_t m_addr
 

Constructor & Destructor Documentation

GroveMD ( int  bus = GROVEMD_I2C_BUS,
uint8_t  address = GROVEMD_DEFAULT_I2C_ADDR 
)

GroveMD constructor

Parameters
busI2C bus to use
addressI2C address to use

Here is the call graph for this function:

~GroveMD ( )

GroveMD destructor

Here is the call graph for this function:

Member Function Documentation

bool writePacket ( REG_T  reg,
uint8_t  data1,
uint8_t  data2 
)

Composes and writes a 3-byte packet to the controller

Parameters
regRegister location
data1First byte of data
data2Second byte of data
Returns
True if successful

Here is the caller graph for this function:

bool setMotorSpeeds ( uint8_t  speedA,
uint8_t  speedB 
)

To control DC motors, sets the speed of motors A & B. Valid values are 0-255.

Parameters
speedASpeed of motor A
speedBSpeed of motor B
Returns
True if successful

Here is the call graph for this function:

Here is the caller graph for this function:

bool setPWMFrequencyPrescale ( uint8_t  freq = 0x03)

To control DC motors, sets the PWM frequency prescale factor. Note: this register is not ducumented other than to say the default value is 0x03. Presumably, this is the timer prescale factor used on the ATMega MCU timer driving the PWM.

Parameters
freqPWM prescale frequency; default is 0x03
Returns
True if successful

Here is the call graph for this function:

bool setMotorDirections ( DC_DIRECTION_T  dirA,
DC_DIRECTION_T  dirB 
)

To control DC motors, sets the directions of motors A & B

Parameters
dirADirection for motor A, DIR_CW or DIR_CCW
dirBDirection for motor B, DIR_CW or DIR_CCW
Returns
True if successful

Here is the call graph for this function:

bool enableStepper ( STEP_DIRECTION_T  dir,
uint8_t  speed 
)

To control a stepper motor, sets its direction and speed, and then starts operation. For Mode2, this method will return immediately. For Mode1 (the default) this method returns when the number of steps specified by setStepperSteps() has completed.

Parameters
dirDirection, STEP_DIR_CW or STEP_DIR_CCW
speedMotor speed. Valid range is 1-255. For Mode 1 (default), this specifies the speed in RPM's. For Mode 2, speed is multiplied by 4ms by the board, so higher numbers will mean a slower speed.
Returns
True if successful

Here is the call graph for this function:

bool disableStepper ( )

To control a stepper motor, stops the stepper motor.

Returns
True if successful

Here is the call graph for this function:

bool setStepperSteps ( unsigned int  steps)

To control a stepper motor, specifies the number of steps to execute. For Mode2, valid values are between 1-255, 255 means continuous rotation.

For Mode1 (the default) steps can be any positive integer.

Parameters
stepsNumber of steps to execute. 255 (only in Mode2) means continuous rotation.
Returns
True if successful

Here is the call graph for this function:

void configStepper ( unsigned int  stepsPerRev,
STEP_MODE_T  mode = STEP_MODE1 
)

Configure the initial Stepper parameters. This should be called before any other stepper method.

Parameters
stepsPerRevThe number of steps required to complete one full revolution.
modeThe stepper operating mode, default STEP_MODE1
Returns
Elapsed milliseconds

Here is the caller graph for this function:


The documentation for this class was generated from the following files: