UdonLibrary 1.0.0
機械システム研究部 C++ ライブラリ
読み取り中…
検索中…
一致する文字列を見つけられません
コントローラーの構成

構成を考える

PS5 コントローラー は Bluetooth を用いて通信を行いますが、ロボコン会場には WiFi や Bluetooth が多く存在するため、混線する可能性があります。そこで 920MHz 帯を用いて通信します。小規模なロボットや、混線が置きにくいような環境下では Bluetooth を用いて構成することも可能です。

メインマイコン側のドキュメントは こちら にあります。

■ 920MHz 経由 / 無線モジュールがメイン基板にある場合 (推奨)

flowchart LR
subgraph 操縦者側
subgraph 送信基板
コントローラ --USB--> USBホストシールド --SPI--> 送信側マイコン[マイコン] --UART等--> 送信側モジュール[無線モジュール]
end
end
subgraph ロボット側
subgraph メイン基板
送信側モジュール[無線モジュール] -.920MHz.-> 受信側モジュール[無線モジュール] --UART等--> メイン側マイコン[マイコン]
end
end
  • 送信基板マイコン

■ 920MHz 経由 / 無線モジュールとメイン基板が別々の場合 (推奨)

flowchart LR
subgraph 操縦者側
subgraph 送信基板
コントローラ --USB--> USBホストシールド --SPI--> 送信側マイコン[マイコン] --UART等--> 送信側モジュール[無線モジュール]
end
end
subgraph ロボット側
subgraph 受信基板
送信側モジュール[無線モジュール] -.920MHz.-> 受信側モジュール[無線モジュール] --UART等--> 受信側マイコン[マイコン]
end
subgraph メイン基板
受信側マイコン[マイコン] --CAN等--> メイン側マイコン[マイコン]
end
end
  • 送信基板マイコン
  • 受信基板マイコン

■ Bluetooth 経由 / USB ホストシールドがメイン基板にある場合

flowchart LR
subgraph 操縦者側
コントローラ
end
subgraph ロボット側
subgraph メイン基板
コントローラ -.Bluetooth.-> Bluetoothドングル --USB--> USBホストシールド--SPI--> メイン側マイコン[マイコン]
end
end
  • USB ドングルとのペアリング

■ Bluetooth 経由 / USB ホストシールドとメイン基板が別々の場合

flowchart LR
subgraph 操縦者側
コントローラ
end
subgraph ロボット側
subgraph 受信基板
コントローラ -.Bluetooth.-> Bluetoothドングル --USB--> USBホストシールド--SPI--> 受信側マイコン[マイコン]
end
subgraph メイン基板
受信側マイコン[マイコン] --CAN等--> メイン側マイコン[マイコン]
end
end
  • 受信基板マイコン
  • USB ドングルとのペアリング

■ USB 経由

flowchart LR
subgraph 操縦者側
コントローラ
end
subgraph ロボット側
subgraph メイン基板
コントローラ --USB--> USBホストシールド--SPI--> メイン側マイコン[マイコン]
end
end

送信側マイコン用クラス

この場合、送信基板のマイコンは USB ホストシールドからコントローラの情報を受け取り、無線モジュールへの転送を行います。具体的には Udon::Message::PadPS5 型オブジェクトを転送します。

USB ホストシールドから Udon::Message::PadPS5 型オブジェクトを取得するには、Udon::PadPS5USB クラスを使用します。getMessage() から Udon::Message::PadPS5 型オブジェクトを取得出来ます。

// コントローラの情報を LoRa へ転送する例
#include <Udon.hpp>
static Udon::PadPS5USB pad;
.serial = Serial1,
.m0 = 2,
.m1 = 3,
.aux = 4,
.channel = 0,
});
void setup()
{
pad.begin();
lora.begin();
}
void loop()
{
pad.update();
const Udon::Message::PadPS5 message = pad.getMessage();
lora.setMessage(message);
// 省略形: lora.setMessage(pad.getMessage());
delay(1);
}
E220 送信クラス
Definition E220Writer.hpp:20
有線USB経由PS5コントローラークラス
Definition PadPS5USB.hpp:32
bool begin()
コントローラーと通信開始
Definition PadPS5USB.hpp:48
Message::PadPS5 getMessage() const
Message::PadPS5型のメッセージを取得する
Definition PadPS5USB.hpp:108
void update()
更新
Definition PadPS5USB.hpp:61
PS5コントローラーのボタン情報
Definition PadPS5.hpp:21

コントローラに内蔵されている LED や、バイブレーションを動作させられます。

