上品なLチカとは?
こんにちは,dotstudioのたくろーどんです.
LチカとはLEDをチカチカさせることです.
Arduinoといったマイコンを手に入れると,多くの人がLチカに取り組むでしょう.
ただ,LEDをチカチカさせるだけで満足ですか?
満足できないなら,ちょっと上級者っぽく上品なLチカを試してみましょう.
上品なLチカを実現するために,PWM制御を使います.
PWM制御の詳しい説明はdotstudioの資料をご覧ください.
プログラム
Nefry BTをつかったPWM制御ですが,Nefry BTの説明書にはanalogWrite()関数を使っていますが,うまくいきませんでした.
調べてみるとNefry BTに使われているESP32ではanalogWrite関数が実装されていないようです.
その代わりに,ESP32ではPWM制御のためにledc()関数が用意されているので,これを使います.
PWM制御を使ったLチカのプログラムは下記に示します.
//esp32はanalogWriteが使えない
//ledc関数を使う
#include<Nefry.h>
#include"esp32-hal-ledc.h"
#define PIN A3
void setup() {
pinMode(PIN, OUTPUT);
ledcSetup(0, 490, 8);
ledcAttachPin(PIN, 0);
}
void loop() {
int led_value;
for(led_value = 0; led_value <= 255; led_value += 5){
ledcWrite(0, led_value);
delay(30);
}
for(led_value = 255; led_value >= 0; led_value -= 5){
ledcWrite(0, led_value);
delay(30);
}
}
プログラムを詳しく見てましょう.
ledc()関数を使うため,ライブラリ「esp32-hal-ledc.h」を最初にインクルードします.
#include"esp32-hal-ledc.h"
ライブラリ「esp32-hal-ledc.h」を使うときの主な関数が以下に示すものです.
①ledcSetup(チャンネル,周波数,分解能)
②ledcAttachPin(ピン番号,チャンネル):チャンネルはピン番号の識別番号です
③ledcWrite(チャンネル,パルス幅):設定した角度になるように与えるべきパルス幅を算出する関数
分解能のイメージはどれだけ細かく制御するのかを表しています.これはビット数で表します.
例えば,分解能を8ビットとするれば0~255バイト(2の8乗で計算),10ビットなら0~1023バイト(2の10乗で計算)となります.
これを,どのようにPWM制御に使えるのか説明します.PWM制御とは 一定電圧の入力から、パルス列のオンとオフの一定周期を作り、オンの時間幅を変化させる電力制御方式のことです.つまり,実効電圧を変化させることができます.
なので,例えば,最大5[V]の出力を考えたとき,
- 分解能8ビットだと0→0[V],127→2.5[V],255→5[V]
- 分解能10ビットだと0→0[V],511→2.5[V],1023→5[V]
と表せます.分解能が大きい方が,細かい制御ができることがわかるかと思います.
void setup() {
pinMode(PIN, OUTPUT);
ledcSetup(0, 490, 8);
ledcAttachPin(PIN, 0);
}
今回は,分解能8ビットで制御しています.
先ほどの説明を理解すれば,下記にvoid loop()の中身も理解できるかと思います.
ledcWrite()関数で値を出力しています.
void loop() {
int led_value;
for(led_value = 0; led_value <= 255; led_value += 5){
ledcWrite(0, led_value);
delay(30);
}
for(led_value = 255; led_value >= 0; led_value -= 5){
ledcWrite(0, led_value);
delay(30);
}
}
動かしてみる
以下のように,ただLEDがチカチカするのではなく,上品な感じでLチカできます.
PWM制御を使えば,DCモータやサーボモータを自由に制御できるようになるので理解しておくと良いでしょう!では!