ラベル M5Atom の投稿を表示しています。 すべての投稿を表示
ラベル M5Atom の投稿を表示しています。 すべての投稿を表示

2020年4月30日木曜日

M5Atomで『離席中』対策装置を作成

PCの無操作スクリーンロック、離席中ステータス表示などを回避する装置を作成する

概要

・M5AtomはPCからBluetoothマウスとして認識される

・以下の内部状態を持つ
 ・ペアリングモード
 ・待機モード
 ・自動動作モード

・ペアリングモード
 PCとのペアリングを待つ
 成功時は待機モードに遷移

・待機モード
 ユーザーのM5Atomボタン押し操作を待つ
 ボタンが押されたら自動動作モードに遷移

・自動動作モード
 マウスカーソルを常時動かし続ける
 ユーザーのM5Atomボタン押し操作を待つ
 ボタンが押されたら待機モードに遷移

作成方法

ソースコード(後述)をビルドしてM5Atomに書き込み

使用方法

初回のみペアリング操作が必要

ペアリング: 
 M5Atomを通電させてLEDが白色(ペアリングモード)になることを確認
 PCの設定からBluetooth機器の追加(ESP32 Bluetooth Mouse)を行う
 LEDが赤色(待機モード)になることを確認
 初回以降は通電後自動的にPCと接続される

動作の切り替え:
 LED赤色表示(待機モード)でM5Atomのボタンを押す
 LEDが緑色(自動動作モード)になることを確認
 マウスカーソルが自動的に動く
 再度ボタンを押すとLEDが赤色表示(待機モード)になりマウスカーソルは止まる

ソースコード解説

ESP32 Bluetooth Mouseライブラリ+M5AtomのButtonサンプルコード
loop()でマウスカーソルを動かす箇所は見栄えを良くしているだけでもっと簡単でよい

ソースコード


#include "M5Atom.h"
#include <BleMouse.h>

#define MAX_X 320
#define MAX_Y 240

int point_x = 0;
int point_y = 0;

int dir_x = 1;
int dir_y = 1;

int moveFlag = 0;

BleMouse bleMouse;

uint8_t DisBuff[2 + 5 * 5 * 3];

void setBuff(uint8_t Rdata, uint8_t Gdata, uint8_t Bdata)
{
    DisBuff[0] = 0x05;
    DisBuff[1] = 0x05;
    for (int i = 0; i < 25; i++)
    {
        DisBuff[2 + i * 3 + 0] = Rdata;
        DisBuff[2 + i * 3 + 1] = Gdata;
        DisBuff[2 + i * 3 + 2] = Bdata;
    }
}

void setup() {
  Serial.begin(115200);
  Serial.println("Starting BLE work!");
  bleMouse.begin();
  M5.begin(true, false, true);

  setBuff(0x10, 0x10, 0x10);
  M5.dis.displaybuff(DisBuff);
  while(1)
  {
    if(bleMouse.isConnected()) {
      Serial.println("Connect");
      setBuff(0x10, 0x00, 0x00);
      M5.dis.displaybuff(DisBuff);      
      break;      
    }
    delay(100);
    Serial.print(".");
  }  
}

void loop() {

    if (M5.Btn.wasPressed())
    {
      if(moveFlag == 0)
      {
        moveFlag = 1;
        setBuff(0x00, 0x10, 0x00);
      }
      else
      {
        moveFlag = 0;
        setBuff(0x10, 0x00, 0x00);
      }
      M5.dis.displaybuff(DisBuff);      
    }
    if(moveFlag == 1)
    {
      bleMouse.move(dir_x, dir_y);
      point_x += dir_x;
      if(point_x <= 0)
      {
        point_x = 0;
        dir_x = 1;
      }
      else if(MAX_X <= point_x)
      {
        point_x = MAX_X;
        dir_x = -1;
      }
      
      point_y += dir_y;
      if(point_y <= 0)
      {
        point_y = 0;
        dir_y = 1;
      }
      else if(MAX_Y <= point_y)
      {
        point_y = MAX_Y;
        dir_y = -1;
      }
    }
    delay(5);
    M5.update();  
  
}

2020年3月13日金曜日

m5Atomの給電方法を調べたメモ

m5Stack公式のツイートを発見
これを信じるならば背面5Vへの電源供給は正常な用法といえる

Fake Wifi-GeoLocation for M5Atom x6概要

M5Stack ATOM LITE(以下M5Atom)を使ったWifi位置偽装装置を作った


ざっくり概要:

・6台のM5Atom(APモード)とM5StickCを片方向シリアル接続
 M5SticKCから6台のM5Atomへ片方向通信が可能
 各M5AtomへMACアドレス変更命令を出す

・Wifi位置偽装の理屈
 MACアドレスを詐称した複数のWifiアクセスポイント(AP)を立てる
 Wifiによる位置測定では周囲のWifiAPのユニークIDとしてMACアドレスを使う
 特定位置にあるWifiAP群のMACアドレスを再現すれば位置偽装ができる
 当然ながら位置測定にGPSを併用する場合には無力
 (動画で使っている端末はiPodTouch/こけおどし的デモ)

配線の様子:L字のロングピンが無かったので手曲げで作った

テクニカルな話:

・背面電源供給時の発熱が凄い
 5V≒VCC端子という想定で回路を組んだが発熱が凄い
 単体へのUSB給電と明らかな差がある
 仕様を問い合わせた方がいいかもしれない

・ESP8266とMACアドレス変更関数が異なる
 ESP8266でのwifi_set_macaddr()にあたる関数はesp_wifi_set_mac()

・動画のUSB給電は定格電流を加味していないので注意
 試しに動作させたら動いただけ
 USB給電→背面5Vピンの定格電流は不明
 一応動作しているものの何の保証もない

2020年3月12日木曜日

Tic Tac Toe for M5Atom x9概要

M5Stack ATOM LITE(以下M5Atom)を使った〇×ゲーム(Tic Tac Toe)を作成した


ざっくり概要:

・9台のM5Atomを片方向シリアル接続しており、環状に通信可能
 上流から来た情報を下流に再送するイメージ
 この環状通信でボタンの押し下げとLED点灯命令をやりとりする

・9台のうち1台が親機で残りは子機
 〇×ゲームを処理するのは親機
 子機へのLED点灯命令発行、子機からのボタン押し下げイベント受理を行う
 子機は自分のボタン監視(イベント発行)とLED制御のみ

配線の様子:ジャンパ線の長さがまちまちなのは手製のため

テクニカルな話:

・M5Atomは背面5Vへの電源供給で動作
 実動作上は5V≒VCC端子
 回路図が公開されていないのでやや不安
 給電には5V2AのACアダプタ使用
 3/13追記:
  背面からの給電でアクセスポイントとして動作させた際の発熱が凄い
  USB給電の場合と比べてはっきりと発熱に差がある
  仕様がはっきりするまで給電に使うべきではないかも…

・1台にUSB給電するとほかの8台もドライブしてしまう
 定格電流やUSB給電の仕様が公開されてないので怖くて使っていない
 一台当たり50mA強はいけそうな気もするが…?
 今後の課題とする

・〇×ゲームにはミニマックス法を使ったため、プレーヤーは一生勝てない
 クソゲーである
 (※〇×ゲームは互いに最善手を打つ限り常に引き分けるゲーム)
 意図的に手加減する処理を入れないと病む

M5Atomは電源周りの情報がないのが不安