Showing posts with label Rover. Show all posts
Showing posts with label Rover. Show all posts

Friday, 22 September 2017

Resolving Issues with Forward and Reverse Runs

In the previous post, I had mentioned how the shift from forward to reverse and vice versa was quite unpredictable with an undocumented ESC. Using a series of empirically determined instructions, I had managed to make the motor run both in forward and reverse - but strictly according to a predefined series of instructions. Whenever we changed the series of instructions, the shift from forward to reverse [or vice versa] would not happen.

Here, I present an improvement upon that code: one that takes a Serial Input - and then acts on it. In my rover, I was able to make the motor run either in forward or in reverse according to the input. The caveat is that between every shift in direction, I had added a brake instruction. I still need to check if the brake instruction can be done away with [so far, am not brave enough to do that; but eventually].

Once the code below has been compiled and uploaded, I find that using the Serial input values 2 [forward] and 4 [reverse] interspersed with 3 [brake], works reproducibly.

[Code]
/* Arduino control of standard RC car ESC. 
Has code for both forward and reverse movements. 
The code presupposes that the ESC is already armed. Given sparse documentation for the ESC, I am not examining weird behavior changes in this ESC. However, if your ESC refuses to arm, then I would suggest the code shown in post_1 be used. 

Briefly, arming the ESC involves starting at the lowest pulse rate [typically around 700 microseconds] and going up to the max [typically 2100 microseconds]; since Arduino Servo library treats ESC as servos, one can also pulse the ESC from angles 0 [corresponding to minimum pulse] to 180 [corresponding to maximum pulse]. Each pulse must be at least 20milliseconds, though I prefer 40milliseconds just to be sure. Probably better ESCs will require shorter durations at each pulse rate.

Now that all the disclaimers are done, here goes nothing.
*/


#include<Servo.h>
Servo esc; // Call the ESC "esc"
void setup()
{
  esc.attach(9);
//Again - this is useful only during the testing part. For autonomous running, it is pointless.
  int i=0;
  Serial.begin(9600);
  delay(3000);

}

void loop()
{
  int i=0;
  char input;
  // Start at Servo Degree 70 and go till just above neutral. 
  // Note, Neutral is at 94 for this ESC.
  // This will run it in one direction.
  // Name this Step 1
  input=Serial.read();
if(input == '1')
{
  for(i=70;i<95;i++)
  {
    esc.write(i);
    delay(200);
  }
}

//Run for 2 seconds at moderately high speed (70).
// Name this Step 2
if(input =='2')
{
  esc.write(70); delay(200);
}
// Apply Brakes for 40 millisecs.
// Name this Step 3

if(input == '3')
{
  esc.write(100); delay(40);

// Apply throttle in opposite direction for 2 seconds.
// Name this Step 4
if(input == '4')
{
  esc.write(110); delay(2000);
}
// Bring down throttle to neutral.
// Name this Step 5
if(input == '5')
{
  for(i=110;i>90;i--)
  {
    esc.write(i);
    delay(200);
  }
}
// Apply brakes again - to change directions for 40 millisecs.
// Name this Step 6
if(input == '6')
{
  esc.write(70); delay(40);
}
input=NULL;
}
[/Code]

Sunday, 15 January 2017

Forward and Reverse in BLDC ESC

Last post (here) we looked at the ESC control in cars, with and without brakes. Here, I provide a sample code that managed to run the car autonomously (meaning: it ran without any Tx / Rx).

#include<Servo.h>
Servo esc; // Call the ESC "esc"
void setup()
{
  esc.attach(9);
/*
As you can see - I am not arming the ESC here. For some reason, the ESC is now on a persistently armed mode now. Upon powering, the ESC automatically arms. Given sparse documentation for the ESC, I am not examining this weird behavior changes in this ESC. However, if your ESC refuses to arm, then I would suggest the code shown in post_1 be used.
*/
//Again - this is useful only during the testing part. For autonomous running, it is pointless.
  int i=0;
  Serial.begin(9600); }

void loop()
{
  int i=0;
  // Start at Servo Degree 70 and go till just above neutral. 
  // Note, Neutral is at 94 for this ESC.
  // This will run it in one direction.
  for(i=70;i<95;i++)
  {
    esc.write(i);
    delay(200);
  }
//Run for 2 seconds at moderately high speed (70).
  esc.write(70); delay(2000);
// Apply Brakes for 40 millisecs.
  esc.write(100); delay(40);
// Apply throttle in opposite direction for 2 seconds.
  esc.write(110); delay(2000);
// Bring down throttle to neutral.
  for(i=110;i>90;i--)
  {
    esc.write(i);
    delay(200);
  }
// Apply brakes again - to change directions for 40 millisecs.
  esc.write(70); delay(40);
}

This code has not been rigorously tested at all. For example, there is no reason why I used 40 millisecs instead of, say, 35. All I have noticed is that at the pulse frequency (50Hz / 20 millisecs) this code doesn't work. So, in all likelihood, 21ms could also work. Also - I don't know what will happen if I bring the run throttle (70 and 110) closer to neutral (say,
85 and 100). In some cases, the ESC behavior abruptly changes, and the direction shifting doesn't happen (it stops running in one of the directions).

However, this code has allowed the RC car to move forward and in reverse without any external input at all. (time for a drink).

Given below is a photo of the car I had used for this purpose - it is a Traxxas / TT rip-off rally frame. The big (1/10) frame has plenty of room / power for carrying the Arduino board, a 7200 mAh NiMH battery for the car, a 10000mAh USB power bank (used to power the Arduino board) and everything else in between. I have not provided the connection drawing, because it is - at this point - trivial.



I intend to slap a SONAR on it and see if it can run around and not bump into obstacles (or walls). At that point, I will post a video :-)

Till then - ciao.

k