ポケコンを魔改造してLinuxマシンに

C言語のプログラムを Emacs で編集しているところ。
先日、52年前の電卓「カシオミニ」を魔改造してRPN電卓化した。なかなかうまくいったが、そうは言っても電卓という範疇にとどまっている限り、びっくりするほど高機能になったわけではない。そこで今回は、37年前(1988年)のポケコンを改造して、Linuxが走る最新式?のポケットコンピューターを作ってみた。電源スイッチを上方向に入れると Linux コンピュータに、下方向に入れると RPN電卓として使える設計で、やはり外装には手を加えず、全てをオリジナルのケースに収めた。WiFi にも繋がるので、ソフトウェアや Python のパッケージを追加するのも簡単。結果、「もし、現代にポケコンがあったら」という想像を具現化したようなものが出来上がった。
紹介動画
構想
まず、改造できそうなポケコンについて調べてみた。1980年代前半の人気機種(SHARP PC-1245, CASIO PB-100など)は小型化の進んだ関数電卓の影響を受けているため、とても薄型で電源はボタン電池、よって改造には向かなさそうだ。それに対し1988年頃になると工業高校などへの導入を前提に、大きめで頑丈な筐体の機種が増え、キーボードや画面、電池容量も大きくなっている。その中から、学校向けに大量販売され、今も安価に見つかるSHARP PC-G801をターゲットにすることにした。

オリジナルの基板。特に右側が激しく腐食している。
ビアにも緑青が詰まっており、パターンにも切れた部分が多数あった。
故障しているが、外装はあまり傷んでいないものを探して入手。分解して調べると、電池の液漏れでメイン基板や液晶周りが激しく腐食しており、確かにこれは修理困難、と判断して改造に進むことにした。上の写真のように、メイン基板の裏側にはLSIなど多くの部品が実装されている。なかには電解コンデンサなど厚みを要する部品もあり、意外とゆったりとしたスペースがあった。計測すると、基板の表面から裏蓋までは(補強のリブなどを除去すれば)8mm弱のスペースがあり、外装に手を加えることなく、いろいろなマイコンが搭載できそうだ。

回路の概略。内臓の電池と、USBからの給電に対応し、
いずれの場合でも RPi に電源を供給するかどうかを選ぶことができる。
そこで、搭載する部品の構成について検討した。これまで Arduino nano や Raspberry Pi Pico, ESP32 などのマイコンを使用してきたが、これらでは本格的なOSが動作しないので、今回は Linux が動作する Raspberry Pi Zero 2W (以下、RPi)を搭載してみることにした。これを使用するには普通、USBキーボードとHDMIディスプレイを接続するが、今回は筐体内に小型ディスプレイを搭載するため、別途 ESP32-S3(以下、ESP32)マイコンも使い、こちらからシリアルポート(UART)経由でログインする。ポケコンに備わる多数のキー全部を読み取るには多くのGPIOポートが必要だし、Linux は起動に時間がかかるため、電卓としてさっと使いたいときには ESP32側だけを起動できれば便利だ。よって電源スイッチには ON のポジションを2つ設け、一方では RPi と ESP32 の両方、他方では ESP32 だけに電力が供給されるようにする。ESP32 では RPi に電力が供給されているかどうかを調べる配線を行い、シリアル端末とRPN電卓の2モードを切り替える。
基板の設計・発注

プリント基板の回路図。OLEDディスプレイや RPi への配線は含まれていない。
今回はオリジナルの基板(以下、PCB = Print Circuit Board) を使わず、PCB を新しく設計・制作することにした。PCB にキーボードの導電ゴム接点などを自作で作り込むのは難しいため、外注することに。結果、必然的に基板CAD(KiCAD)を使う必要が生じた。海外の専門業者(JLCPCB, PCBway など)に発注すると、安価に高品質な PCB を制作できることは知っていたが、これまで取り組んだことがなかった。しかし、いつかは通る道。・・と思って始めてみると、最初はとっつきにくいと思っていた KiCAD が、実はびっくりするほどよく出来たソフトウェアであることが分かってきた。

