Particle Core I2C

Today I tried working with I2C on the core, I used a Grove I2C Motor Driver, But nothing seems to be happening… I tried the motor driver with a arduino and it seems to work fine. I’m not sure what I am doing wrong…
Here is the code I used -

#define MotorSpeedSet             0x82
#define PWMFrequenceSet           0x84
#define DirectionSet              0xaa
#define MotorSetA                 0xa1
#define MotorSetB                 0xa5
#define Nothing                   0x01
#define EnableStepper             0x1a
#define UnenableStepper           0x1b
#define Stepernu                  0x1c
#define I2CMotorDriverAdd         0x0f   // Set the address of the I2CMotorDriver
// set the steps you want, if 255, the stepper will rotate continuely;
void SteperStepset(unsigned char stepnu)
{
  Wire.beginTransmission(I2CMotorDriverAdd); // transmit to device I2CMotorDriverAdd
  Wire.write(Stepernu);          // Send the stepernu command 
  Wire.write(stepnu);            // send the steps
  Wire.write(Nothing);           // send nothing   
  Wire.endTransmission();        // stop transmitting 
}
///////////////////////////////////////////////////////////////////////////////
// Enanble the i2c motor driver to drive a 4-wire stepper. the i2c motor driver will
//driver a 4-wire with 8 polarity  .
//Direction: stepper direction ; 1/0
//motor speed: defines the time interval the i2C motor driver change it output to drive the stepper
//the actul interval time is : motorspeed * 4ms. that is , when motor speed is 10, the interval time 
//would be 40 ms
//////////////////////////////////////////////////////////////////////////////////
void StepperMotorEnable(unsigned char Direction, unsigned char motorspeed)
{
  Wire.beginTransmission(I2CMotorDriverAdd); // transmit to device I2CMotorDriverAdd
  Wire.write(EnableStepper);        // set pwm header 
  Wire.write(Direction);              // send pwma 
  Wire.write(motorspeed);              // send pwmb    
  Wire.endTransmission();    // stop transmitting 
}
//function to uneanble i2C motor drive to drive the stepper.
void StepperMotorUnenable()
{
  Wire.beginTransmission(I2CMotorDriverAdd); // transmit to device I2CMotorDriverAdd
  Wire.write(UnenableStepper);        // set unenable commmand
  Wire.write(Nothing);              
  Wire.write(Nothing);              
  Wire.endTransmission();    // stop transmitting 
}
//////////////////////////////////////////////////////////////////////
//Function to set the 2 DC motor speed
//motorSpeedA : the DC motor A speed; should be 0~100;
//motorSpeedB: the DC motor B speed; should be 0~100;

void MotorSpeedSetAB(unsigned char MotorSpeedA , unsigned char MotorSpeedB)  {
  MotorSpeedA=map(MotorSpeedA,0,100,0,255);
  MotorSpeedB=map(MotorSpeedB,0,100,0,255);
  Wire.beginTransmission(I2CMotorDriverAdd); // transmit to device I2CMotorDriverAdd
  Wire.write(MotorSpeedSet);        // set pwm header 
  Wire.write(MotorSpeedA);              // send pwma 
  Wire.write(MotorSpeedB);              // send pwmb    
  Wire.endTransmission();    // stop transmitting
}
//set the prescale frequency of PWM, 0x03 default;
void MotorPWMFrequenceSet(unsigned char Frequence)  {    
  Wire.beginTransmission(I2CMotorDriverAdd); // transmit to device I2CMotorDriverAdd
  Wire.write(PWMFrequenceSet);        // set frequence header
  Wire.write(Frequence);              //  send frequence 
  Wire.write(Nothing);              //  need to send this byte as the third byte(no meaning)  
  Wire.endTransmission();    // stop transmitting
}
//set the direction of DC motor. 
void MotorDirectionSet(unsigned char Direction)  {     //  Adjust the direction of the motors 0b0000 I4 I3 I2 I1
  Wire.beginTransmission(I2CMotorDriverAdd); // transmit to device I2CMotorDriverAdd
  Wire.write(DirectionSet);        // Direction control header
  Wire.write(Direction);              // send direction control information
  Wire.write(Nothing);              // need to send this byte as the third byte(no meaning)  
  Wire.endTransmission();    // stop transmitting 
}

void MotorDriectionAndSpeedSet(unsigned char Direction,unsigned char MotorSpeedA,unsigned char MotorSpeedB)  {  //you can adjust the driection and speed together
  MotorDirectionSet(Direction);
  MotorSpeedSetAB(MotorSpeedA,MotorSpeedB);  
}
void stepperrun()
{
 Serial.println("sent command to + direction, very fast");
 SteperStepset(255);
 StepperMotorEnable(1, 1);// ennable the i2c motor driver a stepper. 
  delay(5000);
  Serial.println("sent command to - direction, slow");
  SteperStepset(255);
  StepperMotorEnable(0, 20);
  delay(5000);
   Serial.println("sent command to - direction, fast");
  StepperMotorEnable(0, 2);// ennable the i2c motor driver a stepper. 
  delay(5000);
 Serial.println("sent command to + direction,100 steps, fast");
 SteperStepset(100);
  StepperMotorEnable(1,5);
 delay(3000);

 Serial.println("sent command to shut down the stepper");
 StepperMotorUnenable();
 delay(1000);
 
  Serial.println("sent command to - direction, slow, and 10 steps then stop");
 SteperStepset(10);
 StepperMotorEnable(0,40);
 delay(5000);
 Serial.println("sent command to shut down the stepper");
 StepperMotorUnenable();
 delay(5000);
}
void setup()  {
  Wire.begin(); // join i2c bus (address optional for master)
  delayMicroseconds(10000);
  Serial.begin(9600);
  Serial.println("setup begin");
  stepperrun();
}

void loop()  {
   while(1)  {
    MotorSpeedSetAB(100,100);
    delay(10); //this delay needed
    MotorDirectionSet(0b0110);  //0b1010  Rotating in the positive direction 
    delay(10000); 
    MotorDirectionSet(0b1001);  //0b0101  Rotating in the opposite direction
    delay(500);
  }
  
}

@lamefreaks, which version of the Grove board are you using? I am not familiar with the board so do they have pull-up resistors for the I2C lines? How did you hook up the board to the Core?

You also need to remove the while(1) loop from loop() so the background firmware can run. :smile:

did you ever get a solution to this?