スーパーファミコン コントローラーの無線化プロジェクト:バグ有だが、一応動きはする ここまでまとめ
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() {
}
コメント
コメントを投稿