RCWL-0516をテスト

安価なドップラー動体センサーをamazonで見つけたので5個入りのを買ってみました。で、簡単な動作テストをしてみたのですが、どうも感度がバラバラに見えます。しかも再現性がない??

はっきりしないので、治具を作って確認してみました。
作った治具はこんな感じです。(写真は不良品の切り分け後に撮ったので、不良品にはマジックでNGと書いてあります)

大したことはしてなくて、単三電池1本からHT7750Aで5Vを生成、生成した5VをドップラーセンサーモジュールとPIC16F1823に供給しています。ドップラーセンサーの出力端子はPIC16F1823のRC0に入力しています。PIC16F1823はRC0の状態によってRC1に接続したLEDの点灯/消灯制御、RC5(PWM)に接続した圧電ブザーの鳴動の制御(=PWMのデューティの調整)をしているだけです。初期設定を除いて、やることがあまりに少ないので、PICの動作周波数は32kHzとしています。

PICの初期設定はMPLAB XのCode Configuratorでやっているので、記述したコードは、main()の中の

これだけです。
Code Configuratorは簡単に書けるのはいいのですが、ドキュメント化が難しいです。各項目に設定した内容をテキストでリストアップしてくれると嬉しいのですが・・・。

話を戻して、テストしてみると以下のことがわかってきました。

  • 5枚中1枚は動作不良(動作しない)
  • 残りの4枚は正常に動作する。感度も特に差はないようだ。
  • 正常品も電源投入後、反応しない時間帯がある。約15秒位だろうか。
    紛らわしいのは電源投入直後、出力=Hとなり、2秒くらいした後、一瞬出力=Lとなった後、再度出力=Hが2秒位続いて、その後、15秒くらい無反応の時間がある。その後は安定して動作し続ける。感度がバラついて見えたのは、この挙動のせい。
  • 基板の両面に対して感度がある。表も裏もあまり変わらないような気がする。側面にたいしても感度があるが、表面/裏面方向よりも感度は悪そう。反応範囲は4〜5mくらいだろうか。
  • 金属が近くにあると途端に感度が悪くなるようだ。

で、不良品の1枚をよく見てみると、部品が欠品しています。

ICの下に1箇所、部品が欠落した跡があります。

これが何なのか、GitHubに上がっている資料で調べると、22uFのコンデンサのようです。そこで、手持ちの22uFの積層セラミックコンデンサをつけてみました。

これで電源投入してみると、ちゃんと動作するようになりました。

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 を用いてグラフ化してみました。

 

リチウムイオン電池制御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 出力画像を180度回転

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

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

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

の後に、

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

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

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

TTGO T-Camera LiPO電池を接続してみました

リチウムイオン電池のコントローラ(IP5306)が搭載されているTTGO T-Cameraですが、回路図をみるとD4というダイオードが入っていて電池からIP5306に向かってしか電流が流れないので、一見充電できないように見えます。

しかし、よくみるとこれ、「2A FUSE」と書いてあります。つまり、フットプリント流用のためにダイオードのシンボルになっているようです。さらに、その右下を見ると分圧回路があり、電池の電圧がESP32で確認できるようです。そこで、電池の電圧をモニターしつつ、LiPOをつないでみることにしました。つないだのは手持ちのトイドローン用の500mAhのものをコネクタを付け替えたものです。

ソフトウェアは表示画面に3ページ目を追加してモニターするようにしてみました。

単純にIO35の電圧を読んだだけでは高インピーダンスで外部/内部のノイズの影響を受けているのか、スッチングノイズを拾っているのかわかりませんが、かなりブレがあります。本来ならまずはR43にコンデンサを抱かせたいところですが、面倒なので50ms周期で32回の平均を取っています。(1005のコンデンサなんて手持ちにないし・・・。そもそもESP32のADCの入力インピーダンスってどのくらいなんでしょうね。100kΩでは大きすぎるのかも?)

一方、充電電流を見てみると、PCにつないだ場合には入力側で0.4Aくらいでしたので、電池への充電電流もせいぜい0.5Aくらいで1C程度ということで問題ない範囲(本当はもう少し減らしたい)かと思ったのですが、Ankerのモバイルバッテリーにつないだところ、0.8Aくらい流れていて2C近い電流が流れてしまうようです。IP5306の中国語のデータシート(こちらの通販サイト?にあるもの)を見ると、最大1Aで充電するようですので、ちょっとまずいかもしれません。データシートをみても充電電流を調整する方法はなさそうです。

バッテリーで動作するWiFi IPカメラというのも悪くないですし、どうしたもんでしょうね。

TTGO T-Camera ファームウェア改造

TTGO T-Cameraのファームウェアを改造してみました。

1.ファームウェア開発環境の準備

ファームウェアはArduino環境で開発しますので、まずはLinuxMint19に開発環境を導入します。

