スポンサーリンク

arduino MEGA 2560をPS3のコントローラーで制御する方法を紹介[保存版]

aruduino(アルドゥイーノ)MEGA 2560にUSBホストシールドを載せてBluetoothでPS3のコントローラーと接続する方法を解説します。コンパチ品の中国製アルドゥイーノでも大丈夫です。パソコンにUSB接続するやり方もバッチリですし、ジョイスティックでモーターコントロールするソースコードも公開しています。アルドゥイーノを使用して、ロボットを作りたい方にはかなり有益な記事かと。それでは参りましょう。




アルドゥイーノでラジコン、ロボットを作る


なんでこんな記事を書いているのかというと、実は組み込みマイコン系のエンジニアとして働いていたことがあります。働いていたんですが、ハッキリ言って電子回路は趣味ではありません。好きじゃないこともないんですが、仕事で使っていたんでできないことはないという。たまたま後輩が「arduino」というマイコンを使用してロボット製作をしないといけないという相談を受けて、やってみました。ただ、「arduino」の使い方を調べていくうちに、これといった資料がインターネットになかったので、これは需要があるかもしれないということで書いております。

この記事にたどり着いた方はある程度は「arduino」について調べたものと思います。「UNO」という最もスタンダードなものの記事は多いんですが、ロボット等出力ポートを多く必要とするものについてはほとんどありません。この記事ではポート数の多い「MEGA 2560」を使用していきます。

プログラムについては、ロボットコンテスト用にモーター4つをメカナムホイールで使うソースコードを下記で紹介します。しかもジョイスティックで。しかもPWM制御で。もちろんパクッてOKです。

ロボットコンテストなどでよく使うのはジョイスティックで足回りはモーター4つ、他は残りのボタンを使うんですよね?よく知りませんが。

足回りとその他のボタンを使用するなら「割り込み処理」をしないとスムーズにロボットとして動かないとは思いますが、ここでは説明が長くなるので書いていません。需要があれば別記事を書いて説明します。

欲しい方が居ましたら、下の方でお気軽にコメントください。本来は腕時計のブログなので需要が無ければ書きません。

アルドゥイーノをPS3コントローラーに接続するために必要なもの


・arduinoの開発環境ソフト
・arduino mega 2560基板(パチモンでOK)
・USBホストシールド基板
・ドングル
・PS3コントローラー(パチモンでOK)


たったこれだけです。大きい出力のモーターを動かすならこれにモータードライブ基板が必要になってきます。自作もできるので、この記事に需要があればまた詳しく書きたいと思います。またの機会ということで。とりあえず接続まで解説していきましょう。


とりあえず、aruduinoのホームページに行ってソフトをダウンロードしてください。


これはスマホで見た時のホームページです。メニューからダウンロード的なところをクリック、Windowsのものをダウンロードしてください。ver.は最新のものでOKです。これもやり方が解らなければコメントください。just Download を選べばお金は一切払わなくて大丈夫です。


arduino mega 2560基板(パチモン)



私が購入しました。中国製のアルドゥイーノです。載ってる部品はだいたい同じですが、本家イタリアのものに比べると荒いところがいくつかあります(笑)。しかし、本家のものは安くても6000円ほど。中国製のものは1500円以下で手に入るので、コストの高さが全然違います。

中国製の荒いところは後で説明するので、今から買う人はとりあえずアマゾンor楽天orヤフーで購入してください。私の購入したものと全く同じじゃなくても大丈夫です。




USBホストシールド基板



これと「ドングル」を使って「PS3コントローラー」と「arduino mega 2560」を繋げます。

手元にものがないので、雑に書いて申し訳ないんですが左下のRESETスイッチがありますよね?横書きの5vのところと縦書き?の3.3v、5vの部分をはんだ付けしてショートさせてください。ここを半田付けしないとUSBホストシールドに電源が供給されないので繋がりません。よくわからない方はこの記事のさらに下で実際に動かしている画像があるので拡大して見てください。

「arduino mega 2560」載せ方も下の画像を見て頂ければと思います。

