2020年9月3日木曜日

pokemon Go BOT (位置偽装装置)の改修

以前に作成したポケモンGoBOTに大きく手を加えた
おそらくこれが最終版となる
以下はそのメモ



位置偽装ユニット統合版

以前のポケモンGoBOTは3つのユニットから構成されていた
今回はこれを1つのユニットに統合した
制御マイコンはM5StickCであり、以下の機能をすべて担当する
・wifi位置偽装
・PCからの位置偽装データ受信(および保持)
・サーボモータ制御




TIPS

・スマホの充電ケーブルへの負荷が大きかったため、負荷分散する構造に変更

・サーボは最大電流400mA程度のものを使用
 →M5StickCの5Vから電源供給しているため、ギリギリ

・PCからの位置偽装データ受信方法を変更
 旧:逐次データを受け取る。PC側で送信をループする
 新:最初に一括で受け取る。M5StickC側で参照をループする
 →BOT動作中にPCを占有する必要がなくなった
  データ受信後はUSB電源に接続すればよい



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月14日土曜日

Fake Wifi-GeoLocation for M5StickC概要

前回、M5Atomを6台使ったWifi位置偽装装置を作成したのだが
twitterで『これはESP32単体で実現できる』旨の指摘を受けた
以下は教わった情報をもとにM5StickC1台だけでWifi位置偽装装置を作成したメモ

Wifi位置偽装装置への指摘

M5Atom6台の作例ではそれぞれをアクセスポイント(AP)として動作させていた
しかしMACアドレス詐称目的ならばフル機能のAPは必要ない
詐称したMACアドレスを含むBeaconフレーム送信機能だけでよい

ミニマムなBeacon送信を実装できればM5Atomを複数使う必要もない
6台分のBeaconフレームを1台でサイクル送信し続ければよい

『MACアドレスを詐称した複数のAPを立てる』がアイデアの根幹であったため上記の指摘は目から鱗であった

作成

教わったGithubのサンプルコード
https://github.com/Jeija/esp32-80211-tx
ESP-IDF用のプロジェクトだがArduino IDE環境でもほぼそのまま流用できる
(構造体初期化などコンパイラに蹴られる部分あり)

サンプルでは8つのSSIDを切り替えてBeaconフレームをサイクル送信している
これを任意MACアドレスを切り替える方式に修正して前回のソースとマージした

動作チェック

複数台APを立てる現行方式と全く遜色ない
むしろMACアドレス変更→リブートに数秒かかっていた現行方式よりも良い

コスト・機能ともに改善されてうれしい反面、急にブレイクスルーが来てしまい戸惑う
詳しい人の知見とアドバイスは最高

グッバイ旧プロジェクト

2020年3月13日金曜日

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

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

wifi位置偽装方法のざっくり解説

スマホのWifiを使った位置測定の基礎知識:


測定シーケンスは以下の通り
・周囲にあるwifiアクセスポイント(複数)の名前を調べる
 →wifiアクセスポイント:個人宅の無線LANルータや店舗のホットスポットなど
・アクセスポイントの名前を使って位置情報データベースを検索する
・データベースから位置座標を取得する

メリットはGPSより測定が高速なこと
デメリットはデータベースへのアクセスが必要なこと、精度が悪いこと
このためGPSと併用して使われることが多い

Wifi位置測定を騙す偽装方法:

偽装方法は以下のとおり
・偽装先の周囲にあるwifiアクセスポイントの名前を調べる
・名前が可変のアクセスポイントを複数準備する
・偽装先で調べたアクセスポイントの名前を準備したアクセスポイントに設定する

メリットは特殊な機材や高度なプログラミングが不要であること
デメリットは現地調査が必要なこと、精度が悪いこと、ノイズが多いこと、GPSと併用されると成立しないこと

テクニカルな補記:


・上記における『アクセスポイント名』とはBSSID(≒MACアドレス)のこと、SSIDではない
・位置情報データベースは複数存在する(google、Apple、MS…)
・データベースによってはSSID、電波強度等も副次的なパラメータとして使用する
・データベースは逐次更新される
・偽装用アクセスポイント以外の電波を遮断(減衰)する工夫がないと使い物にならない
 (もともと周囲にあるアクセスポイントが位置情報データベース検索に使われてしまう)
・ウォードライビングサイトなどで現地調査を省くことができる(場合がある)
・偽装用アクセスポイントはIP網に接続する必要は無い
・偽装用アクセスポイントの電波強度は極弱にすること
 (第三者の位置測定における酷いノイズになる)

※この方法は実用性がないので『アプローチは面白い』以上のものにはならない
  (ソフトウェアで偽装する方が簡単で精度も高い)

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は電源周りの情報がないのが不安

