スポンサーリンク
ものづくり・DIY

Arduinoで可変抵抗を読む|analogReadと分圧のしくみ、map()でLEDの明るさを変えるまで

値のふらつきを抑える

最後の桁が揺れるのは普通のこと

可変抵抗を止めた状態でシリアルモニタを見ていると、値が「511、512、511、513」のように1〜2ずつ揺れることがあります。これは故障ではありません。USB電源のわずかな揺れや、周りの配線から入る雑音、A/D変換そのものの誤差によって、約5mV刻みの最後の段階がどちらかに転ぶためです。

スポンサーリンク

LEDの明るさのように、少し揺れても見た目に分からない用途なら、気にしなくてかまいません。困るのは、値を数字で表示する、段階の境目でモードを切り替える、といった用途です。境目のすぐそばでつまみを止めると、表示がちらついたり、モードが行ったり来たりしたりします。

平均を取る

いちばん手軽な対策は、何回か読んで平均を取ることです。

int readAverage(int pin) {
  long sum = 0;
  for (int i = 0; i < 16; i++) {
    sum += analogRead(pin);
  }
  return sum / 16;
}

16回読んでも数ミリ秒で終わるので、つまみの操作が遅く感じることはありません。回数を増やすほど揺れは小さくなりますが、つまみを動かしたときの反応は少しずつ遅くなります。入門では8〜16回程度が扱いやすい目安です。

変化が小さいときは無視する

もう一つの方法は、前回の値から一定以上変わったときだけ値を更新するやり方です。

int lastValue = 0;

void loop() {
  int value = analogRead(A0);
  if (abs(value - lastValue) >= 4) {
    lastValue = value;
    Serial.println(lastValue);
  }
}

この例では、4以上変わったときだけ新しい値として扱います。止めているときの小さな揺れは無視され、手で回したときにはきちんと反応します。段階を切り替える用途では、上がるときと下がるときで境目を少しずらしておく(ヒステリシスを持たせる)と、境目でのちらつきがさらに起きにくくなります。

配線とハードウェアでの対策

スケッチで抑えきれない大きな揺れがあるときは、配線を見直します。

  • 接触を確かめる:可変抵抗の足がブレッドボードの奥まで入っていないと、触るたびに値が飛びます。挿し直すか、導線をはんだ付けした可変抵抗を使います。
  • 配線を短くする:ジャンパー線が長いと雑音を拾いやすくなります。可変抵抗とボードの距離はなるべく短くします。
  • コンデンサーを入れる:真ん中の端子とGNDのあいだに0.1μF程度のセラミックコンデンサーを入れると、速い雑音がならされます。ただし、つまみを速く回したときの反応がわずかに遅れます。
  • 抵抗値の大きすぎる部品を避ける:Unoのマイコンのアナログ入力は、つなぐ回路の抵抗値が10kΩ程度以下で正確に読めるよう作られています。100kΩのような可変抵抗では値が安定しにくくなります。

複数のアナログ入力を続けて読む場合に、前に読んだ端子の電圧に引っ張られた値が出ることがあります。そのときは同じ端子を2回続けて読み、1回目を捨てて2回目を使うと落ち着くことが多いです。

ふらつき対策のチェック(数回読んで平均を取る、小さな変化は無視する、足が奥まで挿さっている、配線を短くまとめる、10kΩ前後の部品を使う)
スケッチと配線の両方から見る。
スポンサーリンク

うまく読めないときの確認順

症状から原因を絞る

値がおかしいときは、症状によって疑う場所が変わります。次の表を手がかりにすると、闇雲に配線を触らずにすみます。

症状 よくある原因 確かめること
回しても0のまま 5V側の配線が外れている、A0以外の端子を読んでいる 端の足と5Vの配線、スケッチの端子番号
回しても1023のまま GND側の配線が外れている 端の足とGNDの配線
値が勝手に大きく揺れる 真ん中の足がA0につながっていない A0の配線、足の挿さり具合
途中で値が飛ぶ 接点の傷み、ブレッドボードの接触不良 テスターで抵抗の変わり方を測る
向きが逆 両端の足が逆 5VとGNDの足を入れ替える
真ん中で512にならない Aカーブの部品を使っている 表記がBかどうか

「値が勝手に揺れる」症状は、A0が何にもつながっていない、浮いた状態のときによく起きます。入力端子が浮くとどうなるかは、Arduinoでタクトスイッチを読むで詳しく説明しています。デジタル入力でもアナログ入力でも、つながっていない端子の値は決まらない、という点は同じです。

段階を分けて確かめる

原因が分からないときは、次の順で一つずつ確かめると切り分けやすくなります。

  1. スケッチを、A0の値をそのまま表示するだけのものに戻す。
  2. 可変抵抗を外し、A0をジャンパー線でGNDにつなぐ。0付近が出ればボードとスケッチは正常。
  3. A0を3.3Vの端子につなぐ。675前後が出れば、アナログ入力が電圧を読めている。
  4. 可変抵抗を戻し、テスターで真ん中の足とGNDのあいだの電圧を測りながら回す。0〜5Vで変われば部品と配線は正常。
  5. それでも表示がおかしければ、ジャンパー線を新しいものに替える。

