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

  • 16
    Like
  • 0
    Comment
More than 1 year has passed since last update.

はじめに

秋葉原メイカーズ倶楽部2016に、IAMAS勢3人で「EXC_BAD_ACCESS」という縁起の悪い名前のVJチームとして出演させて頂きました。
DSC_0005.jpg

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

DSC_0342.jpg
第一弾はNintendo64のコントローラ。

ノスタルジックなアレをPCで使う

イベント直前にハードオフに走り、ジャンクコーナーで良さ気なものを探ったら、ニンテンドウ64のコントローラが324円で売っていました。その中でも比較的キレイなものを買ってきました。
DSC_0341.jpg
久しぶりだね

64コントローラをPCで使うためのアダプターなんかもあったりしましたが、どうせなら自分でやりたい。基盤から信号抜けないかなーと思ってコントローラを開けてみたりしましたが、よくわからず。

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

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

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

FPUYNODG3TDVKN5.MEDIUM.jpg
上記リンクより引用

DSC_0339.jpg
ブレッドボード用の固くて先が細いジャンパワイヤを使うのがオススメ

DSC_0358.jpg
上のInstructablesの通り、右の穴→3.3V、真ん中の穴→2番ピン、左の穴→GNDにつなぎます。

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

スクリーンショット 2016-08-16 11.09.40.png
うまくいっているとシリアルモニタに各ボタンの状態を示す4と0の数字、スティックのXYの値が出てきます。ガチャガチャ押すと反応してたのしい。

余談

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

ほんとは無線化したかった

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

【参考】

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

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

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

Processingの現行バージョンは2016年8月16日現在で3.1.2。ここで5年前に戻ります。
Processingのダウンロードページの下の方から、バージョン1.5.1を落とす。

スクリーンショット_2016-08-16_11_20_51.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)

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

Downloads/Processing.app/Contents/MacOS/JavaApplicationStub

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

【参考】

Processingのプログラムをなおす

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

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);

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

やってみよう!!

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

スクリーンショット 2016-08-17 1.01.48.png
グレーの画面が開いたら、メモ帳でもProcessingファイル上でもいいのでどこかにカーソルを置いて、コントローラのボタンを押してみましょう。

aa.gif
うまくいけば、コントローラのAボタンを押すと「A」が、Bボタンを押すと「B」がカーソルのところに入力されるようになります。キーボードハックしてますね。

うまくいかない場合

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

対処①

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

スクリーンショット_2016-08-17_1_07_02.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
成仏してくれ

次回は

DSC_0345.jpg
サイボーグ化した鹿のツノ(知床産)で映像コントロール芸のレシピをご紹介します

と思ってましたが、それはあとにします
WiiFitからOSC飛ばしてopenFrameworksを動かす