はじめに
ledcWrite()を使って、LEDを明るくしたり暗くしたりします。
プログラム
定義等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
/*
LEDC Software Fade
This example shows how to software fade LED
using the ledcWrite function.
Code adapted from original Arduino Fade example:
https://www.arduino.cc/en/Tutorial/Fade
This example code is in the public domain.
*/
// use first channel of 16 channels (started from zero)
#define LEDC_CHANNEL_0 0
// use 12 bit precission for LEDC timer
#define LEDC_TIMER_12_BIT 12
// use 5000 Hz as a LEDC base frequency
#define LEDC_BASE_FREQ 5000
// fade LED PIN (replace with LED_BUILTIN constant for built-in LED)
#define LED_PIN 5
int brightness = 0; // how bright the LED is
int fadeAmount = 5; // how many points to fade the LED by
|
ESP-WROOM-32では、機能を実現するチャネルと、そのチャネルをどのピンに割り当てるかを、ソフトウェアを使って設定することができます。データシートによると、LED PWMは16チャネルあるようです。ここでは、チャネル0を利用しています。このチャネル定義が、LED_CHANNEL_0です。
LEDC_TIMER_12_BITは、デューティ比を何ビットで表すかを定義しています。ここでは、12ビット(0~4095)で表すようにしています。
LEDC_BASE_FREQは、PWMのベース周波数を定義しています。5000Hzに設定しています。
LED_PINは、LEDを接続するピン番号です。
brightnessは、LEDの明るさを表すグローバル変数です。また、fadeAmountは、loop()が実行されるたびに、どれだけ明るさを変化させるかを定義しています。
ledcAnalogWrite
28
29
30
31
32
33
34
35
36
37
|
// Arduino like analogWrite
// value has to be between 0 and valueMax
void ledcAnalogWrite(uint8_t channel, uint32_t value, uint32_t valueMax = 255) {
// calculate duty, 4095 from 2 ^ 13 - 1
uint32_t duty = (4095 / valueMax) * min(value, valueMax);
// write duty to LEDC
ledcWrite(channel, duty);
}
|
現状、Arduino core for the ESP32には、analogWrite()は定義されていません。ここでは、analogWrite()のような関数を定義しています。
最初に、デューティ比を計算します。このスケッチでは、デューティ比は13ビットで定義しているので、入力されたデューティ比を13ビットの値に変換します。具体的には、0~valueMaxの値を、0~8191の値にマッピングしています。
その後、指定したchannelと、計算したdutyを使って、ledcWrite()を呼び出します。
setup()
38
39
40
41
42
43
|
void setup() {
// Setup timer and attach timer to a led pin
ledcSetup(LEDC_CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_12_BIT);
ledcAttachPin(LED_PIN, LEDC_CHANNEL_0);
}
|
ledcSetup()を使って、LED PWMの設定を行います。
次に、ledcAttachPin()を使って、ピンとチャネルとを結びつけます。
loop()
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
void loop() {
// set the brightness on LEDC channel 0
ledcAnalogWrite(LEDC_CHANNEL_0, brightness);
// change the brightness for next time through the loop:
brightness = brightness + fadeAmount;
// reverse the direction of the fading at the ends of the fade:
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
|
先に定義したledcAnalogWrite()を使って、PWMを出力します。
brightnessの値を、fadeAmountだけ増加(fadeAmountが負の場合は結果として減少)させます。
brightnessが負、もしくは255以上になったら、fadeAmountの符号を反転させます。
結果として、brightnessは、0、5、10、…250、255、250、…10、5、0、5、10、…と変化していきます。
バージョン
Hardware: | ESP-WROOM-32 |
Software: | Arduino core for the ESP32 2.0.4 |
最終更新日
September 4, 2022