ポケコンでLチカ:信号機の点滅シーケンスを再現してみる
信号機が好きな小学生が、自治体の競売で信号機の実物を入手して自宅に設置したというほほえましいニュースがありました。
信号機を落札した小学生、独学プログラミングで点灯成功「LEDより昭和の電球式の方がなじみがあって好き」(WebArchive)
ORICON NEWS – 2021.3.15
記事の「独学プログラミング」とは、写真を見るとArduinoのようです。リレー基板などのAC100Vラインの工作はお父さんのサポートもあるのではないかと思いますが、C言語ライクなArduino言語を小学5年生で習得した行動力と探求心がスゴイです。お父さんも「信号機を作るために、一緒にPCやマイコンのプログラミングを勉強しました。」(引用)とのことで、息子さんと一緒になって取り組んでみる姿勢がすばらしいです。
記事にするほどでもないと思って放置していましたが、ポケコン(SHARP PC-G850V)のパラレル出力を利用して信号機の点滅パターンを再現して遊んでみたことがあり、いい機会なので残しておきたいと思います。いわゆる「Lチカ」(LEDチカチカ)というやつです。
動画
YouTubeに動作の様子をアップしました。
歩行者信号の点滅速度は2Hzがちょうど良いみたいですね。
プログラム
BASICのプログラムリストは以下の通りです。
10CLS
20PRINT "コウツウシンゴウ シミュレ-タ"
30OPEN "PIO:"
40PIOSET 0
50PIOPUT 0
60WAIT
70LOCATE 0,2:PRINT "PUSH ENTER"
100W=8:S1=1:S2=0:S3=0:S4=1:S5=0:GOSUB *SUB
110W=20:S1=1:S2=0:S3=0:S4=1:S5=0:GOSUB *SUB2
120W=3:S1=1:S2=0:S3=0:S4=0:S5=1:GOSUB *SUB
130W=3:S1=0:S2=1:S3=0:S4=0:S5=1:GOSUB *SUB
140W=8:S1=0:S2=0:S3=1:S4=0:S5=1:GOSUB *SUB
200GOTO 100
1000*SUB
1010WAIT W*64
1020PIOPUT S1*128+S2*64+S3*32+S4*2+S5
1030LOCATE 0,2
1040PRINT "(";S1;S2;S3;") (";S4;S5;")"
1050RETURN
2000*SUB2
2010WAIT 16:J=0
2020FOR I=0 TO W
2030IF J=0 THEN PIOPUT S1*128+S2*64+S3*32+S4*2+S5 ELSE PIOPUT S1*128+S2*64+S3*32+S5
2040LOCATE 0,2
2050IF J=0 THEN PRINT "(";S1;S2;S3;") (";S4;S5;")" ELSE PRINT "(";S1;S2;S3;") (";0;S5;")"
2060IF J=0 THEN J=1 ELSE J=0
2070NEXT I
2080RETURN
変数表は以下の通りです。
変数名 | 用途 |
---|---|
S1 | 信号灯の状態(車両用・緑) 0:消灯/1:点灯 |
S2 | 信号灯の状態(車両用・黄) 0:消灯/1:点灯 |
S3 | 信号灯の状態(車両用・赤) 0:消灯/1:点灯 |
S4 | 信号灯の状態(歩行者用・緑) 0:消灯/1:点灯 |
S5 | 信号灯の状態(歩行者用・赤) 0:消灯/1:点灯 |
W | ウェイトの設定 *SUBに渡す場合は継続する秒数 *SUB2に渡す場合は点滅する回数(状態変化ごとに1カウントするので、1サイクルでは2を指定する。4を指定するとOFF-ON-OFF-ONと点滅し、点滅時間は1秒となる。点滅周期は2Hzで固定です) |
LEDの状態(点灯・消灯)を制御して一定時間待つ処理はサブルーチン化しています。サブルーチンは、変数表の変数(パラメータ)を設定してから呼び出して使用します。
*SUB LEDの状態を変更してから指定の時間だけウェイトを掛けるサブルーチン
*SUB2 LEDを指定の回数だけ点滅させるサブルーチン
変数S1~S5は0または1の値を取り、そのまま重みづけをしてPIOPUT(パラレル出力)に渡す値としても使っています。
LED基板
ありあわせの部品でLED基板を作ります。
ポケコンとの接続はL型ピンヘッダだけで済むので簡単です。ジャンク部品で作っているのでLEDの種類はバラバラ、ユニバーサル基板(サンハヤト ICB-288)は長期保管でだいぶ年季が入ってしまったものを活用しました。
LEDの電流制限抵抗は1kΩです。
今回はちょっとした遊びなので、LEDは新品ではなくジャンク品から適当に選んで使用しました。筆者が小学生のころから少しずつ溜まっていった部品たちで、ジャンク袋に含まれていたLEDのほか、電子工作キットの余り物や、粗大ごみの廃家電から外したLEDもあります。レトロな大型LEDや、カセットテープデッキ用とみられる再生(PLAY)マークの形をしたLEDもあったりします。
伝統的BASICの楽しみ
冒頭の少年はArduinoで信号機の制御をしているようです。Arduino言語はC言語に近く、単純なLチカならまだしもタイマーを組み合わせて点滅させたりしようとすると難易度が上がります。とはいえArduinoは入門書や解説サイトも多いので、電子工作と相性の良いマイコン学習環境としてはArduinoがベストな選択になるでしょう。
8ビットPCに載っていたBASICは上から下への一筆書きが基本で、初心者に向いているとされてきました。しかしWindowsでは昔ながらの行番号付きBASICでアプリを開発することは現実的ではなく、BASIC言語としてはVisual Basicとして今もなお使われているものの、行番号付きのBASICは廃れてしまいました。伝統的な行番号付きBASICを搭載し、教育用として日本国内独自の進化を遂げてきたポケコンも、2015年までに全機種で生産終了となってしまいました。
伝統的BASICはアプリ開発用としての役目を終えましたが、中途半端な書きかけで実行しても書いたところまでは動くので、トライ&エラーを繰り返す学習用として最適です。近年は「こどもパソコン」IchigoJamが出てくるなど、その敷居の低さを再評価する動きも出てきています。
筆者は、冒頭の少年と同じ年齢のころにマイコンBASICマガジンを片手にBASICに没頭していました。それから30年経ちましたが、当時の経験は今につながっています。当時の原体験を思い出しつつ、ときどきポケコンBASICで遊んでいます。