ルーレットの試作
PICで作ったルーレットに出会いました。スタートボタンを押すと高速でLEDの点灯位置が変わり、ストップボタンを 押すと、高速から中速に、そして低速を経由して停止するというものです。
同じものをAVRで作ってみることにしました。ただし、スピーカーを持っていないので音は省略しました。
AVRはTiny26Lを使うことにします。
 @LEDは10個にします。ポートAだけでは足りないので、ポートBも使います。
 Aスタートとストップのスイッチを付けるので、ポートBは入出力混在です。プルアップも必要です。
 Bそこで、点灯位置はその都度計算せず、パターンを配列変数に用意しておきます。Cの便利なところです。
 Cルーレットは次第に遅くなって、最後に止まる形にします。waitルーチンの時間を長くして、遅くします。
 Dそのためには、引数付きのwaitルーチンを作り、引数をfor文で大きくすれば良いだろうと考えました。
こうして作ったのがこのルーレットです。時間を決める数値は計算をしていません。試運転を繰り返しながら 適当なところで止めました。8ビットを超える数値の取り扱いと、IF文についてはCのありがたさを 痛感しています。
試作品は例によってブレッドボードに作りましたから、LED部はフロッピーケースに取り付けました。1枚の写真では 縦長になるので、分割した写真になりました。
 

プログラムはここに置きます。
(付)以前からの習慣で、ハードもソフトも少し作っては動作を確認しつつ進めます。ハードではMCUを実装せずに ソケットの端子をHにしたりLにつないで周辺の動作を見ます。ソフトでは、例えばこのプログラムでも、少し書いては テストランで、数十回の書き込みをしています。(その都度の確認が楽しみかも?)書き換え10000回保証はこの意味で うれしいことです。ISPも助けてくれます。ライタの書き込み切り替えスイッチも、on,offが煩わしく、プッシュスイッチ を並列に増設しました。この程度の書き込みでは瞬間的に終わりますから、押しボタンの方が楽なのです。
Cの文法がよく分かりません。良い資料があれば教えていただきたいと思っています。

その2 スタート/ストップスイッチを兼用する
 上の回路では、スタートとストップの押しボタンスイッチを分けましたが、これを1つにしてトグル動作にすることを 考えました。スイッチについては、上の例のように「ONの状態が発生したかどうか」だけを判断するのは簡単ですが、押された 回数を判断するには考慮が必要です。
1.チャタリングがある=タクトスイッチは少ないようですが、機械的スイッチはバウンドしながら接触し、 また離れます。 一押ししたつもりが、数回のON、OFFをしたことになります。これをさけるために、プログラムでスイッチを読みに行った後、 ループで時間を浪費しています。数ミリ秒の間にバタツキが止まるようですから、その間読まなければいいわけです。このように チャタリング対策が必要です。
2.一押しを2回以上評価させない=人間の一押しは、長くなれば0.3秒くらいになるでしょう。これに対してコンピュータは 0.01秒(10ミリ秒)位の間隔で読みに行くのが普通です。一瞬の押しが2回と読まれたら、困ります。そこで、スイッチの前回の 状態を覚えておく変数を用意して、前回がoffで今回がonの時はonと判断し、前回がonで今回がonなら「まだ離していない、続いている」と判断します。これによって1秒間押し続けても「一押し」と判断されます。
回路図はありませんが、スタートスイッチで兼用し、ストップスイッチは不要になります。
プログラム2として準備しました。


TOPへ


inserted by FC2 system