hogehoge, world.

米国カリフォルニアのソフトウェアエンジニアがIT・自転車・音楽・天体写真・語学などについて書く予定。

Particle Mesh: Early Adopterはつらいよ (5) ~ 外部アンテナを付けてみる

前回まで、いかにXenon~クラウド間通信が通らないか、OTAが通らないか、という話をしてきた。もしかしたら改善するかも、とMesh用の外部アンテナを付けてみることにした。

f:id:tomoto335:20190107030844j:plain:w400
Xenon/Argon側に "BT" と書かれたBluetooth/Mesh兼用の外部アンテナ用コネクタが空いているのは知っていたのだが、どんなアンテナを使えばいいのかまったくわからず、コミュニティを漁ってまず「Argonに付いてくるWiFi用アンテナと同じでよい」ことを突き止める。純正↓は$15/本+送料でちょっと高い。

2.4GHz Flex Antenna (Wi-Fi or Mesh) - Particle Retail

スペック的には2.4GHz用でU.FLというコネクタ*1のものなら何でもいいのかな?と探してみると、MouserやAliexpressに確かに似たようなものが山ほど見つかる。ただこれらのサプライヤは単価は安いが送料が高く到着に時間がかかるので、結局Amazonで似たようなものをポチっとした(上の写真)。品揃えは少ないがこういう2本セットが$6や$8、それが2日で届くのであれば悪くはない。

もうひとつ注意がある。現時点のファームウェアでは外部アンテナ選択関数は未実装である。代わりにアプリケーションに下記のコードを書けば使うことはできるらしい。
Mesh range / external antenna? - Particle Mesh - Particle

void selectExternalMeshAntenna() {
#if (PLATFORM_ID == PLATFORM_ARGON)
    digitalWrite(ANTSW1, 1);
    digitalWrite(ANTSW2, 0);
#elif (PLATFORM_ID == PLATFORM_BORON)
    digitalWrite(ANTSW1, 0);
#else
    digitalWrite(ANTSW1, 0);
    digitalWrite(ANTSW2, 1);
#endif
}

いやでもこれ、データシートの記述と合ってなくないか?
https://docs.particle.io/assets/images/argon/argon-block-diagram.png
https://docs.particle.io/assets/images/xenon/xenon-block-diagram.png
https://docs.particle.io/assets/images/boron/boron-block-diagram.png
実際に値を見てみたところ、デフォルトで

Argon: ANTSW1(31)=0, ANTSW2(32)=1
Xenon: ANTSW1(29)=1, ANTSW2(30)=0

だったので、デフォルト状態を反転している上のコードは合ってるっぽい。

さらに注意。外部アンテナはネットワーク確立時点から必要なのだから、setupに入る前に(static変数の初期化時に)上のコードを実行したところ、効果がなかった。タイミングが早すぎてシステムによりデフォルト値が上書きされてしまうのだと思われる。というわけで、SYSTEM_THREAD(ENABLED)を書いて、setupの先頭で外部アンテナをON、waitUntilMesh.ready(Xenonの場合)なりParticle.connected(Argonの場合)なりを待つ必要があるようだ。

さて効果は如何ほどか。リセットガチャなしに部屋から出ずにOTAが通れば万々歳である。

*1:U.FLにはIPEXなど他の呼び名もあるが同じものらしい。参照: Hirose U.FL - Wikipedia