diff --git a/main/gps.h b/main/gps.h index e9d0e46..d64a8d0 100644 --- a/main/gps.h +++ b/main/gps.h @@ -14,7 +14,8 @@ #include "HardwareSerial.h" #include "esp_log.h" -#include #include +#include +#include #include #include diff --git a/main/servo.cpp b/main/servo.cpp new file mode 100644 index 0000000..21b747d --- /dev/null +++ b/main/servo.cpp @@ -0,0 +1,61 @@ + +#include "driver/ledc.h" +#include "esp_log_level.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include + +#include "esp_log.h" + +#define SERVO_PIN 7 +#define LEDC_TIMER LEDC_TIMER_0 +#define LEDC_MODE LEDC_LOW_SPEED_MODE +#define LEDC_CHANNEL LEDC_CHANNEL_0 +#define LEDC_DUTY_RES LEDC_TIMER_13_BIT +#define LEDC_FREQUENCY 50 + +uint32_t us_to_duty(int us) { + // 20000 is the period in microseconds (50Hz) + // 8191 is the max duty cycle for 13-bit resolution + return (uint32_t)((float)us / 20000.0f * 8191.0f); +} + +ledc_timer_config_t ledc_timer = {.speed_mode = LEDC_MODE, + .duty_resolution = LEDC_DUTY_RES, + .timer_num = LEDC_TIMER, + .freq_hz = LEDC_FREQUENCY, + .clk_cfg = LEDC_AUTO_CLK}; + +ledc_channel_config_t ledc_channel = {.gpio_num = SERVO_PIN, + .speed_mode = LEDC_MODE, + .channel = LEDC_CHANNEL, + .timer_sel = LEDC_TIMER, + .duty = 0}; +void servo_init() { + ledc_timer_config(&ledc_timer); + ledc_channel_config(&ledc_channel); +} + +#define DUTY_CYCLE_DOWN 2000 +#define DUTY_CYCLE_UP 850 + +enum SERVO_OPTIONS { + UP, + DOWN, + OFF, +}; + +void set_servo(SERVO_OPTIONS opt) { + switch (opt) { + case UP: + ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, us_to_duty(DUTY_CYCLE_UP)); + ledc_update_duty(LEDC_MODE, LEDC_CHANNEL); + break; + case DOWN: + ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, us_to_duty(DUTY_CYCLE_DOWN)); + ledc_update_duty(LEDC_MODE, LEDC_CHANNEL); + case OFF: + ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 0); + ledc_update_duty(LEDC_MODE, LEDC_CHANNEL); + } +} diff --git a/main/servo.h b/main/servo.h new file mode 100644 index 0000000..e69de29