Arduinoを使ってNintendo64のコントローラをPCで使う

# はじめに

[秋葉原メイカーズ倶楽部2016](https://www.facebook.com/events/247075088987520/)に、[IAMAS](http://www.iamas.ac.jp/)勢３人で「EXC_BAD_ACCESS」という縁起の悪い名前のVJチームとして出演させて頂きました。
![DSC_0005.jpg](https://qiita-image-store.s3.amazonaws.com/0/77925/d5dedec1-e8df-392b-558e-36279ce2cd99.jpeg)


とってもたのしかったですが、**VJに使った電子工作系アイテムがクラブで使うには地味すぎて悲しい思いをした**ので、使ったいくつかのひみつ道具ネタのレシピをここで公開することで成仏させたいと思います。


![DSC_0342.jpg](https://qiita-image-store.s3.amazonaws.com/0/77925/0dbc26fd-ce61-a641-ebaf-ab3b65829d46.jpeg)
第一弾はNintendo64のコントローラ。


# ノスタルジックなアレをPCで使う
イベント直前にハードオフに走り、ジャンクコーナーで良さ気なものを探ったら、ニンテンドウ64のコントローラが324円で売っていました。その中でも比較的キレイなものを買ってきました。
![DSC_0341.jpg](https://qiita-image-store.s3.amazonaws.com/0/77925/4ff025ab-497c-e5a5-20ef-5c91ea25b37b.jpeg)
久しぶりだね


[64コントローラをPCで使うためのアダプター](https://www.amazon.co.jp/May-Flash-%E3%83%A1%E3%82%A4%EF%BD%A5%E3%83%95%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5N64-USB%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%83%BB%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%83%BC-%EF%BC%88PC%E7%94%A8%EF%BC%89/dp/B0049ZBJPW)なんかもあったりしましたが、どうせなら自分でやりたい。基盤から信号抜けないかなーと思ってコントローラを開けてみたりしましたが、よくわからず。

そこでググってみると、普通にコントローラのさきっぽから線を突っ込んで使ってる人が海外にいました。天才か。
[Use an Arduino with an N64 controller - Instructables](http://www.instructables.com/id/Use-an-Arduino-with-an-N64-controller/)

これを見れば大体できるのですが、結構内容が古いので、2016年8月現在やるとすればどうしたらいいのか注意点を交えて書いていこうと思います。


## Arduinoにつなぎ、プログラムを書き込む

![FPUYNODG3TDVKN5.MEDIUM.jpg](https://qiita-image-store.s3.amazonaws.com/0/77925/52a8aca5-06a4-cb12-7735-92d5807fcd4d.jpeg)
上記リンクより引用

![DSC_0339.jpg](https://qiita-image-store.s3.amazonaws.com/0/77925/245612b9-af35-5c85-ef08-e75a449a3e5b.jpeg)
ブレッドボード用の固くて先が細いジャンパワイヤを使うのがオススメ

![DSC_0358.jpg](https://qiita-image-store.s3.amazonaws.com/0/77925/fde559b9-1792-18f1-8f8d-ce451b251548.jpeg)
上のInstructablesの通り、**右の穴→3.3V、真ん中の穴→2番ピン、左の穴→GND**につなぎます。

Instructablesから`N64_Arduino.zip`をダウンロードし、`N64_Arduino.pde`をArduino IDEで開き、Arduinoに書き込みます。（普通にダブルクリックで開くとProcessingが開くかもしれないので注意）
ぼくはArduino Unoでやりました。後述しますがAVRが動いていればNanoでもPro miniでもなんでもいいと思います。

<img width="615" alt="スクリーンショット 2016-08-16 11.09.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/77925/45c9db88-6a0c-1430-fea0-2baa21710adb.png">
うまくいっているとシリアルモニタに各ボタンの状態を示す4と0の数字、スティックのXYの値が出てきます。ガチャガチャ押すと反応してたのしい。


### 余談
普通に信号抜くとエンコードしなくてはならないっぽいのだけど、Instructablesに載せた人が`N64_Arduino.pde`内でエンコードして上記のようにシリアルモニタで見れるようにしてくれているっぽい。オープンソース最高。


### ほんとは無線化したかった 
[ESPr Developer](https://www.switch-science.com/catalog/2500/)を使って無線化しようとしましたが、AVRではない関係で同じプログラムでは実現できなさそうでした。
（AVRに関してはぼくも全然詳しくないのですが、Arduino Unoをはじめとする多くのArduinoのメインのマイコンはAVRという仕組みを活用しているようで、ESP8266のマイコンはAVRではないのでいろいろ勝手が違うようです）
そして上記Instructablesに従うとシリアルモニタから信号を読む必要があるので、WiFiでつなぐと（たぶん）別の信号に変換する必要もあり、今回は断念。ラズパイとか使ってProcessingまで走らせられればできそうな気もする。辛そうだけど。

【参考】

- [Arduino's PORTx and PINx not declared · Issue #1632 · esp8266/Arduino · GitHub](https://github.com/esp8266/Arduino/issues/1632)
- [Arduino を AVR プログラマ(ISP: In-System Programmer)として使う](http://n.mtng.org/ele/arduino/ArduinoISP.html)



## Processing1.xでシリアル信号をキー入力に変換

以下もInstructablesの通りですが、シリアル信号を読み込んだだけでは他のアプリケーションで使えないので、何かしら信号を変換する必要があります。ここで上記Instructablesでとっている方法は、**シリアル信号をキー入力に変換する**、という方法。そんなんやったことないわ。どうやらProcessing1.xのときはできたっぽい。今もできるのかは不明。


### Javaのバージョンを落としてProcessing1.5.1を動かす

[Processing](https://processing.org/)の現行バージョンは2016年8月16日現在で3.1.2。ここで5年前に戻ります。
[Processingのダウンロードページ](https://processing.org/download/)の下の方から、バージョン1.5.1を落とす。

<img width="568" alt="スクリーンショット_2016-08-16_11_20_51.png" src="https://qiita-image-store.s3.amazonaws.com/0/77925/88484784-9385-2847-f9e1-3f105e362b8f.png">



そしていまの普通のPCではJavaのバージョンが新しすぎて、

```
[0] "Error: This Java instance does not support a 32-bit JVM."
[1] "Please install the desired version."
```
とか怒られてうまく動かないと思います。のでJVMというのを置き換える必要があります。ターミナルを開いて

```export JAVA_HOME=$(/usr/libexec/java_home -d32)```

この１行を入力。これでJavaに関してはOK。**一度ターミナルのタブを閉じるとPATHが無効化されるっぽいので注意。**
これをやってもプログラムはうまく動かないっぽいので、Processing1.5.1をターミナルから実行する。もしダウンロードフォルダにAppが置いてあれば

`Downloads/Processing.app/Contents/MacOS/JavaApplicationStub`

でProcessing1.5.1が開くはず。Applicationフォルダに別バージョンのProcessing（3.xなど）がある場合は注意。

【参考】

- [MacOSXで「Error: This Java instance does not support a 32-bit JVM.」出たときの対処法](http://qiita.com/kozy4324/items/58b5a55b4c8673f4f104)
- [Processing1.5.1をOSX 10.8.2で動かす方法](http://memorandums.hatenablog.com/entry/2013/03/05/230501)


### Processingのプログラムをなおす

Instructablesから`N64_Controller.zip`をダウンロードし、`N64_Controller.pde`をProcessing1.5.1で開く。Instructablesにも書いてあるが、プログラムの一番上に


```Processing:N64_Controller.pde
import java.awt.Robot;
import java.awt.AWTException;
import java.awt.event.InputEvent;
```
を足す。

あとはRunしたときに画像を表示するようにしていると、なぜかNullPointerExceptionが出てしまいうまく動かないので、

`PImage bg;`
`bg = loadImage("N64_Controller.jpg");`
`background(bg);`

上記の３行を消すかコメントアウトする。これでようやく大方の準備は完了です。


## やってみよう！！

これでProcessingのRunボタンを押してみてください。**もしArduinoのシリアルモニタが開いていれば、Runを押す前に閉じましょう。**

<img width="542" alt="スクリーンショット 2016-08-17 1.01.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/77925/77ba9086-6d3d-f6c0-e3b7-ab7b8b62778d.png">
グレーの画面が開いたら、メモ帳でもProcessingファイル上でもいいのでどこかにカーソルを置いて、コントローラのボタンを押してみましょう。

![aa.gif](https://qiita-image-store.s3.amazonaws.com/0/77925/371ff945-18fa-b9f0-e798-c49d6b22d095.gif)
**うまくいけば、コントローラのAボタンを押すと「A」が、Bボタンを押すと「B」がカーソルのところに入力されるようになります。**キーボードハックしてますね。


### うまくいかない場合
多分かなりの確率でうまくいかないと思います。


#### 対処①
`String portName = Serial.list()[1];`
の下に
`print(portName);`
と書き足してRunしてみます。

<img width="459" alt="スクリーンショット_2016-08-17_1_07_02.png" src="https://qiita-image-store.s3.amazonaws.com/0/77925/b1a2fec5-6335-59f4-48f6-37c7ba84e5dc.png">
WARNINGは気にしなくていいです。動きます。
ここにArduinoのポートの名前（Windowsなら`COM3`とか、Macなら`/dev/cu.usbmodem1411`とか）が出ていなければ、
```String portName = Serial.list()[1];```
の`[1]`を変えなきゃいけない可能性が高いです。ぼくは`[2]`にしたら、上の囲った部分がArduinoのポートの名前になり、動きました。

#### 対処②
これはもうぼくもよくわからないのですが、USBを刺すポートを変えるとうまくいったりします。ちなみにぼくはMacBookの左側のUSBポート（`/dev/cu.usbmodem1411`）ではうまくいかず、右側のUSBポート（`/dev/cu.usbmodem1421`）ではうまくいきます。あとは右側でもうまくいかない時もあるのですが、何度か抜き差しすると動いたりします。Hardware is so Hard.



# 幸福の訪れ
Instructablesにある通り、これを使うとエミュレータも動きます。詳細はそちらを参照。
単純にキーボードを押してるのと同じことなので、**ProcessingやoFでもキー入力を読み取ってエフェクトを加えるやつ使えば、64のコントローラでも映像つくったりできるはず。**Javaのバージョン下げたままProcessing3とか動かせるのかは全然わかりませんが。


## 注意
我々64世代が64コントローラでエミュレータで遊び始めると時間無限に吸われるので気をつけてください。Nintendoはすごい。


## ありがとう
![DSC_0023.jpg](https://qiita-image-store.s3.amazonaws.com/0/77925/f7ea9a9f-229e-e5ad-6fd8-0948d0e849a6.jpeg)
成仏してくれ


# 次回は
![DSC_0345.jpg](https://qiita-image-store.s3.amazonaws.com/0/77925/2ecfa021-fa01-168d-cf6b-cdbd48168397.jpeg)
サイボーグ化した鹿のツノ（知床産）で映像コントロール芸のレシピをご紹介します

と思ってましたが、それはあとにします
[WiiFitからOSC飛ばしてopenFrameworksを動かす](http://qiita.com/sanokazuya0306/items/89b1a4d0952d631c4059)