This is an old revision of the document!
TinyIdiot
tinytony for esp8266
drv8830 datasheet
built of work by sparkfun minimoto breakout and jiwashin and here
##wiring ESP DRV 8830 GPIO 4 | SDA GPIO 5 | SCL VIN | Vcc GND | Gnd
- connect to the ESP only with I2C pulled up with 3.3v.
- Motor (+) and OUT1, motor (-) and OUT2
- A 1 nF (102) ceramic capacitor between + and - of the motor
- A resistance of 0.2 Ω between ISENSE and GND of the DRV 8830
- 0.1 μF (104) ceramic capacitor between VCC and GND of the DRV 8830
- A 10 kΩ resistor between SDA and 3.3 v
- A 10 kΩ resistor between SCL and 3.3 v
- 5 V output such as USB serial and VIN of ESP - WROOM - 02 board
- GND of USB serial etc. and GND of ESP - WROOM - 02 board
code
/*
TinyIdiot
tiytony esp8266
drv8830 code from https://jiwashin.blogspot.com/2016/09/drive-dc-motor-by-drv8830-and-esp8266.html
pdf > http://www.tij.co.jp/jp/lit/ds/symlink/drv8830.pdf
##wiring
ESP DRV 8830
GPIO 4 | SDA
GPIO 5 | SCL
VIN | Vcc
GND | Gnd
* **connect to the ESP only with I2C pulled up with 3.3v.**
* Motor (+) and OUT1, motor (-) and OUT2
* A 1 nF ceramic capacitor between + and - of the motor
* A resistance of 0.2 Ω between ISENSE and GND of the DRV 8830
* 0.1 μF ceramic capacitor between VCC and GND of the DRV 8830
* A 10 kΩ resistor between SDA and 3.3 v
* A 10 kΩ resistor between SCL and 3.3 v
* 5 V output such as USB serial and VIN of ESP - WROOM - 02 board
* GND of USB serial etc. and GND of ESP - WROOM - 02 board
*/
#include <Arduino.h>
#include <Wire.h>
uint8_t readMotorStatus();
void resetMotorStatus();
void runMotor(int inVector);
void writeToDriver(byte inDirection, byte inVoltage);
void brakeMotor();
const int kDrv8830Address = 0x64;
const int kBitClear = 0x80;
const int kBitILimit = 0x10;
const int kBitOTS = 0x08;
const int kBitUVLO = 0x04;
const int kBitOCP = 0x02;
const int kBitFault = 0x01;
//
// Setup
//
void setup() {
Serial.begin(115200);
Wire.begin();
}
//
// Loop
//
float r = 0;
void loop() {
//
// Motor
float s = sin(r) * 64.0;
r += 0.1;
if (r > 6.28) r = 0.0;
int out = (s > 0) ? 0x01 : 0x02;
int speed = s;
runMotor(speed);
int status = readMotorStatus();
if (status & kBitFault) {
Serial.print("Motor Fault : ");
Serial.println(status, HEX);
resetMotorStatus();
}
delay(100);
}
//
// DRV8830 Controll
//
uint8_t readMotorStatus() {
uint8_t result = 0x00;
Wire.beginTransmission(kDrv8830Address);
Wire.write(0x01); // read register 0x01
Wire.endTransmission();
Wire.requestFrom(kDrv8830Address, 1);
if (Wire.available()) {
result = Wire.read();
} else {
Serial.println("No status data");
}
return result;
}
void resetMotorStatus() {
Wire.beginTransmission(kDrv8830Address);
Wire.write(0x01); // fault
Wire.write(0x80); // clear
Wire.endTransmission(true);
}
void runMotor(int inVector) {
int direction;
int voltage;
if (inVector > 0) {
direction = 0x01;
voltage = inVector;
} else if (inVector == 0) {
direction = 0x00;
voltage = 0;
} else {
direction = 0x02;
voltage = -inVector;
}
writeToDriver(direction, voltage);
}
void brakeMotor() {
writeToDriver(0x03, 0x00);
}
void writeToDriver(byte inDirection, byte inVoltage) {
if (inVoltage <= 0x05) inVoltage = 0x06; // minimum voltage value is 0x06.
int outData = (inVoltage & 0x3f) << 2 | (inDirection & 0x03);
Wire.beginTransmission(kDrv8830Address);
Wire.write(0x00); // control
Wire.write(outData); //
Wire.endTransmission(true);
delay(12);
}

