プリメイドaiをWiFiで動かそう　分解からアプリ起動まで

プリメイドai用WiFiブリッジを作ったよ プリメイドaiをWiFi化を以前書きました
https://qiita.com/usashirou/items/622cb3d7ab2e46ecf5e8
が、分解からアプリまでをマニュアルにしてほしいということで今回書きました。
##工具
精密ドライバー（♯0や♯00サイズなど　＋ネジのみです）
（ケース）オープナー（先端が平たい工具で、傷防止のため樹脂の方が良いです）

##分解
まずは耳を分解をしましょう。
![DSC_0034 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f0f99396-55d9-efd1-544d-42743f2d0bc4.jpeg)

突起の部分にオープナーを入れてこじ開けます。(力は要りませんので過度な力をかけない事）
*写真は耳の部品が上下逆になっていると思います。
![DSC_0032 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d8786eef-d064-5177-3b7e-d47581822f92.jpeg)

両耳の内側のネジ3本ずつを外します。
![DSC_0028 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/37cb2fac-123d-2401-c8cd-6cabb28f1354.jpeg)

両側の蓋パーツを外し、頭頂部のパーツを外します。
![DSC_0029 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/9bc8ff95-2914-2262-898b-39e6a4e4d15f.jpeg)

最後に、基板のネジ2本を外します。
![DSC_0025 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/68f2df67-4892-157a-58bd-4a3feadb7a8e.jpeg)

##組立
WiFiブリッジ基板を元の基板と同じように取り付け、元に戻します。
配線も同じように取り付けます。
ただし、4ピンコネクタは、向きが上下逆なので反転させてください。
（Ver1.0は正しい向きにシルク印刷が入っています）
![DSC_0023 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/45098ffb-9c2b-8f72-91e9-a870d22b02b1.jpeg)

##ファーム更新
組み立て済み基板はファームウェアが入っています。
キット版や、独自のファームウェアを入れたい場合は、以下のようにしてください。
なお、4ピンコネクタは輸送中の破損防止の為ハンダ付けされていません。
必要に応じてはんだ付けをしてください。

###Arduinoの準備
これは、M5Stackをはじめよう　Arduino編からの引用です。
https://qiita.com/usashirou/items/3d5f03b0de320cf0ee57

まずは、Arduinoをインストールします。
https://www.arduino.cc/en/Main/Software
Arduinoをダウンロードしましょう
![Arduino-DL.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8504c9e0-0eda-e79e-9184-2ffd18ce38dd.jpeg)

ファイル⇒環境設定を開きます
![ESP-32-Arduino-0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f28ce29d-373c-dbd4-fe9d-972e1ee43eca.jpeg)

以下のアドレスをボードマネージャーのURLに入力します。
https://dl.espressif.com/dl/package_esp32_index.json
![ESP-32-Arduino.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/17b79639-855d-a025-0a7e-86ac1255cd59.jpeg)

ツール→ボード（？？？ここは気にしないでね）→ボードマネージャーをクリックします。
![M5Stack-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/9f3f24a3-fcc3-799b-3467-53bdd3945e6f.jpeg)
「ESP32」と入力し、インストールします。
![M5Stack-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/b7dda189-7637-9555-8b9a-bfb2d55c8410.jpeg)

ボードをESP32にします
（ここで選択するESP32は、どれでもいいわけではありませんが、ESP32Dev Moduleならば、問題ないようです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/0a09c81d-8ee4-db68-ed55-d1797be40706.png)

次に、上記のGithubのページからファイルをダウンロードします。
・ESP32-Serial-Bridge
https://github.com/AlphaLima/ESP32-Serial-Bridge
Clone or Downloadをクリックし
Download ZIPを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/e44867c8-fda2-0163-0020-42b5603ff7a1.png)

ダウンロードしたファイルを解凍し、実行します。
すると、こんな画面が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f31c7ebf-62e0-5e28-227d-14e7240afbdc.png)
OKを押した場合、必ずConfig.hを同じフォルダに入れるようにしてください。
ArduinoIDEの仕様により、プロジェクト毎にフォルダを作るようになりました。
同じフォルダの中に、conhig.hが入っていないとエラーが出てしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/39730561-87dd-226f-e5bf-954efffbc9b1.png)


