マイコンボードArduino Nanoを使って、LEDの点滅周期を可変抵抗(ボリューム)で調整してみようという試みです。
可変抵抗で分圧した電圧をAD変換し、その値を使って点滅周期を変化させてみます。
このページは「マイコンLチカ道場 Arduino編」の「2-2:可変抵抗でLチカの周期をコントロール」に対応するページです。
回路図
回路図は下記になります。
今回はボリューム一つと、LED一つのシンプルな回路です。
動作確認用にLCDキャラクタディスプレイモジュールを接続しています。
部品リスト
使用する部品は下記になります。
品名 | 参照名 | 数量 | 数値・仕様 |
マイコンボード | A1 | 1 | Arduino nano |
抵抗 | R1 | 1 | 220Ω |
可変抵抗 | RV1 | 1 | 10kΩ,Bカーブ 例:アルプス電気製RK09Dなど |
LED | D1 | 1 | 青色LED |
LCDモジュール | – | 1 | HiLetgo製 16X2 キャラクタ LCDディスプレイ |
I2C変換基板 | – | 1 | HiLetgo製 LCD用 IIC/I2C/TWI/SPI シリアルインタフェースモジュール PCF8574使用 |
可変抵抗は、前回(可変抵抗でLチカの明るさをコントロール)と同じアルプス製の基板取り付け用ボリューム(10kΩ、Bカーブ品)を使用します。
使用するLCDキャラクタディスプレイ
今回使用するLCDキャラクタディスプレイは、Amazonで購入した16列×2行のものを使います。
I2Cへの変換基板もあわせて購入しました。
これを使用することで、LCDキャラクタディスプレイをI2C接続に変換することができます。
可変抵抗はLCDのコントラスト調整用です。
ジャンパピンをショートさせることで、バックライト点灯。
I2Cアドレスはデフォルトで「0x27」「0x3F」のいずれか。基板上のジャンパA0、A1、A3の組み合わせで変更できるようです。
プログラム(スケッチ)
今回は最近話題のChatGPTの技術を使用したBingのAIに聞いてプログラムを考えてもらいました。
下記のようにやりたいことをチャットで質問してみました。
下記の仕様のプログラムを作ってください。
マイコンボードはArduino nanoを使用する。
可変抵抗で分圧した電圧をAD変換する。
AD変換した値を使ってLEDの点滅周期を変化させる。
map関数で0~1023を10mm秒~3秒に変換する。
AD変換値が小さいほど、点滅周期を長くする。
キャラクタLCDディスプレイ(16文字、2列)に点滅周期をHzで表示させる。
ディスプレイのライブラリはLiquidCrystal I2Cを使用する。
プログラム
#include <LiquidCrystal_I2C.h>
#define LED_PIN 9 // LEDのピン番号
#define VR_PIN A0 // 可変抵抗のピン番号
// LCDディスプレイのオブジェクトを作成
LiquidCrystal_I2C lcd(0x27, 16, 2); //(I2Cアドレス,16文字,2列)
int vr_value; // 可変抵抗の値を格納する変数
int blink_time; // 点滅周期を格納する変数
float blink_freq; // 点滅周波数を格納する変数
void setup() {
pinMode(LED_PIN, OUTPUT); // LEDピンを出力モードに設定
lcd.init(); // LCDディスプレイの初期化
lcd.backlight(); // LCDディスプレイのバックライトを点灯
}
void loop() {
vr_value = analogRead(VR_PIN); // 可変抵抗の値を読み取る
blink_time = map(vr_value, 0, 1023, 3000, 10); // 点滅周期に変換する(単位はミリ秒)
blink_freq = (float)1000 / blink_time; // 点滅周波数に変換する(単位はHz)
digitalWrite(LED_PIN, HIGH); // LEDを点灯する
delay(blink_time / 2); // 点灯時間分待つ
digitalWrite(LED_PIN, LOW); // LEDを消灯する
delay(blink_time / 2); // 消灯時間分待つ
lcd.clear(); // LCDディスプレイの内容を消去する
lcd.setCursor(0,0); // LCDディスプレイのカーソル位置を設定する(左上が(0,0))
// LCDディスプレイに点滅周波数と単位を表示する
lcd.print("L\xc1\xb6 Freq:"); //カタカナ「チカ」を文字コードで入力してみた
lcd.setCursor(0,1); //カーソルを0列、2行目へセット
lcd.print(blink_freq);
lcd.print("Hz");
}
回答してもらったコードをコンパイルして確認してみます。
今回は、ほぼ修正なしで動作しました。
※直したのはピン番号や表示する文字くらいです。
動かない場合はその部分を追加で質問したり、コードを解説してもらったりすることも出来るので、プログラムの勉強に良いですね。
※下記は例です。
I2C通信を使うのに、Wire.hライブラリを使わなくても良いんですか?
Wire関数は、I2Cデバイスとの通信を行うために必要なライブラリです。しかし、LiquidCrystal I2Cライブラリは、Wire関数を内部でインクルードしているので、別途インクルードする必要はありません。
キャラクタディスプレイをI2C接続するためには、Arduino nanoのA4ピンとA5ピンを使用します。A4ピンがSDA(データ)ピンで、A5ピンがSCL(クロック)ピンです。
キャラクタディスプレイのSDAピンとSCLピンをそれぞれArduino nanoのA4ピンとA5ピンに接続し、VCCピンとGNDピンを電源に接続すればよいです。
動作確認
ブレッドボードで組んで動作を確認してみました。
可変抵抗を左に回している状態では、点滅周期3秒なので0.33Hzと表示されています。
可変抵抗を回すと、LEDの点滅周期が速くなっていきます。
今回、Bカーブの可変抵抗を使いましたが、回し始めと回し終わりあたりの変化が急な感じもします。
Aカーブ品を使えばもう少し違ったかもしれません。
プログラムでカーブを変換出来ればもっとよいですね。AIに聞いてみましょうか…
また、100HzにするとLCDの更新が追い付かないためかチラついてしまいます。
動画でみてみよう
まとめ
マイコンボードArduino Nanoと可変抵抗を使って、Lチカの点滅周期を調整してみることに成功しました。
今回はChatGPTの技術を使用したBingのAIにプログラムを作るのを手伝ってもらいました。
AIを活用することで、プログラミングの勉強もはかどりそうです。