ホーム > 家族のギャラリー > ペントミノを解く > 第7章 ペントミノ専用ハードウェア > 7.1 PSP概要
2008.1.3
7.1 PSP概要

1. ハード構成

以前、秋月で買った5x7ドットの2色マトリックスLED 2個の使い道を考えながら、秋月のページを眺めていたらI/Oピン数の多い28ピンのPIC16F873Aが目に付いた。I/Oピンが22ピンもあり、PIC1個のみでマトリックスLEDを2個並べて表示できる。ペントミノのボードは6×10マトリックスなので十分だ。マトリックスLEDの各セルが四角なこともペントミノの表示に丁度良い。(このLEDはすでに秋月で扱っていない模様)

5x7ドット 2色マトリックスLED
5x7ドット 2色マトリックスLED

という訳でPIC 1個+マトリックスLEDで、ペントミノを解いて表示する専用マシンを作ってみることにした。

PIC16F873Aのデータメモリは192バイト(96バイト×2バンク)、プログラムメモリは4Kワード(2Kワード×2ページ)と、データメモリが非常に少ない。バンクに分かれていることもつらい。この少ないメモリでそこそこの性能のコードが書けるかかが課題。

クロックは最速の20MHzとし、外部発振子としてセラロックを使用する。電源は4V以上必要なのと、LEDが小さめなので単5電池を3本使用しコンパクトに作ることを目指す。(表面実装のPICやボタン電池を使えばさらに小さくできそうだが、そこまでは凝らない)

他に電源SW用に小型のスライドスイッチ1個と、動作を切り替えるためのタクトスイッチ1個、LEDの電流制限抵抗、プルアップ抵抗、ユニバーサル基板など。ケースは、東急ハンズで単5電池ホルダ3個と基板が入りそうな小さなアクリルケースを見つけた。部品代は合計1,500円程度。電池ホルダとケースが意外と高い。

2. 目標性能

PICでは使えるメモリが少なくて凝ったことはできそうにないので、実装するプログラムは、C言語版の最適化の3版をベースにすることにした。

当時、PentiumIII 800MHzを使って1.75秒で全解が求められている。これを元にCPU性能の違いから目標タイムを推定する。

以上から、40x16=640倍で、1.75秒×640=1,120秒(18分40秒) を目標とした。

アセンブラで書くのでもう少し速いかもしれないが、PICはデータメモリが少ないのでピース定義テーブルを配列で持てないなどの制約がある。また、計算中の進捗状況を表示するために多少CPUを使うので、ひとまずこの位を目標とした。平均すると0.5秒毎にひとつの解が得られる(1,120秒/2339解=0.47秒)。

大昔、APPLE-][のCPU 6502(1MHz動作)のアセンブラで解いたとき、一晩で50個程度しか解けなかったことがあるので心配。当時のコードはすっかり忘れてしまったが、盤面の長い辺に沿ってピースを置いたことが遅い理由だったと、今では思う。

3. 実際の性能

一応、速度を気にしてコードを書き、実際に動かしたら以下のように目標をクリアできた。約0.3秒毎に解が求まっている。もう少しは速くできると思う。

データメモリは結構ギリギリの175バイト使用。処理速度を多少犠牲にすればあと36バイト程度は削減可能。プログラムメモリは文字パターンなどを含めて1.8Kワードで済んだ。

No.処理時間対応内容
1958秒・次の置き場所の1,2セルの孤立チェックなし
・進捗表示なし
2804秒・次の置き場所が1セル分しかない孤立チェックのみ実装
・進捗表示なし
3778秒・次の置き場所の1,2セルの孤立チェックあり
・進捗表示なし
4809秒・進捗表示あり
5782秒・アセンブラコードを少し見直し
6692秒・ピース定義を見直し
※処理時間はPICの開発環境:MPLAB上のStopwatch機能で測定

4. 機能概要

(1). 実行モード

ステップ実行モード
ひとつの解が求まると一旦止まり、その解番号と解の表示を行う。ボタンを押すまでその解の表示を繰り返す。ボタンを押すと次の解の計算を行う。ボタンを長押しすると、連続実行モードになる。
連続実行モード
止まらずに続けて計算し、求まった解数を随時表示する。途中でボタンを押すとステップ実行モードになり、その時点の解番号と解の表示を行う。

(2). プログレスバー

ひとつの解を求めるまでの様子を緑色LEDで表示する。置けたピース数を縦の1列で表示するが、1列7ドットなのでピース6〜12個の状況をバーグラフで表示。12個目は一瞬なのでほとんど見えない。

(3). 解数の表示

連続実行モード時に、解いた解数をプログレスバーのように表示する。4桁の結果を4行で表示する。

(4). 解番号の表示

表示部は7×10ドットのマトリックスで、そのままでは数字を表示できないので、スクロール表示する。解番号 No. 1 〜 No. 2339 までゼロサプレス(上位桁の不要な0を表示しない)で表示。

(5). 解の表示

ボードの左上から、配置した順にピース形状を順次表示する。1ピース当たり0.3秒くらい表示し、12ピース4秒位。

(6). その他

  • 電源投入時のスプラッシュ表示
  • 全解が求まったときの完了表示
  • 自動パワーオフ(全解完了時、入力待ちでボタンが長時間押されないとき)

5. 動作中の様子

まだケースに入れる前の状態です。緑の輝度が少し低い。

演算中の様子 解の表示
連続モードで演算中の様子 解の表示の様子

  Copyright (C) Nakamura 2008  

【↑7章 目次】   【次(7.2)へ→】