PS2パッドとESP8266を接続し、ボタン押下状態値の取得を確認後、UDP通信のプログラムを書いて送信側は終了。
GPSXライブラリのGPIO定義ソースをESP8266に接続するピンに書き換え、AT2_PINに関しては使わないのでコメントアウトした。
ACK_PIN に関しては抜いても正常に動いたが一応接続しておいた。
GPIOは以下のように繋いだ。
#define DAT_PIN 14 // CTL1 Data
#define CMD_PIN 12 // CTL2 Command
#define AT1_PIN 4 // CTL6 Attention (PAD1)
#define CLK_PIN 13 // CTL7 Clock
#define ACK_PIN 5 // CTL9 ACK
以下はソースコード。WiFi接続状態の確認にGPIO16を使用した。
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <WiFiUDP.h>
#include <GPSXClass.h>
// UDP settings
WiFiUDP UDP;
// WiFi settings
IPAddress HOSTIP (192, 168, 4, 1);
IPAddress myIP(192, 168, 4, 2);
const char *ssid = "********";
const char *password = "********";
const int statusPin = 16;
int wifiStatus = 0;
void connectWiFi() {
WiFi.begin(ssid, password);
WiFi.config(myIP, WiFi.gatewayIP(), WiFi.subnetMask());
Serial.println("start_connect");
int sw = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
sw = !sw;
digitalWrite(statusPin, sw);
}
Serial.println("CONNECTED!");
wifiStatus = 1;
digitalWrite(statusPin, HIGH);
}
void setup() {
Serial.begin(115200);
PSX.mode(PSX_PAD1, MODE_ANALOG, MODE_LOCK);
PSX.motorEnable(PSX_PAD1, MOTOR1_DISABLE, MOTOR2_DISABLE);
// Poll current state once.
PSX.updateState(PSX_PAD1);
pinMode(statusPin, OUTPUT);
delay(200); // waitTime
digitalWrite(statusPin, HIGH);
Serial.println("-");
Serial.println("start");
WiFi.mode(WIFI_STA);//重要!
UDP.begin(893); // setting UDP port
connectWiFi();
}
void sendWiFi(char byteData[]) {
if (UDP.beginPacket(HOSTIP, 893)) {
UDP.write(byteData);
UDP.endPacket();
}
}
void loop() {
if(wifiStatus == 1){
control();
}
delay(17);
end_loop();
}
void control(){
PSX.updateState(PSX_PAD1);
char b[8];
for(int i = 0; i < 8; i++){
b[i] = keyState[0][0][i+1];
}
sendWiFi(b);
}
void end_loop(){
if (WiFi.status() != WL_CONNECTED) {
WiFi.disconnect();
digitalWrite(statusPin, LOW);
Serial.println("disconnect!");
wifiStatus = 0;
connectWiFi();
}
}
受信側に関してはパネルロボットソースに詳細を記述した。
基本的には以前書いたUDP通信の手順と同じで、ボタン押下状態はGPSXライブラリを参考にした。
パッド内に基板とバッテリーを入れたいのでパネルロボット開発時に作成した基板を使った。
バッテリーは3.7V 240mAhのリポ電を使う。
振動モーターは使わないので取り外し、基板とモーターを格納するために振動モーターの軸受部分を切り取った。
コントローラー基板への配線に関してはPS2パッド用に若干の修正を行い、以下のように接続した。
PS2パッド端子、ESP8266、バッテリー、電源スイッチ、プログラム用端子、充電用端子を以下のように接続した。
PS2パッドの配線は以下のようになっていた。
茶
オレンジ
紫
黒、灰
赤
黄
青
✕
緑
完成。