Project 11.2 ADコンバータとbitマップ/Soft Colorful Light

前回はADCとポテンショメーターを使ってLEDの明るさをPWMで制御してみました。

あわせて読みたい
Project 11.1 ADコンバータとPWM/Soft Light ここまでの学習で、PWMを使ったLEDの明るさコントロール、ADCを使ったポテンショメーターの値取得について学習しました。 https://kaneshige.org/?p=234#index_id1 http...

今回はポテンショメーターの数を増やして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 モジュールをコントロールしてみましょう。 ...
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

金重総合研究所の主席研究員。
子供の頃から研究者を目指し、ライフワークとして日々様々な研究をしています。
経営・マネジメント・金融・DXあたりが本職です。
私を採用したい人、私と一緒に働きたい人、一緒に知識を肥やしていきたい人はぜひお声がけ下さい。

コメント

コメントする

目次