The story: I hit a break wall with ODrive. ODrive is an open source brushless DC motor (BLDC) driver built with robotics in mind (my application..). I don’t have faith in the project and after months of trying to make it fit my application I’m abandoning it. It’s painful to spend that kind of money on a product (two even!) … but I’m not hopping back on the Stepper bandwagon just yet. I’ll see if I can put my brushless DC motors to use on PopBot 0.5.
First step was deciding on if I could use an off the shelf ESC or buy one. I purchased a RC “rockcrawler” driver as I assumed the firmware would be most compatible with my application. The car and boat ESCs have forward and reverse speed by splitting the PWM servo input in half. While waiting on shipping I found an ESC for a boat and a few for quads in one robot junk bins. Quads are single directions but the boat one was good enough for testing. It had no torque in the low end but that’s not a surprise based on the application with the motor type. I needed a way to program this ESC without a controller and receiver. Programming is typically performed w/ the receiver/controller by pushing the speed to min-max in a certain order. Well that can be done with the arduino of course. Here is a super simple piece of code for you if you don’t want to reinvent the wheel. This will also allow you to control your ESC once it’s programmed and you can uncomment my basic acceleration code if desired.
Hook up the ESC control signals (servo input). On the ESC the white (signal in, sometimes I think the alternate color is orange?) to digital output 9 on the Arduino Uno or Mega. Tie the black (or brown) wire to one of the grounds. DO NOT HOOK UP RED. We don’t need the power from the ESC.. it’s usually not something we want anyways (like 6V… ).
You’ll need this library. Download it and place the uncompressed directory in your Arduino libraries directory.
https://github.com/maxpowel/ESC
/*
* Charles Ihler, iradan.com
* 2020-04-27 build from example of library.
*
* Open the serial monitor... enter 0 (and enter) for reverse
* 1 for foward and 2 for idle/stop..
* Most ESCs want a motor hooked up or warn of damage.. make sure the motor is safe and can't spin off and hurt something.
*
*/
#include <Servo.h>
#include "ESC.h"
ESC esc(ESC::MODE_FORWARD_BACKWARD);
int sel = 0;
String ssel;
void setup()
{
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
esc.attach(9); //change to some other PWM pin if required
}
void output_high() {
digitalWrite(LED_BUILTIN, HIGH);
esc.setDirection(ESC::FORWARD);
esc.setSpeed(500); //comment this out and uncomment below for acceleration. When test running motor.
//for (int i = 0; i <= 150; i++) {
// esc.setSpeed(i);
//delay(25);
//}
}
void output_low() {
digitalWrite(LED_BUILTIN, LOW);
esc.setDirection(ESC::BACKWARD);
esc.setSpeed(500); //comment this out and uncomment below for acceleration. When test running motor.
// for (int i = 0; i <= 150; i++) {
// esc.setSpeed(i);
// delay(25);
//}
}
void output_n() {
digitalWrite(LED_BUILTIN, LOW);
esc.setDirection(ESC::BACKWARD);
esc.setSpeed(0);
}
void loop()
{
Serial.print("Forward (1), Reverse (0), Stop/N(2)?(1/0/2): ");
while (Serial.available() == 0) {}
ssel = Serial.readString();
Serial.print(" --> ");
Serial.println(ssel);
sel = ssel.toInt();
if (sel == 1) {
output_high();
Serial.println("ON!");
}
if (sel == 0) {
output_low();
Serial.println("OFF.");
}
if (sel == 2) {
output_n();
Serial.println("Neutral");
}
delay(100);
}
Enjoy…