担当授業のこととか,なんかそういった話題。

主に自分の身の回りのことと担当講義に関する話題。時々,寒いギャグ。

カウンタが欲しい。

2013-02-15 23:59:36 | 工作・実習
近々試みたい作業の一つは,100人ほどのデータからある統計を取ることである。
そのために,人数を数えるカウンタが欲しい。

もっとも手っ取り早いのは,「正」の字を書いて人数を数える方法である。

しかし,そうではなくて,カウンタを何らかの方法で作りたい気がした。

このところ関心がぶり返している電子工作の一環として電子カウンタを作るということも考えた。

実は,小・中学生のころ,世の中は電子工作ブームで,僕はしょっちゅうパーツ屋に電子部品を買いに行っていた。しかし,実際に組み立てた回路は数えるほどしかない。

そのため,なんとなく作りたいなぁという思いだけでつい買ってしまった未使用のパーツがたくさん残っている。数日前に取り出してみたら,導電スポンジに刺さってるCMOS ICは,なんと54個もあった。

どうやらその中には 12 bit カウンタも入っていた。扱うデータは100人ちょっとの数だから,7 bit もあれば十分事足りる。実は 7 bit カウンタのCMOS ICも存在するのだが,僕のコレクションには入っていないようだった。

カウンタを自作するといっても,個数を表示する7個のLEDが押しボタンを一回押すごとに点いたり消え,表示が2進数なので10進数に直すには自分で計算するという,極めて素朴なものを想定している。

IC コレクションの中には2進数を10進数に変換するデコーダやら,7セグメントLEDという,デジタルな数字を表示する素子を制御するためのものもあるようだが,そういったことにはこだわらないことにした。

そんな素朴な機能しか持たない回路であっても,いざ自分で考えようとするとよくわからない。最大の難関はスイッチのチャタリング防止回路をどう組むかである。

ここでいうスイッチは機械スイッチであり,金属の接点が触れたり離れたりすることで導通状態が変わるものである。こうした機械スイッチは,接点がばたついて瞬間的に ON-OFF を繰り返すことがある。そうすると,スイッチ・ボタンを一回押しただけなのに,もっとたくさんカウントされてしまう恐れがある。したがって,ボタンを一回押したら信号が一回だけカウンタに送られるようにする工夫が必要となる。

チャタリング防止回路はデジタル回路について解説している本に載っているが,問題は,回路に使用されている抵抗値をどう設定するかである。電源電圧が5Vの場合の回路が本に載っていたとして,電池2本の3Vで動くように修正するにはどうすればよいかが,僕にはまださっぱりわからないのである。ダメもとで作ってみても良いが,期待通りに動かない公算が強いので,やる気になれない。

こうした事情で,手元のICコレクションは依然宝の持ち腐れ状態のままである。


電子工作でカウンタを自作するのは僕にはまだ無理だが,代わりに電子回路シミュレータで回路を組んでシミュレートしてはどうかという考えが浮かんだ。

ところが,そこには思いがけない落とし穴があったのである。

まず,有名な LTspice というフリーの強力なシミュレータがあるのだが,どうも標準ではデジタル回路はサポートしていないようである。

他に TINA-TI というものもあるが,こちらもデジタル回路をサポートしていない。とある本の付録の CD に収録されている Book 版というのはデジタル回路やリアルタイムシミュレーションがある程度使えるらしいので,それを手に入れる必要がある。

そういうわけで,現在の僕のPC環境では無理だということがわかった。これにはガッカリであった。

しかし,これらの優秀なシミュレータはトランジスタ回路ならばシミュレートできる。ならば,いっそのことカウンタをICではなくトランジスタのみで設計してはどうかという考えも浮かんだ。それはそれで非常にチャレンジングな面白いテーマだとは思うが,チャタリング防止回路の設計よりもハードルが高い。ただ,なぜ最近電子工作熱がぶり返してきたか,その理由を忘れかけていたが,数週間前に抱いていた野望は,デジタル回路の各種ゲートをトランジスタ回路で実現するというものだったことを思い出した。だから,この路線はこの春休みに追究したい主要テーマに沿っている。

