MAKER UNO + で始めるSTEM (15) 日の出をキャッチ④
前回は、LEDが3個入ったモジュールを利用しました。定電流コントローラICの制御端子をMAKER UNO +からON/OFFして、PWMの制御ができました。もう少したくさんのLEDを光らせます。
●LEDモジュールの仕様
秋月電子通商の「超高輝度面発光白色LEDモジュール 40x30mm」のモジュールを使います。高輝度用としてではなく広い面積を光らせるような用途に向いていそうです。
回路図を見ると、LED 3個と電流制限抵抗330Ωが直列につながれたブロックが14組あります。12Vで約150mAの電流が流れると書かれています。実際に測定すると149mAでした。なので、一つのブロックには約10mAが流れています。
ON/OFFするための制御回路は入っていません。
●ドライブ回路
MAKER UNO +からは12Vを直接ON/OFFできません。ドライブにMOSFETを利用します。通常下記の回路で駆動します。直列に入っている47Ωは安定動作(※)のためです。なくても動作します。47kΩはゲートが電源の入るシーケンスによって浮いてしまうのを避けるために入っています。値は数kから数百kΩと、かなりアバウトです。
すでに3.3MΩでプルダウンされているので、ここは直列抵抗も省略して、直結します。LEDx3と直結に入っている抵抗330Ωは、基板に取り付けられている値です。
ドライブに用いたMOSFETの2N7000は、海外の電子工作でよく使われる汎用品です。パルスでは約800mAの電流を扱えます。
●接続
●スケッチ
前回と同じです。読み取りの関数を少し修正しました。
const byte analogOutPin = 11;
int outputValue = 0;
#define waitTime 1000
void setup() {
Serial.begin(9600);
Serial.println("\nStart");
}
void loop() {
float VoltAV = readA0();
Serial.print(" AvarageVolt= ");Serial.println(VoltAV);
if (VoltAV > 4.0 ) outputValue = 100;
if (VoltAV > 2.0 && VoltAV <4.0 ) outputValue = 10;
if (VoltAV < 2.0 ) outputValue = 0;
analogWrite(analogOutPin, outputValue);
delay(2000);
}
float readA0() {
float VoltA0 = analogRead(A0);
delay(waitTime);
VoltA0 = VoltA0 + analogRead(A0);
delay(waitTime);
VoltA0 = VoltA0 + analogRead(A0);
return VoltA0 / 3.0 / 1024 * 5.0 ;
}
(2020/05/07)1023は間違いなので、1024に変更した。
(※)稲葉保;パワーMOSFET活用の基礎と実際、p.41。
●コラム 浮動小数点
本ボードで使われているATmega328は8ビット・マイコンです。8ビットのデータと8ビットのデータを加算するのは簡単です。8ビットと16ビットのデータを加算するのはちょっと工夫したプログラムで記述できます。では乗算はどうでしょうか。それなりに記述は大変なので、アセンブラを使ってプログラムを書くときは、ライブラリをリンクします。
実数は上記のような整数値を扱うのに比べて、飛躍的にプログラムの量が増えます。したがって、時間もすごくかかります。C言語で実験したとき、実数の割り算は乗算の倍の時間がかかりました。Arduinoで扱えるarmやESP32は32ビット・マイコンです。32ビットを一度に扱えるので、普通に8ビットより高速に加算や乗算のプログラムが実行できます。armの中でもCortex-M4以上は浮動小数点演算をハードウェアで実装しています。クロックの高速化とあいまってとても高速に実行できます。