下の商品リンクから探せますが、USBホストシールドなら何でもいいと思います。不安な方は私と同じ白い基板のものを購入してください。たぶん最安です。



ドングル



ものによっては繋がらないものもあるようです。Ver.4.0というものなら間違いないと思います。心配な方はBlueSoleil製のものを選びましょう。




PS3コントローラー



これもコンパチ品でOKです。本物のPS3コントローラーは9000円ほどしますが、中国製のものならば1500円程度で購入出来ます。




アルドゥイーノとPS3コントローラーに接続するプログラム


arduinoのホームページからソフトウェアはダウンロードできましたか?

できましたらarduinoとPS3コントローラーを繋ぐライブラリをインクルードしましょう。
とりあえず下記のZIPファイルをダウンロードしてください。デスクトップにでも張り付けておけば大丈夫です。

”ZIPファイル”
USB_Host_Shield_2.0はこちら

それからは下の画像のように「スケッチ」→「ライブラリをインクルード」→「ZIP形式のライブラリをインクルード」をクリックしてUSB_Host_Shield_2.0を選びましょう。




そうすると「スケッチ例」にUSBホストシールドが出てきます。画像のように進んで「PS3BT」をクリック。これでarduinoとPS3コントローラーを繋ぐ準備ができました。「スケッチ」からマイコンボードに書き込みましょう!!



ここで大問題!?アルドゥイーノとパソコンがつながらない!!


「PS3BT」のサンプルプログラムが書き込めない!?
ここでマイコンボードに書き込めないことが多々あります。特に中国製のarduinoではそのままでは接続できないことがほとんどです。

このままでは書き込めません。どうすればいいのか?私の後輩もここでつまずいていました。下のプログラムをインストールすれば秒で方が着きます。

USBシリアル変換ドライバはこちら

インストールすると「CH341」というシリアル返還ドライバが出現するので「Install」をクリックしましょう。これにて完了。あとはデバイスマネージャーで確認するまでもありません。プログラムがarduinoに書き込めるはずです。

ツールからボードの種類を「MEGA 2560」にしておくことも忘れずに。




さあ!arduinoとPS3コントローラーを繋ぎましょう!!


プログラムが無事に書き込めましたら次は実際にPS3コントローラーを接続します。手順は以下の通りです。

・USBホストシールドにドングルを繋ぐ

・ドングルが青く点滅したらドングルを抜く

・PS3コントローラーをUSBケーブルでホストシールドに繋ぐ(1分くらい待ちます)

・USBケーブルを抜いてから再びドングルを差す

・arduinoのリセットボタンを押してからPS3コントローラーのPSボタン(ど真ん中)を押す

・PS3コントローラーのLED1が点灯すれば接続完了です




arduinoのサンプルプログラムを公開


//This sketch created by 1016blog

#include  <PS3BT.h>
#define PWMA 2
#define PWMB 3
#define PWMC 4
#define PWMD 5
#define PWME 6
#define PWMF 7
#define PWMG 8
#define PWMH 9

USB Usb;
BTD Btd(&Usb);
PS3BT PS3(&Btd);

void setup() {
Serial.begin(115200);
if (Usb.Init() == -1) {
Serial.print(F("\r\nOSC did not start"));
while (1); //halt
}
Serial.print(F("\r\nPS3 Bluetooth Library Started"));
pinMode(PWMA, OUTPUT);
pinMode(PWMB, OUTPUT);
pinMode(PWMC, OUTPUT);
pinMode(PWMD, OUTPUT);
pinMode(PWME, OUTPUT);
pinMode(PWMF, OUTPUT);
pinMode(PWMG, OUTPUT);
pinMode(PWMH, OUTPUT);

}

