■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 <stdio.h>#include "freertos/FreeRTOS.h"#include "freertos/task.h"#include "driver/gpio.h"#include "driver/ledc.h"#include "sdkconfig.h"#include "driver/ledc.h"#define BLINK_GPIO_R 3#define BLINK_GPIO_G 4#define BLINK_GPIO_B 5#define LEDC_TEST_DUTY 1000#define LEDC_TEST_FADE_TIME 2000ledc_timer_config_t ledc_timer;ledc_channel_config_t ledc_channel;void setup() {ledc_timer.duty_resolution = LEDC_TIMER_10_BIT; // PWM Dutyledc_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.duty = 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);}void loop() {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]);



0 件のコメント:
コメントを投稿