#include #include #include "driver/gpio.h" #include "esp_err.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_random.h" #include "driver/ledc.h" #include "hal/ledc_types.h" #define SEQ_MAX_LEN 8 /* Inputs */ // Clock In // Reset In /* Outputs */ #define GPIO_CLK_OUT (7) // Clock Out #define GPIO_GATE_OUT (8) // Gate CV Out /* LED GPIO Pins */ #define LEDC_CLK_OUT (5) #define LEDC_GATE_OUT (6) static void gpio_init(void) { // Setup Clock CV Output gpio_reset_pin(GPIO_CLK_OUT); gpio_set_direction(GPIO_CLK_OUT, GPIO_MODE_OUTPUT); // Setup Gate CV Output gpio_reset_pin(GPIO_GATE_OUT); gpio_set_direction(GPIO_GATE_OUT, GPIO_MODE_OUTPUT); } static void ledc_init(void) { // Setup LEDC PWM timer configuration ledc_timer_config_t ledc_timer = { .speed_mode = LEDC_LOW_SPEED_MODE, .timer_num = LEDC_TIMER_0, .duty_resolution = LEDC_TIMER_13_BIT, .freq_hz = 5000, .clk_cfg = LEDC_AUTO_CLK }; ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer)); // Setup Clock LED ledc_channel_config_t ledc_clk_channel = { .channel = LEDC_CHANNEL_0, .gpio_num = LEDC_CLK_OUT, .speed_mode = LEDC_LOW_SPEED_MODE, .timer_sel = LEDC_TIMER_0, .intr_type = LEDC_INTR_DISABLE, .duty = 0, .hpoint = 0 }; ESP_ERROR_CHECK(ledc_channel_config(&ledc_clk_channel)); // Setup Gate LED ledc_channel_config_t ledc_gate_channel = { .channel = LEDC_CHANNEL_1, .gpio_num = LEDC_GATE_OUT, .speed_mode = LEDC_LOW_SPEED_MODE, .timer_sel = LEDC_TIMER_0, .intr_type = LEDC_INTR_DISABLE, .duty = 0, .hpoint = 0 }; ESP_ERROR_CHECK(ledc_channel_config(&ledc_gate_channel)); } void blink_led(ledc_channel_t channel) { ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, channel, 9000)); ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, channel)); vTaskDelay(10 / portTICK_PERIOD_MS); ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, channel, 0)); ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, channel)); } void pulse_cv(uint8_t gpio_num) { gpio_set_level(gpio_num, 1); vTaskDelay(20 / portTICK_PERIOD_MS); gpio_set_level(gpio_num, 0); } void gen_rand_seq(uint8_t *sequence) { for (uint8_t i = 0; i < SEQ_MAX_LEN; i++) { sequence[i] = esp_random() % 2; } } void app_main(void) { /* Initialize Peripherals */ /* Initialize GPIO */ gpio_init(); /* Initialize Monitor LEDs */ ledc_init(); /* Initialize sequence */ uint8_t sequence[SEQ_MAX_LEN] = {0}; uint8_t seq_len = SEQ_MAX_LEN; /* Main Loop */ while (1) { for (uint8_t step = 0; step < seq_len; step++) { blink_led(LEDC_CHANNEL_0); // blink clock led pulse_cv(GPIO_CLK_OUT); // if step has been set for sequence if (sequence[step] == 1) { pulse_cv(GPIO_GATE_OUT); blink_led(LEDC_CHANNEL_1); // blink gate triggered led } printf("%i", sequence[step]); vTaskDelay(500 / portTICK_PERIOD_MS); } gen_rand_seq(sequence); printf("\n"); } }