押しボタン式の信号機をつくってみました.出来てしまえばそんなに難しくはないですが,今までに作ったことのない課題だと,新しいプログラミングテクニックが必要なので,それはちょっと考えました.ちなみに,この記事の内容は情報系の大学1年生くらいの難しさがあります.
まず,押しボタン式の信号機は次のようなものとします.
- 信号機の状態は3つ,赤,青,青の点滅が循環している.
- 青,青の点滅は一定時間で次の状態に進む.
- 押しボタンの状態は2つ,押されていない,押されている.
- ボタンをタッチすることで,押されていないから押されているに変わる.
- ボタンが押されていて,赤の状態がスタートしてから一定時間以上経過した場合,信号機は青に,ボタンが押されていないに変わる.
今回,新しく必要だったテクニックは,「カウンターがいくつ以上のとき」という判定と,そのために必要なカウンターのリセットです.
ビスケットで作っているカウンターは桁上がりにも1ステップ必要であるため,たとえば1100という表示が丁度12ステップ後には起きません.この数の前の状態は,1011という数ですが,ここに1を足して,2回桁上がりがあって1100になります.でもこのときにはすでに2ステップたっているので,画面上は1102 (本当は2のところは1が二つ重なっている)になっているはずです.
前回の信号機では「1100だったら,カウンターを0にする」ではなくて「11ーーだったら,11ーーを引く」というメガネになっていたので,桁上がり中にカウントアップされていた数はそのままで,引き続き次の数を数えることができました.つまり1102だけど11--を引いて次は2から数えるということです.個別には多少のタイミングのずれはありますが,青,黄,赤のトータルでは周期がそろって動きます.
ところが今回は,いくつ以上という判定をしなければなりません.たとえば1000以上という判定をしたかったとき,4桁目が1である,というのでは不十分で5桁目やもっと上の桁が1だけど4桁目は1じゃないという場合もあるのです.
そこで,判定したい数になったらそれ以上桁上がりはしない,というメガネを追加します.つまり,2ーーー(2は1が二つ重なっている)なら1---にする,として5桁目には進まないようにします.
もう一つはリセットです.1000以上ということは,1000から1111までのどこでリセットするかわかりませんから単純に1---を引くというのでは数が残ってしまいます.そこで強制的にすべての桁を0にするメガネが必要です.
具体的にみてみます.
カウンターは青用と赤用2つ用意します.青点滅も青用を使います.
これは青点滅.
青のときカウンターがここまで来たら,点滅に変わります.これは1---を引くという前回と同様の方式.
青点滅のときにここまで来たら,信号機を赤にして,それより下の桁をリセットします.下の桁は何桁くらい長くなるかわからないので多めに入れておきます.
各桁をリセットするメガネです.上から青の球が1つを消す.青の球が2つ重なっているのを消す.青の三角(青の球の生成器)を赤の三角(赤の球の生成器)に変える.最後に,何もないところではそのまま消えます.
これは押しボタンです.押されていないときにタッチすると押された状態になります.
これは,ボタンが押されていないときに,この桁で赤の球が2つ重なっていたら,1つにするというものです.ここでこの桁以上のカウントを止めています.青のカウンタの位置とは2つずれているので,青の4倍の時間になります.青が1,青点滅が1,赤が4以上です.
これは,ボタンが押された状態でこの桁に赤い球があれば,信号機を青にして,ボタンを押されていないにして,下の桁をリセットします.今これを書いていて気が付きましたが,この桁で赤い球が2つ重なる瞬間にタッチして押された状態になると,この桁に赤い球が一つ残ってしまうバグがありますね.それを修正するにはこの桁にも赤リセットの×を置く必要があります.
青のカウンターと同じ,赤リセットのメガネです.
最初にこのように配置してスタートします.
作品はここです.
車の信号も加えると,車側の黄色信号の状態も必要ですね.歩行者信号が赤で,XX以上のときに押されていたら,まず車信号が黄色になって,次に車信号が赤になると同時に,歩行者信号が青になります.これは一定時間でよいので,青カウンターをそのまま使えばよいでしょうね.
今回の例題は,特にタイミングをしっかりと考えなければならない難しいプログラムでしたが,感想としては論理ゲートを組み合わせて状態遷移機械を作っているようでした.
ビスケットが小学生のプログラミング教育だけではなく,情報系の大学生の学習ツールとしても十分使えるのではないでしょうか.逆に小学生のすごい子にはこういう英才教育もありかもしれません.