##書込
プログラムを修正したら、マイコンボードに書き込みます。
このためにはUSB-シリアル変換ケーブルを用意する必要があります。
ただし、出力が800mA以上のものを用意してください。
M5Stackや、ESP-32DevBoardであれば対応可能です。
また、ESP ProgrammerなどのESP専用に作られているものも対応しています。

結線は、USBシリアル変換ケーブルのTXと、基板のTXを、RXとRXにつなぎます。
(基板のTXは、ESP-32のRXへ、RXは、ESP-32のTXにつながっています。)
わかりやすくするために、シルクを接続先のものにしましたが、わかりにくいという指摘を受けたので、Ver1では変更しました。

USBシリアル変換ケーブルをパソコンと接続します。
Arduinoでツール⇒シリアルポートで接続先のCOMポートを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/e897cab2-9700-e5f2-509c-d14f787e67ea.png)

シリアルモニタを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f9bf89ba-e098-c2ff-2362-59eaeac801ab.png)
キチンと動作した場合、画像のように出力されるはずです。
出力内容がループしている場合は、電流不足と思われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/593268f1-63e5-0210-d732-7e5c1f6b39c2.png)
それでは、書き込みをしましょう。
基板のPSボタンを押しながらResetを押します。
すると、「waiting for download」と出ます。
これで書き込みが可能になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/49a98af5-12f6-3e2a-aeb5-98514e58cc61.png)

この状態で、⇒を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f6d25496-fa12-24e7-451c-47aa17f47a79.png)
これで書き込みが開始されます。

###通信モードの変更
conhig.hを変更します。
標準では、WIFiのアクセスポイントモードになっていますが、クライアントに変更することが可能になっているようです。

```
//#define BLUETOOTH
#define OTA_HANDLER 
#define MODE_AP // phone connects directly to ESP
//#define MODE_STA // phone connect station
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d4da3503-e09d-c2ee-26eb-e667a8c7efb3.png)
使用しないものは先頭に // を加えます。

SSIDとPASS、IPアドレスの設定は15行目（上記がないと13行目）からです。
＊IPアドレスはDHCPなのでここでIPアドレスを指定しても反映されないはずです。

```
// For AP mode:
const char *ssid = "premaidai2";  // You will connect your phone to this Access Point
const char *pw = "Flightcomputer"; // and this is the password
IPAddress ip(192, 168, 4, 1); // From RoboRemo app, connect to this IP
IPAddress netmask(255, 255, 255, 0);
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f3cc1600-e5b1-1d25-eeb0-75d3fb57a32a.png)

クライアントの際はIPアドレスを知りたいので返答するようにします。
Mainのコードに以下を追加します。(81行目辺り）

```
  if(debug) COM[DEBUG_COM]->println(WiFi.localIP());
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ee63dfd9-d420-2519-710c-3f4615655561.png)

うまくつながるとこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/e630e870-3c1b-26bb-a71f-f4079748dfb9.png)


###SmartConfigの設定
SmartConfigを使うと、アクセスポイントの設定をiOSやAndroidのアプリから入れることができるようになります。
外で作業することが多い人にはお勧めの機能です
日本語資料としてはこちらがおススメ
Keri'ｓLabo　ESP32にSmartConfigでWiFi情報を伝える
https://kerikeri.top/posts/2018-02-16-esp32-smartconfig/

config.hへ追加

    #define Smrtconfig // Smrtconfig

メインファイルへ追加

```
#ifdef Smrtconfig//https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/examples/WiFiSmartConfig/WiFiSmartConfig.ino
  WiFi.mode(WIFI_AP_STA);//APモードにする
  WiFi.beginSmartConfig();//SmartConfigをスタート
  Serial.println("Waiting for SmartConfig.");//SmartConfigのデータを待つ
  while (!WiFi.smartConfigDone()) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("SmartConfig received.");//SmartConfigデータ受信

  //APポイントへ接続
  Serial.println("Waiting for WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("WiFi Connected.");//WiFi接続
  Serial.print("IP Address: ");//IPアドレス
  Serial.println(WiFi.localIP());
 #endif
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/72dcece5-e2ee-a0ac-ecc2-dff0ae85f4cc.png)

スマホアプリからWiFiの情報を送信します
<img width="364" alt="2BEBDEFB-8137-44D9-9ECC-5B9BC11099CC.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2dc38d1d-c8f7-9436-82b5-f33ab8a81689.jpeg">

当方が書き換えたプログラム
https://github.com/taisirou/premaidai

##仮想シリアルポートの設定
今回は、仮想シリアルポートとしてUSRVCOMを使用します。
https://www.usriot.com/support/downloads/usr-vcom-virtual-serial-software.html
USR-VCOM_V3.7.2.525_Setup.exeをインストールします。

基本Nextで進んでいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/34b91dbe-65ff-b23a-930c-b4ea8bb4918e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/bdb927f9-bbe8-519e-8fad-edcff394ac55.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/dc52f3e0-475a-9128-fa6b-3848b54d79a8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/86411ef9-541d-2eb4-5665-6e773ea4bf7f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/4c2cd42a-29d0-898c-aad5-18914bea85cb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f37e30e5-95c6-38cf-1975-515cd57f83cd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/bd279547-b4d6-e368-cb65-db82cfe90c56.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f74b303e-1a0d-447d-acc2-7e971a8db31d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/acc04865-6c82-7d5a-7104-6d4340d85095.png)

