Professional Documents
Culture Documents
Coaster Motor I2C
Coaster Motor I2C
*/
#include <Wire.h>
// easily convert 2 bytes to/from an integer
union BYTE2INT {
byte asBytes[2];
int asInt;
} byteToInt;
// easily convert 2 bytes to/from an integer
union BYTE2FLOAT {
byte asBytes[2];
float asFloat;
} byteToFloat;
// set pin numbers:
#define LED_PIN 13// the number of the LED pin
#define MOTOR_CNT 2// number of motors
#define MOTOR_PINS 3// Arduino pins/motor
int changed = 0;
void setup() {
// join i2c bus with address 0x04
// register receive event handler
Wire.begin(4);
Wire.onReceive(receiveEvent);
// initialize the LED pin as an output:
pinMode(LED_PIN, OUTPUT);
// initialize motor pins as output:
for(int i = 0; i < MOTOR_CNT; i++)
{
for(int j = 0; j < MOTOR_PINS; j++)
{
pinMode(motor_pins[i][j], OUTPUT);
}
}
// flash ready
digitalWrite(LED_PIN, HIGH);
delay(1000);
digitalWrite(LED_PIN, LOW);
}
//
// just flash if change from I2C master
// work is done in registered recieve event
//
void loop()
{
// indicate change from master
if(changed == 1)
{
// flash ready
digitalWrite(LED_PIN, HIGH);
delay(50);
digitalWrite(LED_PIN, LOW);
changed = 0;
}
}
//
// set motor speed to requested value
// motorSpd in range -255 to 255
// assume linear for now, add lookup tables for non-linear pwn resp
//
// pwm range 0 to 255, direction controlled by direction pins
//
void setMotorSpeed(int motorIdx,int motorSpd)
{
// stopped?
if(motorSpd == 0)
{
analogWrite(motor_pins[motorIdx][0], 0);
// change as required for motor brakes
digitalWrite(motor_pins[motorIdx][1], LOW);
digitalWrite(motor_pins[motorIdx][2], LOW);
return;
}
// check speed ranges
if(motorSpd < -255)
motorSpd = -255;
if(motorSpd > 255)
motorSpd = 255;