Hello everyone, I have a question regarding my program in arduino. I have to control ESC by arduino, I need only to run up the motor to the certain power and then go to 0 again. I made the program below but when I connect arduino into ESC, ESC starts beeping quickly, which means according to the manual that the throttle is not set to minimum. I tried to set the throttle to minimum by arming process in my program however it is not probably correct. I´m very beginner with arduino and this is my first project, so I´m sorry for possible stupid mistakes in my program.
Thanks in advance,
Pavel
#include <Servo.h>;
Servo ESC;
int pos = 0; //Sets position variable
void arm(){
setSpeed(0); //Sets speed variable delay(1000);
}
void setSpeed(int speed){
int angle = map(speed, 0, 100, 0, 180); //Sets servo positions to different speeds ESC1.write(angle);
}
void setup() {
ESC.attach(3); //Adds ESC to D3 pin. arm();
}
void loop() {
int speed; //Implements speed variable
for(speed = 0; speed <= 50; speed += 5) { //Cycles speed up to 50% power for 1 second
setSpeed(speed); //Creates variable for speed to be used in in for loop
delay(1000);
}
delay(4000); //Stays on for 4 seconds
for(speed = 50; speed > 0; speed -= 5) { // Cycles speed down to 0% power for 1 second
setSpeed(speed); delay(1000);
}
setSpeed(0); //Sets speed variable to zero no matter what
delay(1000); //Turns off for 1 second
}
A few items. Unnecessary white space (like your extra blank lines) and no formatting make your code hard to read.
I loaded your sketch (thank you for proper use of code tags), formatted it (CTRL-T) and removed the extra lines.
Don't you agree that this is easier to read?
#include <Servo.h>;
Servo ESC;
int pos = 0; //Sets position variable
void arm() {
setSpeed(0); //Sets speed variable delay(1000);
}
void setSpeed(int speed) {
int angle = map(speed, 0, 100, 0, 180); //Sets servo positions to different speeds ESC1.write(angle);
}
void setup() {
ESC.attach(3); //Adds ESC to D3 pin. arm();
}
void loop() {
int speed; //Implements speed variable
for (speed = 0; speed <= 50; speed += 5) { //Cycles speed up to 50% power for 1 second
setSpeed(speed); //Creates variable for speed to be used in in for loop
delay(1000);
}
delay(4000); //Stays on for 4 seconds
for (speed = 50; speed > 0; speed -= 5) { // Cycles speed down to 0% power for 1 second
setSpeed(speed); delay(1000);
}
setSpeed(0); //Sets speed variable to zero no matter what
delay(1000); //Turns off for 1 second
}
Now, you see that you have an arm function. But I cannot find it being called.
Consider calling it in the setup.
Also, many ESCs require some delay at zero throttle to arm.
Consider putting in a small delay (one second?) after you set the speed to zero.
Putting the delay(1000) in the arm() routine (instead of it just being in a comment) should fix the arming.
for (speed = 0; speed <= 50; speed += 5) { //Cycles speed up to 50% power for 1 second
setSpeed(speed); //Creates variable for speed to be used in in for loop
delay(1000);
But then with the delay(1000) in your for loops it waits 1 second between each +/-5 move...so takes 10 seconds to get to 50% or back to 0%. The comment is a bit misleading.
Also you keep setting the variable 'speed' but you never write it or anything else to the ESC so there's definitely still some work to do.
Thank you for the advices, it´s working as I need now.
Working code below
#include <Servo.h>;
Servo ESC;
int pos = 0; //Sets position variable
int speed; //Implements speed variable
void arm(){
setSpeed(0); //Sets speed variable
delay(2000);
}
void setSpeed(int speed){
int angle = map(speed, 0, 100, 0, 180); //Sets servo positions to different speeds
ESC.write(angle);
}
void setup() {
ESC.attach(3); //Adds ESC to D3 pin.
arm();
}
void loop() {
int speed; //Implements speed variable
for(speed = 0; speed <= 50; speed += 5) { //Cycles speed up to 50% power for 1 second each step
setSpeed(speed); //Creates variable for speed to be used in in for loop
delay(1000);
}
delay(4000); //Stays on for 4 seconds
for(speed = 50; speed > 0; speed -= 5) { // Cycles speed down to 0% power for 1 second
setSpeed(speed);
delay(1000);
}
setSpeed(0); //Sets speed variable to zero no matter what
delay(1000); //Turns off for 1 second
}
I'm having an interesting problem after the fan shuts off with the above code.
I'm trying to delay the start for 1 minute on and 1 minute off etc.
but, when its on 1 minute off, the motor "beeps" every 2 to 4 secs.
I need silent for the 1 minute.
Once this works, the total fan run time is for 1 hour on and 2 hours off each day.
cheers Jason
My sketch is:
const long oneSecond = 1000; // a second is a thousand milliseconds
const long oneMinute = oneSecond * 60;
const long threeMinute = oneMinute * 3;
const long oneHour = oneMinute * 60;
const long twoHour = oneHour * 2;
const long threeHour = oneHour * 3;
int sensorPin = A0; // select the input pin for LDR//
int sensorValue = 0; // variable to store the value coming from the senso
#include <Servo.h>;
Servo ESC;
int pos = 0; //Sets position variable
int speed; //Implements speed variable
void loop() {
int speed; //Implements speed variable
for(speed = 0; speed <= 40; speed += 5) { //Cycles speed up to 50% power for 1 second each step
setSpeed(speed); //Creates variable for speed to be used in in for loop
delay(1000);
}
delay(oneMinute); //Stays on for 1 minute
for(speed = 40; speed > 0; speed -= 5) { // Cycles speed down to 0% power for 1 second
setSpeed(speed);
delay(1000);
}
setSpeed(0); //Sets speed variable to zero no matter what
delay(1000); //Turns off for 1 sec