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

Revision:
0:41ddae212f64
Child:
1:7efb04a9c0dd
diff -r 000000000000 -r 41ddae212f64 SimonK_I2C_ESC.cpp
--- /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