Omni3MD.cpp
Go to the documentation of this file.
00001 /*
00002   Omni3MD.cpp - Library for interfacing with omni-3md (3 motor driver controller) from www.botnroll.com
00003   Created by Nino Pereira, April 28, 2011.
00004   Released into the public domain.
00005 */
00006 
00007 
00008 #include "Wire.h"
00009 #include "Omni3MD.h"
00010 
00011 /*Omni3MD::Omni3MD(byte omniAddress)
00012 {
00013   _omniAddress = omniAddress;
00014 }*/
00015 
00017 //private routines
00019 void Omni3MD::i2c_connect(byte omniAddress)
00020 {
00021     _omniAddress = omniAddress>>1;
00022         Wire.begin(_omniAddress);                                               // join i2c bus (address optional for master)
00023 }
00024 
00025 byte Omni3MD::i2cRequestData(byte addressValue, byte command)
00026 {
00027   byte value=(byte)0xFF;
00028   Wire.beginTransmission(addressValue);                          // transmit to device
00029   Wire.send(command);                                                            // sends one byte
00030   Wire.endTransmission();                                                        // stop transmitting
00031 
00032   Wire.requestFrom((int)addressValue,(int)1);        // requests one byte
00033   if (Wire.available())
00034   {
00035     value=Wire.receive();
00036   }
00037   return value;
00038 }
00039 
00040 void Omni3MD::i2cSendData(byte addressValue, byte command, byte buffer[], byte numBytes)
00041 {
00042   byte value=0;
00043   Wire.beginTransmission(addressValue); // transmit to device #0x10
00044   Wire.send(command);        // sends one byte 
00045   for (int k =0; k< numBytes;k++)
00046     Wire.send(buffer[k]);        // sends one byte
00047   Wire.endTransmission(); // stop transmitting 
00048 }
00049 
00051 //setup routines
00053 
00054 void Omni3MD::calibrate_omni()
00055 {
00056         byte buffer[]={KEY1,KEY2};
00057         i2cSendData(_omniAddress, COMMAND_CALIBRATE,buffer,sizeof(buffer));
00058 }
00059 void Omni3MD::set_i2c_timeout (byte timeout) //timeout x 100 miliseconds to receive i2C Commands
00060 {
00061   byte buffer[]={timeout, KEY1, timeout, KEY2}; 
00062   i2cSendData(_omniAddress, COMMAND_TIMEOUT_I2C,buffer,sizeof(buffer));
00063 }
00064 void Omni3MD::set_i2c_address (byte newAddress)
00065 {
00066   byte buffer[]={newAddress, KEY1, newAddress, KEY2};
00067   i2cSendData(_omniAddress, COMMAND_I2C_ADD,buffer,sizeof(buffer));
00068   _omniAddress=newAddress;
00069 }
00070 /* void Omni3MD::set_way(byte way)
00071 {
00072   byte buffer[]={way, KEY1, way, KEY2};
00073   i2cSendData(_omniAddress, COMMAND_CFG_MOV_CW,buffer,sizeof(buffer));
00074 }*/
00075 void Omni3MD::set_PID(word Kp, word Ki, word Kd)
00076 {
00077   byte Kp_H=highByte(Kp);
00078   byte Kp_L=lowByte(Kp);
00079   byte Ki_H=highByte(Ki);
00080   byte Ki_L=lowByte(Ki);
00081   byte Kd_H=highByte(Kd);
00082   byte Kd_L=lowByte(Kd);
00083   byte buffer[]={Kp_H,Kp_L,Ki_H,Ki_L,Kd_H,Kd_L};
00084   i2cSendData(_omniAddress, COMMAND_GAIN_UPDATE, buffer, sizeof(buffer));
00085 }
00086 void Omni3MD::set_prescaler(byte encoder, byte value)
00087 {
00088   byte buffer[]={encoder,value,KEY1,KEY2};
00089   i2cSendData(_omniAddress, COMMAND_PRESCALER_CFG,buffer,sizeof(buffer));
00090 }
00091 void Omni3MD::set_enc_value(byte encoder, word encValue)
00092 {
00093   byte encValueHIGH=highByte(encValue);
00094   byte encValueLOW=lowByte(encValue);
00095   byte buffer[]={encoder,encValueHIGH,encValueLOW,KEY1,KEY2};
00096   i2cSendData(_omniAddress, COMMAND_INC_ENC_PRESET,buffer,sizeof(buffer));
00097 }
00098   
00100 //movement routines
00102 
00103 /*void Omni3MD::mov_omni_pid(byte linear_speed,byte rotational_speed,word direction)
00104 {
00105   byte dir_H=highByte(direction);
00106   byte dir_L=lowByte(direction);
00107   byte buffer[]={linear_speed,rotational_speed,dir_H,dir_L};
00108   i2cSendData(_omniAddress, COMMAND_MOV_OMNI_PID,buffer,sizeof(buffer));
00109 }
00110 void Omni3MD::mov_omni_nopid(byte linear_speed,byte rotational_speed,word direction)
00111 {
00112   byte dir_H=highByte(direction);
00113   byte dir_L=lowByte(direction);
00114   byte buffer[]={linear_speed,rotational_speed,dir_H,dir_L};
00115   i2cSendData(_omniAddress, COMMAND_MOV_OMNI_NOPID,buffer,sizeof(buffer));
00116 }*/
00117 void Omni3MD::mov_lin3M_pid(byte way1,byte speed1,byte way2,byte speed2,byte way3,byte speed3)
00118 {
00119   byte buffer[]={way1,speed1,way2,speed2,way3,speed3};
00120   i2cSendData(_omniAddress, COMMAND_MOV_LIN3M_PID,buffer,sizeof(buffer));
00121 }
00122 /*void Omni3MD::mov_lin3M_nopid(byte way1,byte speed1,byte way2,byte speed2,byte way3,byte speed3)
00123 {
00124   byte buffer[]={way1,speed1,way2,speed2,way3,speed3};
00125   i2cSendData(_omniAddress, COMMAND_MOV_LIN3M_NOPID,buffer,sizeof(buffer));
00126 }
00127 void Omni3MD::mov_lin1M_pid(byte motor,byte way, byte speed)
00128 {
00129   byte buffer[]={motor,way,speed};
00130   i2cSendData(_omniAddress, COMMAND_MOV_LIN1M_PID,buffer,sizeof(buffer));
00131 }
00132 void Omni3MD::mov_lin1M_nopid(byte motor,byte way, byte speed)
00133 {
00134   byte buffer[]={motor,way,speed};
00135   i2cSendData(_omniAddress, COMMAND_MOV_LIN1M_NOPID,buffer,sizeof(buffer));
00136 }
00137 void Omni3MD::mov_incremental(byte motor,byte way, byte speed,word encPosition,byte stoptorque)
00138 {
00139   byte encPosHIGH=highByte(encPosition);
00140   byte encPosLOW=lowByte(encPosition);
00141   byte buffer[]={ motor, way, speed, encPosHIGH, encPosLOW, stoptorque};
00142   i2cSendData(_omniAddress, COMMAND_MOV_INC,buffer,sizeof(buffer));
00143 }*/
00144 void Omni3MD::stop_motors() 
00145 {
00146   byte buffer[]={KEY1,KEY2};
00147   i2cSendData(_omniAddress, COMMAND_STOP,buffer,sizeof(buffer));
00148 }       
00149 
00151 // Readings routines
00153 
00154 float Omni3MD::read_temperature()
00155 {
00156   byte temperHigh=i2cRequestData(_omniAddress, COMMAND_TEMPER1_HI);
00157   byte temperLow=i2cRequestData(_omniAddress, COMMAND_TEMPER1_LOW);
00158   float temperatureValue=((int)temperHigh*255)+(int)temperLow;
00159   return (temperatureValue/10);
00160 }
00161 float Omni3MD::read_battery()
00162 {
00163   byte batteryValueLow=i2cRequestData(_omniAddress, COMMAND_BAT_LOW);
00164   byte batteryValueHigh=i2cRequestData(_omniAddress, COMMAND_BAT_HI);
00165  // float batteryValue=(batteryValueHigh<<8)+batteryValueLow;
00166   return(((batteryValueHigh<<8)+batteryValueLow)/10.0);
00167 }
00168 float Omni3MD::read_firmware()
00169 {
00170   byte firmI=i2cRequestData(_omniAddress, COMMAND_FIRMWARE_INT);
00171   byte firmD=i2cRequestData(_omniAddress, COMMAND_FIRMWARE_DEC);
00172   float firmwareValue=(firmI<<8)+firmD;
00173   return (firmwareValue/100.0);
00174 }
00175 /*byte Omni3MD::read_control_rate() // returns 10, 20, 40 (times per second control operation)
00176 {
00177   return i2cRequestData(_omniAddress, COMMAND_CTRL_RATE);
00178 }
00179 int Omni3MD::read_enc_lim1()
00180 {
00181   byte enc1_lim_hi=i2cRequestData(_omniAddress, COMMAND_ENC1_LIM_HI);
00182   byte enc1_lim_low=i2cRequestData(_omniAddress, COMMAND_ENC1_LIM_LOW);
00183   return ((enc1_lim_hi<<8)+enc1_lim_low);
00184 }
00185 int Omni3MD::read_enc_lim2()
00186 {
00187   byte enc2_lim_hi=i2cRequestData(_omniAddress, COMMAND_ENC2_LIM_HI);
00188   byte enc2_lim_low=i2cRequestData(_omniAddress, COMMAND_ENC2_LIM_LOW);
00189   return ((enc2_lim_hi<<8)+enc2_lim_low);
00190 }
00191 int Omni3MD::read_enc_lim3()
00192 {
00193   byte enc3_lim_hi=i2cRequestData(_omniAddress, COMMAND_ENC3_LIM_HI);
00194   byte enc3_lim_low=i2cRequestData(_omniAddress, COMMAND_ENC3_LIM_LOW);
00195   return ((enc3_lim_hi<<8)+enc3_lim_low);
00196 }
00197 int Omni3MD::read_enc_max1()
00198 {
00199   byte enc1_max_hi=i2cRequestData(_omniAddress, COMMAND_ENC1_MAX_HI);
00200   byte enc1_max_low=i2cRequestData(_omniAddress, COMMAND_ENC1_MAX_LOW);
00201   return ((enc1_max_hi<<8)+enc1_max_low);
00202 }
00203 int Omni3MD::read_enc_max2()
00204 {
00205   byte enc2_max_hi=i2cRequestData(_omniAddress, COMMAND_ENC2_MAX_HI);
00206   byte enc2_max_low=i2cRequestData(_omniAddress, COMMAND_ENC2_MAX_LOW);
00207   return ((enc2_max_hi<<8)+enc2_max_low);
00208 }
00209 int Omni3MD::read_enc_max3()
00210 {
00211   byte enc3_max_hi=i2cRequestData(_omniAddress, COMMAND_ENC3_MAX_HI);
00212   byte enc3_max_low=i2cRequestData(_omniAddress, COMMAND_ENC3_MAX_LOW);
00213   return ((enc3_max_hi<<8)+enc3_max_low);
00214 }*/
00215 int Omni3MD::read_enc1()
00216 {
00217   byte enc1_inc_hi=i2cRequestData(_omniAddress, COMMAND_ENC1_INC_HI);
00218   byte enc1_inc_low=i2cRequestData(_omniAddress, COMMAND_ENC1_INC_LOW);
00219   return ((enc1_inc_hi<<8)+enc1_inc_low);
00220 }
00221 int Omni3MD::read_enc2()
00222 {
00223   byte enc2_inc_hi=i2cRequestData(_omniAddress, COMMAND_ENC2_INC_HI);
00224   byte enc2_inc_low=i2cRequestData(_omniAddress, COMMAND_ENC2_INC_LOW);
00225   return ((enc2_inc_hi<<8)+enc2_inc_low);
00226 }
00227 /*int Omni3MD::read_enc3()
00228 {
00229   byte enc3_inc_hi=i2cRequestData(_omniAddress, COMMAND_ENC3_INC_HI);
00230   byte enc3_inc_low=i2cRequestData(_omniAddress, COMMAND_ENC3_INC_LOW);
00231   return ((enc3_inc_hi<<8)+enc3_inc_low);
00232 }*/
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines


traxbot_robot
Author(s): André Gonçalves Araújo
autogenerated on Fri Feb 1 2013 13:21:12