可変抵抗で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を活用することで、プログラミングの勉強もはかどりそうです。

参考リンク

Arduino Uno Rev3 アルドゥイーノ ウノ ATmega328P【正規代理店品】プログラミング ロボット 電子工作 アルデュイーノ 正規品 アルディーノ 電子パーツ 電子工作キット
Arduinoオフィシャルストア
初めての方は正規品か、互換品でもUSB-シリアル変換にAtmega16U2が使われているものがオススメです。安価な互換品はCH340G等が使われており、トラぶると面倒かもしれません。
タイトルとURLをコピーしました