スーパーファミコン コントローラーの無線化プロジェクト:バグ有だが、一応動きはする ここまでまとめ

 

SFCに接続された側のESPはSFCの5Vから電源を供給(このSFC、USB typeCに改造済みなんで電力的に余裕がある・・ACアダプターの時に動くかは不明だがおそらく問題ないかと)


動画見ていただくとわかるように、時よりボタンを操作していないのにも関わらずドンキーコングがジャンプ(Bボタンを押した挙動)をしてしまう。

SFCに接続する側のESPのスケッチ

#include <ESP8266WiFi.h> // WiFi
#include <WiFiUDP.h>     // UDP

#define PS_READ_PIN 5
#define DAT_OUTPIN 4
#define DAT_OUTPIN_BIT (1<<4)

int button_status;

// SSIDとパスワード
const char *ssid = "esp8266";
const char *password = "12345678";
//create UDP instance
static WiFiUDP udp;

#define LOCAL_PORT  5000  // port number for local
#define REMOTE_PORT 5000  // port number for remote
// IPアドレス
IPAddress localIP; //local IP address
IPAddress remoteIP;  // remote address

void onRising() {
  noInterrupts();
  //B Y SELECT  START 上 下 左 右 A X L R HHH
  //button_status = 0b1010101010101011; // for test

  delayMicroseconds(9);
  for (int j = 0; j < 16; j++) {
    WRITE_PERI_REG(PERIPHS_GPIO_BASEADDR + (8 - 4 * (bitRead(button_status, 15 - j))), DAT_OUTPIN_BIT);

    delayMicroseconds(11);
    for (int i = 0; i < 13; i++) { asm("nop \n"); };  // i<10 0.65usec
  }
  digitalWrite(DAT_OUTPIN, LOW);
  interrupts();
}
void setup() {
  Serial.begin(115200);

  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(DAT_OUTPIN, OUTPUT);  
  pinMode(PS_READ_PIN, INPUT);
  digitalWrite(DAT_OUTPIN, LOW);
  attachInterrupt(digitalPinToInterrupt(PS_READ_PIN), onRising, RISING);
  //attachInterrupt(digitalPinToInterrupt(PS_READ_PIN), onRising2, RISING);
  button_status = 0b1010101010101111;

  //Serial.begin(115200);
  delay(100);
 
  // AP setting
  WiFi.mode(WIFI_AP);
  WiFi.softAP(ssid, password);
  delay(100);
  localIP = WiFi.softAPIP();
  Serial.println();
  Serial.print("AP IP address: ");Serial.println(localIP);
 
  // start udp
  udp.begin(LOCAL_PORT);
   delay(100);
}
void loop() {
    char packetBuffer[16];
  int packetSize = udp.parsePacket();
  if (packetSize) {
    int len = udp.read(packetBuffer, packetSize);
    if (len > 0) packetBuffer[len] = '\0';
    button_status=atoi(packetBuffer);
  }
    //Serial.println(button_status,BIN);
}

コントローラーに接続する側のESPのスケッチ

#include <ESP8266WiFi.h>  // WiFih>
#include <WiFiUdp.h>
#include "ESP8266TimerInterrupt.h"

const char ssid[] = "esp8266";   // SSID
const char pass[] = "12345678";  // password

static WiFiUDP wifiUdp;  //create UDP instance

// IP address to send UDP data to.
// it can be ip address of the server or
static const char *kRemoteIpadr = "192.168.4.1";
static const int kRmoteUdpPort = 5000;

#define PS_PIN 4    //D1
#define DAT_PIN 14  //D5
#define CLK_PIN 5   //D2
ESP8266Timer ITimer;

int status = 0b0;

void timertask() {
  String D_DATA;

  digitalWrite(PS_PIN, HIGH);
  delayMicroseconds(12);
  digitalWrite(PS_PIN, LOW);
  delayMicroseconds(6);
  for (int i = 0; i < 16; i++) {
    digitalWrite(CLK_PIN, LOW);
    if (digitalRead(DAT_PIN) == LOW) {
      bitWrite(status, 15 - i, 0);
    } else {
      bitWrite(status, 15 - i, 1);
    };
    delayMicroseconds(6);
    digitalWrite(CLK_PIN, HIGH);
    delayMicroseconds(6);
  }
  D_DATA = String(status);
  wifiUdp.beginPacket(kRemoteIpadr, kRmoteUdpPort);
  //wifiUdp.write(String(val,BIN), 16);
  wifiUdp.print(D_DATA);
  wifiUdp.endPacket();
  Serial.println(status, BIN);
}

void setup() {
  Serial.begin(115200);
  Serial.println("");                  // to separate line
  static const int kLocalPort = 5000;  //local port
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, pass);  //Connect to the WiFi network
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  Serial.print("IP address:");
  Serial.println(WiFi.localIP());
  wifiUdp.begin(kLocalPort);

  pinMode(PS_PIN, OUTPUT);
  pinMode(CLK_PIN, OUTPUT);
  pinMode(DAT_PIN, INPUT);
  digitalWrite(PS_PIN, LOW);    //normal state of PS pin
  digitalWrite(CLK_PIN, HIGH);  //nomal state of CLK pin

  ITimer.attachInterruptInterval(16666, timertask);
}

void loop() {

}



コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

Attiny85 FuseRest