今日は,プレステコントローラでピンクロータを動かしてみます.
えっと,NHKロボコンでプレステコントローラでロボット動かさないといけない的なことがあって,そこでたまたまピンクロータを持っていたので,ちょっとやってみたくなりました.
準備物
- Arduino Uno
- Arduino USBホストシールド
- プレーステーション3コントローラ
-
ピンクロータ
-
トランジスタとか抵抗とかジャンパーピンとか
ピンクロータを分解してみる
なるほど,可変抵抗が付いていて,つまみを回すと電流量が変化するからブルブルの刺激が変化するということか.
ピンクロータをArduinoに繋ぐ.
回路に関しては,こちらのスライドに載っているのを参考にさせていただきました.
これの8ページ目に回路が載っています.
トランジスタと抵抗さえ用意できればあとは繋ぐだけ.
プレステコントローラを使う準備
githubに,USBホストシールドを使うためのヘッダファイルが落ちているので,それを落としてくる.
そして,ArduinoのIDE側「ライブラリをインクルード」→「zip形式のライブラリをインストール」を選ぶ.
すると,PS3USB.hとspi4teensy3.hが使えるようになるのでそれをコード側でinclude.
ソースコード
PS3.getButtonPress(TRIANGLE)
のようにしてあげれば,プレステコントローラが押されている時に1, 押されてなければ0が返ってきますので,それを利用して,押されていればピンクロータを動かすというようなことをやっていきます.
#include <PS3USB.h> #ifdef dobogusinclude #include <spi4teensy3.h> #endif USB Usb; PS3USB PS3(&Usb); void setup() { Serial.begin(9600); while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection if (Usb.Init() == -1) { Serial.print(F("\r\nOSC did not start")); while (1); //halt } Serial.print(F("\r\nPS3 USB Library Started")); } void loop() { if (PS3.getButtonPress(TRIANGLE)){ Serial.print("三角ボタンが押されています\n"); } if (PS3.getButtonPress(CIRCLE)){ Serial.print("丸ボタンが押されています\n"); } if (PS3.getButtonPress(CROSS)){ Serial.print("バツボタンが押されています\n"); } if (PS3.getButtonPress(SQUARE)){ Serial.print("四角ボタンが押されています\n"); } if (PS3.getButtonPress(UP)) { Serial.print("上ボタンが押されています\n"); } if (PS3.getButtonPress(RIGHT)) { Serial.print("右ボタンが押されています\n"); } if (PS3.getButtonPress(LEFT)) { Serial.print("左ボタンが押されています\n"); } if (PS3.getButtonPress(DOWN)) { Serial.print("下ボタンが押されています\n"); } }
こんな感じで書いてあげれば,シリアルにプレステコントローラの入力情報を表示できるはず.
僕は,とりあえず動作確認のためなので,反応してたら1
,反応してなかったら0
を表示させてみました.
嬉しさ嬉しさ pic.twitter.com/Z1frSKQgj1
— Я (@yuki_99_s) 2016, 2月 1
では,あとは…
void setup()
のところに,ピンクロータをつないだピンを指定します.上のスライドの回路だと,2番目のピンにつないでいるので,pinMode(2, OUTPUT);'として,2番目のピンを出力ピンとして,指定します.
digitalWrite(2, HIGH);`とすると,2番ピンにつながったピンクロータが振動し始めます.
そして,丸ボタンを押した時にピンクロータがオンになって,バツボタンを押した時にオフになるようにしてみます.
#include <PS3USB.h> #ifdef dobogusinclude #include <spi4teensy3.h> #endif USB Usb; PS3USB PS3(&Usb); void setup() { Serial.begin(9600); while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection if (Usb.Init() == -1) { Serial.print(F("\r\nOSC did not start")); while (1); //halt } Serial.print(F("\r\nPS3 USB Library Started")); pinMode(2, OUTPUT); } void loop() { if (PS3.getButtonPress(CIRCLE)){ Serial.print("丸ボタンが押されています\n"); digitalWrite(2, HIGH); } if (PS3.getButtonPress(CROSS)){ Serial.print("バツボタンが押されています\n"); digitalWrite(2, LOW); }
これでめでたくピンクロータをプレステコントローラから制御することができるようになりました.
みためは結構ごっついですね.
さらに発展
PWM出力で,ピンクロータの振動の強さをいろいろ変えてみたり,あらかじめ振動の強弱パターンを変えてみてボタンをおすことによって複雑なロータの動きをさせてみたり.
Arduinoをwi-fiにつないで,遠隔地においてあるピンクロータを動かしてみたり.
夢が広がりますね!