■ESP32-C3開発ボード
ESP32-C3はLEDコントローラーが持っています。これを使って、簡単に雰囲気ランプ効果ができます。
今回は、ESP-C3-32開発ボードを利用します。下記ようなものです。
赤枠で、開発ボードで一つRGB LEDがあります。次は、このRGB LEDをコントロールしてみます。
■GPIO情報
上図をみると、IO3、IO4、IO5のいずれもRGB LEDを繋がっています(それぞれはR、G、Bです)から、サンプルとして、今回はIO3(赤色)を利用しましょう。
■PWMコントロール
PWMとは、Pulse Width Modulationの略で、波長のような制御を行います。
PWMをコントロールするために、下記設定が必要です:
1、タイマーを配置: のDuty比率を指定する
2、チャネルを配置:PWMデータ出力のGPIO
3、ハードウェアのFadeOn機能を利用し、LEDの明るさを変更する
楽鑫は相応の構造体を提供しました。提供している構造体を利用してやりやすいです。
ledc_timer_config_t ⇒ タイマー配置用
ledc_channel_config_t ⇒ チャネル配置用
■プログラム
ledcはESP32のLED用高精度PWM機能です。通常のPWMだけでなく、ledc_set_fade_with_timeとledc_fade_startを使えば自動的に指定秒数でfadeしてくれて大変便利。
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#define LEDC_TEST_DUTY 1000
#define LEDC_TEST_FADE_TIME 2000
ledc_timer_config_t ledc_timer;
ledc_channel_config_t ledc_channel;
ledc_timer.duty_resolution = LEDC_TIMER_10_BIT; // PWM Duty
ledc_timer.freq_hz = 1000; // PWM信号の周波数
ledc_timer.speed_mode = LEDC_LOW_SPEED_MODE; // タイマーモード(低速)
ledc_timer.timer_num = LEDC_TIMER_0; // タイマー インデックス
ledc_timer_config(&ledc_timer);
ledc_channel.channel = LEDC_CHANNEL_0;
ledc_channel.gpio_num = BLINK_GPIO_R;
ledc_channel.speed_mode = LEDC_LOW_SPEED_MODE;
ledc_channel.timer_sel = LEDC_TIMER_0;
ledc_channel_config(&ledc_channel);
ledc_fade_func_install(0);
ledc_set_fade_with_time(ledc_channel.speed_mode, ledc_channel.channel, LEDC_TEST_DUTY, LEDC_TEST_FADE_TIME);
ledc_fade_start(ledc_channel.speed_mode, ledc_channel.channel, LEDC_FADE_NO_WAIT);
vTaskDelay(LEDC_TEST_FADE_TIME / portTICK_PERIOD_MS);
ledc_set_fade_with_time(ledc_channel.speed_mode, ledc_channel.channel, 0, LEDC_TEST_FADE_TIME);
ledc_fade_start(ledc_channel.speed_mode, ledc_channel.channel, LEDC_FADE_NO_WAIT);
vTaskDelay(LEDC_TEST_FADE_TIME / portTICK_PERIOD_MS);
■最終結果
■RGBを同時コントロールの場合、構造体はこのような実装する
ledc_channel_config_t ledc_channel[3];
ledc_channel[0].channel = LEDC_CHANNEL_0;
ledc_channel[0].duty = 0;
ledc_channel[0].gpio_num = BLINK_GPIO_R;
ledc_channel[0].speed_mode = LEDC_LOW_SPEED_MODE;
ledc_channel[0].timer_sel = LEDC_TIMER_0;
ledc_channel[1].channel = LEDC_CHANNEL_1;
ledc_channel[1].duty = 0;
ledc_channel[1].gpio_num = BLINK_GPIO_G;
ledc_channel[1].speed_mode = LEDC_LOW_SPEED_MODE;
ledc_channel[1].timer_sel = LEDC_TIMER_1;
ledc_channel[2].channel = LEDC_CHANNEL_2;
ledc_channel[2].duty = 0;
ledc_channel[2].gpio_num = BLINK_GPIO_B;
ledc_channel[2].speed_mode = LEDC_LOW_SPEED_MODE;
ledc_channel[2].timer_sel = LEDC_TIMER_2;
ledc_channel_config(&ledc_channel[0]);
ledc_channel_config(&ledc_channel[1]);
ledc_channel_config(&ledc_channel[2]);