LoginSignup
1
1

More than 5 years have passed since last update.

【PWM制御】Nefry BTで上品なLチカをする

Last updated at Posted at 2018-07-01

上品なLチカとは?

こんにちは,dotstudioのたくろーどんです.

LチカとはLEDをチカチカさせることです.
Arduinoといったマイコンを手に入れると,多くの人がLチカに取り組むでしょう.
ただ,LEDをチカチカさせるだけで満足ですか?
満足できないなら,ちょっと上級者っぽく上品なLチカを試してみましょう.

上品なLチカを実現するために,PWM制御を使います.
PWM制御の詳しい説明はdotstudioの資料をご覧ください.

プログラム

Nefry BTをつかったPWM制御ですが,Nefry BTの説明書にはanalogWrite()関数を使っていますが,うまくいきませんでした

https://gyazo.com/1c3513db18b9fbd37db425f28781bb3b

調べてみると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チカできます.

https://gyazo.com/72e1a967db1fe3051d7ae469fa122a3f

PWM制御を使えば,DCモータやサーボモータを自由に制御できるようになるので理解しておくと良いでしょう!では!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1