Arduinoで遊ぶページ

Arduinoで遊んだ結果を残すページです。
garretlab
サンプルプログラム解説

概要

ledcWrite()を使って、LEDを明るくしたり暗くしたりします。

プログラム

定義等

/*
 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 13 bit precission for LEDC timer
#define LEDC_TIMER_13_BIT  13

// 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_13_BITは、デューティ比を何ビットで表すかを定義しています。ここでは、13ビット(0~8191)で表すようにしています。

LEDC_BASE_FREQは、PWMの周波数を定義しています。5000Hzに設定しています。

LED_PINは、LEDを接続するピン番号です。

brightnessは、LEDの明るさを表すグローバル変数です。また、fadeAmountは、loop()が実行されるたびに、どれだけ明るさを変化させるかを定義しています。

ledcAnalogWrite()

// 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, 8191 from 2 ^ 13 - 1
  uint32_t duty = (8191 / valueMax) * min(value, valueMax);

  // write duty to LEDC
  ledcWrite(channel, duty);
}

現状、Arduino core for ESP32 WiFi chipには、analogWrite()は定義されていません。ここでは、analogWrite()のような関数を定義しています。

最初に、デューティ比を計算します。このスケッチでは、デューティ比は13ビットで定義しているので、入力されたデューティ比を13ビットの値に変換します。具体的には、0~valueMaxの値を、0~8191の値にマッピングしています。

その後、指定したchannelと、計算したdutyを使って、ledcWrite()を呼び出します。

setup()

void setup() {
  // Setup timer and attach timer to a led pin
  ledcSetup(LEDC_CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_13_BIT);
  ledcAttachPin(LED_PIN, LEDC_CHANNEL_0);
}

ledcSetup()を使って、LED PWMの設定を行います。

次に、ledcAttachPin()を使って、ピンとチャネルとを結びつけます。

loop()

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);
}

先に定義したlidcAnalogWrite()を使って、PWMを出力します。

brightnessの値を、fadeAmountだけ増加(fadeAmountが負の場合は結果として減少)させます。

brightnessが負、もしくは255以上になったら、fadeAmountの符号を反転させます。

結果として、brightnessは、0、5、10、…250、255、250、…10、5、0、5、10、…と変化していきます。

バージョン

1.0.0



メニューを表示するためにJavaScriptを有効にしてください。

Arduinoで遊ぶページ
Copyright © 2018 garretlab all rights reserved.
inserted by FC2 system