2020年6月25日木曜日

10ドルちょっとなHDMIキャプチャを買ってみた。

Aliexpressを見ていたらHDMIキャプチャが10ドル台で売っていたので気になって買ってみた。
もともとUSB2.0対応のアルミ筐体のやつを見ていたけど、2ドルぐらい高いのがUSB3.0って書いてあったのでつられて買ってみた。
箱の写真は商品ページにあったけど、箱はないよって書かれいていたけどこんな状態で届いた。
まぁまいどおなじみな感じで、たまにCD-ROM割れてたりするけど…

なんかCD-ROMも付属してきているけどソフトでも入ってるのだろうか?
UVC対応なのでドライバは要らないはず。
この時点でなんかおかしいことに気がつく、USB端子青だけどUSB3.0用の端子ついてない…

PCにつなぐとWindows 10標準搭載のカメラアプリで使用できた。
そんでもって60FPS対応してなさそう…
そりゃぁUSB2.0の帯域だと対応できないよね的な…
まぁ安価だけど…

早速分解。
ナイフを隙間に入れると簡単に割れるいつもの中華仕様。
接着もされてないし、爪もないので簡単。
メインのICはMacro SiliconeのMS2109 PAA-SNFQGOD 2016っていう刻印が入っていた。昔はHDMIからコンポジットに変換して、アナログキャプチャ用のチップで実装してたりしてたみたいだけど、これはダイレクトでHDMIからUSBに変換している?
EEPROMもついている。
そしてどう見てもUSB2.0じゃん。おそらくアルミハウジングのやつと中身が一緒。
買うならアルミハウジングのやつのほうがお得かも?

裏面にはWS_K004_V01の文字が。結構新しい基板なのかな?

まぁ1400円程度で購入できるHDMI→UVC変換ケーブルとしてはまぁまぁの出来かもしれない?PCのHDMIをつなぐとHDCP対応っぽい認識はしていた。
画質的にはNintendo Switchを入れた感じではそこそこの画質。USB2.0の帯域なので圧縮でもかけているのだろうか。Dot by Dotではないと思う。
UVC対応なのでHDMI出力のカメラをWebカメラとして使う用途には良いかもしれない。
最近ZOOMとか流行っててWebカメラ高いし。

あとはラズパイとかの動作確認用にディスプレイの小窓を使って写せるから便利的な。
ちなみにAndroidだとUVC対応していたりするので、タブレットをHDMIディスプレイ化したりするのにも使えそう。
こんど遅延測ってみよう。

2020年6月14日日曜日

ESP32-CAMから複数クライアントに配信してみる

1年前ぐらい前から使っているESP32-CAMだけどストリームが別ポートなので外部から見たいときポート2つ開けないといけないのなんか不便。さらに同時に複数のデバイスからのアクセス不可能だし。

調べてみるとマルチクライアント対応のファームを公開している人がいたのでファームを変更してみた。

どうにか今使っているDEMOベースのファームをESPAsyncWebServerとかで実装できないかどうかとかも調べていたんだけどよくわからんので…

というわけで
このファームを利用させてもらった。

ESP32のArduino CoreはRTOS上で動いてるのでストリームの部分をRTOSの専用タスクとして動かすことによってマルチクライアント対応しているらしい。
このままコンパイルしても850kBぐらいしか使わないのでArduino OTAを入れてスケッチに機能追加しやすいようにしておいた。OTAがパフォーマンスに影響しているかは不明。

とりあえずWifi設定が便利なようにWiFiマネージャーと、IPアドレス調べなくても見れるようにmDNSを仕込んで使ってみた。
WiFiマネージャーには今回はtzapuさんのWiFiManagerを使用させてもらった。
リリースされている方はESP8266用止まりだったので最新ソースをgitした。
このWiFi設定ライブラリ関連は他のライブラリとの組み合わせが難しい気がする…読み込んでる関連ライブラリのバージョンとかが違くてコンパイルエラー出たり複数のライブラリが存在しているエラーが出たりとか…最新のArduino Coreだとこのライブラリ安定な気もする?

このESP32-CAMファームはHTTPのポートも80番だけでいいので複数カメラに対応させる場合はルーター側でポートの転送先を変えていけば問題なさそうだし便利そう。

解像度変更とかの設定が決め打ちなので少し改造して設定できるようにしてみようかな…
このレベルのファームだとRTSPいらないレベルの少人数限定ライブカメラとしても使えそう。安価だし。

以下修正済みのinoファイル。
WiFiManagerライブラリを入れて、MJPEG Multiclient Streaming Serverのinoファイルだけを置き換えてコンパイルすれば動くはず…

2020年6月13日土曜日

センターコンソールにUSBをDIYで埋め込む

友人が車に社外ナビをつける際にUSBポートをキレイに埋め込みたいということで純正ナビを選択しないとメクラになるところにUSBポートを付けてみた。