2020年2月21日金曜日

M5Stack ATOM LITEを購入

AliExpressで注文したATOM LITEが届いたのでそのメモ
なお技適の問題があるので使用にはご注意

ATOM LITEとは

M5StickCからLCDとバッテリーなどを外した小型のM5Stack
上位機種として5x5のLEDを搭載したATOM Matrixがある
USB-シリアル変換付きで筐体のあるミニマムなESP32といったところ

小型のM5Stack

外観

24x24x10mmとM5StickCの半分以下のサイズ
背面に2.54mmピッチのGPIOポート
他のポートはUSBType-CとGroveポート
※公式ページには4P PH2.0とあるが明らかにGroveポート
 PHコネクタ4ピンは干渉して挿さらないことを確認
 強引に挿すためには両方を切削する必要がある

パッケージ/本体以外の同梱物無し
現物の表と裏/技適表記は無い/Groveポートのノッチ付きコネクタが確認できる
筐体を開けた状態(裏側)/ピン表記シールの下にはM2ビス用穴あり
筐体を開けた状態(表側)/内部チップにも当然ながら技適表記無し

動作確認(電源供給だけ)

公式ページで回路図が未公開のため以下の2点を実機動作確認した
(※回路をチェックしたわけではないので注意)

1.背面GPIOポートの5Vから本体に給電できるか
 →できる
2.Groveポートの5Vから本体に給電できるか
 →できる

LITE複数使いの場合にTypeCケーブルを何本もぶら下げる必要はない模様

5VをGrove端子から入力→成功
5Vを背面5Vポートから入力→成功


2020年1月8日水曜日

banggoodで中国から電子工作パーツ購入のメモ

amazonにて中国発送の電子工作パーツをよく購入している
これはもう中国のECサイトから直接購入すればよいのではないか?と思い立ち実行した
以下はそのメモ

banggood

最初の候補はAliExpressだったが、コンビニ決済に対応していたためbanggoodに変更
やはり海外サイトでカード決済するのはためらいがある

banggoodはエレクトロニクス製品以外も扱う総合ECサイト
ドローンを始めとしたRCパーツが強いのが特徴
AliExpressあたりと比べると明らかな海賊版は排除されている傾向がある
(偽ポケモンGOプラスなど)
結論だけ言うとイマイチでした

買ったもの

 ・M5StickC(マウンタ付き) x1    1292円
 ・ESP8285ボード     x10    3140円

M5StickCは市価の3割引
ESP8285ボードはシンプルな構成で使いやすそうだったので購入

購入の手続き

 国内ECサイトと変わらず
 Emailアドレス、住所名前等を記入するとコンビニ決済用の番号が表示される
 コンビニにて決済して注文完了
 (念のため英語表記で住所を記入したが日本語でもいけるらしい)

 ポイントは発送方法の選択
 一番安い郵便(追跡不可能)から宅配便まで3~4程度の選択肢あり
 (商品や取扱いメーカーにより異なる)
 高いほど安全で早い
 今回は安い方から2番目を選択

タイムラインとトラブル発生

 8/15 オーダー提出
 8/16 支払完了
 8/23 クレームを入れる
 8/26 『発送』にステータス変更
 8/27 (オーダー時の到着予定日)
 9/10 到着

 注文時は『到着予定日』が8/27であった
 8/23に未だ発送がされないことについて問い合わせをする
 (問い合わせは英文にてフォーム入力)

 担当者の回答は
 『到着予定日前だから処理は正常、予定日を過ぎても発送されなければ対応する』
 とのこと
 文化が違う…
 問い合わせから数日後に発送→二週間後に着

 商品はすべて正常動作した
 ボードはなぜか11個入っていた

所感

 トラブルによる遅延は悪印象
 (担当者の返信だけは高速レスポンスだったが)
 中国からの輸送時間(2週間程度)は元々想定内であったが実際はその倍かかった
 決済にクレカ番号の入力が不要であったことはよかった

 安価かつすぐに必要の無いものならば買っても良いか?という感じ
 中国ECサイトから買って日Amazonで売るだけの商売が成立する理由が分かった
 (Amazonが挟まるだけでもリスクヘッジが大きい)
 





ESP8266を用いたwifi位置偽装装置の電流値測定

ESP8285を用いてモバイル電源で動作する位置偽装装置の開発を予定している

モバイル電源の使用にはESP系チップの高い消費電流がネックとなる
定格とは別に位置偽装装置システムにおける実消費電流を調査する

ESP8266の動作と消費電流

パワーオン時に200~300mAのピークがあると言われている
いったん起動してしまえばデータシートどおりの動作をする
起動時に電源の電流容量が不足すれば電圧降下によって起動できないケースがでてくる
自己復旧できないのでこれは問題

