A simple I2C library for ESCs using the Blue Robotics version of SimonK's TGY firmware (https://github.com/bluerobotics/tgy). This library supports the BlueESC, but also the Afro Nfet 30A. I2C is an alternative interface for micro-controllers, rather than using PWM (as a servo) -- this provides some additional features like temperature level, RPM, etc.
Dependents: SimonK_I2C_ESC_Example
Example program here:
Import programSimonK_I2C_ESC_Example
Simple example for the SimonK_I2C_ESC. Tested on the FRDM K64F.
Additional guidance is provided in the Wiki
Diff: SimonK_I2C_ESC.cpp
- Revision:
- 0:41ddae212f64
- Child:
- 1:7efb04a9c0dd
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SimonK_I2C_ESC.cpp Fri Apr 01 06:45:10 2016 +0000 @@ -0,0 +1,77 @@ +#include "SimonK_I2C_ESC.h" + +namespace { + char _buffer[9]; +} + +SimonK_I2C_ESC::SimonK_I2C_ESC(I2C &i2c, char address, char poleCount) : _i2c(i2c){ + _address = address; + _poleCount = poleCount; + // A timer is needed to calculate the RPM. + mbed_rpm_timer.start(); + _rpmTimer = mbed_rpm_timer.read_ms(); +} + +// Read the incoming data buffer from an ESC +void SimonK_I2C_ESC::readBuffer(char buffer[]) { + char readStartAddress = 0x02; + _i2c.write(_address,&readStartAddress,1,false); + _i2c.read(_address,buffer,9); +} + +// Send motor speed command to ESC +void SimonK_I2C_ESC::set(short throttle) { + char throttleData[3]; + throttleData[0] = 0x00; // Throttle Start Address + throttleData[1] = throttle>>8; + throttleData[2] = throttle; + _i2c.write(_address, throttleData, 3, true); +} + +// Send motor speed command to ESC +void SimonK_I2C_ESC::setPWM(short pwm) { + set((pwm - 1100) * (32767 - -32767) / (1900 - 1100) + -32767); +} + +void SimonK_I2C_ESC::update() { + _buffer[8] = 0x00; // Reset last byte so we can check for alive + readBuffer(_buffer); + _rpm = (_buffer[0] << 8) | _buffer[1]; + _voltage_raw = (_buffer[2] << 8) | _buffer[3]; + _temp_raw = (_buffer[4] << 8) | _buffer[5]; + _current_raw = (_buffer[6] << 8) | _buffer[7]; + _identifier = _buffer[8]; + _rpm = float(_rpm) / (( mbed_rpm_timer.read_ms() -_rpmTimer)/1000.0f)*60/ float(_poleCount); + _rpmTimer = mbed_rpm_timer.read_ms(); +} + +bool SimonK_I2C_ESC::isAlive() { + return (_identifier == 0xab); +} + +float SimonK_I2C_ESC::voltage() { + return float(_voltage_raw)/65536.0f*5.0f*6.45f; +} + +float SimonK_I2C_ESC::current() { + return (float(_current_raw)-32767)/65535.0f*5.0f*14.706f; +} + +float SimonK_I2C_ESC::temperature() { + // This code was taken from an Adafruit + float resistance = SERIESRESISTOR/(65535/float(_temp_raw)-1); + + float steinhart; + steinhart = resistance / THERMISTORNOMINAL; // (R/Ro) + steinhart = log(steinhart); // ln(R/Ro) + steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro) + steinhart += float(1.0) / (TEMPERATURENOMINAL + 273.15); // + (1/To) + steinhart = float (1.0) / steinhart; // Invert + steinhart -= float(273.15); // convert to C + + return steinhart; +} + +short SimonK_I2C_ESC::rpm() { + return _rpm; +} \ No newline at end of file