2021年6月7日月曜日

ESP32マイコンで USB接続の RFIDリーダを動かす

 前回のアレクサガジェットのときは、ESP32 マイコンと RFID リーダは Bluetooth の SPP で接続していました。ESP32 は Bluetooth も内蔵しているので、そのままで SPP や BLE のリーダを使うことが出来ます(通信仕様は調べる必要がありますが)。

その後いろいろありまして、今度は USB 接続のリーダを利用する必要が出てきました。もちろん ESP32 マイコンには USB ホストコネクタありませんので、USB ホストのモジュールを使う必要があります。

モジュールはいくつかあるようなんですが、スイッチサイエンスさんにM5Stack用のシールドがありましたのでこれなら情報もそれなりにありますし何とかなるだろうと思って使ってみることにしました。

USB Host Shield for M5Stack

回路図とにらめっこしながら作成したのがこれ。

プログラムはライブラリの USB_Host_Shield_2.0 がそのまま使えるということでサンプルプログラムの USBFTDILoopback を使います(つないでいるUSBのリーダがFTDIなので。このリーダはSPPだけでなく、USB接続して仮想COMポートで制御できます)。このサンプルでは特定のデータを送信して受信するのを繰り返すようになっています。そこで送信するデータを下記のリーダのバージョン取得コマンドに書き換えておきます(65行目)。

char strbuf[] = "~rv\r\n";

早速動かしてみると、動いてはいるようですがコマンドを投げているような気配はありません。何が起きているのかわからないのでデバッグモードにしてデバッグ出力するようにします。settings.h の42行目あたりの次の値を0から1に変更すればいいようです。

/* Set this to 1 to activate serial debugging */
#define ENABLE_UHS_DEBUGGING 1

これで動かしてみると、

FTDI Init
FTDI Init: Product not supported
Expected VID:00000403
Found VID:0403
Expected PID:6001
Found PID:6015

このような表示でました。どうも PID が合ってないようです。ということでソース側のPIDを変更します(cdcftdi.h の29行目あたり)。

もう1回動かします。

FTDI Init
Addr:01
NC:01
Conf.Val: 01
Iface Num: 00
Alt.Set: 00
Endpoint descriptor:
Length: 07
Type: 05
Address: 81
Attributes: 02
MaxPktSize: 0040
Poll Intrv: 00
Conf.Val: 01
Iface Num: 00
Alt.Set: 00
Endpoint descriptor:
Length: 07
Type: 05
Address: 02
Attributes: 02
MaxPktSize: 0040
Poll Intrv: 00
NumEP:03
Conf:01
baud_value:001A
baud_index:0000
FTDI configured
.~Rv0000bl-7.2.6.2
.~Rv0000bl-7.2.6.2
.~Rv0000bl-7.2.6.2
.~Rv0000bl-7.2.6.2
.~Rv0000bl-7.2.6.2
.~Rv0000bl-7.2.6.2
.~Rv0000bl-7.2.6.2

キター!リーダからバージョン情報のリプライが来ています。これで ESP32 マイコンからUSB接続のリーダが利用できるようになりました。


2021年6月1日火曜日

RFID対応の Alexaガジェットを作る

 MANICAモバイルのゲートを作るというのを以前やったんですが、これをちゃんと作りたいということで何で作ろうかと考えたんですが、やっぱり手頃なのがなくてそういえばアレクサとか Google Nest とか最近どうなってるんだろうと思ったら、アレクサのガジェットが作れるようになっていました。

詳細はこちらに詳しく記載されておりますので参照くださいませ。

ESP32をAlexa Gadgets Toolkitデバイスにしよう

RFIDリーダとガジェットを直接接続するのは無理ですが、ESP32とRFIDリーダを接続すればガジェットとして使えそうです。ちなみにガジェット自体は上記リンクの内容で問題なく動いたんですが、なぜかスキル側でエンドポイントの取得が全然できなくて一旦諦めたんですが数日後にやってみたらあっさり取得できたので進めることができました。

こんな構成になります。

   アレクサとESP32はBLE、ESP32とRFIDリーダはSPPで接続します。

まずは家の中で使う想定で、これを使ってカギとかサイフとかを探せるようにしてみたいと思います。

・・・


というわけで作成してみたんですが、実用レベルには至らなそうな結果になってしまいました。

私「アレクサ、ICタグでカギを探して。」

アレクサ「わかりました。」 ここでリーダが自動で読み取りを開始する

アレクサ「ありませんね」

アレクサ「ありませんね」

アレクサ「反応あり」 (タグが読めた)

アレクサ「反応あり」

アレクサ「近い」 (RSSIが大きくなった)

アレクサ「近い」

アレクサ「そこ!」 (RSSIがさらに大きくなった)

アレクサ「そこ!」

私「あった」

アレクサ「よかったですね!」 ここでリーダの読み取りは停止

という動きになるんですが、なんともリアルタイム性が無いので探しづらいです(笑

ESP32側ではリアルタイムに判定できるんですが、その結果をガジェットで上げるとクラウドのスキルまでいって、そこから話すことばを選んでアレクサに降りてきてようやく話すという感じなので判定からアレクサが喋るまでどうしてもラグが出来てしまいます。

アレクサは言葉のやり取りをする前提なのでリアルタイム性を求めるのは難しいかもしれません。何かもうひと工夫必要ですね。