測定対象システムの概要

位置偽装ユニット
ESP8266を6基、RN-41-SMを1基使用
ESP8266はwifiサーバとして動作し、30秒おきに設定が変更されリスタート
RN-41は30秒おきに接続先からマクロを受け取る

実測定結果(起動時)

5回測定のピーク電流が1200mA弱
300mA×6を覚悟していたが実動作上はタイミングが重複するわけではない模様
(元からサーバをbeginするタイミングはズラしている/効いているかは不明)
測定モレするようなスパイク状のピークがあった場合は見逃してしまうので注意

電源端子のあたりで測定
測定例

測定結果(動作中)

動作を10分継続した場合のピーク電流は600mA弱
定常電流との振れ幅は100mA未満
こちらは想定よりも高め

考察

起動時のピーク電流さえやり過ごせば1Aもあれば良い
・ESP8266を二群に分けてディレイ電源供給
 →ピーク電流は900mA程度?
・ESP8266をリレー形式で1つずつディレイ電源供給
 →ピーク電流は700mA程度?
剛腕戦略をとるならば2Aのモバイル電源を用意すればいい

消費電力は定常電流に3.0Vをかければいいので定常ピークで考えても1800mW程度
モバイル運用しても問題ない程度の消費電力と言える

INA219ブレイクアウトボード+M5Stackで簡易電流測定

以下は簡易電流測定器を作成したメモ

動機は電流測定無しでESP8266系チップを弄るのに限界を感じたため

INA219ブレイクアウトボード

今回はAdafruit製のブレイクアウトボードを使用
測定した電流をI2C経由で読み取り可能
(同様の模造品が沢山あり、そちらでも問題無いハズ)

電流測定したい箇所にVin+とVin-を使って挟み込む(GND側がVin-)
電圧も測定したければ測定対象と更にGNDを接続する
困ったらAdafruit

M5Stack

ディスプレイがあり、microSDカードが読み書きできるため使用
(ただし今回はまだSDカード出力は実装していない)
GPIO21(SDA)、GPIO22(SDL)を用いればI2Cライブラリを使用可能
(SDA、SDLポートが別途あるが、内部で結線されている)

作成方法(配線)

M5Stackの上部端子(メス/2.54mmピッチ)に
・GND
・3V
・GPIO21(SDA)
・GPIO22(SDL)
が並んでいるのでこれをINA219に結線すればよい

INA219の各端子に2.54mmピッチのピンを立てる
都合の悪いことにSDAとSDLの位置が逆
今回は極細配線で強引にクロス接続した
(本当は中継基板を作ってそこでクロスさせた方が楽で賢い)

Vin+とVin-にアクセスしやすいように端子台とメス端子をハンダ付けして終了

INA219(4ピンオス)を上部端子(8ピンメス)に挿して運用すると事故原因になる
このためダミー4ピンオスを追加して8ピンオスとしている
(ダミーは結線せず、根本で切断)

結線:SDAとSDLのクロスが強引
結線:SDAとSDLをこね回した結果のコゲが痛ましい

作成方法(プログラミング)

INA219ブレイクアウトボードはArduino用ライブラリが存在
(Adafruit_INA219.h)
機種依存が無いためM5Stackでもそのまま流用できる
Adafruit社ページからDLしてArduinoライブラリにインポート
(あるいは『ライブラリ管理』から『INA219』で絞り込んで導入)

M5Stackの画面表示はサンプルスケッチ参照のこと

SDカードに吐き出す部分を作ればロガーになるがひとまず測定のみ実装
ピーク電流を比較・更新する以外はAPIの結果をそのまま表示しているだけ

測定回路のGNDをM5StackのGNDに接続する必要あり/写真の使い方では電圧測定値は無効
マルチメータで確認

2020年ToDo

wifi位置偽装装置携帯版の作成

ESP8285とM5Stack(あるいはM5StickC)を用いて作成
可能ならばモバイルバッテリーで動作させる

簡易電流ロガーの作成

M5StackとINA219ブレイクアウトボードを用いて作成
wifi位置偽装装置の最大電流値を測定するため

スマホ連射装置の作成

リレータッチボード(SWITCHSCIENCE製)と点滅LEDを用いて作成
電源はUSB
まともなケースとケーブルを用いて体裁を整えたもの

スマホ連射装置(ペンタイプ)の作成

リレーと点滅LEDを用いて作成
リレータッチボードを用いず、パッド部分を自作する
実用性を考えてペンタイプとする

簡易静電容量ロガーの作成

M5StackとMPR121ブレイクアウトボードを用いて作成
スマホ連射装置のパッド部分の作成に必要