まぁ通常はスイッチホール用にUSB端子をつけるアダプタなどが売っているんだけども、今回の車種にはそれの設定がまだなくて、純正ナビ用の部品を変換するか、他社の社外ナビの部品を流用するかを悩んだんだけども、どちらも高いということで…(HDMI付きしか無いらしくて1万ぐらいする…

ということでメクラをもう一つ購入してもらって加工することに。

トヨタ純正品番55524-12010-C0ってやつ。300円ちょいらしい。150系ランクル、50系RAV4、マイチェン後の50プリウスはこのタイプのメクラで、現時点でまだUSB端子を出せるような社外のアダプタが出ていなかったらしい。


このメクラ、結構長い。リブが立っているので加工が厄介そう。

このメクラにUSB端子程度の穴を開けてUSB延長ケーブルを取り付けるだけ。

USB延長ケーブルはナビの説明書的にはちゃんと車用がいいんだろうけど実用上よっぽど粗悪品でなければ問題なさそうだし…おそらく熱的な問題だともう。


作業的にはUSBサイズの穴を端子より少し小さめに開けてヤスリで形を整えながら拡張してく感じ。延長ケーブルのメス端子の形状も各社色々あるんだけど今回はストレートだったので引っかかりもなくスムーズに入った。
USBのメス端子は少し余裕があるぐらいで結構ぴったりサイズだった。
メクラの固定用の爪が端子にあたって動きづらかったのでUSBメス端子のサイド部分を少し削ったぐらい。

あとは2液のエポキシ系接着剤で固定して完成!PP/PEって書いてあったので結構接着剤によっては剥がれやすいかもしれんので注意。今回は結構引っ張っても大丈夫だったので問題ないかなぁ。
ホットボンドとかは車の熱で溶けちゃうのである程度耐熱ある接着剤が良さげ。

というわけで今回は500円以下で作れちゃったので社外パーツが出ていなかったりDIYが得意な人にはおすすめかも知れない。

2020年6月6日土曜日

STM32duinoでCAN-BUSを使ってみた。

BluePillにはCAN(Control Area Network)が内蔵されていて、ESP32みたいにCANトランシーバを取り付けるだけでCAN-BUSが使えるっぽい。ArduinoだとMCP2515とSPI通信してCANバスに対応させるような環境が多いけど、CAN機能が内蔵されていると小型化できて良さそう。ただしライブラリとか情報が少ない…
このマイコンボードのCAN機能はArdupilotとかでUAVCANでは使われてたりしてたようなんだけど、手軽に使えるようなライブラリがなかなかな見つからなかったんだけど、STM32Duinoでも使いやすそうなライブラリが出ていたので使ってみた。

今回試してみたのはeXoCANっているライブラリ。いまのところSTM32duinoの中ではSTM32F103に対応しているライブラリっぽい。

BluepillのCANポートはCAN1のみの対応で、デフォルトでPA11(CAN RX)とPA12(CAN TX)、remapでPB8(CAN RX)とPB9(CAN TX)になっている。ここにCANトランシーバを接続してCAN BUS対応にできる。今回は3.3V対応のCANトランシーバIC、SN65HVD232Dを使用してみた。
bluepill canbus
デフォルトのPA11とPA12だとUSBとおなじピンになってるのでremapのPB8とPB9を使用することに。なのでcan.beginのBusTypeはPORTB_8_9_XCVRを選択。といってもSTM32F103はSTM32F072みたいにUSBとCANは同時に使えないのでUSB CDCが使えない。(CANを有効にするとUSBに繋いでも不明なデバイスになってしまう)
なのでSTM32DuinoではUSBサポートは無効にして、書き込みのときは手動でブートローダーモードに入れないといけないのが少し面倒。(Boot1ジャンパを1に変更してUSB指し直して書き込み中に0に戻したりしてる)
STM32CubeProgrammerをインストールしてればBoot0で純正Serialブートローダ使ってもいいんだけどね…

CANトランシーバとはPB8(CAN RX)をR(RX)に、PB9(CAN TX)をD(TX)に接続した。
スケッチの方はbpCanBlinkInterrupt.inoを使用して、"PORTA_11_12_WIRE_PULLUP"のところを、"PORTB_8_9_XCVR"に変更しただけ。

とりあえず通信できているかどうかはラズパイに接続して確認してみた。
5000msごとにデータが送られてきてるのを確認できた。なぜかbpCanBlink.inoをおなじ変更で書き込んでもデータが送られてこない…
でもまぁとりあえず受信データ割り込みのほうが便利そうな気がするのでこのまま使ってみることに。

ちなみにBluepill用のSLCANファームウェアを使うとBluepillをPCやラズパイでCANアダプタとして使うこともできるらしい。ただし、STM32F103はCANとUSBの同時使用ができないためUSB→シリアル変換アダプタが必要だけど。(SLCANはシリアルポートとCANの変換)

一応USBのブートローダでも書き込みできるんだけど、CANを有効にした瞬間にUSBデバイスとして認識できなくなってしまうので、STM32F103に元々入っているシリアルブートローダを使ったほうが便利かも。これだとシリアルコンソールもそのまま使えるし、リセット後にシリアルコンソールを開き直さなくて良いのでデバッグもしやすい。

今のところはArduinoで扱えるマイコンではCANが内蔵されているのはSTM32duinoとESP32ぐらいなのかな。MCP2515は情報も豊富で超便利だけどやっぱりコスト的にはCANトランシーバは結構安く売っているので内蔵されてる方が有利そう。