フォト
2018年5月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
無料ブログはココログ

« 豊四季Tiny BASIC for micro:bit をV0.05に更新しました | トップページ | micro:bitをArduino環境で使う (6) PPIを使った単音出力 »

2018年1月21日 (日)

アナログ入力を使った16ボタン入力

以前自作したアナログ入力を使ったボタン入力と同様のキーパッドが
Aliexpressで安価に販売されているので入手しました。
GND、VCC、アナログ入力の3ピンで簡単に16ボタン入力が実装出来ます。

Button Keypad module 4x4. One analog out. Simple connection to Compatible for Arduino, Raspberry, STM. Keypad

ついでに3x4タイプも入手

Button Keypad 3x4 module. One analog out. Compatible for Arduino, Raspberry, STM. Keypad

到着した製品

意外としっかりとした製品です。
透明キャップを外してボタンにラベルを付けることが出来ます。

04_2

マニュアルは無いのですが、裏に10ビット解像度時のアナログ入力値が記載されています。

05

この情報を元に、豊四季タイニーBASIC for micro:bitにて動作確認してみました。

動作確認プログラム

10 'Keypad 4x4
20 @(10)=1013,920,840,780,670,630,590,560,502,477,455,435,400,320,267,228
30 G0=G
40 G=GRADE(ANA(1),10,16)
50 IF G>=0 ?"KEY=[";G+1;"]":MSG TOP,0,CHR$(65+G)
60 GOTO 30

ボタンの判定は誤差と揺らぎを考慮し、裏面の値の10を引いた値で判定しています。

GRADE() 関数は配列に格納された値を閾値として等級判定する関数です。
第1引数には、判定する値、第2引数には配列先頭番号、第3引数にはデータ数を指定します。
アナログ入力ANA(1)の値が1013以上の場合は0、920以上の場合は1..と判定します。
範囲外の場合は-1を返します。
比例関係に無い値を等級判定する場合に利用するとプログラムを短く出来ます。

押した番号をコンソールに表示し、ボタン1~16をA~PとしてLEDマトリックスに表示させます。

06

とりあえず、動作しました。

ただし、瞬間的に誤判定し、正常判定の状態になる場合があります。
ログを見ると、ボタン[1]を押したのに、一瞬ボタン[6]と判定されています。

02

この原因は、ボタンを押したときのチャタリングと思うのですが、念のため波形を見てみました。

01

波形はボタンを離した時のものですが、やはりチャタリングが発生しています。
このチャタリングに対する誤動作防止にはいくつか方法があります。

今回は、
  ChaNさんの 「テクニカル ノート チャタリング対策のしかた
が大変参考になりました。

ChaNさんの対策案でプログラムで対応できる「ディレイ方式」が一番簡単そうです。
さっそく試してもました。

対策

まず、測定波形を見ると1回あたりのチャタリングの幅は0.4msec(マス1msec幅)程度です。

そこで、アナログ値の測定のよるボタン判定において、
  「前回の値と今回の値が異なる場合、今回の値を捨て1msec後にもう一度測定する、
   同じなら値として採用する」


という対策を施したところ、誤判定を無くすことが出来ました。
う~ん、なかなかいい感じで利用できるようになりました。

修正対応したプログラム
10 'Keypad 4x4
20 G0=-1
30 @(10)=1013,920,840,780,670,630,590,560,502,477,455,435,400,320,267,228
40 G0=G
50 G=GRADE(ANA(1),10,16)
60 IF G<>G0 WAIT 1 GOTO 40
70 IF G>=0 ?"KEY=[";G+1;"]":MSG TOP,0,CHR$(65+G)
80 GOTO 40

さて、以前自作したキーパッドをIchigoJamで利用した時には、チャタリングによる
誤判定は気になりませんでした。なぜでしょう?

この理由としては、IchigoJamの処理速度が遅いため、チャタリングによる変化を
検知出来なかったのだと思われます。

今回試したmicro:bitの豊四季Tiny BASICは、ARM的にはIchigoJamと同スペックですが、
実装上の工夫により、IchigoJamより余裕で15~30倍の処理能力があります。

Arduino UNOでこのボードの利用する場合も、何らかのチャタリング対策は必要と思います。

« 豊四季Tiny BASIC for micro:bit をV0.05に更新しました | トップページ | micro:bitをArduino環境で使う (6) PPIを使った単音出力 »

arduino」カテゴリの記事

ARM」カテゴリの記事

micro:bit」カテゴリの記事

日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/571408/66305347

この記事へのトラックバック一覧です: アナログ入力を使った16ボタン入力:

« 豊四季Tiny BASIC for micro:bit をV0.05に更新しました | トップページ | micro:bitをArduino環境で使う (6) PPIを使った単音出力 »