| @@ -0,0 +1,56 @@ | |||
| #include <Servo.h> | |||
| #define PIN_POT A0 | |||
| #define PIN_BTN 2 | |||
| #define PIN_ESC 5 | |||
| #define MIN_SPEED 1000 | |||
| #define MAX_SPEED 1500 | |||
| #define DELAY 10 | |||
| Servo esc; | |||
| void setup() { | |||
| Serial.begin(115200); | |||
| pinMode(PIN_BTN, INPUT_PULLUP); | |||
| pinMode(PIN_POT, INPUT); | |||
| esc.attach(PIN_ESC); | |||
| esc.writeMicroseconds(MIN_SPEED); | |||
| } | |||
| float speedFunc(float t) { | |||
| return 0.15 + 0.000000005 * t * t * t; | |||
| } | |||
| void loop() { | |||
| int pressed = 0; | |||
| int t = 0; | |||
| int reachedMax = 0; | |||
| while (digitalRead(PIN_BTN) == LOW) { | |||
| pressed = 1; | |||
| int pot = analogRead(PIN_POT); | |||
| int speed = map(pot, 0, 1023, 0, MAX_SPEED - MIN_SPEED); | |||
| int actualSpeed; | |||
| if (!reachedMax) { | |||
| float multiplier = min(speedFunc(t), 1); | |||
| if (multiplier > 1) { | |||
| multiplier = 1; | |||
| reachedMax = 1; | |||
| } | |||
| actualSpeed = speed * multiplier + MIN_SPEED; | |||
| } else { | |||
| actualSpeed = speed + MIN_SPEED; | |||
| } | |||
| Serial.println(actualSpeed); | |||
| esc.writeMicroseconds(actualSpeed); | |||
| delay(DELAY); | |||
| t += DELAY; | |||
| } | |||
| if (pressed) | |||
| esc.writeMicroseconds(0); | |||
| } | |||