ESP8266からMQTT送受信してみる

AdafruitのMQTTライブラリを使ってローカルに立てたブローカー(MQTTサーバー)と通信してみます。

ライブラリのインストール

ArduinoIDEで「ツール→ライブラリを管理」でライブラリマネージャーから「Adafruit MQTT Library」をインストールします。

サンプルプログラムの呼び出し

「スケッチの例→Adafruit MQTT Library→mqtt_esp8266」でサンプルプログラムを呼び出します。

これでESP8266に書き込んで実行すると、リスナー側で

という感じで送信されているのが確認できました。

Arduino IDEのシリアルモニタ側でも

という感じでPublish/Subscribeの確認ができました。

 

ArmbianにMQTT環境をインストール

syslogサーバになっているArmbianにMQTT環境をインストールします。作業内容はこちらの記事を参考にしました。(というか、そのまま)

注)ローカルネットワーク内でのテストのため、ユーザー認証なしの状態で実施しています。

サーバー (Broker) のインストール

サーバー(Broker)の起動

クライアントのインストール

リスナー(Subscribe)を動かす

リスナーの起動はサーバ(Broker)の起動後に行う。下記はその後のPublishをした際の記録を含む。トピックは mqtttest としてみた。

今回はローカルのサーバ(Broker)に対して接続(subscribe)しているが、リモートのサーバ(Broker)に対して接続(subscribe)する場合は「-h server名」とする。

別のPCでもクライアントのみ起動してサーバー(Broker)を指定してリスナーを起動すると、Publishした瞬間に同時に両方のリスナーで表示される。

Publishを動かす

今回はローカルのサーバ(Broker)に対して接続(Publish)しているが、リモートのサーバ(Broker)に対して接続(Publish)する場合は「-h server名」とする。

サーバー(Broker)を自動起動するように設定

ESP8266/ESP32でsyslog出力

ESP32でセンサ情報を収集できるようになったのですが、ESP32は電源を落とすとデータが消えてしまいます。そこでログをsyslogで出力してみます。

ぐぐると、GitHubにちょうど Arduino用の Syslog ライブラリがありましたので、これを試してみます。

GitHubからZIPでダウンロードしてきて、ダウンロードしたファイル(Syslog-master.zip)を展開、展開したディレクトリの名前を Syslog-master から Syslog に変更して、 ~/Arduino/librariesの下に移動します。

その後、Arduino IDEを起動すると、「ファイル→スケッチ例」の中に「Syslog」が出てきますので、この中の AdvancedLoggingESP8266 を開いて、冒頭の部分を修正します。

修正して実行すると、syslogサーバ側に以下のようなログが記録されました。

ドップラーセンサー用のケースを設計

以前作ったESP32のテスト用の基板以前買った秋月のドップラーセンサを適当に組みあわせてFusion360でケースを設計、出力してみました。

組み合わせた基板はこんな感じでいきあたりばったりです。

でも、基板に合わせてこんな感じのケースを設計しました。

こんな感じで基板を載せます。

蓋をしてネジ止めするとそれっぽくなるのが3Dプリンタのいいところです(笑)。

ネジ穴はM3x6のネジのネジ部を実測して、2.8mmの穴を開けて、入れやすいようにC1で面取りしただけで、いい感じにネジ止めできるようになります。何度も開け閉めするものでなければインサートナットを挿入しなくてもいいので楽ちんです。

ESP32でマイクロ波近接センサをロギング

ESP32はしばらく放置している間にすごく使いやすくなっていたので、調子に乗って、以前買ったESP32 DevKitCOLEDモジュールをつけて、ドップラーセンサーモジュールで壁越しに動体検知するのにチャレンジしてみました。

開発はArduino環境で行いました。無線LANの初期化やNTPでの時刻同期、OLEDの表示に関する部分、Webサーバーに関する部分はT-Cameraのソースをベースに不要な部分を削除して用意しました。

今回使用したセンサはUARTで通信します。ESP32にはUARTが3つあり、1つはPC(Arduino IDE)との通信用となっていますので、残り2つが利用可能です。今回はUART1の送信を16ピン、受信を17ピンに割り当てて使用しました。

で初期化しました。

受け取ったセンサ情報は接近時、離別時、停止時の3つのパターンがありますが、それぞれ毎分0秒を境界とした1分毎、毎時0分を境界とした1時間毎に発生数を計数して Chart.js を用いてグラフ化してみました。

 

TTGO T-Cameraの画像をngrok経由で取得

NAT配下のWebサーバ等をインターネットからアクセスできるようにトンネリングをするngrokというサービスがあります。

これを使って、3Dプリンタの監視画像をインターネットから取得できないか試してみました。

テスト環境は以下のとおりです。

まず、ngrok公式サイトからサインアップをします。サインアップすると、「Setup & Installation」という画面に移行しますので、これに沿って操作していきます。

まず、ngrokのダウンロードですが、Linux(ARM)のURLをコピーして、wgetでzipファイルを取得します。(下記はURLを書き換えてありますので、必ずURLをコピーしてください)

ダウンロードしたら、②、③に沿って展開とトークンの取得を行います。トークンの取得は③のところのコマンドラインをコピー&ペーストして実行するだけです。

トークンを取得したら、 ~/.ngrok2/ngrok.yml にある設定ファイルを作成します。

1行目の内容はトークン取得で作成されている内容です。2行目以降が追加した内容になります。

作成したら、

で起動します。

という感じで状態が表示されます。この状態でインターネット側から https://b3d16323.ngrok.io にアクセスするとBASIC認証が求められ、設定したユーザー名とパスワードを入力すると、TTGO T-Cameraへアクセスすることができました。アクセスすると上記の状態の下にHTTPリクエストの状態がリストで表示されます。なお、b3d16323の部分は起動する度にランダムに変わります。有料プランにするとこの部分を固定にすることができるようです。

