前回はADCとポテンショメーターを使ってLEDの明るさをPWMで制御してみました。
今回はポテンショメーターの数を増やしてRGB LEDの色をコントロールしてみましょう。
目次
回路図
接続図
コード
/**********************************************************************
Filename : SoftColorfulLight
Description : Controlling the color of RGBLED by potentiometer.
Auther : www.freenove.com
Modification: 2022/10/21
**********************************************************************/
const byte adcChns[] = {12, 13, 14}; // define the adc channels
const byte ledPins[] = {38, 39, 40}; // define led pins
const byte pwmChns[] = { 0, 1, 2}; // define the pwm channels
int colors[] = {0, 0, 0}; // red, green ,blue values of color.
void setup() {
for (int i = 0; i < 3; i++) { //setup the pwm channels
ledcSetup(pwmChns[i], 1000, 8); //1KHz, 8bit(0-255).
ledcAttachPin(ledPins[i], pwmChns[i]);
}
}
void loop() {
for (int i = 0; i < 3; i++) {
colors[i] = map(analogRead(adcChns[i]), 0, 4096, 0, 255); //calculate color value.
ledcWrite(pwmChns[i], 256 - colors[i]); //set color
}
delay(10);
}
今回のポイントは20行目のmapです。13行目でledcを8ビットで初期化しているので、0~255の範囲になります。対するADCは12ビットで0~4096の範囲です。なので、それらを対応付ける必要があります。それがmap()関数です。map()関数の書式は以下のとおりです。
map(value, fromLow, fromHigh, toLow, toHigh)
mapを使用せずに以下のようにしても良いですね。
const byte adcChns[] = {12, 13, 14}; // define the adc channels
const byte ledPins[] = {38, 39, 40}; // define led pins
const byte pwmChns[] = { 0, 1, 2}; // define the pwm channels
void setup() {
for (int i = 0; i < 3; i++) { //setup the pwm channels
ledcSetup(pwmChns[i], 1000, 12); //1KHz, 8bit(0-255).
ledcAttachPin(ledPins[i], pwmChns[i]);
}
}
void loop() {
for (int i = 0; i < 3; i++) {
ledcWrite(pwmChns[i], 4096 - analogRead(adcChns[i])); //set color
}
delay(10);
}
Arduino IDEの標準ライブラリで使用できるanalogWrite() 関数は、8ビットPWMのみをサポートしています。そのため、プログラムの互換性を重視するならmapしたほうが良いということですね。ESP32-S3のPWMとしては13ビットまで対応しています。もっとも、私の目には8ビットと12ビットで色の階調の違いを区別できないです・・・。
次回は8LEDモジュールをPWM制御してみましょう。
Project 11.3 ビット変換の別解/Soft Rainbow Light
前回はポテンショメーターを3つ使用してRGB LEDの色を自在に制御してみました。 https://kaneshige.org/?p=391 今回は8LED モジュールをコントロールしてみましょう。 ...
コメント