Hello, I am using EMG30 motors and MD25 driver. Exactly this kit: EMG30 data
I downloaded a code from Downloads and I have got this
/***************************************************************
// CONTROLO MOTOR COM MD-25
//**************************************************************/
#include <Wire.h>
/***************************************************************
// MD25Add (default)
//**************************************************************/
#define MD25Add 0xB0 >> 1 // The Arduino IIC functions automaically
// add one or zero at the end of the
// address for read/write operations
/***************************************************************
// GENERAL REG.s
//**************************************************************/
#define Speed1 0x00
#define Speed2 0x01
#define Enc1a 0x02
#define Enc1b 0x03
#define Enc1c 0x04
#define Enc1d 0x05
#define Enc2a 0x06
#define Enc2b 0x07
#define Enc2c 0x08
#define Enc2d 0x09
#define Battery 0x0A
#define M1Current 0x0B
#define M2Current 0x0C
#define SWver 0x0D
#define Acceleration 0x0E
#define Mode 0X0F
#define Command 0X10
/***************************************************************
// COMMAND REG.s
//**************************************************************/
#define Reset_encoder 0x20
#define Disable_controller 0x30
#define Enable_controller 0x31
#define Disable_timeout 0x32
#define Enable_timeout 0x33
#define Change_i2c_address_1 0xA0
#define Change_i2c_address_2 0xAA
#define Change_i2c_address_3 0xA5
/***************************************************************
// Enable/Disable Timeout
//**************************************************************/
void enableTimeOut(boolean state){
Wire.beginTransmission(MD25Add); // Transmit to device
Wire.write(Command); // Access to command register
if (state){
Wire.write(Enable_timeout); // Enable 2 second timeout
}
else{
Wire.write(Disable_timeout); // Disable 2 second timeout
}
Wire.endTransmission(); // Stop transmitting
}
/***************************************************************
// Enable/Disable on-board Controller
//**************************************************************/
void enableController(boolean state){
Wire.beginTransmission(MD25Add); // Transmit to device
Wire.write(Command); // Access to command register
if (state){
Wire.write(Enable_controller); // Enable controller
}
else{
Wire.write(Disable_controller); // Disable controller
}
Wire.endTransmission(); // Stop transmitting
}
/***************************************************************
// Reset encoder function
//**************************************************************/
void resetEncoders(void){
Wire.beginTransmission(MD25Add); // Transmit to device
Wire.write(Command); // Access to command register
Wire.write(Reset_encoder); // Access to reset register
Wire.endTransmission(); // Stop transmitting
}
/***************************************************************
// Send order to motor
//**************************************************************/
void sendData2Reg(byte reg, byte val)
{
Wire.beginTransmission(MD25Add); // Device select
Wire.write(reg); // Reg 2 write
Wire.write(val); // data
Wire.endTransmission(); // End transmission
}
/***************************************************************
// Reset encoder function
//**************************************************************/
int receiveFromEncoder(byte reg)
{ //---------------------------------------------------
// reg must be Enc1a or Enc1b
//---------------------------------------------------
int encoder = 0;
byte measure[4];
byte k = 0;
Wire.beginTransmission(MD25Add); // Transmit to device MD25
Wire.write(reg); // Ask for Encx register
Wire.endTransmission(); // Stop transmitting
Wire.requestFrom(MD25Add, 4); // Request 4 bytes of data from MD-25
// Scan IIC port and retrieve data
// Scan IIC port and retrieve data
while(Wire.available()) // while available...
{
measure[k] = Wire.read(); // Measure byte
k++;
}
// Concatenate the data
encoder = (measure[0]<<24) | (measure[1]<<16) | (measure[2]<<8) | measure[3];
return(encoder);
}
/***************************************************************
// Setup function
//**************************************************************/
void setup()
{
Serial.begin(115200); // Initialize serial comunication with
// the computer's terminal
Wire.begin(); // Initialize Arduino as the IIC Master
resetEncoders(); // Initialize to zero the encoder register
enableTimeOut(false); // Disable automatic 2s timeout
enableController(false); // Disable on-board feedback speed control
sendData2Reg(Acceleration,2); // Decrease acceleration (default = 5)
sendData2Reg(Speed1, 128); // The motor is initially stoped
double data;
for(int k=255;k>=0;--k){
sendData2Reg(Speed1, k);
// Filter encoder data------------------------
data = 0;
for (int sample=0;sample<15;sample++)
{
data+=(receiveFromEncoder(Enc1a)/15.0);
}
// -------------------------------------------
Serial.println(data);
delay(100);
}
sendData2Reg(Speed1, 128); // Stop the motor
enableTimeOut(true); // Enable 2 second protection timer
enableController(true); // Enable velocity controller
}
/***************************************************************
// Loop function
//**************************************************************/
void loop()
{
// Nothing to do ;-)
}
I have no clue whats going on here, and I don't know how to make the encoders work.
My objective is to make the motors run for a specific counts of the encoder and then turn etc.
Can I just use a command out of this code in order to do that.
I never seen this kind of communication with a motor driver.
If this is any help here is the command list: MD25 Serial Documentation
I would be really grateful if someone could help! Thank you.