カウンタはフリップフロップと呼ばれる回路を用いて作られる。そのフリップフロップは NAND ゲートの組み合わせで作れるらしい。ならば NAND ゲートの機能を持つトランジスタ回路を作ればよいのではないか。しかし,悲しいかな,トランジスタの動作原理もいまひとつわかっていないので,実際にどうすればよいかわからない。試しにトランジスタ2石の回路を設計して TINA-TI でシミュレートしてみたところ,NAND ではなくて NOR ゲートの動作をした。シミュレーションをして回路のいろいろな節点の電圧も調べてみたが,想定していたのと全く異なる結果となり,正直戸惑っている。

なぜうまくいかないのかは当然自分で分析して解決しなければならない。その魅力的なパズルに取り組むのは来週にしようかと考えている。

また,そもそもトランジスタ2石で組む双安定マルチバイブレータという回路がフリップフロップそのものだということを『絵とき トランジスタ回路』という本で学んだ。しかしその本に載っている回路は,負レベルのトリガ・パルスを入力するものなので,それを3Vの正電源だけの回路に改造したいという野望が首をもたげてしまった。それが可能かどうかなどは,双安定マルチバイブレータの動作原理をしっかりと理解する必要があり,これも腰を据えて取り組むべき課題である。


結局,今しばらくは電子回路でカウンタを作ることができないという結論に至った。


カウンタが作れないからといって当初の集計を取るという作業をいつまでも先延ばしにするわけにはいかない。そこで,保険として,カウンタのプログラムを組んではどうかと考えた。しかし,BASIC言語をほんのちょっとたしなむ程度であって,僕のプログラミング技能はほとんど皆無なので,これはこれで僕にとってはハードルが高い。しかし,あてはあった。

以前何度かお世話になった日本語プログラミング言語『なでしこ』の存在を思い出したのである。そういえば,一年前にもなでしこで簡単なカウントダウンタイマーを作ったことを思い出した。僕はつくづく一年周期で同じようなことを繰り返す性質らしい。

どんなカウンタを作るか。ボタンをクリックしたら,表示されている数値が一つ増えるという,極めてシンプルなもので十分である。さて,ではそのボタンや数値はどういう命令で表示させればよいのだろうか。

なでしこには詳しいコマンドレファレンスもついているが,かなり膨大な内容であり,僕のような素人が自分にとって必要な機能だけを探すというのは無理がある。そこで,なでしこのサンプルプログラムから学ぶことにして,サンプルプログラムがネットに落ちていないかググってみた。そうして調べた結果,次のようなソースコードに至った。

--- ソースコード開始 ---
母艦のタイトルは「カウンター」。母艦の高さは、250。母艦の幅は、300。
結果とはラベル。そのXは100。そのYは50。その文字サイズは50。
人数は0
結果は0
追加ボタンとはボタン。そのWは80。そのHは40。その文字サイズは20。そのXは200。そのYは150。そのクリックした時は~
人数=人数+1
結果=人数
リセットボタンとはボタン。そのXは200。そのYは10。そのクリックした時は~
結果=0
人数=0
--- ソースコード終了 ---

母艦というのは,カウンタソフトのウィンドウのことである。そのウィンドウのタイトルや大きさを1行目で指定している。
人数や結果というのは変数名である。ラベルというのはウィンドウ内でテキストを表示する部品である。ここでは,そのテキストのデータはカウントした数値である。
ウィンドウ内に追加ボタンとリセットボタンを配置した。追加ボタンを一回押すとカウンタが+1される。リセットボタンを押すと表示が 0 にリセットされる。

『なでしこ』の開発者であるクジラ飛行机氏が web 上で「日本語で10行プログラミング」という非常に役立つ記事(以前も,また今回も大いに参考にさせていただいた)を連載されており,それを真似て無理やり10行に収めてみた。実質的には1行目と3行目,4行目は省いてもほぼ支障なく作動するが,変数の初期値を設定する3行目と4行目はあった方がよいと思う。これらを省いた場合は,最初にリセットボタンでリセットするという手間をかければ全く支障なく動くはずである。


というわけで,実際の集計作業に取り掛かる準備は整った。しかし,このプログラムで作業をしてしまうと,電子回路でカウンタを作るというモチベーションが失われてしまう。

どうしたものか。

来週中には決着をつけねばなるまい。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする