釣りは「へら鮒に始まりへら鮒に終わる」と言うそうだが、「ArduinoはLチカに始まりLチカに終わる」などと誰かが言っていそうで多分誰も言っていない(笑)。
さておき、けっこう楽しいんだよな、Lチカ。
で、なんっか、手持ちのものをいろいろとくっつけたくなるのだ。今日目に入ったのはSeeedstudio SIDEKICK BASIC KITに入っていた青いポテンショメータ。私が少年の頃は「バリオーム」「ボリューム」「可変抵抗」と言ったものだが、今はポテンショメータと言うそうな。
ポテンショメータでLチカのスピードを調整してみよう。
まず、ポテンショメータのスペックシートなどがなくてはっきりしないから、テスターを当てて抵抗を測る。0Ωから10.5kΩまで変化できることがわかった。
このまま直列に+5Vを印加してアナログピンに入力してしまいそうだが、0Ωの時に過電流になってしまうから、10kΩの別の抵抗と直列に入れた方がいいだろう。そうするとポテンショメータを最小に回し切っても0.5mAくらいに抑えられる。
計算はどうなるかというと、こんなようなことになる。
式に代入すれば、ポテンショメータを最大抵抗にしたとき2.44V、最小抵抗にしたとき0Vになることがわかる。
プロトタイピングシールドのブレッドボードは小さくて全部の部品が載らないから、普段使っている普通のブレッドボードにつける。
動かすとこんな感じだ。
スケッチはこんな感じ。
//
// vr2speed.ino
// ポテンショメータでLチカ制御
// 27.07.26(日)1300~
// 佐藤俊夫
//
const unsigned int
STARTPIN = 2,
ENDPIN = 8,
INPUTPIN = 9,
VR = 0,
DELAYMIN = 5,
DELAYMAX = 100;
const float
V0 = 5.0, // +5V
R1 = 10000.0, // アナログピンに入れるための電流制限抵抗10kΩ
VRMIN = 0.0, // ポテンショメータの最小抵抗実測値 0Ω
VRMAX = 10500.0; // ポテンショメータの最大抵抗実測値 10.5kΩ
//
void setup() {
// 330Ωをカソードにそれぞれ入れてデジタル2~8番にLEDを繋いである。
for(int i = STARTPIN; i <= ENDPIN; i++){
pinMode(i, OUTPUT);
}
// タクトスイッチは9番に繋いでアースし、内蔵プルアップ抵抗を使っている。
pinMode(INPUTPIN, INPUT_PULLUP);
// ポテンショメータは10kΩ抵抗と直列に繋ぎ、間から出力を取っている。
pinMode(VR, INPUT);
}
void loop() {
static int i = STARTPIN, RLdirection = 1, delaytime = DELAYMIN;
static unsigned long int prevtime = 0;
if(prevtime + delaytime < millis()){
digitalWrite(i, LOW);
i += RLdirection;
if(i > ENDPIN) i = STARTPIN;
if(i < STARTPIN) i = ENDPIN;
digitalWrite(i, HIGH);
prevtime = millis();
}
if(digitalRead(INPUTPIN) == LOW){
delay(500);
RLdirection *= -1;
}
float v1 = (V0 * R1) / (R1 + VRMAX);
float vr = analogRead(VR) * (V0 / 1024);
delaytime = constrain(fmap(vr, v1, 0.0, DELAYMAX, DELAYMIN), DELAYMIN, DELAYMAX);
}
float fmap(float x, float in_min, float in_max, float out_min, float out_max) {
// もともとの「map()」がlong int型でこの用途に合わないので、float型を定義
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}