可変抵抗でLチカの周期をコントロール【マイコン Lチカ道場 Arduino編 2-2】

可変抵抗でLチカ周期変更 Arduino
当サイトのリンクにはアフィリエイト広告が含まれています。

マイコンボードArduino Nanoを使って、LEDの点滅周期を可変抵抗(ボリューム)で調整してみようという試みです。
可変抵抗で分圧した電圧をAD変換し、その値を使って点滅周期を変化させてみます。

このページは「マイコンLチカ道場 Arduino編」の「2-2:可変抵抗でLチカの周期をコントロール」に対応するページです。

スポンサーリンク

回路図

回路図は下記になります。
今回はボリューム一つと、LED一つのシンプルな回路です。

動作確認用にLCDキャラクタディスプレイモジュールを接続しています。

回路図

部品リスト

使用する部品は下記になります。

品名参照名数量数値・仕様
マイコンボードA11Arduino nano
抵抗R11220Ω
可変抵抗RV1110kΩ,Bカーブ
例:アルプス電気製RK09Dなど
LEDD11青色LED
LCDモジュール1HiLetgo製 16X2
キャラクタ LCDディスプレイ
I2C変換基板1HiLetgo製 LCD用 IIC/I2C/TWI/SPI
シリアルインタフェースモジュール
PCF8574使用

可変抵抗は、前回(可変抵抗でLチカの明るさをコントロール)と同じアルプス製の基板取り付け用ボリューム(10kΩ、Bカーブ品)を使用します。

使用するLCDキャラクタディスプレイ

今回使用するLCDキャラクタディスプレイは、Amazonで購入した16列×2行のものを使います。

16×2キャラクタ LCDディスプレイ
16×2キャラクタ LCDディスプレイの裏面

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と表示されています。

0.33Hzで点滅

可変抵抗を回すと、LEDの点滅周期が速くなっていきます。

1Hzで点滅
4Hzで点滅

今回、Bカーブの可変抵抗を使いましたが、回し始めと回し終わりあたりの変化が急な感じもします。
Aカーブ品を使えばもう少し違ったかもしれません。
プログラムでカーブを変換出来ればもっとよいですね。AIに聞いてみましょうか…

また、100HzにするとLCDの更新が追い付かないためかチラついてしまいます。

100Hzで点滅

動画でみてみよう

まとめ

マイコンボードArduino Nanoと可変抵抗を使って、Lチカの点滅周期を調整してみることに成功しました。

今回はChatGPTの技術を使用したBingのAIにプログラムを作るのを手伝ってもらいました。
AIを活用することで、プログラミングの勉強もはかどりそうです。

参考リンク

タイトルとURLをコピーしました