オリジナル基板をスキャナで取り込み、その上にフットプリントを配置、配線していく。
赤が表側(キーボード側)、青が裏側(部品取り付け面)の配線。
ほとんどの部分がキーボード接点のため、最初は近道をしようとして、直接 PCB エディタで配線しようとした。しかし、それではうまくいかないことを悟り、きちんと回路図エディタで回路を作り、導電ゴム接点をフットプリントエディタで設計したりしながら、完成にこぎつけた。「これでうまく動くんだろうか」という不安は、回路図やPCBの検査機能(ERC, DRC) が取り除いてくれた。というよりも、これがなければ間違いなく配線のし忘れなどが生じていただろう。基板をスキャナで取り込み、それに重ねるようにデザインすることが出来るのも便利だった。

出来上がったPCB。厚み1mmの両面基板で、導体の露出部は金メッキされている。
そうして発注データが出来上がり、JLCPCBのウェブサイトへ投入。エラーも出なかったので、そのままえいやと、初めての発注へ進んだ。基板サイズが大きめ(長辺21cm)なことに加え、キー接点の劣化(酸化皮膜形成)を避けるために金メッキ(ENIG)処理を選択したこともあり、5枚で27.67ドル、送料込みで36.32ドルもかかったが、1週間ほどで基板が到着。その美しい出来に満足した。テスターで簡易テストをしたところ、当然ながらOKだったので、ESP32を装着してキースキャンコードをフラッシュ。全キーが、軽い押下力で確実に読めた。固定用の穴なども含め、完全ノーミス。楽勝(・・と舐めていたら次回、大ポカをやらかしそうだが)。
部品の搭載・配線

部品の厚みを抑えるための工夫。
部品の搭載・配線で注意しなくてはならないのは、その高さの抑制だ。前述したように基板面から7.8mmほどのスペースがあるというものの、ピンヘッダを縦に付けたらそれだけでアウトだ。そこで、以下のような工夫をした。
- ESP32の装着には背の低いピンソケットを用い、ESP32を裏向き(伏せる向き)に装着した。ピンヘッダは最低限の長さにし、裏側へ飛び出した部分はカット。
- 上記のピンヘッダでは1列分(上の写真では、手前側)しか基板に接続できないので、ESP32の奥側にはL字のピンヘッダを内向きに取り付け、高さを抑制する。ここにはディスプレイ(SPI接続)、RPiへのシリアル通信(UART)や、ピンソケット側では足りなかった2本分のキースキャン用配線を行う。
- OLEDディスプレイには最初から2列のピンヘッダが装着されていたため、それを外して、こちらも2列のL字ピンヘッダに交換。
- RPi のほうにもL字ピンヘッダを用いるが、あらかじめハンダ付けする部分の長さを短くカットして、ピンが裏に突き抜けないように。ただ、配線抵抗による電圧降下のため動作が不安定になったので、電源回路については別途、直接ケーブルをはんだ付けして追加してある。
部品に合わせて裏蓋の内側も加工する。もとの部品の配置に合わせてリブなどが設けられているので、それらをルーターで削って除去する。特に、電池蓋の内部(兄弟機 PC-E200 でメモリーバックアップ電池が装着されるところ)は大きく削る必要があるが、ここは電池蓋で隠れる部分なので外観には影響がない。RPi の取り付け穴をもとの裏蓋のネジ穴に重ねてあるので、この部分(ネジ受けの内側、上の写真では右下の穴)も削って薄くしておく。