void loop() {
Usb.Task();

if (PS3.PS3Connected || PS3.PS3NavigationConnected) {
//ホームポジション
if ((PS3.getAnalogHat(LeftHatX) > 117 && PS3.getAnalogHat(LeftHatX) < 137) && (PS3.getAnalogHat(LeftHatY) > 117 && PS3.getAnalogHat(LeftHatY) < 137)){

analogWrite(PWMA, 0);
analogWrite(PWMB, 0);
analogWrite(PWMC, 0);
analogWrite(PWMD, 0);
analogWrite(PWME, 0);
analogWrite(PWMF, 0);
analogWrite(PWMG, 0);
analogWrite(PWMH, 0);
}
//前進
else if((PS3.getAnalogHat(LeftHatX) > 107 && PS3.getAnalogHat(LeftHatX) < 147) && (PS3.getAnalogHat(LeftHatY) < 116)){

analogWrite(PWMA, 200);
analogWrite(PWMB, 0);
analogWrite(PWMC, 200);
analogWrite(PWMD, 0);
analogWrite(PWME, 200);
analogWrite(PWMF, 0);
analogWrite(PWMG, 200);
analogWrite(PWMH, 0);
}
//後退
else if((PS3.getAnalogHat(LeftHatX) > 107 && PS3.getAnalogHat(LeftHatX) < 147) && (PS3.getAnalogHat(LeftHatY) < 255)){

analogWrite(PWMA, 0);
analogWrite(PWMB, 200);
analogWrite(PWMC, 0);
analogWrite(PWMD, 200);
analogWrite(PWME, 0);
analogWrite(PWMF, 200);
analogWrite(PWMG, 0);
analogWrite(PWMH, 200);
}
//右旋回
else if((PS3.getAnalogHat(LeftHatX) > 138) && (PS3.getAnalogHat(LeftHatY) > 107 && PS3.getAnalogHat(LeftHatY) < 147)){

analogWrite(PWMA, 0);
analogWrite(PWMB, 200);
analogWrite(PWMC, 200);
analogWrite(PWMD, 0);
analogWrite(PWME, 0);
analogWrite(PWMF, 200);
analogWrite(PWMG, 200);
analogWrite(PWMH, 0);
}
//左旋回
else if(( PS3.getAnalogHat(LeftHatX) < 116) && (PS3.getAnalogHat(LeftHatY) > 107 && PS3.getAnalogHat(LeftHatY) < 147)){

analogWrite(PWMA, 200);
analogWrite(PWMB, 0);
analogWrite(PWMC, 0);
analogWrite(PWMD, 200);
analogWrite(PWME, 200);
analogWrite(PWMF, 0);
analogWrite(PWMG, 0);
analogWrite(PWMH, 200);
}
//すき間
else{

analogWrite(PWMA, 0);
analogWrite(PWMB, 0);
analogWrite(PWMC, 0);
analogWrite(PWMD, 0);
analogWrite(PWME, 0);
analogWrite(PWMF, 0);
analogWrite(PWMG, 0);
analogWrite(PWMH, 0);
}

if (PS3.PS3Connected) {

if (PS3.getButtonClick(PS)) {
PS3.disconnect();
}
}
}
}



これで動くはずです。保証はできませんが。

このプログラムでメカナムホイールを制御できます。普通のホイールで走らせる場合は右旋回と左旋回の出力部分をいじりましょう。analogWriteの部分ですね。

LEDを繋いでジョイスティックを動かすと制御信号が出ているのがわかります。

差すピンはプログラム冒頭の#define PWM※ 数字 数字の部分のピンです。2番~13番はアナログ出力になっているので0~255の範囲で電圧を制御できます。0が0%、255が100%という考えですね。





中国製アルドゥイーノが雑なところ


前項でのサンプルプログラムを見ると2番から順番に使っていないのがわかりますよね?

中国製アルドゥイーノの欠点はここです。

なんと、
ちゃんと動かないポートが存在するのです。

ビックリですよね。実際に6枚ほどの基盤を試しましたが、どの基盤にも不良のポートがありました。ただ、8ポート動けばOKなのでだいたいなんとかなります。

アルドゥイーノで制御するのは簡単です。


arduinoをPS3コントローラーで制御する方法を解説してきました。

この記事で救われる方がいれば幸いです。何かわからないことがあれば気軽にコメントください。追記、または記事にて説明します。

参考になった!!という方はこの記事をはてブなんかで拡散してくれたら喜びます。よろしくお願いします。