おさらい

この記事は前回の記事の続きです。

これまでの記事では、GPIO が 4本しか無い ATtiny10 でも ADC を使って 20ボタン識別を実現できそうだということで、その検証回路を組み制御ソフトウェアを実装しました。
今回は実際の動作を検証していきます。

こいつ…動くぞ!

こんな回路を、

20ボタンテスト回路

こんな風に組み上げて、

20ボタンテスト回路

プログラムを作って、マイコンに書き込みました。
そしていよいよ動かします。
動いてる様子がこちら。撮影の都合、BTNIN のリード(白い線)はテスター棒につないでいます。

動くぞ!

超地味な上に、ギガと無料ブログ容量温存のためにビットレートが相当ケチられていて、そっ閉じしたくなる動画ですね。でもそこは本質ではありません。
ボタン0~19 相当の抵抗の足を順に触り、それぞれに異なる LED の点滅パターンで 20個のボタンが読み分けられていることが確認できています。最後の抵抗の足は 21番目のボタン20 に相当しますが、これは無効ボタンとして処理していて、ボタン開放検出動作を確認しています。ボタン開放時(テスター棒を離したとき)に1回点灯しています。
ちなみに LED の点滅パターンは前回以下のように決めたのでした。

Lチカは、押されたボタンの番号 0~19 を 2進数 5bit で点滅させます。以下のように bit値 0 なら 1回、1 なら 2回点滅として、MSB から点滅させます。

ピンが無ければ ADC を使えばいいじゃない (2)SW編 – ソフトウェア仕様

アナログ電圧の読み取りとか結構デリケートそうですが、こんな雑な有様でも動いてますね!

ところでオシロ買ったンすよ

なんか Amazon が直々にハンディオシロをおすすめしてくるので、買ってみたんです。見込まれ頼み込まれて断るなんて義理も人情もありゃしませんから、衝動買いということにして。いやそんな高いものじゃないんですけど、一応 2ch?やっぱ 2ch あると 1ch じゃ見られない世界が見えてくるっていうか?まあこれは経験してみないと分からないかな(笑)、いやいや大したもんじゃないんですけどね。ほんとに(笑)

というわけで、実際の読み取りシーケンスを信号レベルで覗いてみます。まずは真ん中らへんのボタン10 の様子を見てみます。
黄色のラインが BTNIN、青のラインが LEDOUT です。左端で黄色のラインが Low に落ちている所がボタンを押した瞬間です。青いラインの Low の位置が 0V のラインです。
その他記号を書き入れ、説明します。

ボタン10
記号説明
V13.3Vボタンが押されるまで BTNIN を High に保つための内蔵プルアップによる電圧、Vcc レベル
V20.5Vボタンを押したことにより Low に引き下げられた電圧。ボタンに接続された抵抗群による GND 接続と内蔵プルアップ抵抗による Vcc 接続でバランスした電圧
T120μs弱BTNIN が Low に引き下げられ、これによって発生する INT0割込みによって CPU がパワーダウンから覚めてボタン読み取り処理まで到達する時間
T2, T4, T6200μs弱
1.55V
BTNOUT から High を出力することによって現れたボタン電圧を AD変換している時間
T3, T5, T720μs弱ボタンが開放されていないことの確認とAD変換した値からボタン番号を求めている時間。この時には BTNOUT を Low に落としているので、電圧は V2 レベルになる

以上のようにボタンを 3度読んで、ボタン番号を特定したのち LED の出力が始まっています(青色のライン)。なかなかいい感じで動いてますね。
ではほかのボタンもいくつか見てみます。

ボタン0

ボタン電圧は 0V のはずですが結構ザラついてますね。

ボタン1

ボタン0 よりもちょっぴりボタン電圧が上がってます。当たり前ですが、改めて確認すると感心しますね。

ボタン18

一番上のボタンの 1つ前のボタンです。ところでここで、T3、T5、T7 に相当する時間がボタン10より伸びていることにお気づきでしょうか。これは上位ボタンほど特定に必要な内部処理ループ数が多いからです。改めて見るとボタン1 なんかは逆に縮んでるように見えますね。

ボタン19

最上位ボタンのボタン19 です。上にある抵抗の分、ボタン電圧は Vcc より少し低いです。

ボタン20相当

ボタン19 の上の抵抗の上、 BTNOUT です。Vccレベルになっています。3度読んだ挙句、該当ボタン無しということで LED出力はありません。いい感じですね。

ここまでの波形は結構きれいだったと思いますが、実はこれは結構厳選してます。やっぱりリード線で抵抗の足を触る方法だと、よほどうまく触らないとこんなに落ち着いた電圧になりません。ちょっと荒っぽく触ったときの信号を見てみます。横軸が違いますので注意してください。

ボタン10 荒れてる

ボタン10です。電圧が荒れている中下向きの髭がたくさん見えることから、読み取りを何度も繰り返していることが分かります。LED出力の直前 3区間ほどでボタン電圧が安定してきていて、裏を返せばここで 3度連続で同じ値が読めたのでボタンの特定を完了したのだろうことが伺えます。真面目に仕事してますね。
なお、タクトスイッチなどのちゃんとしたスイッチを使うとこんなに荒れるどころかチャタリングすらほとんど観測できませんので、この荒れようはテストだからとボタンをケチったことによるものです。本番ではちゃんとやります。

今から本気出します

BTNIN の様子と LEDOUT のタイミングを同時に見られたのは 2chオシロならではありますが、人の目にもどんくさい LED の様子をオシロで見ても面白くないですね。なのでオシロにもうちょっと本気を出してもらいます。
プログラムをいじって、3度連続で読めたボタン電圧の AD変換値をオシロ上で分かるようにして観測してみます。AD変換値はどのくらい安定しているのでしょうか。
ボタン10 にタクトスイッチを接続して行います。

ボタン10 ADC変換値

Lチカの速さをオシロで見られる程度にして、3度読んだ AD変換値を出力しています。
まず最初に、タクトスイッチを使用したことによって BTNIN の波形自身が落ち着いていることが分かります。何度押してもこのクオリティです。これなら2度読みでも充分そうです。
また青ラインから変換値を読みますと、7Fh、80h、7Fh、10進数にして 127、128、127 ということでかなり安定した値が読めているようです。
そしてボタン10 の電圧の論理値は 1/2 Vcc なのでその変換値は 127~128 になるはずですが、実測でも 127~128 の値がぴったり読めていますから、抵抗もよく揃っていそうです。論理値と実測値がこれだけ合うというのも結構驚くべきことだと思います。
いろんなことが確認できました。とてもよい結果でした。

ミッション完了!

ATtiny10 を使用する際のピン不足からくるボタン不足を ADC で解決する方法を思いついてから、ボタン数の論理上限や回路のパラメータなどを算出し、ソフトウェアの実装、動作の確認と順を追って進めてきました。その結果、20ボタンの正確な識別の実証とアナログ電圧を扱いながらの驚くべき安定性を目の当たりにできて非常に有意義でした。気分のいいところで、これを以てミッション完了とします。

そうそう、元々は赤外線リモコンを作る話でした。ボタン数の問題が解決できたので、あとは粛々と作るだけです。もちろん後で記事にします。というか実はもうソフトも完成していてモノは作れるのです。これこの通り。

リモコン

でも、

蓋が閉まらない

電池がケースに干渉して蓋が閉まらず、心が折れているのです。
とまあ、リモコンの話はソフトウェア面で書くことが多いので、別のシリーズにします。
ごきげんよう。

このシリーズ

この記事

関連記事