TinyViewPlus 有線リモコン
BluetoothキーボードでTinyViewPlusに数字を送って計測する方法を実際のレースで試してみましたが、Bluetoothの接続が不安定になり、使い物にならなかったので、有線のリモコンを作成することにしました
使い方
・みっつのPilot番号のリモコンと本体のPilot番号を3.5mmオーディオケーブルで接続します(動作的には番号が一致する必要はありません、リモコンは全て同じものです)
・本体の小窓のショートピンをMacかPCで差し替えます
・本体の「USB KEY」と書かれた側のマイクロUSBとMacかPCにUSBケーブルで接続します
・「PROG」と書かれた側のコネクターは、新機能を追加するような時、マイコンを再プログラムする際に使いますので普段は使いません
・TinyViewPlusを起動後、レースモードにしスタートします
・それぞれのリモコンのカラースイッチを押すとラップを計測したのと同じ動作になりラップが計測され周回数が加算されます
・無彩色のボタンを押すと減算されます
・作りは単純なキーボードで
Pilot1はカラーボタンを押すと「5」
無彩色ボタンを押すとMacなら「cmd+5」、PCなら「alt+5」
Pilot2はカラーボタンを押すと「6」
無彩色ボタンを押すとMacなら「cmd+6」、PCなら「alt+6」
Pilot3はカラーボタンを押すと「7」
無彩色ボタンを押すとMacなら「cmd+7」、PCなら「alt+7」
がキーボードから入力されたのと同じ動作をします
・TinyViewPlusがアクティブになっていない時にボタンを押すとどうなるかわかりませんので注意が必要です
・マイコンのコネクターが元々丈夫ではありませんので接続の際には気をつけてください
作り方
割り込みを使う
Pilot1〜Pilot3の加算、減算合わせて6個のスイッチになるので、検出をLoopで回さずに割り込みで処理します
チャタリングはハードで
ソフトでdelayをかけてチャタリングを回避することが多いですが、入力を受け付けない時間ができてしまうので、今回はハードでチャタリングを回避します
ハード
今回使うマイコンはESP32S3で、USBデバイスになれる機能がついたものです。秋月電子通商で購入しました
向かって左側のマイクロUSBでスケッチを書き込み、向かって右側のマイクロUSBでUSB OTGデバイスとして繋ぎます
チャタリング回避はシュミットトリガ74LCX14で行います。IC1個でちょうど6個入っているので都合が良かったです
書き込み
書き込む際には左側のUARTと書かれたポートに接続して書き込みます
USBデバイスとして使うのでToolsメニューのUSB Modeの項目で、「USB-OTG(TinyUSB)」を選びます
スケッチ
17番をLOWにした時PC用に 減算 ALT + 数字を送ります
17番が開放の場合Mac用に 減算 Command + 数字を送ります
// Tools -> USB Mode --> USB OTG(TinyUSB)
// 4,Pilot1 Add SW
// 5,Pilot2 Sub SW
// 6,Pilot2 Add SW
// 7,Pilot2 Sub SW
// 15,Pilot3 Add SW
// 16,Pilot3 Sub SW
// 17,Mac(HIGH) or Win(LOW) SW
// 18,PilotLamp
#include "USB.h"
#include "USBHIDKeyboard.h"
USBHIDKeyboard Keyboard;
volatile bool pilot1Add = false;
volatile bool pilot1Sub = false;
volatile bool pilot2Add = false;
volatile bool pilot2Sub = false;
volatile bool pilot3Add = false;
volatile bool pilot3Sub = false;
const int pilotLED = 18;
void IRAM_ATTR addLap1() {
pilot1Add = true;
}
void IRAM_ATTR subLap1() {
pilot1Sub = true;
}
void IRAM_ATTR addLap2() {
pilot2Add = true;
}
void IRAM_ATTR subLap2() {
pilot2Sub = true;
}
void IRAM_ATTR addLap3() {
pilot3Add = true;
}
void IRAM_ATTR subLap3() {
pilot3Sub = true;
}
void setup() {
pinMode(pilotLED, OUTPUT);
pinMode(4, INPUT); // 4,Pilot1 Add SW
pinMode(5, INPUT); // 5,Pilot2 Sub SW
pinMode(6, INPUT); // 6,Pilot2 Add SW
pinMode(7, INPUT); // 7,Pilot2 Sub SW
pinMode(15, INPUT); // 15,Pilot3 Add SW
pinMode(16, INPUT); // 16,Pilot3 Sub SW
pinMode(17, INPUT_PULLUP); // 17,Mac(HIGH) or Win(LOW) SW
Keyboard.begin();
USB.begin();
delay(400);
digitalWrite(pilotLED, HIGH);
attachInterrupt(digitalPinToInterrupt(4), addLap1, RISING);
attachInterrupt(digitalPinToInterrupt(5), subLap1, RISING);
attachInterrupt(digitalPinToInterrupt(6), addLap2, RISING);
attachInterrupt(digitalPinToInterrupt(7), subLap2, RISING);
attachInterrupt(digitalPinToInterrupt(15), addLap3, RISING);
attachInterrupt(digitalPinToInterrupt(16), subLap3, RISING);
}
void loop() {
if (pilot1Add == true) {
Keyboard.write('5');
Keyboard.releaseAll();
pilot1Add = false;
}
if (pilot1Sub == true) {
if (digitalRead(17) == LOW) {
Keyboard.press(KEY_LEFT_ALT);
} else {
Keyboard.press(KEY_LEFT_GUI);
}
Keyboard.write('5');
Keyboard.releaseAll();
pilot1Sub = false;
}
if (pilot2Add == true) {
Keyboard.write('6');
Keyboard.releaseAll();
pilot2Add = false;
}
if (pilot2Sub == true) {
if (digitalRead(17) == LOW) {
Keyboard.press(KEY_LEFT_ALT);
} else {
Keyboard.press(KEY_LEFT_GUI);
}
Keyboard.write('6');
Keyboard.releaseAll();
pilot2Sub = false;
}
if (pilot3Add == true) {
Keyboard.write('7');
Keyboard.releaseAll();
pilot3Add = false;
}
if (pilot3Sub == true) {
if (digitalRead(17) == LOW) {
Keyboard.press(KEY_LEFT_ALT);
} else {
Keyboard.press(KEY_LEFT_GUI);
}
Keyboard.write('7');
Keyboard.releaseAll();
pilot3Sub = false;
}
}