アフィリエイト広告
アフィリエイト広告

Arduinoにヒステリシスを持たせる

前回「Arduino で 2 進数入力 7 セグ LED ドライバを制御」で、ボリュームの位置に応じた値を 7 セグメント LED で表示させてみました。

基本的な動作はうまくいったのですが、ボリュームをゆっくり回していくと、数値の変わり目 (しきい値) で表示がちらついてしまいます。入力電圧などのわずかな変化で、表示する値が上がったり下がったりしてしまうためです。

そこで、入力にヒステリシスを持たせることにしました。

ヒステリシスを持たせたスケッチ

ヒステリシスを持たせる方法ですが、しきい値を越えて数値が上がったら入力値を高い方へシフトする、逆に数値が下がったら入力値のシフトした分をリセットするようにします。

  1. // analog2bcd.ino 2020/03/11 by meyon
  2. void setup() {
  3.   pinMode(2, OUTPUT);
  4.   pinMode(3, OUTPUT);
  5.   pinMode(4, OUTPUT);
  6.   pinMode(5, OUTPUT);
  7. }
  8. void loop() {
  9.   static int shift = 0;
  10.   static byte previousData = 0;
  11.   int sensorValue = analogRead(A0) + shift;
  12.   sensorValue = constrain(sensorValue, 0, 1023);
  13.   byte digitData = map(sensorValue, 0, 1024, 0, 10);
  14.   if (digitData > previousData) {
  15.     shift = 10;
  16.   } else if (digitData < previousData) {
  17.     shift = 0;
  18.   }
  19.   previousData = digitData;
  20.   digitalWrite(2, digitData&B0001);
  21.   digitalWrite(3, digitData&B0010);
  22.   digitalWrite(4, digitData&B0100);
  23.   digitalWrite(5, digitData&B1000);
  24. }

18 〜 23 行
ヒステリシスを持たせている部分です。
出力する数値 digitData が以前の値より大きくなったとき、14 行の入力値に shift をプラスします。これで入力値が shift の分だけ下がるまで digitData は変化しなくなります。
digitData が小さくなったときは shift を 0 に戻します。結果的に入力値が下がることになるので、shift 分だけ上がるまで digitData は変化しません。

15行
入力値に shift 分をプラスするので、入力範囲を越えてしまわないように constrain() 関数で制限しています。

16 行
前は計算式を使っていましたが、map() 関数にしてみました。視覚的にもわかりやすいかも。

ヒステリシスの値になる shift 値は、大きくすると動作は安定しますが、入力値と表示値の誤差が大きくなってしまいます。小さすぎると表示のちらつきがでますので、動作させてみて良さそうな値を選びます。

タイトルとURLをコピーしました