pad.setLightBar({ 0x38b48b }); // タッチパネルサイドLED (色指定可能)
pad.setMicLed(true); // マイクLED
pad.setPlayerLamp(); // タッチパネル下部LED (5つ)
pad.vibrate(100, 100); // 左右バイブレーションモーター
void setLightBar(const Udon::RGB &color)
ライトバーの色を設定する
Definition PadPS5USB.hpp:115
void setPlayerLamp(uint8_t mask=0b011)
5つのプレイヤーのランプの点灯を設定する
Definition PadPS5USB.hpp:125
void vibrate(uint8_t big=100, uint8_t small=100)
バイブレーション
Definition PadPS5USB.hpp:140
void setMicLed(bool on=true)
マイクのLEDの点灯を設定する
Definition PadPS5USB.hpp:132

受信側マイコン用クラス

この場合、受信基板のマイコンは無線モジュールから取得した Udon::Message::PadPS5 型オブジェクトをメインマイコンへ転送する役を担います。

// LoRa で受信したデータを CAN バスへ送信する例
#include <Udon.hpp>
.serial = Serial1,
.m0 = 2,
.m1 = 3,
.aux = 4,
.channel = 0,
});
static Udon::CanWriter<Udon::Message::PadPS5> writer{ bus, 0x006 };
void setup()
{
lora.begin();
bus.begin();
}
void loop()
{
bus.update();
// LoRa から CAN に転送
if (const auto message = lora.getMessage())
{
writer.setMessage(*message);
}
else
{
writer.setMessage({});
}
delay(1);
}
Teensy用 CANバスクラス
Definition CanBusTeensy.hpp:31
CAN通信 送信クラス
Definition CanWriter.hpp:23
E220 受信クラス
Definition E220Reader.hpp:22
void begin() noexcept
受信開始
Definition E220Reader.hpp:42

Bluetooth 使用時の受信側マイコン用クラス

この場合、受信基板のマイコンは USB ホストシールドからコントローラの情報を受け取り、メインマイコンへ転送します。具体的には Udon::Message::PadPS5 型オブジェクトを転送します。

あらかじめコントローラと Bluetooth ドングルがペアリングされている必要があります。ペアリング方法

PadPS5BT.hpp を個別にインクルードし、Udon::PadPS5BT クラスを用います。使い方は PadPS5USB クラスと同じです。

// コントローラの情報を CAN バスへ転送する例
#include <Udon.hpp>
static Udon::PadPS5BT pad;
static Udon::CanWriter<Udon::Message::PadPS5> writer{ bus, 0x006 };
void setup()
{
pad.begin();
bus.begin();
}
void loop()
{
pad.update();
bus.update();
writer.setMessage(pad.getMessage());
}
void update()
バス更新
Definition CanBusTeensy.hpp:89
void begin()
通信開始
Definition CanBusTeensy.hpp:37
Bluetooth経由PS5コントローラークラス
Definition PadPS5BT.hpp:31
void update()
更新
Definition PadPS5BT.hpp:66
Message::PadPS5 getMessage() const
Message::PadPS5型のメッセージを取得する
Definition PadPS5BT.hpp:118
bool begin()
コントローラーと通信開始
Definition PadPS5BT.hpp:53

PadPS5USB クラスと同じく、コントローラに内蔵されている LED や、バイブレーションを動作させられます。

pad.setLightBar({ 0x38b48b }); // タッチパネルサイドLED (色指定可能)
pad.setMicLed(true); // マイクLED
pad.setPlayerLamp(); // タッチパネル下部LED (5つ)
pad.vibrate(100, 100); // 左右バイブレーションモーター
void setPlayerLamp(uint8_t mask=0b011)
5つのプレイヤーのランプの点灯を設定する
Definition PadPS5BT.hpp:135
void vibrate(uint8_t big=100, uint8_t small=100)
バイブレーション
Definition PadPS5BT.hpp:150
void setLightBar(const Udon::RGB &color)
ライトバーの色を設定する
Definition PadPS5BT.hpp:125
void setMicLed(bool on=true)
マイクのLEDの点灯を設定する
Definition PadPS5BT.hpp:142

Bluetooth ドングルとのペアリング

Bluetooth を使用してコントローラのデータを取得する場合、USB ドングルとのペアリングが必要です。一度ペアリングすると以降はペアリングする必要ありません。

PadPS5BT のコンストラクタに PAIR を指定し書き込むことで USB ドングルがペアリングモードで起動します。

// ペアリング用スケッチ
#include <UdonFwd.hpp>
static Udon::PadPS5BT pad{ PAIR };
void setup()
{
pad.begin();
}
void loop()
{
pad.update();
}

クリエイトボタン、PS ボタンをライトバーが点滅するまで長押しすることで、コントローラ側もペアリングモードになります。ペアリングは通常数秒で終わります。ペアリングが成功するとライトバーが点灯します。

‍ペアリングに時間がかかる場合、マイコンをリセットすることで大抵つながります。またホストシールドは電源電圧に敏感であるため、電圧値が正常か確認してください。