Hello, for a startup, i just want to control the speed of 4 BLDC motors using APM 2.0. which i previously controlled using arduino uno, can anyone help?
You need to be a member of diydrones to add comments!
I have tried to use the same code as i used in Arduino uno, attaching only 1 motor, but the problem is coming that as soon as i run the program, power supply with which ESC have been connected, immediately starts blinking rapidly showing that current is insufficient, that was not the problem when i was running the same code with arduino uno, i have repeatedly checked for all the connections and replaced Power supply, have also tried by replacing motor but same problem is coming every time.
Do you want an Arduino sketch?? is the chip inside the AT mega 2560?? If it is and you need an arduino sketch code try
/* * This code is in the public domain. * (Do whatever you want with it.) */
// Need the Servo library #include <Servo.h>
// This is our motor. Servo myMotor;
// This is the final output // written to the motor. String incomingString;
// Set everything up void setup() { // Put the motor to Arduino pin #9 myMotor.attach(12);
// Required for I/O from Serial monitor Serial.begin(9600); // Print a startup message Serial.println("initializing"); }
void loop() { // If there is incoming value if(Serial.available() > 0) { // read the value char ch = Serial.read();
/* * If ch isn't a newline * (linefeed) character, * we will add the character * to the incomingString */ if (ch != 10){ // Print out the value received // so that we can see what is // happening Serial.print("I have received: "); Serial.print(ch, DEC); Serial.print('\n');
// Add the character to // the incomingString incomingString += ch; } // received a newline (linefeed) character // this means we are done making a string else { // print the incoming string Serial.println("I am printing the entire string"); Serial.println(incomingString);
// Convert the string to an integer int val = incomingString.toInt();
// print the integer Serial.println("Printing the value: "); Serial.println(val);
/* * We only want to write an integer between * 0 and 180 to the motor. */ if (val > -1 && val < 181) { // Print confirmation that the // value is between 0 and 180 Serial.println("Value is between 0 and 180"); // Write to Servo myMotor.write(val); } // The value is not between 0 and 180. // We do not want write this value to // the motor. else { Serial.println("Value is NOT between 0 and 180");
// IT'S a TRAP! Serial.println("Error with the input"); }
// Reset the value of the incomingString incomingString = ""; } } }
You will need to change the 12 in myMotor.attach(12) to whatever pin you will be using.
In the serial monitor screen just enter different values between 0 and 180 to vary the speed of the motor. The values usually below 60 do not spin the motor. I hope this helps.
Replies
I have tried to use the same code as i used in Arduino uno, attaching only 1 motor, but the problem is coming that as soon as i run the program, power supply with which ESC have been connected, immediately starts blinking rapidly showing that current is insufficient, that was not the problem when i was running the same code with arduino uno, i have repeatedly checked for all the connections and replaced Power supply, have also tried by replacing motor but same problem is coming every time.
Hello Enyo,
Do you want an Arduino sketch?? is the chip inside the AT mega 2560?? If it is and you need an arduino sketch code try
/*
* This code is in the public domain.
* (Do whatever you want with it.)
*/
// Need the Servo library
#include <Servo.h>
// This is our motor.
Servo myMotor;
// This is the final output
// written to the motor.
String incomingString;
// Set everything up
void setup()
{
// Put the motor to Arduino pin #9
myMotor.attach(12);
// Required for I/O from Serial monitor
Serial.begin(9600);
// Print a startup message
Serial.println("initializing");
}
void loop()
{
// If there is incoming value
if(Serial.available() > 0)
{
// read the value
char ch = Serial.read();
/*
* If ch isn't a newline
* (linefeed) character,
* we will add the character
* to the incomingString
*/
if (ch != 10){
// Print out the value received
// so that we can see what is
// happening
Serial.print("I have received: ");
Serial.print(ch, DEC);
Serial.print('\n');
// Add the character to
// the incomingString
incomingString += ch;
}
// received a newline (linefeed) character
// this means we are done making a string
else
{
// print the incoming string
Serial.println("I am printing the entire string");
Serial.println(incomingString);
// Convert the string to an integer
int val = incomingString.toInt();
// print the integer
Serial.println("Printing the value: ");
Serial.println(val);
/*
* We only want to write an integer between
* 0 and 180 to the motor.
*/
if (val > -1 && val < 181)
{
// Print confirmation that the
// value is between 0 and 180
Serial.println("Value is between 0 and 180");
// Write to Servo
myMotor.write(val);
}
// The value is not between 0 and 180.
// We do not want write this value to
// the motor.
else
{
Serial.println("Value is NOT between 0 and 180");
// IT'S a TRAP!
Serial.println("Error with the input");
}
// Reset the value of the incomingString
incomingString = "";
}
}
}
You will need to change the 12 in myMotor.attach(12) to whatever pin you will be using.
In the serial monitor screen just enter different values between 0 and 180 to vary the speed of the motor. The values usually below 60 do not spin the motor. I hope this helps.
You can use the same code on the APM2.0 as you would on the uno