Closed18

冬休みの自由研究:cartreaderを作る

sasa+1sasa+1

最近、Nintendo Switch向けに配信されているFAMILY COMPUTERやSUPER FAMICOMでジョイメカファイトだったり、ゼルダの伝説 神々のトライフォースだったりを久しぶりにプレイしたのだけど、思いのほか楽しくて、配信されていない昔プレイしたことのある他のソフトもプレイしたくなってきてしまった。

ゲーム機のエミュレーターがいろいろ存在することはずっと昔に調べたことがあったので知っていたけど、そのエミュレータへゲームソフトを読み込ませるためにはどうしたら良いか調べたところ、吸い出し機を使ってカセットからソフトを吸い出してデータにすれば良いということがわかった。

その吸い出し機について調べてみたらcartreaderというものがいろいろなカセットに対応していて良いらしい。GitHubで管理されていてモダンで良さそうな雰囲気を感じる (偏見かもしれないけど、こういうハードウェア系のウェブサイトってCSSで装飾もされていない1990年代のようなシンプルなものが多いような気がする……それはそれで味があってハードウェア系〜という感じがして好きではあるのだけど) ので、これを年末に作ってみようと思った。

cartreaderについて書いてくれているページ:

sasa+1sasa+1

冬休み、もとい年末の休暇は1週間程度(もう少し多いかも?)しかないので、休暇中に作業に取り掛かるのなら今から必要なものを注文して早めに入手しておく必要がある。cartreaderのWikiにあるNeeded Partsには必要になるパーツとそれの入手先が書いてあるので、これらを揃えようと思う。

Arduino

cartreaderを作るにあたってArduino Mega 2560が必要となるが、先に書いた参考ページには

互換品で可

とあるのでそれを信じてAmazon.co.jpにあったELEGOOのArduinoを買った。1,700円くらい。よく調べずに注文してしまったのだけど、AliExpressだともっと安く互換品を売っているようなので[1]こちらで買った方がより安くて良かったかもしれない……

ELEGOO以外にHiLetgoやOSOYOOやKumanなどがあるけど、HiLetgoのものはUSBコネクタやDCジャックの位置が純正の物と比べて微妙に異なるらしいので避けることにした。

ちなみに純正品のArduino Mega 2560 R3はスイッチサイエンスのウェブサイトで見ると6,000円近くする。

Arduinoの互換品については以下のページを参考にしたりした:

Arduino modules

microSDの差込口とOLEDとクロックジェネレータは以下から買った。同じお店でまとめて買った方が送料が余計にかからないだろうし、まとまって届く気がしたのでそういう買い方をした。

OLEDはなくても良いらしいけど、カッコ良さそうなのと出力が見れた方が良さそうと思うので手に入れておきたいと思って買った。クロックジェネレータはオプションらしいし、何に使われるのかすらよくわかってないけど買っておいた。

microSDの差し口が40円くらい、OLEDが200円くらい、クロックジェネレータが300円くらいだった。あとはここに送料がかかる。

カートリッジスロット

カートリッジスロットはAmazon.co.jpにもあったけれど、AliExpressと比べると値段が違いすぎ[2]て 🤔 という顔になってしまったのでAliExpressで買うことにした。だいたいスロット1つが300円くらい。

NINTENDO64やメガドライブのスロットを使うことはなさそうだけど、実装はしてみたいので入手はしておこうと思う。