2と3の確認で、ジャンパー線は必ずA0とGND、A0と3.3Vの組み合わせだけにします。5VとGNDを直接つながないよう、配線を変えるたびにUSBを抜いておくと安全です。

一歩進んだ使い方:つまみを設定に使う

ほかの作例と組み合わせる

可変抵抗は「値を設定するつまみ」として、ほかの作例と組み合わせると便利です。例えば、点滅の間隔をつまみで変えるなら、map(value, 0, 1023, 100, 1000) で100〜1000ミリ秒に写し、その時間だけ待つようにします。ブザーの音の高さを変えるなら、map() で周波数の範囲に写して tone() に渡します。ブザーの鳴らし方はArduinoでブザーを鳴らすで紹介しています。

段階で使う方法もあります。値を256ずつに区切れば4つのモードを切り替えるダイヤルになり、ボタンを押したときのモードを可変抵抗で選ぶ、といった組み立てもできます。この場合は、前に説明したヒステリシスを入れておくと、境目でモードがちらつきません。

スポンサーリンク

半固定抵抗で「調整用のつまみ」を作る

作品が完成した後で変えたくなる値、例えば「暗くなったらLEDを点ける」ときの暗さの基準などは、スケッチに数値を書き込む代わりに、半固定抵抗で調整できるようにしておくと便利です。スケッチを書き直さなくても、ドライバーで回すだけで基準を変えられます。センサーの値と可変抵抗の値を比べ、センサーのほうが小さければ点ける、という書き方になります。

読む間隔と処理の組み立て

ここまでのスケッチは、loop の中で毎回 analogRead していました。可変抵抗の操作は人の手によるものなので、実際には数十ミリ秒に1回読めば十分です。ほかの処理と組み合わせるときは、millis() で経過時間を測り、一定の間隔ごとに読むようにすると、delay で処理全体が止まるのを避けられます。表示の更新やモードの判定もこの間隔に合わせておくと、動きの落ち着いたスケッチになります。

まとめ

可変抵抗は、両端の2本を5VとGNDに、真ん中の1本をアナログ入力につなぐだけで使える部品です。つまみを回すと分圧の割合が変わり、真ん中の端子の電圧が0Vから5Vまで連続して変わります。その電圧を analogRead が0〜1023の数値に変え、map() で使いたい範囲に写せば、明るさや間隔、音の高さなど、さまざまな値をつまみで決められるようになります。

最初の一歩として、B10Kの可変抵抗を1つ用意し、値をシリアルモニタに表示するスケッチを書き込んで、つまみを端から端まで回してみてください。0から1023まで値が変わることを確かめたら、次にLEDを1つ加えて明るさを変えてみると、「読む」から「動かす」までの流れがひと通りつながります。

よくある質問

可変抵抗の3本の端子はどれをどこにつなぎますか?

両端の2本を5VとGNDに、真ん中の1本をアナログ入力端子(A0など)につなぎます。真ん中の端子は回したときに電圧が変わる出力なので、5VやGNDに直接つながないでください。回す向きと値の増減が逆なら、両端の2本を入れ替えます。

analogReadの値が0〜1023なのはなぜですか?

Arduino Unoのアナログ入力は10ビットで電圧を数値にしていて、2の10乗にあたる1024段階で表すためです。0がGNDと同じ0V、1023が基準電圧(Unoでは通常5V)付近に対応します。ボードによって段階の数や基準電圧が違うことがあります。

何Ωの可変抵抗を選べばよいですか?

Arduinoの入力で位置を読む用途なら、10kΩ前後のものが扱いやすく、作例でもよく使われます。値が大きすぎるとアナログ入力の読み取りが不安定になりやすく、小さすぎると両端に流れる電流が増えます。表記ではB10Kのように書かれています。

つまみを動かしていないのに値が1〜2ずつ揺れます。

アナログ入力では、電源のわずかな揺れや雑音で最後の桁が揺れるのはよくあることです。何回か読んで平均を取る、一定以上変わったときだけ値を更新する、といった処理で落ち着きます。大きく揺れる場合は、配線の接触不良や端子の挿し込みを確かめます。

analogWriteで出すのは本当のアナログ電圧ですか?

UnoのanalogWriteによる出力は、オンとオフを速く切り替えるPWMという方式で、電圧そのものを細かく変えているわけではありません。LEDの明るさのように平均で効く用途では、電圧を変えたのに近い効果が得られます。使える端子はボードの資料で確認してください。

コメント

まだコメントはありません。最初の感想をどうぞ。

個人情報(本名・住所・電話番号など)やリンクの書き込みはご遠慮ください。内容によっては表示しないことがあります。プライバシーポリシー

スポンサーリンク
  1. 秋の戸口に並ぶかぼちゃの明かりとかぶ、麦束
  2. 資料を手に落ち着いて話し合う二人
  3. ノートパソコンと資料、外付け記憶装置がある机
  4. 冬の木で越冬する卵のうやミノムシ、テントウムシ
  5. 青い折り鶴と三角に折った紙、無地の折り紙