配線後の状態。ESP32のポートは、使用不可のピンを除き、ほとんど埋まった。
このポケコンはもともと、左右両側に端子口がある。各マイコンはそちら側にUSBやHDMI端子が向くよう装着した。裏蓋を装着した状態で、ESP32への給電・プログラミング(フラッシュ)や、RPi への給電・USB機器接続が可能だ。ただしHDMI端子はケースに一部隠れる。ケースを削って接続できるようにすることも考えたが、ESP32側から単体でログインできるため HDMI は初期設定時などにしか使わない。よって、必要に応じて裏蓋を外す運用とすることとして、ケース外観には全く手を加えなかった。
ソフトウェア
ESP32でキースキャンし、押されたキーの文字コードをUART(シリアル通信)で RPi へ送出。また受け取った文字コードをディスプレイに表示すれば、あとは RPi 側のわずかな設定変更(シリアルポート有効、シリアルコンソール有効にセットする)だけでシェルログインできるようになる。ただしそのままでは emacs などのエディタが使えない。テキストエディタは画面の任意の位置に文字を表示する必要があり、これにはエスケープシーケンスと呼ばれる特別な文字列を解釈する機能が必要だ。これはまた、文字色の変更や、バックスペースキーを押したときに前の1文字が消える、という動作にも関係している。エスケープシーケンスを処理しなければ、画面に余計な文字列も現れてしまう。

エスケープシーケンスの、カーソル移動関係のコード。
VT100互換などとも呼ばれる業界標準のエスケープシーケンス(ANSI escape code)全体はかなり多機能だが、今回用いるディスプレイはカラー表示ができないこともあり、必要最低限の機能のみ実装することにした。かなり泥臭いコードになったが、emacs が「一応」使えるようになった(時折、未実装のエスケープシーケンスが送られることがあり、その場合は ctrl-L で再描画する必要がある)。画面が狭いので、上にスクロールして過去の表示を遡る機能も実装した。

RPN電卓の、指数・対数関数関係のコード。
一方、ESP32だけに電源を入れたときはRPN関数電卓として動作させるが、普通の電卓に比べて画面が広いことや、A-Zの文字キーがあることを生かすべく、機能を追加した。スタックは6段表示されているが(内部32段)、これに A-F の文字を振り、キーを押すとそれに対応した値をスタックトップに入力できるようにした。また別途、自由に値を保存できる変数(X, Y, Z)も設け、shift-X で X へスタックトップの値を格納し、X を押すとそれを呼び戻せるようにした。この X, Y, Z の値も画面右側に表示される。もちろん三角関数や対数・指数などの関数電卓機能に加え、多段のアンドゥ機能も搭載してある。

裏側、電池蓋を外したところ。オリジナル同様、単3電池4本で動作する。
以上により、Linux 端末にも、RPN 電卓にもなるポケコンが出来上がった。Linux (Raspberry Pi OS) は WiFi でネットワークに繋がるので、現在時刻は ntp で自動的に取得されるし、他の計算機へ ssh や scp でアクセスすることもできる。逆に、他の計算機からポケコンへ ssh や VNC で接続することもでき、広い画面を要する複雑な設定などはそれで行うのが便利だ。プログラミングも C や Python が難なく走り、Python のライブラリを PIP でインストールしたり、ソフトウェアの追加・更新を apt コマンドで行うこともできる。やろうと思えば、webサーバを立ち上げたりもできるはずだ。
以下は今後、実装したいと考えている機能である。
- 標準的な 80列 x 24 行のターミナルを模擬するモード。全体を見るために上下左右にスクロールできるようにする。
- 未実装のエスケープシーケンスの追加。
- ESP32 単体時の、USBキーボード / bluetooth キーボード / ssh ターミナル機能の追加。
製作過程
リンクは、対応する X の書き込みです。- 2025.11.2 : 故障品の PC-G801 を入手
- 2025.11.8 : PCB 設計完了、発注
- 2025.11.13 : OLED ディスプレイ動作確認
- 2025.11.16 : PCB 到着、ESP32 装着、キー入力確認
- 2025.11.21 : RasPi Zero 2W 搭載、UART 経由でログイン可能に
- 2025.11.23 : 最低限のエスケープシーケンス実装、emacs 利用可に
- 2025.11.25 : ESP32 単独時の RPN 関数電卓実装
- 2025.11.28 : エスケープシーケンスコマンド追加、フォントサイズ調整(7行表示化)