#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/ledc.h"
#include "esp_err.h"
// Konfiguracja serwomechanizmów
#define SERVO_MIN_PULSEWIDTH 500 // Minimalny czas impulsu w mikrosekundach
#define SERVO_MAX_PULSEWIDTH 2500 // Maksymalny czas impulsu w mikrosekundach
#define SERVO_MAX_DEGREE 180 // Maksymalny kąt obrotu serwomechanizmu
// Kanały PWM dla poszczególnych serwomechanizmów
#define SERVO_14_CHANNEL LEDC_CHANNEL_0
#define SERVO_12_CHANNEL LEDC_CHANNEL_1
#define SERVO_13_CHANNEL LEDC_CHANNEL_2
#define SERVO_15_CHANNEL LEDC_CHANNEL_3
#define SERVO_16_CHANNEL LEDC_CHANNEL_4
#define SERVO_5_CHANNEL LEDC_CHANNEL_5
#define SERVO_4_CHANNEL LEDC_CHANNEL_6
#define SERVO_2_CHANNEL LEDC_CHANNEL_7
int array10[9][9] = {
{70, 45, 135, 110, 110, 135, 45, 70, 400},
{115, 45, 135, 65, 110, 135, 45, 70, 400},
{70, 45, 135, 110, 65, 135, 45, 115, 400},
{115, 45, 135, 65, 110, 135, 45, 70, 400},
{70, 45, 135, 110, 65, 135, 45, 115, 400},
{115, 45, 135, 65, 110, 135, 45, 70, 400},
{70, 45, 135, 110, 65, 135, 45, 115, 400},
{115, 45, 135, 65, 110, 135, 45, 70, 400},
{75, 45, 135, 105, 110, 135, 45, 70, 400},
};
void set_servo_angle(ledc_channel_t channel, int angle) {
uint32_t duty = (angle * (SERVO_MAX_PULSEWIDTH - SERVO_MIN_PULSEWIDTH) / SERVO_MAX_DEGREE) + SERVO_MIN_PULSEWIDTH;
duty = duty * (8192 / 20000); // Przeliczenie na jednostki LEDC (us na duty cycle)
ledc_set_duty(LEDC_HIGH_SPEED_MODE, channel, duty);
ledc_update_duty(LEDC_HIGH_SPEED_MODE, channel);
}
void dance2() {
for (int i = 0; i <= 8; i++) {
set_servo_angle(SERVO_14_CHANNEL, array10[i][0]);
set_servo_angle(SERVO_12_CHANNEL, array10[i][1]);
set_servo_angle(SERVO_13_CHANNEL, array10[i][2]);
set_servo_angle(SERVO_15_CHANNEL, array10[i][3]);
set_servo_angle(SERVO_16_CHANNEL, array10[i][4]);
set_servo_angle(SERVO_5_CHANNEL, array10[i][5]);
set_servo_angle(SERVO_4_CHANNEL, array10[i][6]);
set_servo_angle(SERVO_2_CHANNEL, array10[i][7]);
vTaskDelay(pdMS_TO_TICKS(array10[i][8]));
}
}
void app_main() {
// Konfiguracja LEDC timer
ledc_timer_config_t ledc_timer = {
.duty_resolution = LEDC_TIMER_13_BIT,
.freq_hz = 50, // Serwomechanizmy zazwyczaj działają z częstotliwością 50 Hz
.speed_mode = LEDC_HIGH_SPEED_MODE,
.timer_num = LEDC_TIMER_0,
.clk_cfg = LEDC_AUTO_CLK,
};
ledc_timer_config(&ledc_timer);
// Konfiguracja kanałów LEDC
ledc_channel_config_t ledc_channel[8] = {
{.channel = SERVO_14_CHANNEL, .duty = 0, .gpio_num = 14, .speed_mode = LEDC_HIGH_SPEED_MODE, .hpoint = 0, .timer_sel = LEDC_TIMER_0},
{.channel = SERVO_12_CHANNEL, .duty = 0, .gpio_num = 12, .speed_mode = LEDC_HIGH_SPEED_MODE, .hpoint = 0, .timer_sel = LEDC_TIMER_0},
{.channel = SERVO_13_CHANNEL, .duty = 0, .gpio_num = 13, .speed_mode = LEDC_HIGH_SPEED_MODE, .hpoint = 0, .timer_sel = LEDC_TIMER_0},
{.channel = SERVO_15_CHANNEL, .duty = 0, .gpio_num = 15, .speed_mode = LEDC_HIGH_SPEED_MODE, .hpoint = 0, .timer_sel = LEDC_TIMER_0},
{.channel = SERVO_16_CHANNEL, .duty = 0, .gpio_num = 16, .speed_mode = LEDC_HIGH_SPEED_MODE, .hpoint = 0, .timer_sel = LEDC_TIMER_0},
{.channel = SERVO_5_CHANNEL, .duty = 0, .gpio_num = 5, .speed_mode = LEDC_HIGH_SPEED_MODE, .hpoint = 0, .timer_sel = LEDC_TIMER_0},
{.channel = SERVO_4_CHANNEL, .duty = 0, .gpio_num = 4, .speed_mode = LEDC_HIGH_SPEED_MODE, .hpoint = 0, .timer_sel = LEDC_TIMER_0},
{.channel = SERVO_2_CHANNEL, .duty = 0, .gpio_num = 2, .speed_mode = LEDC_HIGH_SPEED_MODE, .hpoint = 0, .timer_sel = LEDC_TIMER_0},
};
for (int i = 0; i < 8; i++) {
ledc_channel_config(&ledc_channel[i]);
}
while (true) {
dance2();
vTaskDelay(pdMS_TO_TICKS(1000));
}
}