memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

「ジョブカン」コントローラの無線化

以下、書いたんですが、2週間くらい使ってみたものの接続が切れてなのか通信しない(押しても記録されない)ことが頻発したため運用を中止しました。コネクション管理機能とか付加しないと実用にはならないと思われます。

背景

大学の勤怠管理としてジョブカンというWebサービスが試験運用中です.出退勤時にWebページを開くのをちょくちょく忘れてしまうのでオリジナルコントローラを何となく作ってみたという記事を以前に書きました.

memorandums.hatenablog.com

コントローラが部屋内にあるので目につくため出勤時・退勤時の忘れは激減しました.それでも出勤直後から会議があったり帰りのバスが迫ってすぐに部屋を出なければならないときなど忘れてしまうことがありました.

実はコントローラを置いている場所がPCの設置場所の都合で部屋の隅なんですが,ランプが光っていても目につかないこともあってできたら部屋の入口付近に置きたいな...とずっと思っていました.

でも,PCを置く場所はないし...コントローラくらいは置く場所があるので無線化できればなんとかなるな...と以前から思ってはいたんですね.で,後期の試験も終わり少し時間が空いたので昨晩作ってみたという記事になります.

無線化

上記で作成したジョブカンコントローラはArduino Nano(中華製)で動作していました.なので,無線機能は搭載されていません.他のマイコンに置き換える必要があるな...とobnizとかM5 Stackとか部屋にあるもので簡単にできないか探っていたのですが,一番簡単そうなのがESP32 Developerでした.これも以前,何かのために購入していたものでした.WifiBluetoothもありますが,今回はPC側でWeb Serialを使っているのでBluetoothを使いました.

ESP32でBluetooth接続で動かした以下の記事を見つけてすぐに動作したのが採用の理由です.ありがとうございます.ほんと,こういう情報提供は嬉しいです.感謝っす.

toyoshi.hatenablog.com

あまり時間がないので簡単に書きます.すいません.

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で接続しているので離れた場所でも動作します.これ嬉しい.

youtu.be

今回やってみて,シリアル通信の無線化はできることはわかっていたけど実際にはやったことなかったんですね...これまで研究室でオリジナルゲームコントローラの制作をしてきたのですがいずれの有線でした.無線対応は簡単にできるな...ということが気づきです.でも,Unity側はどうなるのかな...やってみないとわからないな.また今度.