サターンコントローラーの無線化計画4
専用基板を設計、ソフトも仕上げました
どうも無駄な努力です。
サターンコントローラーの無線化計画、ポンコツな切り貼りプログラムを修正しました。
無駄な箇所は直して、Bluetoothの信号のカラ打ちをなくしました。
一部は付け焼き刃的ですが、for文や比較用の旧値変数でループを軽くしました。
とりあえず操作が軽い!!
前回のソフトに比べて昇竜拳、スクリューパイルドライバーも軽くなり、楽しくなりました。
微修正はあるだろうけど最終バージョンかな?
微修正はするだろうけどまともに使えるバージョンと言っていいでしょう。
あと、修正したい点は下記だけです。
ループの時間は短くしたが、Bluetoothコントローラーとしての正式な周期を見つけて設定する必要あり
(現在はザックリloopの最後にdelay3msを入れてます)出来る限り省電力化
#include <BleGamepad.h>
#include <M5Atom.h>
BleGamepad bleGamepad;
// pin番号を設定
const int s0pin = 21;
const int s1pin = 25;
const int d0pin = 22;
const int d1pin = 33;
const int d2pin = 19;
const int d3pin = 23;
// s0とs1の変化で信号が変わるためd0からd3を配列化
int d0[4];
int d1[4];
int d2[4];
int d3[4];
// d0からd3の変化確認用に旧値の配列を作成、不一致の数値を代入
int old0[4] = {2,2,2,2};
int old1[4] = {2,2,2,2};
int old2[4] = {2,2,2,2};
int old3[4] = {2,2,2,2};
// ATOM liteの現旧ボタン値、不一致の数値を代入
int btn;
int oldbtn = 2;
// 方向キーの重複を避けるために作った変数
int hat = 1111;
int oldhat = 1111;
// LED点滅タイマー
int ontime;
int offtime;
void setup()
{
Serial.begin(115200);
M5.begin(true, false,true);
delay(10); // delay10ms
bleGamepad.begin();
pinMode(d0pin, INPUT); // d0 pin
pinMode(d1pin, INPUT); // d1 pin
pinMode(d2pin, INPUT); // d2 pin
pinMode(d3pin, INPUT); // d3 pin
pinMode(s0pin, OUTPUT); // s0 pin
pinMode(s1pin, OUTPUT); // s1 pin
}
void loop()
{
if (bleGamepad.isConnected())
{
// LED点滅タイマー
if (ontime <= 20){
ontime = ontime + 1;
M5.dis.drawpix(0, 0xf0f0f0);
} else if (offtime <= 2000) {
offtime = offtime + 1;
M5.dis.drawpix(0, 0x000000);
} else {
ontime = 0;
offtime = 0;
}
// ATOM liteのボタン情報更新
M5.update();
// コントローラーのON/OFF読み込み
for (int s0=0; s0 <= 1; s0++){
for (int s1=0; s1 <= 1; s1++){
digitalWrite(s0pin, s0 );
digitalWrite(s1pin, s1 );
delayMicroseconds(100); //これがないと読み込みミス発生
d0[s0*2+s1] = digitalRead(d0pin);
d1[s0*2+s1] = digitalRead(d1pin);
d2[s0*2+s1] = digitalRead(d2pin);
d3[s0*2+s1] = digitalRead(d3pin);
}
// 省電力に効果有無は不明だが、s0とs1をOFFにしておく
digitalWrite(s0pin, 0 );
digitalWrite(s1pin, 0 );
}
// 読み込んだボタンの情報に変化があればBluetoothで送信
if (d0[0] != old0[0]) {
if (d0[0] == 0) {
bleGamepad.press(BUTTON_6);
} else {
bleGamepad.release(BUTTON_6);
}
}
if (d1[0] != old1[0]) {
if (d1[0] == 0) {
bleGamepad.press(BUTTON_5);
} else {
bleGamepad.release(BUTTON_5);
}
}
if (d2[0] != old2[0]) {
if (d2[0] == 0) {
bleGamepad.press(BUTTON_4);
} else {
bleGamepad.release(BUTTON_4);
}
}
if (d3[0] != old3[0]) {
if (d3[0] == 0) {
bleGamepad.press(BUTTON_8);
} else {
bleGamepad.release(BUTTON_8);
}
}
if (d0[2] != old0[2]) {
if (d0[2] == 0) {
bleGamepad.press(BUTTON_2);
} else {
bleGamepad.release(BUTTON_2);
}
}
if (d1[2] != old1[2]) {
if (d1[2] == 0) {
bleGamepad.press(BUTTON_3);
} else {
bleGamepad.release(BUTTON_3);
}
}
if (d2[2] != old2[2]) {
if (d2[2] == 0) {
bleGamepad.press(BUTTON_1);
} else {
bleGamepad.release(BUTTON_1);
}
}
if (d3[2] != old3[2]) {
if (d3[2] == 0) {
bleGamepad.press(BUTTON_9);
} else {
bleGamepad.release(BUTTON_9);
}
}
if (d3[3] != old3[3]) {
if (d3[3] == 0) {
bleGamepad.press(BUTTON_7);
} else {
bleGamepad.release(BUTTON_7);
}
}
// 現値を旧値にコピー
for (int i=0; i <= 3; i++){
old0[i] = d0[i];
old1[i] = d1[i];
old2[i] = d2[i];
old3[i] = d3[i];
}
// ATOM liteのボタンに変化があればボタン10として送信
btn = M5.Btn.isPressed();
if ( btn != oldbtn) {
if ( btn == 1) {
bleGamepad.press(BUTTON_10);
} else {
bleGamepad.release(BUTTON_10);
}
oldbtn = btn; // 現値を旧値にコピー
}
// 方向キーに変化があれば、方向キーをBluetoothで送信
hat = d0[1]*1000 + d1[1]*100 + d2[1]*10 + d3[1];
if (oldhat != hat) {
switch( hat ) {
case 101:
bleGamepad.setHat1(HAT_UP_LEFT);
break;
case 110:
bleGamepad.setHat1(HAT_UP_RIGHT);
break;
case 111:
bleGamepad.setHat1(HAT_UP);
break;
case 1001:
bleGamepad.setHat1(HAT_DOWN_LEFT);
break;
case 1010:
bleGamepad.setHat1(HAT_DOWN_RIGHT);
break;
case 1011:
bleGamepad.setHat1(HAT_DOWN);
break;
case 1101:
bleGamepad.setHat1(HAT_LEFT);
break;
case 1110:
bleGamepad.setHat1(HAT_RIGHT);
break;
case 1111:
bleGamepad.setHat1(HAT_CENTERED);
break;
}
oldhat = hat; // 現値を旧値にコピー
}
delay(3); // 周回動作時間の調整用
}
}
次は専用基板も順調!
ATOM LiteとATOM TailBATを固定して普通のツールとして使えるような基板をKICADで作図しました。サンプル基板をJLCpcbで現在作ってもらってます!設計ミスがあり、修正版はPCBgogoで作ってもらうことにしましたww
そうそう、この基板の製作発注をする数時間前にATOM S3 Liteがスイッチサイエンスさんから発表されたので、ピンアサイン表だけ書き加えました!
※上の基板画像、シルク印刷参照
ATOM S3 Liteの方が省電力であってほしい、、、と願いながら酒を飲んで寝落ちしてましたww
スイッチサイエンスさんで欲しいものが合計3000円を超すようになったら即買い予定です。
この記事が気に入ったらサポートをしてみませんか?