はじめに
秋葉原メイカーズ倶楽部2016に、IAMAS勢3人で「EXC_BAD_ACCESS」という縁起の悪い名前のVJチームとして出演させて頂きました。
とってもたのしかったですが、VJに使った電子工作系アイテムがクラブで使うには地味すぎて悲しい思いをしたので、使ったいくつかのひみつ道具ネタのレシピをここで公開することで成仏させたいと思います。
ノスタルジックなアレをPCで使う
イベント直前にハードオフに走り、ジャンクコーナーで良さ気なものを探ったら、ニンテンドウ64のコントローラが324円で売っていました。その中でも比較的キレイなものを買ってきました。
久しぶりだね
64コントローラをPCで使うためのアダプターなんかもあったりしましたが、どうせなら自分でやりたい。基盤から信号抜けないかなーと思ってコントローラを開けてみたりしましたが、よくわからず。
そこでググってみると、普通にコントローラのさきっぽから線を突っ込んで使ってる人が海外にいました。天才か。
Use an Arduino with an N64 controller - Instructables
これを見れば大体できるのですが、結構内容が古いので、2016年8月現在やるとすればどうしたらいいのか注意点を交えて書いていこうと思います。
Arduinoにつなぎ、プログラムを書き込む
ブレッドボード用の固くて先が細いジャンパワイヤを使うのがオススメ
上のInstructablesの通り、右の穴→3.3V、真ん中の穴→2番ピン、左の穴→GNDにつなぎます。
InstructablesからN64_Arduino.zip
をダウンロードし、N64_Arduino.pde
をArduino IDEで開き、Arduinoに書き込みます。(普通にダブルクリックで開くとProcessingが開くかもしれないので注意)
ぼくはArduino Unoでやりました。後述しますがAVRが動いていればNanoでもPro miniでもなんでもいいと思います。
余談
普通に信号抜くとエンコードしなくてはならないっぽいのだけど、Instructablesに載せた人がN64_Arduino.pde
内でエンコードして上記のようにシリアルモニタで見れるようにしてくれているっぽい。オープンソース最高。
ほんとは無線化したかった
ESPr Developerを使って無線化しようとしましたが、AVRではない関係で同じプログラムでは実現できなさそうでした。
(AVRに関してはぼくも全然詳しくないのですが、Arduino Unoをはじめとする多くのArduinoのメインのマイコンはAVRという仕組みを活用しているようで、ESP8266のマイコンはAVRではないのでいろいろ勝手が違うようです)
そして上記Instructablesに従うとシリアルモニタから信号を読む必要があるので、WiFiでつなぐと(たぶん)別の信号に変換する必要もあり、今回は断念。ラズパイとか使ってProcessingまで走らせられればできそうな気もする。辛そうだけど。
【参考】
- Arduino's PORTx and PINx not declared · Issue #1632 · esp8266/Arduino · GitHub
- Arduino を AVR プログラマ(ISP: In-System Programmer)として使う
Processing1.xでシリアル信号をキー入力に変換
以下もInstructablesの通りですが、シリアル信号を読み込んだだけでは他のアプリケーションで使えないので、何かしら信号を変換する必要があります。ここで上記Instructablesでとっている方法は、シリアル信号をキー入力に変換する、という方法。そんなんやったことないわ。どうやらProcessing1.xのときはできたっぽい。今もできるのかは不明。
Javaのバージョンを落としてProcessing1.5.1を動かす
Processingの現行バージョンは2016年8月16日現在で3.1.2。ここで5年前に戻ります。
Processingのダウンロードページの下の方から、バージョン1.5.1を落とす。
そしていまの普通の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など)がある場合は注意。
【参考】
- MacOSXで「Error: This Java instance does not support a 32-bit JVM.」出たときの対処法
- Processing1.5.1をOSX 10.8.2で動かす方法
Processingのプログラムをなおす
InstructablesからN64_Controller.zip
をダウンロードし、N64_Controller.pde
をProcessing1.5.1で開く。Instructablesにも書いてあるが、プログラムの一番上に
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を押す前に閉じましょう。
グレーの画面が開いたら、メモ帳でもProcessingファイル上でもいいのでどこかにカーソルを置いて、コントローラのボタンを押してみましょう。
**うまくいけば、コントローラのAボタンを押すと「A」が、Bボタンを押すと「B」がカーソルのところに入力されるようになります。**キーボードハックしてますね。
うまくいかない場合
多分かなりの確率でうまくいかないと思います。
対処①
String portName = Serial.list()[1];
の下に
print(portName);
と書き足してRunしてみます。
対処②
これはもうぼくもよくわからないのですが、USBを刺すポートを変えるとうまくいったりします。ちなみにぼくはMacBookの左側のUSBポート(/dev/cu.usbmodem1411
)ではうまくいかず、右側のUSBポート(/dev/cu.usbmodem1421
)ではうまくいきます。あとは右側でもうまくいかない時もあるのですが、何度か抜き差しすると動いたりします。Hardware is so Hard.
幸福の訪れ
Instructablesにある通り、これを使うとエミュレータも動きます。詳細はそちらを参照。
単純にキーボードを押してるのと同じことなので、**ProcessingやoFでもキー入力を読み取ってエフェクトを加えるやつ使えば、64のコントローラでも映像つくったりできるはず。**Javaのバージョン下げたままProcessing3とか動かせるのかは全然わかりませんが。
注意
我々64世代が64コントローラでエミュレータで遊び始めると時間無限に吸われるので気をつけてください。Nintendoはすごい。
ありがとう
次回は
サイボーグ化した鹿のツノ(知床産)で映像コントロール芸のレシピをご紹介します
と思ってましたが、それはあとにします
WiiFitからOSC飛ばしてopenFrameworksを動かす