PS3 or PS4コントローラーをArduino経由でMbedとつなぐヾ(*´∀｀*)ﾉ

#初めまして

みなさん、こんにちは(o^―^o)ﾆｺ
Bonnou開発部のkamekyameです！（って知らないか笑）
まあ、初めてのQiita投稿ということでね、あまり使い方もわかっていないんですが。。。

いろいろありまして、表題のことについて記事を書きたいと思います。

#さっそく

まず、今回のおぷろぐらむを書くに当たっての流れをざっと説明しようかなと思います。。

1. PS3 or PS4 のコントローラーをArduinoにつなぐ。
2. ArduinoとMbedをシリアル通信で接続し、情報を渡す。

って感じかな。。

んんん。簡単だね！

#コントローラーをArduinoにつなぐ

これは、、、**簡単！！！**

マウスクリックだけでいけちゃうんじゃないかな～

ってことで。まず、Arduino IDEちゃんを起動してくださいな。

あっ、まだArduino IDEちゃんをインストールしてないよーって方はこっち見てね

[ArduinoIDEをインストールしてみよう|うぃる育成日記](https://will-ikusei.blogspot.jp/2016/02/arduinoide.html)

起動したら、Arduinoの左上の「ファイル」ってとこに「スケッチ例」ってあるでしょ？そこの中にね、プログラムの例がいっぱいあるの♡

べんりだねー。。

そんでね、コントローラーとArduinoをつなぐ方法はいろいろあるんだけども、今回は「USB Host Shield」っていうArduinoの拡張基盤みたいなのを使うんだー。

![a000004_iso.jpg](https://qiita-image-store.s3.amazonaws.com/0/255360/cb60e9d1-ee6f-4e6d-53ef-44c567d5e526.jpeg)

これが純正のやつね。ほかにもいろんな会社から同じようなやつが出てるから、形とかは違うと思うけど、使い方は一緒！

これをArduinoちゃんにぶっさして、使うんだー。

そんでね、こいつを使うための「ライブラリ」っていうのが必要なんだけども、それをインストールしなくちゃいけないの。

スケッチ > ライブラリをインクルード > ライブラリを管理...

っていう風に進むと、なんか出てくるよね。そこの検索するとこに「usb host」って入れると、一番上じゃないんだけども「USB Host Shield Library 2.0」ってやつがあると思うんだ。それをクリックして、インストールしてみて。

ファイル > スケッチ例
のところの下のほーに「USB Host Shield Library」ってのがでてきたら大丈夫！

いまので感づいた人もいるかと思うけど、そう。USB Host Shieldのスケッチ例があるんだー(o^―^o)ﾆｺ

（ここまで、ほぼクリックだけかな。検索したぐらいか。）

そいでね、
ファイル > スケッチ例 > USB Host Shield Library > Bluetooth
ってとこに「PS3BT」とか「PS4BT」があるよね。使うコントローラーに合わせて使い分けてね。

ん？？？Bluetooth。
そう！コントローラーとはBluetoothでつなぐんだよ～～。

![0000000200316366_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/255360/cd4567a6-ed89-3fe5-94fd-be63d3fcdaa8.jpeg)

こんなやつ使ってね。

んじゃ、
ファイル > スケッチ例 > USB Host Shield Library > Bluetooth
から、使うコントローラーのスケッチ例を開いてみよう！
そして、Arduino Unoちゃんに書き込んでみようか。。

書き込めた？

そしたらね～、さっきのUSBのBluetoothのやつを、host shieldにぶっさして、コントローラーとつなげてみよう！！

（ってどうやってつなげるの？）

PS4のは、スケッチ例に英語だけどコメントに載ってるから探してみて。
PS3のは、スケッチ例にも載ってないみたいだから一応書いておくけど、（他サイトから引っ張ってきたんだけど。。）

1. USBのBluetoothのやつを差した状態でArduinoにコードを書き込む（電源は切らない）←なんか言ってること違うな。。。ま、なんでもいいと思うけどww
2. USBのBluetoothのやつを抜いてUSBケーブルでPS3コントローラを接続する（電源は切らない）
3. ケーブルを抜いてUSBのBluetoothのやつを指し直す（Arduinoを再起動する）
4. PS3コントローラのPS ボタンを押して接続する。

これでつながると思う。。コントローラーのLEDのとこが赤く光ったら成功！！

#ArduinoとMbedをシリアル通信で接続し、情報を渡す

ってことでね。Arduino側のおぷろぐらむを書いていきたいと思いまーす。
（Mbedの方はどうするの？？？？）
実はね。。最初の方に書いた、いろいろあってっていうのが、kamekyameが子分たちの教育のために書いている記事なんですよね。だから、とりまArduinoを使えるようにって感じで書いているからこんなんなってます。Mbed側のライブラリも、こっち側の人間しか持ってないんですよ。。

なので、この記事を見てくれた方々。ごめんなさいm(__)m
どうしても聞きたいことがありましたらコメントの方でよろしくお願いします。できるだけ対応するつもりではいます。(o^―^o)ﾆｺ

ということで、Arduinoのおぷろぐらむ。コード貼っときます。ヾ(*´∀｀*)ﾉ

子分たち。。これを見て、読み解くんだ( ｀ー´)ノ

あっ、これPS4用だから、TouchPadの情報も入ってます。
がんばれ。

```cpp:usb_host_to_mbed_for_PS4.ino
#include <PS4BT.h>
#include <SPI.h>
#include <Wire.h>
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif

USB Usb;

BTD Btd(&Usb);
PS4BT PS4(&Btd);
//PS4BT PS4(&Btd, PAIR);

#define ADDR 0x21
#define MBEDRST A0

int button_new[16];
int button_old[16];
int z;

const int IN[8] = {0, 0, LeftHatX, LeftHatY, RightHatX, RightHatY, L2, R2};

const int BUTTON[18] = {UP, RIGHT, DOWN, LEFT, TRIANGLE, CIRCLE, CROSS, SQUARE, L1, R1, SHARE, OPTIONS, L3, R3, PS, TOUCHPAD, L2, R2};

void setup() {
  Serial.begin(115200);
  PS4.attachOnInit(onInit);
  if (Usb.Init() == -1) {
    Serial.print(F("\r\nOSC did not start"));
    while (1); //halt
  }
}

void loop() {
  Usb.Task();
  if (PS4.connected()) {
    for (int i = 0; i < 16; i++) {
      button_old[i] = button_new[i] & 0x01;
      button_new[i] = PS4.getButtonPress(BUTTON[i]);
    }
    if (Serial.available()) {
      byte memory = Serial.read();
      if (memory == 0xFF) {
        unsigned int buttonData = 0;
        for (int i = 0;i<16;i++) buttonData = (buttonData << 1) + button_new[i];
        Serial.write(highByte(buttonData));
        Serial.write(lowByte(buttonData));
      } else if (memory == 0x20) PS4.disconnect();
      else if ((memory & 0x3F) == 0) Serial.write(0x01);
      else if ((memory & 0x3F) >= 17 && (memory & 0x3F) <= 18) Serial.write(PS4.getAnalogButton(BUTTON[memory - 1]));
      else if ((memory & 0x3F) >= 19 && (memory & 0x3F) <= 22) Serial.write(PS4.getAnalogHat(BUTTON[memory - 19]));
      else if (((memory & 0x3F) >= 23 && (memory & 0x3F) <= 26)) {
        unsigned int touchPadData;
        switch (memory & 0x3F) {
          case 23:
            if (PS4.isTouching((memory & 0b10000000) == 0b10000000)) touchPadData = PS4.getX((memory & 0b10000000) == 0b10000000);
            else touchPadData = 0;
            break;
          case 24:
            if (PS4.isTouching((memory & 0b10000000) == 0b10000000)) touchPadData = PS4.getY((memory & 0b10000000) == 0b10000000);
            else touchPadData = 0;
            break;
          default:
            touchPadData = PS4.getAngle(memory - 25);
            break;
        }
        Serial.write(highByte(touchPadData));
        Serial.write(lowByte(touchPadData));
      }
    }
  } else {
    if (Serial.available()) {
      int memory = Serial.read();
      if (memory == 0) Serial.write(0x00);
    }
  }
}

void onInit() {
  PS4.setLed(White);
}
```
```cpp:usb_host_to_mbed_for_PS3.ino
#include <PS3BT.h>
#include <SPI.h>
#include <Wire.h>
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif

USB Usb;

#if USBMODE
PS3USB PS3(&Usb);
#else
BTD Btd(&Usb);
PS3BT PS3(&Btd);
#endif

#define ADDR 0x21

/*

   data[8] = {B{UP, RIGHT, DOWN, LEFT, TRIANGLE, CIRCLE, CROSS, SQUARE},
              B{L1, R1, SELECT, START, L3, R3, connect, connect},
              LeftHatX
              LeftHatY
              RightHatX
              RightHatY,
              L2,
              R2};

*/

const int IN[8] = {0, 0, LeftHatX, LeftHatY, RightHatX, RightHatY, L2, R2};

const int BUTTON[2][8] = {{UP, RIGHT, DOWN, LEFT, TRIANGLE, CIRCLE, CROSS, SQUARE},
  {L1, R1, SELECT, START, L3, R3, 0, 0}
};


void setup() {
  pinMode(2,OUTPUT);
  Wire.begin(ADDR);
  Wire.onReceive(getd);
  Wire.onRequest(recd);
  //Serial.begin(9600);

  if (Usb.Init() == -1) {
    Serial.print(F("\r\nOSC did not start"));
    while (1); //halt
  }
}

void loop() {
  Usb.Task();
  if (PS3.getButtonClick(PS) && PS3.PS3Connected)
    PS3.disconnect();
    if(PS3.getButtonPress(START)){
      digitalWrite(2,LOW);
    }else{
      digitalWrite(2,HIGH);
    }
}

void getd(int numBytes) {

}


void recd() {
  byte data[8];
  if (PS3.PS3Connected) {
    data[0] = data[1] = 0;
    for (int j = 0; j < 8; j++)
      data[0] = (data[0] << 1) + PS3.getButtonPress(BUTTON[0][j]);
    for (int j = 0; j < 6; j++)
      data[1] = (data[1] << 1) + PS3.getButtonPress(BUTTON[1][j]);
    data[1] = data[1] << 2;
      
    bitWrite(data[1], 1, 1);
    data[2] = PS3.getAnalogHat(LeftHatX);
    data[3] = PS3.getAnalogHat(LeftHatY);
    data[4] = PS3.getAnalogHat(RightHatX);
    data[5] = PS3.getAnalogHat(RightHatY);
    data[6] = PS3.getAnalogButton(L2);
    data[7] = PS3.getAnalogButton(R2);
  } else {
    for (int i = 0; i < 8; i++)  data[i] = 0;
    for (int i = 2; i < 6; i++)  data[i] = 127;
  }
  Wire.write(data, 8);
}
```
ということで、この記事は、これにて終了。ほんとに申し訳ない🙇