釣りは「へら鮒に始まりへら鮒に終わる」と言うそうだが、「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; }