まずは、pyserialをインストールしておきます。

自分のユーザーアカウントを dialout グループに追加した後、一旦ログアウトしてログインし直します。

Aruduino公式サイトから arduino-1.8.9-linux64.tar.xz をダウンロードしてきて展開します。生成された arduino-1.8.9 というディレクトリをホームディレクトリ直下に移動した後、
シェルを開いて、

で Arduino をインストール完了です。インストールが完了したら、 「Menu → プログラミング → Arduino」でArduino IDEを起動します。次にArduino IDEの「ファイル→環境設定」で「追加のボードマネージャのURL」に

を設定します。引き続き、「ツール→ボード→ボードマネージャ」で「esp32 by Espressif Systems」を探してインストールします。インストールが完了したら、「ツール→ボード→ESP32 Wrover module」を選択すれば、Arduino自体の準備は完了です。

2.ソースコードの導入

ソースコードは https://github.com/lewisxhe/esp32-camera-series からZIPでダウンロードしてきます。ダウンロードした esp32-camera-series-master.zip を展開し、展開したディレクトリ名をesp32-camera-seriesに変更して、~/Arduino の下に移動します。

Arduino IDEの「ファイル→開く」で ~/Arduino/esp32-camera-series/esp32-camera-series.ino を開いておきます。

3.ライブラリの準備

Arduino OneButton Library を https://github.com/mathertel/OneButton からZIPでダウンロードしてきて、OneButton-master.zip を展開します。展開したら、ディレクトリ名をOneButtonに変更して、~/Arduino/liraries の下に移動します。

BME280のライブラリについては TTGO T-Cameraでは正常な値を表示しない(そのため、途中から削除されている)のでソースコード中の

の行はコメントアウトしておきます。

esp8266-oled-ssd1306 Library を https://github.com/ThingPulse/esp8266-oled-ssd1306 からZIPでダウンロードしてきて、esp8266-oled-ssd1306-master.zipを展開します。ディレクトリ名をesp8266-oled-ssd1306に変更して、~/Arduino/liraries の下に移動します。

ここまででビルドと書き込みはできるはずです。Arduino IDEのチェックマーク(検証)を押してコンパイルしてみます。うまく行ったら、右矢印マークを押して書き込みもテストしておきます。

4.SoftAPモードからSTAモードへ変更

をコメントアウトして、SoftAPモードを禁止して、

のところに接続先のSSIDとパスワードを設定します。

5.ESP32のIPアドレスを固定IPに変更する

SSID/PASSWORDの設定の箇所の後に以下の記述を追加

WiFi.begin()の直前に以下の記述を追加

6.mDNS対応

ローカルネット内からはIPアドレスではなくホスト名でアクセスできると便利なので、mDNS対応させておきます。

先頭の

の後に

を追加します。続いて、SSID/PASSWORDの設定の箇所の後に以下の記述を追加します。

引き続き、setup()の最後の箇所の

に変更します。更に、void drawFrame1(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) の中の

に書き換えます。(いくつかの行がコメントアウトになっているのは、表示にはIPアドレスもほしいためです。すべてURLでいい場合にはコメントを外します)
さらに、void drawFrame2(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)の中の

に書き換えます。

7.カメラの向きとOLEDの表示が上下逆なのを修正

の後あたりに

を追加します。

これでボードに書き込むと同じサブネットのPCからは http://esp32.local で、異なるPCからは http://IPアドレス でアクセスできます。どちらもOLEDディスプレイにも表示されます。

TTGO T-Camera用ケースを作成

以前買った、TTGO T-Camera用ケースを作成しました。

添付されていたバッテリー用ケーブルを手持ちのLiPoバッテリーに接続して使えるようにしたのですが・・・・改めて回路図を確認したら、充電できない回路になっていました。(追記:回路図ではそう見えるのですが、回路図のシンボルと実物が違っていました。実際には充電可能です。)

・・・というわけで、バッテリーなし仕様の蓋を付けて完了としました。

あとはスタンドはホルダーを作成して3Dプリンタのそばに設置するのと、デフォルトのファームウェアがSoft APモードとなっていてカメラの画像を見るためにはスマホのWi-Fi設定を変更しないといけないので、これをSTAモードに変更してLAN内からアクセスできるようにしたいと思います。

dockerをarm64にインストール

ついでなので、dockerをarm64なubuntuにインストールしてみました。
最初、LinutMintと同じ方法で試してみたのですが、途中でエラーがでてうまく行きませんでした。最終的にはスクリプトを使う方法でインストールしました。

ターゲットはPine A64+上のArmbian Ubuntuです。MicroSDカードで初回起動後、armbian-configにてUSBメモリにインストールしたものです。インストールした際のログは以下のとおりです。

結局、手順としては非常に簡単で、

という感じでスクリプトをダウンロードしてきて実行するだけです。