以下、書いたんですが、2週間くらい使ってみたものの接続が切れてなのか通信しない(押しても記録されない)ことが頻発したため運用を中止しました。コネクション管理機能とか付加しないと実用にはならないと思われます。
背景
大学の勤怠管理としてジョブカンというWebサービスが試験運用中です.出退勤時にWebページを開くのをちょくちょく忘れてしまうのでオリジナルコントローラを何となく作ってみたという記事を以前に書きました.
コントローラが部屋内にあるので目につくため出勤時・退勤時の忘れは激減しました.それでも出勤直後から会議があったり帰りのバスが迫ってすぐに部屋を出なければならないときなど忘れてしまうことがありました.
実はコントローラを置いている場所がPCの設置場所の都合で部屋の隅なんですが,ランプが光っていても目につかないこともあってできたら部屋の入口付近に置きたいな...とずっと思っていました.
でも,PCを置く場所はないし...コントローラくらいは置く場所があるので無線化できればなんとかなるな...と以前から思ってはいたんですね.で,後期の試験も終わり少し時間が空いたので昨晩作ってみたという記事になります.
無線化
上記で作成したジョブカンコントローラはArduino Nano(中華製)で動作していました.なので,無線機能は搭載されていません.他のマイコンに置き換える必要があるな...とobnizとかM5 Stackとか部屋にあるもので簡単にできないか探っていたのですが,一番簡単そうなのがESP32 Developerでした.これも以前,何かのために購入していたものでした.WifiもBluetoothもありますが,今回はPC側でWeb Serialを使っているのでBluetoothを使いました.
ESP32でBluetooth接続で動かした以下の記事を見つけてすぐに動作したのが採用の理由です.ありがとうございます.ほんと,こういう情報提供は嬉しいです.感謝っす.
あまり時間がないので簡単に書きます.すいません.
Arduino NanoのコードをそのままESP32に置き換えようとしたのですが,ゲームボタン?を点灯するには5Vが必要になりまして,ESP32のdititalWriteでは3.3Vまでしか出ないということがわかりました.そういえば内部電圧が違ったのでした...昇圧ICを買ってきて...とも思いましたが,面倒だったので,Arduino Nanoはそのままにして,ボタンが押されたときにBluetoothを送る仕事だけESP32に委譲することにしました.プチ贅沢ですが...
回路図書いている時間がないので...申し訳ないですが写真だけ.
見えないと思いますので要点だけ書きます.
Arduino Nano
- ボタンSWのLED⇒D2
- ボタンSWの+側⇒D3
- ボタンSWのGND⇒GND
- 圧電SP⇒D6とGND
- ESP32へボタンSWが押されたことを通知する(HIGH/LOW)⇒D4
ESP32
やっつけコードですが一応挙げておきます.
Arduino Nano
bool blinking = false; int lamp = LOW; long pre_time = 0; bool send_flag = false; void setup() { Serial.begin(9600); pinMode(2, OUTPUT); pinMode(3, INPUT_PULLUP); pinMode(4, OUTPUT); //ESP32連携用 delay(500); //すぐ実行するとスイッチが押されたことになる } void loop() { //detecting pushing button if (digitalRead(3) == LOW) { if (send_flag == false) { digitalWrite(4, HIGH); blinking = !blinking; if (blinking == true) { Serial.println("I"); beep_in(); } else { Serial.println("I"); beep_out(); lamp = LOW; } send_flag = true; } } else { digitalWrite(4, LOW); send_flag = false; } //make blinking a lamp if (blinking) { if (millis() - pre_time > 300) { lamp = !lamp; pre_time = millis(); } } digitalWrite(2, lamp); delay(100); } void beep_in() { tone(6, 1500); delay(50); noTone(6); delay(50); tone(6, 1500); delay(50); noTone(6); delay(50); tone(6, 2000); delay(300); noTone(6); } void beep_out() { tone(6, 2000); delay(50); noTone(6); delay(50); tone(6, 2000); delay(50); noTone(6); delay(50); tone(6, 1500); delay(300); noTone(6); }
ESP32
#include <Arduino.h> #include "BluetoothSerial.h" BluetoothSerial SerialBT; #define BTN_SW 12 bool send_flag = false; void setup() { SerialBT.begin("JOBCAN"); pinMode(BTN_SW, INPUT); delay(500); //すぐ実行するとスイッチが押されたことになる } void loop() { if (digitalRead(BTN_SW) == HIGH) { if (send_flag == false) { SerialBT.println("I"); send_flag = true; } } else { send_flag = false; } delay(100); }
動かしているところを撮影しました.コントローラを隣においていますが,もちろんBluetoothで接続しているので離れた場所でも動作します.これ嬉しい.
今回やってみて,シリアル通信の無線化はできることはわかっていたけど実際にはやったことなかったんですね...これまで研究室でオリジナルゲームコントローラの制作をしてきたのですがいずれの有線でした.無線対応は簡単にできるな...ということが気づきです.でも,Unity側はどうなるのかな...やってみないとわからないな.また今度.