☎️

2019年:M5StickCで、いま敢えて【ポケベル】を作る!!

2021/09/12に公開

※注意)Qiitaからの移転で、2019年06月19日に投稿した記事です

無くしてはいけない文化がある

というほど思い入れもないのですが、一応ポケベル世代ではあったので、間もなく(2019/09/30に)サービスが終了するポケベルを、自作して後世に残そう!的なアレです。

完成品はこちら

  • リストバンド付きなので、腕時計のように装着できます
  • 通知のはじめに1秒間振動し、少し間を開けて、数字の順に数字の数だけ「ブ… ブ… ブ… 」と振動します
  • ↑の動画は、ポケベルというよりは、三々七拍子で活気づけ「337337」
  • ポケベル的には「10105(いまどこ)」とか「49106(至急TEL)」とか「33414(さみしいよ)」とか送る感じですかね。(憧れてました、そういうのに…)
  • 「懐かしいなぁ」と感じた方は、この辺 読んでみると、「あー、あったねぇ」という感じになれるかも。

以下、レシピ

Firebase での作業

  1. 新規プロジェクト作成
  2. 左メニュー > Database > Realtime Database 「データベースを作成」 > テストモードで開始
  3. message: 1 を追加
  4. 左メニュー > 歯車 > プロジェクトの設定 > サービスアカウント > Database secrets > シークレットのコピー

※Database secretsは廃止されたっぽいので、あまり使わない方が良さそうですが、今現在まだ使えるのと、ささっと試したいので、使ってしまいます
※Firebaseは、そもそもそんなに慣れてないので、もっと良い方法がきっとある…

Arduino IDE での作業

  1. まずは このあたり を参考に Arduino IDE + M5StickC の環境設定を済ませてください。
    (いきなり雑ですみません…)
  2. 次に M5StickC から Firebase に繋ぎに行くために、IDEにライブラリをインストール。
    https://github.com/ioxhop/IOXhop_FirebaseESP32 の緑ボタンから、Zipをdownloadして、
    スケッチ > ライブラリをインクルード > .ZIP形式のライブラリをインストール
  3. 同ライブラリに「Needs: ArduinoJson V5.13.3」の記載があるので、ArduinoJson V5.13もライブラリマネージャーからインストールしておく。
  4. 今回使ったスケッチは以下

スケッチ

  • Arduino IDEを初めて使う方は、ツール > シリアルモニタ が便利です。
    シリアルモニタ下のプルダウンbps115200 bpsで。
#include <IOXhop_FirebaseESP32.h>

#define WIFI_SSID "<WiFiのSSID>"
#define WIFI_PASSWORD "<WiFiのパスワード>"

#define FIREBASE_DB_URL "<プロジェクト名>.firebaseio.com"
#define FIREBASE_DB_AUTH "<シークレット>"
#define FIREBASE_DB_DATA "/message"

#include <EEPROM.h>
#include <WiFi.h>
#include <M5StickC.h>

const int FontSizeMid=4;
const int MoPin = 33;

boolean atfst = true;

bool BtnHomePressd()
{
  return (digitalRead(M5_BUTTON_HOME) == LOW);
}

void clearScreen()
{
  M5.Lcd.setTextColor(WHITE);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.drawString("\n .", 0, 0, FontSizeMid);
}

void showMessage(String data)
{
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.drawString(data, 0, 0, FontSizeMid);
}

void viveWait(String msg){
  Serial.println("vive start");

  digitalWrite(MoPin, HIGH);
  delay(1000);
  digitalWrite(MoPin, LOW);
  delay(500);

  int num = msg.toInt();
  Serial.print("num: ");
  Serial.println(num);
  for (int i = 0; i <= msg.length(); i++) {
    char cn = msg.charAt(i);
    Serial.print("cn: ");
    Serial.println(cn);
    char temp[4];
    sprintf( temp, "%c", cn );
    int n = atoi( temp );
    Serial.print("n: ");
    Serial.println(n);
    if ( n == 0 ){
        digitalWrite(MoPin, HIGH);
        delay(1000);
        digitalWrite(MoPin, LOW);
        delay(200);
    } else {
      for (int j = 0; j < n; j++) {
        digitalWrite(MoPin, HIGH);
        delay(200);
        digitalWrite(MoPin, LOW);
        delay(200);
      }
    }
    delay(500);
  }

  Serial.println("vive end");
  digitalWrite(MoPin, LOW);
}

void setup()
{

  Serial.print("start");
  Serial.begin(115200);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("connecting");
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(500);
  }
  Serial.println();
  Serial.print("connected: ");
  Serial.println(WiFi.localIP());
  delay(500);

  Firebase.begin(FIREBASE_DB_URL, FIREBASE_DB_AUTH);

  Firebase.stream(FIREBASE_DB_DATA, [](FirebaseStream stream) {
    String eventType = stream.getEvent();
    eventType.toLowerCase();

    Serial.print("event: ");
    Serial.println(eventType);
    if (atfst) {
      atfst = false;
    } else if (eventType == "put"){
      String data = stream.getDataString();
      Serial.print("data: ");
      Serial.println(data);
      showMessage("Mission Start!");
      Serial.println("showMessage");
      showMessage(data);
      viveWait(data);
    }
  });
  
  pinMode( MoPin, OUTPUT );
  
  M5.begin();
  M5.Lcd.setRotation(3);
  pinMode(M5_BUTTON_HOME, INPUT);  
  pinMode(M5_BUTTON_RST, INPUT);

  Serial.print("m5Begein ");
  clearScreen();
}

void loop()
{
  int clearCnt = 0;
  if (BtnHomePressd())
  {
    while(BtnHomePressd()) clearCnt++;
    if( clearCnt > 100){
      clearScreen();
    }    
  }
  delay(20);
}

M5StickCって何?

  • WiFi、Bluetooth、マイク、液晶、Grobeポート、GPIO等など、IoTや電子工作を楽しむための各種機能がぎっしりつまった親指サイズの玩具
  • 詳細は、スイッチサイエンスさんの販売ページ を要参照
  • この手の「持ち運び向けの小型なマイコン」は、電源周りがシンドい印象があるのですが、M5StickCはバッテリー内蔵なので、もうそこ悩む必要がない
  • ケースに入ってるのでゴチャゴチャしないし、リストバンド付きで「なんちゃってスマートウォッチ」も実装可能
  • 何より一番うれしいのは、これだけ充実して、お値段わずか2,000円弱という『衝撃の価格』!!

その他

  • 本作は、ハッカソンの事前アイデアソンで挙がったアイデアを元に制作されました
  • スケッチは、同じチームのハッカソンメンバーが作成したモノをお借りして、ポケベル仕様に変更しました。※めっちゃ改悪
  • ほかにも色々作りたいモノ、ここに記載したいアイデアもありますが、それはまた追々

Discussion