インストールが完了したら、USR-VCOMを起動して、AddCOMをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f3b071de-1adb-4b19-ea20-ebebe0e41c58.png)
今回は、192.168.4.1の8880になっています。（私は8881も同じ設定になっています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8e6cf4d6-bbc3-6cb9-e366-e268a1a00134.png)

##アプリケーション
今回は、プリメイドAI-プレイヤーを使用します。
日本Androidの会秋葉原支部ロボット部　第86回勉強会 / 低レベル勉強会2019年12月 〜はんだ付け大会と深セン体験〜で斉藤 辰一郎さん（@wtoy2saito）が動かされていたことをWiFi経由で可能になります。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">日本Androidの会秋葉原支部ロボット部　第86回勉強会 / 低レベル勉強会2019年12月 〜はんだ付け大会と深セン体験〜<br><br>プリメイドai をパソコンからコントロール<br><br>プリメイドAI-プレイヤー<a href="https://t.co/7nkyYP8PaZ">https://t.co/7nkyYP8PaZ</a><a href="https://twitter.com/hashtag/%E3%83%97%E3%83%AA%E3%83%A1%E3%82%A4%E3%83%89ai?src=hash&amp;ref_src=twsrc%5Etfw">#プリメイドai</a> <a href="https://twitter.com/hashtag/%E3%83%97%E3%83%AA%E3%83%A1%E3%82%A4%E3%83%89ai%E3%83%8F%E3%83%83%E3%82%AF?src=hash&amp;ref_src=twsrc%5Etfw">#プリメイドaiハック</a><a href="https://twitter.com/hashtag/akbrobot?src=hash&amp;ref_src=twsrc%5Etfw">#akbrobot</a> <a href="https://t.co/ynsazpQfmt">pic.twitter.com/ynsazpQfmt</a></p>&mdash; usashirou (@usashirou1) <a href="https://twitter.com/usashirou1/status/1207826453695348738?ref_src=twsrc%5Etfw">December 20, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



プリメイドAI-プレイヤーをダウンロードします。
http://www.wtoy.net/static/pmait/

Ai-Playerを起動し、COMPortを設定し接続ボタンを押します。
これで、プリメイドAiをコントロールできるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/eb976916-302b-d2a9-da37-04b74d7509b3.png)

ロボットのタブでは個別に制御することが可能になります。
https://qiita.com/wtoy2saito/items/2b4fdd0a3d9614a11d9e
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/cbce2570-e28c-a191-c3a0-00ab468005b2.png)

##立ち上がらない場合
ESP-32は電流が起動時に800mA必要です。
USBシリアル変換アダプターを使用した場合、電流が足りない為にブート中に落ちて再起動するケースがあります。
起動時にループするときは電流が足りないようです。

また、初期ファームは、アクセスポイントモードになっており、周辺に強力なアクセスポイントがあると立ち上がらないケースがあります。

##出荷前検査
完成品のボードは、出荷前に以下を全数しています。
・Reset、GPOOボタンの確認(ダウンロードモードへ入れること）
・WiFiのアクセスポイントへ接続し、電圧、サーボデータの受信、基本操作の送信及び、動作
・初期導入ファームの書き込み

##検査時の不良
GPIOのはんだ付けが甘い為にダウンロードモードに入らない
これは半数出ていました(修正の為に、半田をかなり盛っているので汚いです、申し訳ございません）

上記の通り、アクセスポイントモードで立ち上がらない時がある。
ステーションモードで立ち上げることで解決。（なお、問題ないときは全く問題なく立ち上がるんです）