実際にGet Stillをクリックすると、

という感じで実際に画像を取得できました。なお、ストリーミングについては異なるポート(81/TCP)でのアクセスが必要なのですが、ngrokのコンフィグファイルでは複数のポートの設定も記述できるものの、ポートごとに異なるURLが割り付けられます。このため、うまくいきませんでした。有料プランにするとURLを指定できるので、うまく行く方法があるのかもしれません。

PCのファンを修理

ネットアクセス用のAthlon5350マシンがあるのですが、しばらく前にケースFANがビビリ音で煩くなってFANを交換しました。もともとついていたFANは回転数センサなしの電源だけが接続されるタイプだったのですが、使っているASUS製のマザー側にFANの回転数制御機能があるようだったので、できるだけ高速のFANを買ってマザーボード側で速度を落として使うことにしました。

・・・・が、交換後、実はPWM制御しかできないということが判明して、爆音PCになってしまいました。速度制御できないとうるさくてたまりませんが、冬場だったこともありFANのケーブルを抜いて使っていました。しかし、気温が上がってきたせいか、最近CPUファンの音が煩くなってきたので、なんとかせにゃならん、ということで、もともとついていたFANにグリースを差して戻してみました。

もともとついていたFANは以下のようなものです。

シールを剥がすと、軸受が見えます。

ここに、グリースを詰めました。爪楊枝の先にグリースを載せて、穴の中に詰めていきました。

たくさん詰めたら、シールを蓋して、ケースにつけると、以前のようなビビリ音はしなくなりました。

今回使ったグリースは、近所のホームセンターにあった下記のグラファイトグリースです。適切なものなのかわかりませんが、見たところ金属同士の軸受かなーと思ったので、これにしました。まあ、FANがだめになったら、またFANを交換すればいいかな、ということで。
蛇腹タイプで40gも入っていますが、はっきり言って一生分くらいありそうです(笑)。

 

リチウムイオン電池制御IC IP5306について

TTGO T-Cameraに搭載されているリチウムイオン電池制御ICのIP5306について調べてみました。

データシートはこちらの通販サイト?で見ることができます(ダウンロードできなくなった場合のために、コピーを置いておきます)。簡体字中国語で書かれていますが、整然と書かれているのでこの手のチップの英語のデータシートが読める人なら大体わかると思います。細部はディスプレイに拡大表示させて、スマートフォンのGoogle翻訳でカメラから翻訳させれば、かなり精度よく翻訳してくれます。

このデータシートを見ると不思議なのはPDFのタイトルでは「1.2A充電、1A放電」と書かれているのですが、中身では「2.1A充電、2.4A放電」と書かれています。

まあ、細かいことはさておき、大雑把に捉えると、モバイルバッテリー用に特化したICです。面白いところを見てみます。

たとえば、LED表示ですが、端子3つでLED1本〜4本までの仕様に対応できるようになっています。1kΩの抵抗でプルアップすることにより、LEDが何個の仕様で動作するかを読み取っているんじゃないかと思います。

また、リファレンスデザインの項目を見てみると、付加価値として操作用のスイッチと照明用のLEDもつけられるようになっています。

この操作用のスイッチは50ms以上2秒以下の押下によって残量表示LEDと出力がONになり、2秒以上の押下で同じ端子に接続された照明用のLEDが点灯、1秒以内に2回連続して短く押すと出力や残量表示LED、照明用LEDがOFFになるというものです。これらの機能が不要の場合には5ピンは未接続でよいようです。
こんな感じで、とにかく2〜5ピンには機能が盛り沢山に詰め込まれています。単に出力端子として使うだけではなく、時分割で入力端子としても使用することでピン数削減を図り、とことんコストダウンを狙っています。かつての日本の半導体では(あるいは欧米の半導体でも)ここまで徹底的にピン数削減を図ったものはみたことがありません。

中国のローカルベンダーの製品にはこういう面白い半導体もあったりするのは興味深いところですし、彼らの並々ならぬパワーを感じるところです。また、数年前は中国語のデータシートがあっても雰囲気しかわからなかったのですが、データシートの内容自体も洗練されたものが増えていることや、Google翻訳のカメラ翻訳を使うことで中身がかなり読めるようになりました。

また面白いものがあったら取り上げてみたいと思います。

TTGO T-Cameraを3Dプリンタ監視用に

TTGO T-Cameraを3Dプリンタの監視用に使ってみました。

まず支柱を設計して、3Dプリンタで出力しました。

Ender-3の左手前に共締めして取り付けるとこんな感じです。

3D Benchyを出力してみました。

PCからブラウザ上でストリーム表示させるとこんな感じです。

VGAサイズくらいであればスムーズに表示されます。スマホからでも表示可能。

暗いのでノイジーですが、UXGAでのキャプチャもこの通り。魚眼レンズなので近くても全景が入ります。画像は歪んでしまいますが、ちょっと状況を確認するには十分な出来になりました。

TTGO T-Camera 出力画像を180度回転

現在のT-Cameraのソースだと、USBコネクタが上に来る向きで天地が合う形になっているので、結構扱いにくい(一方で、USBケーブルを挿した状態で置きやすいというメリットもある)。

で、カメラモジュールで反転させる機能があるのではないか、と探してみたところ、やはりあった。

これを使えないか探しまくった結果、カメラを初期化している

の後に、

と入れれば画像が回転できることがわかった。よって、先に入れたOLEDの表示を回転させる

は削除できる。
でも、USBコネクタが上のほうが便利な場合もあるので、

とすることで反転するようにソース修正した。