脚注
  1. Arduino Mega 2560 compatibleでAliExpressを検索してみると安くて800円前後から売ってたりする。送料も考えるとそこまで変わらないかもしれないけど…… ↩︎

  2. Amazon | SFC(スーパーファミコン 31ピンスロットコネクタ | ゲーム 1個で1,500円なのでAliExpressだと5個買えてしまう!(送料を考えると5個というわけにはいかないだろうけど) ↩︎

sasa+1sasa+1

Arduinoと周辺モジュール、カートリッジスロットは注文したので今度はPCBを注文しようと思う。以前、自分で設計したキーボードのPCBを発注するときにはelecrowを使ったので今回もここにしようかと思ったけど、cartreaderのWikiにはJLCPCBを使えと書いてあったのでこちらを使うことにした。ただ、UIはほぼ同じだったのでelecrowでも良かったかもしれない。

PCB

最低注文数が5枚なので5枚にして注文したら$2だった。ただ送料が$12.60で合計$14.60になった…… 日本円としては決済したときのレートで1,585円だった。送料がちょっとお高い感じになってしまったけど仕方ないか。elecrowでも見てみればよかったかもしれない。

PCBの色は緑だと製造が早いみたいだったけど、白が好きなので白にした。

sasa+1sasa+1

必要な部品は注文したし、他に必要となる抵抗やコンデンサの類は休日に秋葉原に行って買おうと思っていた(LCSCで注文した方が楽だし、もしかしたら秋葉原で買い集めるよりも安かったのかもしれないが……)ので、注文したものが届くまでHow to build the PCBを読んでPCBの実装について調べていた。

読んでいたらArduinoに実装されているトランジスタとレギュレータを外す必要があるとのこと。はんだ吸い取り線で取れるかな〜と考えていたけど辛そうだったので、持っていなかったヒートガンを買うことにした。

ヒートガン

安いやつで大丈夫なのかなあとは思いつつ、レビューに

多ピンICのハンダを溶かしてICの除去が簡単にできた。(無鉛ハンダ)

というレビューがあった[1]ので、とりあえずこれにしてみた。除去できるといいなあ。

脚注
  1. 思ったより強力 ↩︎

sasa+1sasa+1

PCBへの部品の実装方法を読んでいたら途中、PICにsnesCICを書き込んでおく必要がある、とあった。これまでH8やAVRを扱ったことはあるけれど、PICを扱ったことがなく知らなかったので書き込む方法を調べた。

ちなみにこのPICはスーパーファミコンのカセットからソフトを吸い出すときに、そのカセットがSA1という特殊なチップを使っている場合に必要になるとのこと。Wikipediaにスーパーファミコンの特殊チップとしてSA1を使ったタイトルの一覧が載っている。

PICライター

PICにプログラムを書き込むにはライター(プログラマー)を使う必要があるらしい。PICライター比較によると以下のようなライターがある。

これら以外にも秋月やaitendoにもライターがあったし、他にも自作ライターなどもいくつか見かけた(JDMプログラマーとか)ので、もっとたくさんあるんだと思う。

ただ、おそらく今回しか使わないのにライターを買うのはイヤだなあとしぶとく調べていたらPickleというソフトをRaspberry Piから使うとPICに書き込みできる、というのを見つけた。ちょうど最近Raspberry Pi Zero WHを買ったので、これで試してみようと思う。PickleはPIC12F629に対応しているようなので(Wikiに書いてあった[1]し、ソースコードを読んだらヘッダファイルにPIC12F629についての記述があったし)たぶん大丈夫だとは思う。たぶん……

調べると多くのライターのソフトウェアがWindows向けに作られている(MPLAB X IDEはWindows,macOS,Linuxと対応しているし公式が用意している環境なので一番良さそうではある)ようなのだけど、自宅にWindows機が今はないこと、できたらLinuxでやりたいということ、個人的にGUIでなくCUIが好みというところからもPickleが一番自分には合っていそうに思える。他にもライターのソフトウェアがいくつか見つかったので、Pickle以外を使った方が都合の良い時のためにメモしておく。

Raspberry PiでPICに書き込む方法について書いているページ:

GitHubをpic programmerで検索したら出てきたPICライターらしきリポジトリ:

脚注
  1. https://wiki.kewl.org/dokuwiki/projects:pickle:14-bit ↩︎

sasa+1sasa+1

AliExpressで注文した以外に必要な部品を秋葉原に探しに行ってきた。目当てのお店が定休日で行く予定だったお店をすべて回ることはできなくて、結果的にはすべて揃えられなかったのだけど、秋葉原で買えなかったものは通販で揃えられた。

千石電商

千石電商で買ったピンヘッダ、ピンソケット、チップ抵抗、チップコンデンサが写っている写真

  • 1x40ピンヘッダ
  • 2x8ピンソケット
  • 1x6ピンソケット
  • チップ抵抗220Ω
  • チップ抵抗1kΩ
  • チップ抵抗10kΩ
  • チップコンデンサ0.1uF(100nF)

秋月電子通商(ネット通販)

1x7ピンソケットが奇数だからなのかあまり売っていないようで、秋月でやっと見つけたのだけど、わざわざこれを選ばなくても丸ピンのソケットでもよかったのかだろうか、と思っている。通電すればいいと思うので挿さるのならどちらでも良いとは思うが……

aitendo(ネット通販)

aitendoにAMS1117と4x4のタクトスイッチがあって助かった。タクトスイッチは最初、準備中となっていてカートに入れることができなかったが、問い合わせたら数時間後に入れられるようになった。

電解コンデンサはNeeded Partsには書いていないが、How to build the PCBの9

In the video I add a 47uF capacitor here but a bigger 470uF soldered sideways is strongly recommended for SNES SA-1 carts.

とあるので一応買っておいた。


そんなこんなで部品は揃えられたと思う。もし見つけられない部品があればAliExpressで注文しよう、と考えていたものの、これから注文すると休みの間に届かないという不安がぬぐいきれなかったので、国内の電子パーツ屋で揃えることができてよかった。

そういえばmarutsuを全然見てなかった気がする……

脚注
  1. あとから調べて発覚したが、これはSOT-89-3でcartreaderで使いたいのはSOT-223だった。SOT-89-3だと小さいのでランドに足が届かない。スズメッキ線で伸ばせばいいかもしれないが…… AliExpressで注文したり、電子回路の知識があるのなら互換品を選ぶと良いと思う。 ↩︎

sasa+1sasa+1

注文していたものが続々と届いてきた。

ELEGOO MEGA2560 R3

ELEGOOのArduino MEGA2560 R3互換機の箱の写真

まだ開封していない。

PCB

JLCPCBからPCBが注文してから8日くらいで届いた。新型コロナウィルス禍なことを考えると割と早いのかも?

JLCPCBと書かれた箱とPCBとサンタのアクセサリーの写真

クリスマス時期だからなのか、サンタのアクセサリーが同封されてた。

白いcartreaderのPCBが表面と裏面の2枚でそれぞれ写っている写真

PCBはこんな感じ。

sasa+1sasa+1

秋月電子通商やaitendoで注文した部品と、やっとAliExpressで注文した部品が一部届いた。

秋月電子通商

秋月電子通商で注文した部品が写った写真

  • PIC12F629
  • 1x7ピンソケット

aitendo

aitendoで注文した部品が写った写真

  • チップタンタルコンデンサ22uF
  • 電解コンデンサ470uF
  • AMS1117 3.3V
  • RGBフルカラーLEDアノードコモン
  • スライドスイッチ
  • 4x4タクトスイッチ

LEDだけ秋月のやつな気がする……

AliExpress (Store: Win win.)

AliExpressのWin win.というストアで注文した部品が写った写真

これらは注文してから13日くらいで届いた。コロナ禍ということを考えると、海を渡ってきている割にはそれなりに早いのかなと思う。


やっといろいろ届いてきたけど、肝心のカートリッジを挿すスロットがまだ届いていない……

sasa+1sasa+1

以前に書いたPICライター選び[1]ではRaspberry Pi ZeroからPickleを使ってPICにプログラムを書こう、と書いていたがそうは簡単でなかった。

PIC12F629はLVP(Low Voltage Programmingというものらしい)に対応していないため、2種類の電圧を用意してHVP(High Voltage Programmingというものらしい)をする必要があるようだ。なんらかの方法で昇圧をする必要がある(きちんとデータシートを読んだわけではないから本当にそうなのか確信がもてないし、仮にそうだとして9Vなのか12Vなのかもわかっていない)。

散々調べたあとにPickleのWikiにHVPでのPICのプログラミング方法について書いてあるページを発見した[2]がこれはこれで大変そうだった。回路を間違えるとRaspberry Pi自体が壊れるとも書いてあるので、絶対に間違えないという自信がない以上、これは危険だと思ってやめることにした。そもそもこの回路を作るために必要な部品が現在ない。

LVP対応のPICであればPickleを使っての書き込みは準備も含めて楽だと思う。PICライターについて調べるのはもう散々なので、SA1チップを搭載したスーパーファミコンについては諦めて(正直、Wikipediaで一覧にのっていたSA1チップ搭載のプレイしたいソフトはすでにNintendo Switchでプレイできるので必要ないかなと思っていた)PIC抜きで実装しようと思う。

PICライター

PIC12F629

Twitter

https://twitter.com/JQ1BWT/status/289922397631561728

https://twitter.com/hamalin/status/1025948467649163264

脚注
  1. PICライター選び ↩︎

  2. https://wiki.kewl.org/dokuwiki/projects:hi-pi ↩︎

sasa+1sasa+1

1月1日にまるでお年玉のようにこれまで届く気配のなかったソケット類がやっと届いた。12月6日に注文したのでほぼ1ヶ月くらいかかっている……ソケット類よりも後に注文したものの方が先に届いたりしたのだが、やはり指定の配送次第で変わってくるのだろうか。

スーパーファミコンのカセットなどを挿すソケット類の画像

sasa+1sasa+1

年始に注文していたPICKit3(の偽物)がやっと届いた。

PICKit3の偽物の写真

microchipのロゴがないし安かったので本物ではないと思う。それでも、PICにプログラムが書き込めるのならなんでもいい。

それと、SOPに書き込みたいのでSOPをDIPに変換するアダプタも一緒に注文した。

SOPをDIPに変換するアダプタ

必要なのは150milの方(左側のもの)だけ。安かったので使うことはないだろうが200milの方も買っておいた。

これでひとまずはLEDをチカチカさせるプログラムを書き込んでみて、成功したらcartreaderのsnesCICを書き込んでcartreader作りを始めてみようと思う。

cartreaderを作り始めるまでが思いの外、長かった。

sasa+1sasa+1

PIC12F629にLEDを点滅させるコードを書いたつもりなのだけど、LEDが点滅どころか一度も点灯しない。

PICKit3の使い方が間違っていて書き込めていないのか、自作のLEDを点滅させるコードが正しくなくて点滅しないのか、どちらなのかがわからない。ただ、PICKit3はMPLAB Xに付属している mdb.sh コマンドから使っているいるし、 Programming/Verify complete と最後に表示されているので原因はおそらく後者だと思う。偽物とはいえPICKit3ではある(おそらく互換があると思う)し、 mdb.sh から使っていて失敗したり、成功の表示をしておいて実は書き込めていない、というようなことを純正のツールがすることはさすがにないだろう、と思っているので。

PICには興味がない(AVRやRaspberry Pi Picoなら興味がある)し、snesCICが書き込めればいいし、最悪SA1を使ったカセットは吸い出せなくていいのでもうこのまま書き込みとはんだ付けをしてしまおうと思う。仕事ならともかく、全く興味のないPICのために趣味の時間をわざわざ消費しているのがとにかくストレスなのでPICのことを調べるのをやめたい。

sasa+1sasa+1

cartreaderを作り始めた。

PIC12F629への書き込み

まずは事前にFlashing the snesCICをきちんと読む。

PICKit3でソケットを使ってSOPのPIC12F629へプログラムした。方法としてはVagrantでUbuntu 20.04 LTSのVirtualBoxを作って、その環境にMPLAB XをインストールしてCLIからmdb.sh経由で書き込むというもの。VirtualBoxにUSBを認識させるにはExtension Packが必要なのでBoxを作る前にそれをインストールしておく必要がある。

メモを清書するのが面倒なので書かない。

PICKitを付属の基板に接続したところ
DIPソケットにセットされたPIC12F629
PIC12F629にsnesCICを書き込んでいるところ

エラーは出なかったので書き込めていると思う。実際はどうなのかはわからないが。

Arduinoへの書き込み

まずはHow to flash the Arduinoをきちんと読む。

Arduino.appをダウンロードしてきてUSB経由で書き込む。

Arduinoから部品を取り除く

まずはHow to build the PCBをきちんと読む。

Arduinoの電源の横にあるレギュレータとチップを取り除く。はんだ吸い取り線で取っても良いと思うが、ヒートガンを使った。

Arduino Mega互換品
Arduinoから部品を取り除く前
Arduinoから部品を取り除いた後
取り除いた部品

はんだ付け

小さい部品からはんだ付けをしていく。

cartreaderの基盤

ここではんだ付けをしていて気がついたが、aitendoで買ったAMS1117がSOT-223でなくSOT-89-3だった。ひとまわり小さいので、ランドに足が届かなくてはんだ付けができない。スズメッキ線で足を伸ばすかとも考えたが、普通に作りたいのでAliExpressで注文することにした。また時間がかかってしまう……

AMS1117をはんだ付けする箇所

AMS1117はLM1117やLD1117でも代用できる[1]かもしれないが、電子回路制作は初心者なのでAMS1117が届くまで気長に待とう。Arduinoから取り外したレギュレータがAMS1117ではあったが、これは3.3Vでなく5Vだったので使えない。サイズは合っていたのだが。

脚注
  1. http://yaab-arduino.blogspot.com/2015/03/esp8266-wiring-schemas.html によると Several cheap 3.3V regulators are available on the market. A very common and cheap one is the LM1117 (or LD1117). With such regulator you can convert the 5V power used for Arduino to the 3.3V needed by the ESP. An AMS1117 module is also a great choice. とある ↩︎

sasa+1sasa+1

SOT-223のAMS1117が届くまで待とう、と書いた翌日に届いたので、早速作った。


AMS1117をはんだ付けしたところ:

AMS1117をはんだ付けしたところの写真

ゲームボーイのカセットのソケットをはんだ付けしたところ:

ゲームボーイのカセットのソケットをはんだ付けしたところの写真

Arduinoを挿すためのピンヘッダをはんだ付けしたところ:

Arduinoを挿すためのピンヘッダをはんだ付けしたところの写真

脇のモード切り替えスイッチと電源スイッチをはんだ付けしたところ:

モード切り替えスイッチをはんだ付けしたところの写真
電源スイッチをはんだ付けしたところの写真

SA1のためのクロックジェネレータを指すソケットをはんだ付けしたところ:

クロックジェネレータのソケットをはんだ付けしたところの写真

SA1のカセットを吸い出す必要がないのなら必要ない。

SDカードシールドを指すためのソケットをはんだ付けしたところ:

SDカードシールドのソケットをはんだ付けしたところの写真

動画を見ながらはんだ付けしたあと、Wikiを見て気がついたのだけど、これはどちらか片方だけのはんだ付けでよかった。今回はmicroSDカードのシールドだったので、手前の6ピンのソケットだけはんだ付けすれば十分だった。SDカードシールドの場合は8x2ピンのソケットだけはんだ付けすればいい。

操作スイッチをはんだ付けしたところ:

操作スイッチをはんだ付けしたところの写真

カセットのソケットを3つ固定したところ:

カセットのソケットを3つともスルーホールに挿しマスキングテープで固定している写真
カセットのソケットの足がスルーホールから出ている写真

ソケットの足が絶妙に曲がっていて、スルーホールに挿すのが大変だったのでとりあえずマスキングテープで固定しておいた。

カセットのソケットをはんだ付けしたところ:

スーパーファミコンのソケットをはんだ付けしたところ

Arduinoの基盤の下に配置されるソケットは、足が長いので切ってからはんだ付けした方がショートの不安を考えなくて良さそうだった。というのも、cartreaderのWikiではスーパーファミコンのソケットには下に何かを履かせて高さを出しているのだけど、今回そんなことは考えていないので基盤に直接載せているから。実際、Arduinoのピンが干渉しそうな気配だった。

自作キーボードを制作していた時に使って[1]余っていたカプトンテープを一応貼っておいた。足を切っているし必要ないだろうけど。

はんだ付けしたソケットの上からカプトンテープを貼ったところの写真

今回はニンテンドー64のソケットのピンは足を切らなかったけれど、切った方があとではんだ付けするRGBフルカラーLEDのはんだ付けが楽になるので、切った方が良いと思う。


次にLCDをハンダ付けするのだけど、LCDからピンを外すのが大変だった。もし選べるのならピンが事前にはんだ付けされていないものを選ぶのが良いと思う。

LCDの写真
ピンを外したLCDの写真
LCDを基盤に挿した写真
LCDのピンを切ってはんだ付けした写真

LCDがこんな感じにはめ込まれる。

はめ込まれたLCDを俯瞰する写真

RGBフルカラーLEDをはんだ付けした写真:

RGBフルカラーLEDをはんだ付けした写真
RGBフルカラーLEDをLCDの方向に足を曲げた写真

4ピンなので向きに気を付けてはんだ付けする。あとLCDの方向へ足を曲げる。


次にSDカードシールドをはんだ付けするのだけど、これもLCDと同様にピンを外さないといけない。が、外すのがあまりにも大変だったので最終的にはラジオペンチですでに曲がったピンをまっすぐにすることで挿した。ちなみに予備として2つ買っていたからできることなので、予備がないのならおすすめできない方法である。LCDと同様、事前にピンがはんだ付けされていないものを選ぶと良いと思う。

microSDカードシールドの写真

ピンを外そうとはんだ吸い取り線で頑張っているけど、今思うと何かで固定して片側からこてを当てて、もう片側からはんだ吸い取り器を使えば苦労しなかったように思う。が、この時は深夜で早く完成させたかったのでそこまで頭が回らなかった。

ピンを外そうとはんだ吸い取り線で頑張っている写真

諦めて予備のmicroSDカードシールドのピンをラジオペンチで曲げることで挿した。

無理やりmicroSDカードシールドをソケットに挿した写真

無理やりなので元々曲がっていたところが真っ直ぐにならず隙間ができている。

ソケットから少し浮いているmicroSDカードシールドの写真


クロックジェネレータをソケットに挿したところ:

クロックジェネレータがソケットに挿さっている写真

コンデンサをはんだ付けしたところ:

コンデンサをはんだ付けした写真

VCCとGNDの電源線をはんだ付けしたところ:

基盤に電源線をはんだ付けした写真
Arduinoに電源線をはんだ付けした写真

信号線じゃなく電源線なのでもっと太い線の方が良かったような……とは思いつつもスペースも広いわけではないのでまあ良いかと思った。

完成

あとはArduinoをソケットに差し込んだら完成になる。

完成したcartreaderの写真

これは裏面で、コンデンサがはみ出しているのが気になる。

完成したcartreaderの裏面の写真

脚注
  1. keebioのLaplaceでPro Microがキースイッチの足に干渉するところがある ↩︎

sasa+1sasa+1

あとはSDカードを用意してUser Guide通りに進めれば取り込みができる。

実家にスーパーファミコンのカセットが眠っていると思うのだけど、母親に頼んでも探せずにかなりの時間がかかるであろうと思ったので、ヤフーオークションでいくつか欲しいものを購入した。

  • ファイナルファンタジーV
  • MOTHER2

これらをcartreaderで取り込むことができた。吸い出せるのはROMだけだと思っていたのだけど、セーブデータも吸い出せるというのは良かった。もしカセットのバッテリーがまだ生きているのなら当時のセーブデータが吸い出せそう。

今はRaspberry Pi 4にRetroPieをインストールして各種セットアップをし楽しむ環境をやっと作ったところ。


このスクラップを記事か本にまとめなおしたいというのと、スクラップでたくさん画像を貼って文章を書くというのは大変だということがわかった。

sasa+1sasa+1

cartreaderは本来であれば外装を3Dプリンターなどで作ると思うのだけど、面倒なので作らなかった。とはいえ基盤が直接、机に接地されたりするのはよくないしどうしようかと調べていたらゴム足で代用した、というようなツイートを見つけた。

https://twitter.com/Degharl/status/1323928780109344769

このツイートを参考に東急ハンズで同じサイズのネジなどを買った。ナットはショートを気にして透明なプラスチックのものにした。おそらくそこまで気にせずとも大丈夫だとは思うが……

ゴム足をつけた2台のcartreaderの写真:

ゴム足をつけた2台のcartreaderの前面からの写真

なぜ2台かというと、予備として各種部品を余分に買っておいたものを使って組み立てたから。

ゴム足をつけた2台のcartreaderの後ろからの写真:

ゴム足をつけた2台のcartreaderの背面からの写真

スペーサーの側をアップで撮った写真:

ゴム足の側をアップで撮った写真:

足ができたおかげでスイッチが押しやすくなったので、足をつけてよかった。

sasa+1sasa+1

これから作るのならcartreaderの新しいバージョンが出ているらしいので、そちらを作った方が良さそう。

加えて、わざわざPICにsnesCICを書き込まなくともSA1の対応ができるそうだ。

このスクラップは2021/05/01にクローズされました