ESP32で電子工作の基本となる「Lチカ制御」を行ってみたいと思います。
ESP32とLEDを接続
まずは、ESP32とLEDを接続します。
準備するものは、以下になります。
- ESP32-DevKitC
- LED
- ブレッドボード
- 抵抗(100~220Ω)
- ジャンパーワイヤー(ブレッドボードに配線できるもの)
- USBケーブル
以下のように接続を行います。
Lチカ制御 プログラム作成
Arduino IDEを使用して、Lチカ制御プログラムを開発していきます。
Lチカ制御 プログラム① 単純な制御
まずは、単純なLチカ制御プログラムになります。
const int LED = 5;
void setup() {
pinMode(LED, OUTPUT); // 5番ピンをOUTPUTに指定
}
void loop() {
digitalWrite(LED, HIGH); // LED ON
delay(1000);
digitalWrite(LED, LOW); // LED OFF
delay(1000);
}
プログラムについて簡単に説明をいたします。
1行目でLEDという定数に5を設定しています。これは、ESP32の5番ピンをLEDの制御で使用するために設定しています。
4行目で5番ピンを出力に設定しています。pinMode関数は、ピンの動作を入力か出力に設定します。
(INPUTにすると、入力される情報を確認できるようになります。)
8、10行目では、5番ピンに値の出力を行っています。ここでは、LEDのON・OFF制御になります。digitalWrite関数は、HIGHまたはLOWを指定したピンに出力する処理です。
ESP32とパソコンをUSBケーブルで接続して、「マイコンボードに書き込み」を行ってください。
正常に書き込みが完了すると接続されているLEDが1秒おきに点滅すると思います。
とりあえず第一段階クリアです。
Lチカ制御 プログラム② タイマ割り込み
つづきまして、タイマ割り込みによるLチカ制御プログラムになります。
タイマ割り込みとは、一定時間ごとに繰り返し処理を行う機能になります。
今回は、タイマ割り込みに「uTimerLib」ライブラリを使用するので、「ライブラリマネージャ」を使用してインストールします。
Arduino IDEを起動して、メニューの「ツール」→「ライブラリを管理」を選択します。
表示した「ライブラリマネージャ」のテキストボックスに「uTimerLib」を入力します。
「uTimerLib」が表示されるので、「インストール」ボタンを押してインストールします。
インストールが完了したらプログラムを書いていきます。
#include <uTimerLib.h>
const int LED = 5;
int led_on = 0;
void setup() {
pinMode(LED, OUTPUT);
// タイマ割り込み設定
TimerLib.setInterval_us(blink_led, 500000);
}
void loop() {
// 今回は処理なし
}
void blink_led() {
led_on = ~led_on; // 値を反転
digitalWrite(LED, led_on); // LEDのON・OFF制御
}
プログラムについて簡単に説明いたします。
1行目で、先ほどインストールしたライブラリを使用するためのヘッダファイルを設定しています。
10行目でタイマ割り込み設定を行っています。
処理内容は、blink_led 関数を500000μs(0.5秒)ごとに実行するように設定しています。
この設定を行った時点で、タイマ割り込みが開始されます。
17~20行目がLED点灯・消灯を行う関数になります。
18行目で、led_on 変数の値を反転しています。これは、タイマ割り込み処理が行われるたびにON・OFFの値が切り替わります。
19行目で、led_onの値を使用して、5番ピンに値を出力しています。
正常に書き込みが完了すると先ほどより早い間隔(0.5秒おき)で、接続されているLEDが点滅すると思います。
Lチカ制御 プログラム③ 時間計測による制御
つづきまして、loop処理内で時間計測しながらLチカ制御になります。
millis()を使用して時間計測を行って、Lチカ制御を行っています。
millis()は、起動してから現在までの時間をミリ秒単位で取得できます。
経過時間は、現在時間から過去に取得した時間の差分で求められます。
millis() – 前回取得時間 = 経過時間
時間計測によるLチカ制御のプログラムを書いていきます。
const int LED = 5;
int led_type = 0;
int blink_cnt = 0;
unsigned long tmr;
void setup() {
pinMode(LED, OUTPUT); // 5番ピンをOUTPUTに設定
led_type = 3;
tmr = millis();
}
void loop() {
blink_led();
}
// 点滅パターン(1:点 0:滅)
static unsigned char Tbl_blink_ptn[5][12]={
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 通常(消灯)
{ 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }, // ゆっくり点滅
{ 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0 }, // 2回点滅
{ 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0 }, // 早く点滅
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } // 点灯
};
void blink_led() {
if(millis() - tmr < 100) return;
int led_on = Tbl_blink_ptn[led_type][blink_cnt];
digitalWrite(LED, led_on); // LEDのON・OFF制御
if(++blink_cnt>=12) blink_cnt = 0;
tmr = millis();
}
プログラムについて簡単に説明いたします。
14行目でblink_led関数が、繰り返し呼び出されているだけの処理になります。
26~35行目のblink_led関数では、まず、27行目で経過時間を監視して、100ms未満の場合は処理を終了しています。100ms以上経過している場合は、LEDのON・OFF制御を行っています。
ON・OFFの制御は、18~24行目のテーブルの値によります。100ms経過ごとにテーブルの値をインクリメントしながら設定しています。
実際の処理は、29行目でテーブルから値を取得して、30行目でLEDの制御を行っています。
led_typeは、テーブルの点滅種類を指定する変数で、9行目の「led_type=3」で指定しています。led_typeの値を変更することで、点滅の仕方が変わるので、ぜひ試してください。
35行目で、比較用の前回処理時刻を更新しています。
テーブルの個数や、種類などを工夫していろいろな点滅をためしてみてください。
まとめ
Lチカ制御を3パターン行ってみました。
ESP32では、様々なライブラリや関数が用意されているので、Lチカ制御も簡単に行うことができました。
LEDの点滅だけでも 正常や異常などの状態表示も行えるので、いろいろと工夫をしてみるのも 面白いと思います。
【参考図書】