PS2 コントローラ x Arduino

#include <PS2X.h>
//#include <WebServer.h>
#include "esp-rclink.h"

/*
 PSB_SELECT       0x0001
 PSB_L3           0x0002
 PSB_R3           0x0004
 PSB_START        0x0008
 PSB_PAD_UP       0x0010
 PSB_PAD_RIGHT    0x0020
 PSB_PAD_DOWN     0x0040
 PSB_PAD_LEFT     0x0080
 PSB_L2           0x0100
 PSB_R2           0x0200
 PSB_L1           0x0400
 PSB_R1           0x0800
 PSB_GREEN        0x1000
 PSB_RED          0x2000
 PSB_BLUE         0x4000
 PSB_PINK         0x8000
 PSB_TRIANGLE     0x1000
 PSB_CIRCLE       0x2000
 PSB_CROSS        0x4000
 PSB_SQUARE       0x8000
 */

int16_t off_rx=0, off_ry=0, off_lx=0, off_ly=0;

PS2X joystick;
//WebServer server(80);

unsigned int interval;

unsigned int sinceTimer(const unsigned int millis_value)
{
    return millis()-millis_value;
}

void resetTimer(unsigned int &millis_value)
{
    millis_value = millis();
}


void dataIn(){
}

void httpLoop(void *pvParameters) {
    while (1){
        //  server.handleClient();
        delay(30);
    }
}

void handleRoot() {
    char temp[400];
    int sec = millis() / 1000;
    int min = sec / 60;
    int hr = min / 60;
    
    snprintf(temp, 400,
             
             "<html>\
             <head>\
             <meta http-equiv='refresh' content='2'/>\
             <title>ESP RC-Link</title>\
             <style>\
             body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
             </style>\
             </head>\
             <body>\
             <h1>ESP RC-Link</h1>\
             <p>Uptime: %02d:%02d:%02d</p>\
             <p>Battery: %fV</p>\
             <p>Link: %d%%</p>\
             </body>\
             </html>",
             
             hr, min % 60, sec % 60, 3.3, ESPRCLink.getQuality()
             );
    //  server.send(200, "text/html", temp);
    
}

void setup() {
    Serial.begin(115200);
    
    resetTimer(interval);
    
    //joystick.ConfigGamepad(12, 14, 26, 27);
    joystick.ConfigGamepad(12, 14, 0, 2);
    //void PS2X::ConfigGamepad(uint8_t dat_pin, uint8_t cmd_pin, uint8_t att_pin, uint8_t clk_pin, bool
    
    joystick.ReadGamepad();
    delay(100);
    joystick.ReadGamepad();
    
    off_rx = joystick.Analog(PSS_RX);
    off_ry = joystick.Analog(PSS_RY);
    off_lx = joystick.Analog(PSS_LX);
    off_ly = joystick.Analog(PSS_LY);
    
    //  ESPRCLink.init("30:AE:A4:1E:8C:3D", ESPRC_SLAVE);
    ESPRCLink.init("5E:CF:7F:B2:E9:25", ESPRC_MASTER);
    ESPRCLink.on_receive = dataIn;
    Serial.println();
    Serial.println("Hi, I'm "+ESPRCLink.getMac());
    ESPRCLink.setMode(0, ESPRC_STROBE);
    ESPRCLink.setMode(4, ESPRC_SERVO);
    
    //  server.on("/", handleRoot);
    //  server.begin();
    //  xTaskCreatePinnedToCore(httpLoop, "HTTP", 8192 , NULL, 0, NULL, 0);
}

void loop() {
    //    Serial.println("LOOP");
    //  server.handleClient();
    
    joystick.ReadGamepad();
    if (joystick._buttons == 0xf0ff) { //calibration of joysticks when L1 L2 R1 R2 pressed
        off_rx = joystick.Analog(PSS_RX);
        off_ry = joystick.Analog(PSS_RY);
        off_lx = joystick.Analog(PSS_LX);
        off_ly = joystick.Analog(PSS_LY);
    }
    
    //  ESPRCLink.write(0, !joystick.Button(PSB_CROSS));
    //  ESPRCLink.write(4, constrain(90+(joystick.Analog(PSS_RY)-off_ly)/1.4, 0, 180));
    
    if (sinceTimer(interval)>100){
        Serial.print(" up:");
        Serial.print(joystick.Button(PSB_PAD_UP));
        Serial.print(" down:");
        Serial.print(joystick.Button(PSB_PAD_DOWN));
        Serial.print("\n");
        
        //      Serial.write(27);       // ESC command
        //      Serial.print("[2J");    // clear screen command
        //      Serial.write(27);
        //      Serial.print("[H");     // cursor to home command
        //      Serial.print(ESPRCLink.getQuality());
        ////      Serial.print("\n");
        ////      Serial.print(90+(joystick.Analog(PSS_RY)-off_ly)/1.4);
        //      resetTimer(interval);
    }
    
    
    /*
     Serial.println();
     Serial.println();
     Serial.println();
     Serial.println();
     Serial.println();
     Serial.println();
     Serial.println();
     Serial.println();
     Serial.println();
     if (joystick._buttons >> 15 == 0 ) Serial.print(0);
     Serial.println(joystick._buttons, BIN);
     Serial.print(" U : "); Serial.println(joystick.Button(PSB_PAD_UP));
     Serial.print(" D : "); Serial.println(joystick.Button(PSB_PAD_DOWN));
     Serial.print(" L : "); Serial.println(joystick.Button(PSB_PAD_LEFT));
     Serial.print(" R : "); Serial.println(joystick.Button(PSB_PAD_RIGHT));
     Serial.print("/_\\: "); Serial.println(joystick.Button(PSB_TRIANGLE));
     Serial.print(" O : "); Serial.println(joystick.Button(PSB_CIRCLE));
     Serial.print(" X : "); Serial.println(joystick.Button(PSB_CROSS));
     Serial.print("[ ]: "); Serial.println(+joystick.Button(PSB_SQUARE));
     Serial.println(((joystick.Analog(PSS_LX) - off_lx)*(joystick.Analog(PSS_LX) - off_lx))/128);
     Serial.println(((joystick.Analog(PSS_LY) - off_ly)*(joystick.Analog(PSS_LY) - off_ly))/128);
     Serial.println(joystick.Analog(PSS_RX) - off_rx);
     Serial.println(joystick.Analog(PSS_RY) - off_ry);
     */
    delay(10);
}

source.zip
PS2X-master.zip
ESP-RCLink-master.zip
YouTube

PS2コントローラをESP8266に接続 元ネタ
ESP8266 controlling servos over ESP-NOW using PS2 controller
Youtube

上記のサイトで接続方法がわからなかったので調査 1.ダウンロード
https://github.com/Crypter/PS2X
Clone or downloadでZIPを取得しarduino sketchに追加 src中のPS2X.cpp PS2X.hが必要
2. https://github.com/Crypter/ESP-RCLink
Clone or downloadでZIPを取得
/joystick-master のesp-rclink.cpp esp-rclink.hを読み込ませる
基本のプログラムは下記になる
https://github.com/Crypter/ESP-RCLink/blob/master/joystick-master/joystick-master.ino
注意 なぜか esp-rclink.cpp esp-rclink.h をプログラム中で読まないと動きが不安定。調査するほど技術がないので天才な人お願いします