先日、ハードオフでジャンク品をあさっていたらこんなものを見つけました。
ポケットステーションです。
ポケットステーションにはフリーの開発環境があり、これで作成されたアプリケーションやゲームも色々あります。以前ネットでポケットステーションのメモリをPCで読み書きするという記事を見たことがあったので、Arduinoで試してみようと思い購入してみました。¥108でした。
電池切れのためその場で動作確認は出来なかったので、故障している可能性を考えて偶然もう一つあったポケットステーションも購入しました。
こちらは電池がなくボタンのカバーもありませんでした。
早速持ち帰って確認したところ、どちらも正常に動作しました。透明なポケットステーションにはデータも何も入っていませんでしたが、白いポケットステーションには幾つかのセーブデータとゲームが2つ入っていました。
動作確認が出来たので次にArduinoでメモリ読み書きの実例がないかネットで調べてみたところ、結構いろいろな情報が見つかりました。これなら簡単に製作できそうだなと軽い気持ちで取り掛かったのですが、これが大間違い。今までで一番手間のかかった作業となってしまいました。
今回、主に参考にしたのはこちらとこちらのサイトです。ポケットステーションとArduinoの接続にプレイステーションの専用コネクタが必要なのですが、以前Arduinoと接続したマルチタップがあるのでこれをそのまま流用しようと考えました。
参考にしたサイトの情報はArduino UNOのものですが、今回使用したPro Microとはピン配置が多少違うだけなので殆どそのまま動作すると思い、ピン番号を変更してみましたが全く動きません。
サイトにはポケットステーションに入力する電圧が3.3Vでは動作しなかったという情報もあり、マルチタップにつないであるPro Micro互換機が3.3Vのため動作しないのかとも考え、外部電源をつないで電圧を上げてみましたがだめでした。ポケットステーションの替わりにメモリカードを使って検証してみても動作しないのは同じでした。
その後配線を変えたり、ダウンロードしたスケッチを書き換えたり、PCとのシリアル通信に問題がないか調べたり、しまいにはArduinoのブートローダーをLeonardoのものにしたりと思いつくこと全てを試してみてもうまく行きませんでした。
仕方がないのでマルチタップにプレイステーションコントローラーをつなぐためのスケッチを手直しして試したところ、ポケットステーションやメモリカードと通信はできるようになったのですが、データの取りこぼしが多く安定動作させることが出来ません。メモリカードへのアクセスはコントローラーとの通信よりシビアなタイミングが要求されるようでどうにもなりませんでした。
ここで、マルチタップは諦めてArduinoとメモリカードを直に接続することにしました。ArduinoはPro Micro互換機5V動作のものに替え、専用コネクタがないのでポケットステーションの替わりにサードパーティのメモリカードの端子にヘッダピンをはんだ付けして検証を行ってみました。
(犠牲になったメモリカード。今後はArduinoの外部メモリとして活用させてもらいましょう。)
検証を行った結果ですが、マルチタップのときと全く同じでした。この時点で完全に行き詰まってしまいました。
ここで諦めかけたのですが、Arduino UNOで出来ることがPro Microで出来ないはずがないと思い直し、メモリカードとの通信部分からスケッチを作り直していくことにしました。
メモリカードとの通信にはSPIというシリアル通信を使用しているのですが、UNOとPro Micro(Leonardo)ではSPIの実装が少し異なっています。参考にしたサイトのスケッチは少し古い上にUNO向けのものなので、最新のSPIライブラリを使って書き直しました。
すると、メモリカードとArduinoとのデータの受け渡しが問題なく行えるようになったのです。前に流用したプレイステーションコントローラー接続用のスケッチはソフトウェア制御だったのですが、今回はきちんとハードウェアによる制御に切り替えたのでレスポンスが良くなり取りこぼしがなくなったようです。
しかし、まだPCとArduinoの間のシリアル通信のタイミングが合わないところもあり安定動作させるまでにもう一苦労ありました。なんだかんだ時間がかかりましたが、最終的にポケットステーションとメモリカードのデータを読み書きすることに成功しました。
ヤッター! by マシオカ (古い...わからない人はググってね)
その後いろいろ試した結果、Arduinoとポケットステーションをダイレクトに接続してもプレイステーションのマルチタップを経由しても同じように動作しますし、Arduinoの動作電圧が5Vの物でも3.3Vの物でも問題なく動作しました。
今回はネットの情報に頼りすぎたのが大失敗でした。次回からは気を付けます。
それでは今回作成したスケッチはこちらになります。
Pocketstation.ino
このスケッチはマルチタップ経由、Arduino直接接続どちらも共通です。マルチタップにはメモリカードスロットが4つありますが、このスケッチではスロットAを使います。他のスロットに変更したいときはスケッチの124行目と167行目の0x81を変更して下さい。0x81〜0x84がスロットA〜Dに対応しています。
マルチタップとArduinoの配線は次のようになります。(配線についてはこちらも参考にして下さい)
マルチタップ → Arduino
1 DATA → 14
2 COMMAND → 16
4 GND → GND
5 3.6V → 3.3V
6 ATTENTION → 10
7 CLOCK → 15
9 ACK → 3
ポケットステーションやメモリカードとArduinoを直接接続するときの配線は以下の通りです。
ポケットステーション → Arduino
1 DATA → 14
2 COMMAND → 16
4 GND → GND
5 3.6V → 5V
6 ATTENTION → 10
7 CLOCK → 15
8 ACK → 3
次にPC側で動作させるソフトウェアが必要です。Ubuntuでメモリの読み書きをするときのプログラムは次のものになります。
memcard.c
Makefile
コンパイルする前にmemcard.cの10行目にArduinoの接続されているシリアルポートを記述してください。
使用方法は
memcard -i ファイル名
でファイルのメモリイメージをポケットステーションまたはメモリカードに書き込みます。
memcard -o ファイル名
でポケットステーションまたはメモリカードのメモリ内容をファイルに書き出します。
このときのファイル内容はメモリイメージそのままのベタファイルです。
今回作成したスケッチはこちらのサイトのMemCARDuinoと互換性がありますので、Windowsで動作するプレイステーションのメモリカード管理ソフトMemcardRexから利用できます。ただし、ここで配布されているソースコードのままではPro Microとシリアル通信が出来ないので、一箇所修正する必要があります。
ソース中、HardwareフォルダーのMemCARDduino.csで42行目を次のように変更して下さい。
OpenedPort.DtrEnable = false;
↓
OpenedPort.RtsEnable = true;
一応、.Net 4.0向けにコンパイルしたバイナリを置いておきます。
MemcardRex.exe
これらのソフトウェアはこちらのサイトで配布されているポケットステーション向けのゲームなどの読み書きで動作確認は行っていますが、全ての環境で正しく動作するかどうかは保証できません。
上記ソフトウェアを使用して発生した如何なる損害に関して作者は一切の責任を負いませんので、ご利用は自己責任でお願いします。
補足ですが、以前この投稿でPro MicroにPro Micro用のブートローダーを書き込んだ後、1回スケッチを書き込むと2回目以降のスケッチ書き込み時にエラーになると書きました。
今回ブートローダー書き換えで動作検証を行ったときに同じ現象は起こりましたが、スケッチ書き込みでボード書き込みボタンを押した直後にPro Microのリセットボタン(自分で付けました)を押すとスケッチ書き込みに成功し、以降はリセットしなくても正常に書き込めるようになりました。(リセットボタンを押すタイミングによってうまく行かないこともあったので、もしかしたらリセットボタン2度押しなのかもしれません)
Arduinoのブートローダーについて勘違いしていたようで、どうやらスケッチと一緒に毎回ブートローダーも書き込まれているようですね。スケッチ書き込み時にボード選択でLeonardoかPro Micro好きな方を選んで書き込んでおき、エラーが発生したら上記の方法で修正しておけば、Pro Micro単体でのブートローダー切り替えが行えますね。
まだまだ勉強不足でした。
※コメント投稿者のブログIDはブログ作成者のみに通知されます