2018年5月13日日曜日

USBcount50をPythonで使ってみた

秋月で売っているUSBcount50というUSB接続の周波数カウンタがあるんだけど、対応OSは32bitオンリーだしWindows 10はおろかVistaまでの対応らしいのでどうにか使いたいということで知り合いから相談を受けた。
ということで一応借りてきた。


Elan Digital Systems Ltd'sってところから出てるデバイスらしいんだけどディスコン?になってるし、サイトもWebアーカイブに残ってるだけだし…
0.1Hzから50MHzまで測れる周波数カウンタらしい。USBポートはオスがそのまま出ていてUSB延長ケーブルが付属している。赤色LEDがBNC入力端子の下についてて、あとは4chまでスタックして使用できるらしいのでそれ用のポートがついてる。

というわけで早速秋月のページからソフトウェア類が入ったzipをダウンロードすると、ソフトウェアのソースコードとかレジスタの説明が入っていた。Communications Protocolを見てみるとどうやらソフトウェアとデバイス間の通信はUARTでやってる?これならPythonとかでも使えるかも。

USBcount50の中身的には(分解していないのでソフトウェアからの推測だけど)、周波数カウンタの機能自体はFPGA、PCとの通信用にSilicon LabsのCP210xシリーズのUSB UART変換ICを使っていて、FPGAとは921600bpsで通信しているっぽい。こんなに高速にUARTで通信している割には通信プロトコル自体には誤り検出とか実装されていないように思うんだけど、結構安定して通信できているのかな。
USBとBNC端子はアイソレーションされてるようなのでUARTかUSBのラインにアイソレーションICが入ってるのかな?

デバイスとの通信部分はDLLになっていて、DLLをVB6.0のGUIソフトウェアから呼び出してるみたいな構成。どうやらCP210xに直接アクセスしてシリアルナンバーとかバージョンを読み出すところはCP210x用のDLLを使っているようなのでそのせいでPCで仮想COMポートとして認識していてもソフトウェアからアクセスできなくなってそう…

ためしにCooltermからUSBcount50の仮想COMポートにプロトコルの仕様書通りにコマンドを送ってみるとちゃんと帰ってくるようなので、純正ツールを使わなくてもCOMポートにアクセスさえすれば使えそう。どうやらCP210xとの通信はバージョンチェックとかデバイスがつながっているかどうかの確認しかしてなさそうだし。

というわけでDLLの必要そうな部分と、GUIツールからDLLを扱ってる一部をPythonに移植してみた。USBcount50では使ってない関数もあるかも。(同じ外見のデバイスで何種類かシリーズものがあるらしい)
これでOSやバージョンを問わず使うことができそう。XPのマシン用意するのも大変だろうし。
GUI部分はとりあえずは保留でライブラリとして使えるような形で作ってみた。Pythonよく理解できてないのでなんか変な所あるかも…

とりあえずラズパイ上ではうまく動いた。これ、純正ソフトだと周波数と時間しか表示できなさそうだけど、パルス出力のセンサー類をつないでセンサーの出力に応じた計算までさせたいのであればPythonは結構便利な選択肢だったかもしれない。
多分古いデバイスだし、使う人いないだろうけど一応公開しておく…

USBcount50.py

DLLの中身で必要そうな部分をそのまま移植した感じなので不要な関数もあるかも。
そしてテストで測定結果を取得したときに使っていない関数はほぼ未確認。
スタック用のポートもレジスタいじると操作できそうなので汎用デジタルIOとして使えそうな気がする。

そういえばUSB Host ShieldでもCP210xが扱えるらしいけど921600bpsとかで通信できるのかなぁ?もし通信できるならマイコンとかでも扱えちゃうかも?

追記:リンクが切れていたので再アップのついでにVIDとPIDで自動でデバイスを認識するように変更した。

2018年5月7日月曜日

ハイブリッド型の中華イヤホンTRN V20を買ってみた。

Aliexpressを巡回しているとリケーブルできるイヤホンが結構お安いこと…
ということでちょっと調べてみるとBA+DDのハイブリッド型のイヤホンで2000円を切るのにもかかわらずレビューもそこそこ良かったTRNのV20ってのをポチってみた。
マイク付きとマイク無しがあったけど、とりあえずマイク無しで16.63ドルだった。


箱もなかなかいい感じ。
中国から来た割にはあんまり潰れていなかった。


色はグレーにしてみた。
他に黒と赤があった。
マットな感じの質感。結構安っぽさは感じるかも?
まぁ実際安いし…


ケーブルはこれまた高そうな感じ。

ケーブルは2pinで反対にも刺さるのでそれは気をつけないといけないかも。
音質もなかなか良い。2000円とは思えないかも。
2000円以内でこのぐらいのイヤホンが買えるとは中華すごいなぁ

2018年4月21日土曜日

RN4020でI2Cを試してみた

この前RN4020のファームをアップデートしたので1.20で対応したI2C接続を試してみた。
もともとI2C用の22と21PinはRSVDでしたが、このピンがI2C用のピンになってるらしい。

とりあえずテストなので適当な線をはんだ付け。
I2Cのデバイスの電源も一緒に取ろうということで4本線を出してみた。上からGND、VDD、SDA、SCLという感じ。

I2Cデバイスは2年ぐらい前にラズパイ用に買ったBME280が手元にあったのでこれをそのまま接続してみた。
まぁ接触が不安だけどテストなので…

シリアルモニタでつないでコマンドを打ってみる。

+
]A,1,1
]C,0
]W,ECF425
]W,ECF5A0
]W,ECF201
]C,1
]W,ECF7
]C,1
]W,ED
]R,08
]C,1
とりあえずこれでセンサーの値が読み出せた。まぁそのままではなんのことやら…
RN4020のスクリプトでは変数とかは扱えるみたいなんだけどビット演算とかできるのかなぁ?通常のコマンドに変数で代入とかはできるみたいなんだけどBME280だとセンサから補正値を読み出して計算しないといけないし。

スクリプトでどこまでできるのか調べないとな…
受信側で補正かけるのもなんだかなぁだし。補正値を加味したデータを取得できるセンサーを使うとかかなぁ。

2018年4月19日木曜日

Raspberry Pi Cameraで長いフレキを使ってみた

Raspberry Pi Camera上でレンズで遊んでいるとどうしても付属のフラットケーブルではちょっと短く感じることがある。ということで長いフレキケーブルを買ってみた。

Aliexpressが一番安い感じで、とりあえず30cmと2Mのフレキケーブルがだいたい同じ値段で売っていた。
今の環境では30cmが扱いやすい感じの長さなんだけど、値段が余り変わらなかったのでつい2mをポチってしまった。CSIインターフェースってこんなに延長しても使えるのか気になったので…


とりあえずこんな小さい箱に入って届いた
通常2mのケーブルとか買ってもこんなに小さくはならないよなぁ


さすがフレキケーブル、だいぶコンパクトに入っていただけでスペック通り2mありそう。


早速ラズパイとカメラモジュールをつないでテスト。
普通にmjpg-streamerでも問題なく動いた。フレームレートにも影響はなさそうな感じ。

さすがに2mは長すぎるけど、付属の15cmよりはだいぶ作業性が良くなった。
しかしCSIインターフェースってこんなに伸ばしても大丈夫なもんなのねぇ

2018年4月6日金曜日

Raspberry Pi CameraでSマウントのレンズをいろいろ試してみた

というわけで前回はSマウント(M12x0.5)のレンズをRaspberry Pi Cameraに取り付けれるようにして見たわけですが、1.8mmのレンズも届いたので改めてレンズによる画角の違いをテストしてみました。

こちらがAliexpressで購入した1.8mmのレンズ。

IRフィルタ付きが一番安かったのでフィルタは外せばいいかなと思ってこちらにしました。
Raspberry Pi Cameraの方にはフィルタが付いてるのでまずはIRフィルタを取り外し。


ラジペンとかでねじると簡単に外れる。
レンズに傷つけないように注意しないといけないけど。

後はこのレンズ、超短いのでレンズマウントで最大まで締め込んでもピントが合わない…
といいうことでレンズマウンタを削ってもらいました。

デフォルトより3mmほど短くしました。


例によってホットボンドで装着。

というわけでそれぞれのレンズでどんな感じに映るかをテスト。

まずはノーマル。

まぁコピーモジュールなのでレンズの品質があまり良くないとか言われてますが、こんなもんかなぁと。

次にSマウントの3.6mm

画角的にはもともとついていたレンズと変わらない感じ。
レンズが大きくなった分多少画質が良くなった気もする?

お次はSマウントの2.8mm

画角がちょっと広くなってるけど画質はあんまり変わらないかな?

最後に1.8mm

画角がだいぶ広がってるし、文字もくっきり読みやすい感じ。
ピントはすべて真ん中のダンボールに合わせるように調整してるんだけど、どうにも1.8mm以外は文字が潰れてしまう。これはレンズの品質によるものなのかなぁ?あとは対応解像度もあるみたいだし。

ちなみに前回3.6mmを試した際に上手くピントが合わせられなくてマクロにしか使えなくなっていたのはどうやらネジの部分にバリがあってそれ以上ねじ込めなくなっていたみたい。
今回マウンタを縮めることにより問題がなくなった…

こうやっていろんなレンズを試してみると画質はセンサーの性能だけではなさそうということがわかったので、もうちょっと良いレンズを試してみたくなってしまったなぁ



2018年4月4日水曜日

DD-WRTでSoftEther VPNを使ってみた。

iPhoneでVPNで自宅のネットワークに接続するためにDD-WRTでSoftEther VPNを有効化してL2TPで接続してみた。最近の市販ルータはPPTPぐらいには対応してるのが多いけど、せっかくDD-WRTなのでSoftEatherを使ってみた。

使用しているルータはDD-WRT化したWZR-1166DHP。NANDの容量が多いこともあって、公開されているROMでもいろんな機能が付加されている。
ServiceのVPNにはなんとOpenVPNはもちろん、SoftEther VPNの項目まであった。

ただこの項目からSoftEather VPNを有効にしても設定ファイルをコピペしたりしてもうまく動かない…
ということでSSHから手動で設定することに。

まずはSoftEatherの設定を保存するためにAdministration→ManagementでJFFS2を有効化する。

このルーターの場合は結構な容量がつかえるっぽい。

SSHからコマンドを実行したいのでServicesでSecure Shellを有効にしておいた。

SSHでルーターに接続したらとりあえずSoftEather VPNを起動してみる。

vpnserver start
でSoftEather VPNが起動する。

SoftEatherのダウンロードセンターからSoftEher VPN Server Managerをダウンロードしてきて実行する。このツールでサーバーの詳細設定をすることができる。

今回はGUIのvpnsmgr.exeを使用した。

新しい接続設定からルーターのIPアドレスを設定して、接続するとパスワードを設定するように促されるので、設定パスワードを設定し、そのままウイザード形式でVPNの設定を済ませる。このへんは普通のSoftEther VPNの設定と同様に設定できる。
とりあえず今回はL2TPを有効化しておいた。

ウイザードによる設定が完了したら、ローカルブリッジ設定を開く。

ここでは物理的な既存のLANカードとブリッジするのではなくて、新しいtapデバイスを作成した。先程L2TPを設定した仮想ハブにvpnという名前のtapデバイスを作成してローカルブリッジを設定した。
新しいtapデバイス作成時にエラーが発生する場合はシェルからmodprobe tunをすると良いかも。

ローカルブリッジを設定したら、サーバーマネージャーを終了してSSHのターミナルに戻るって下記コマンドを実行する。

mkdir /jffs/etc (もしフォルダが存在する場合は不要)
cp /tmp/var/lib/vpn_server.config /jffs/etc


これでSoftEatherの設定ファイルがjffsにコピーされて再起動しても消えなくなる。
後はWebの設定画面からAdministrationのCommandsを開いて、下記のスクリプトをスタートアップに登録する。

#!/bin/sh

modprobe tun
ln -s /jffs/etc/vpn_server.config /tmp/var/lib/vpn_server.config
/usr/libexec/softethervpn/vpnserver start
sleep 5
brctl addif br0 tap_vpn


これをCommandsのところに入力してSave Startupをクリックすればスタートアップスクリプトとして登録される。

あとはルーターを再起動すれば自動的にSoftEther VPNが起動して設定が読み込まれるはず。

最後に外部から接続できるようにNAT/QoSのPort ForwardingからL2TP用に500と4500番(UDP)を開けて完了。
ちなみにiPhoneからの場合は「L2TP-VPNサーバーが応答しませんでした。」というエラーはIPアドレスがちゃんと取得されてない場合も表示されるみたいなのでこのエラーが出た場合はポートがちゃんと開いてるかどうか以外にもブリッジ設定などによってちゃんとIPが取得できる状態になっているかどうかも確認する必要があるみたい…
(自分はこのエラーがでてポートが空いてないと思いこんでいろいろやっていたので)

とりあえずこれでDD-WRT上でL2TPが使えるようになった。L2TP以外の手段でSoftEther VPNに接続する場合はポートを開けておくのも忘れずに。



2018年3月24日土曜日

Raspberry Pi CameraでSマウントのレンズを使ってみた。

Raspberry Pi Camera V1の互換モジュールでいろいろ遊んでみてたんだけど、レンズのピントを調整するときにレンズに傷をつけてしまった…
ということでレンズを交換してみようと思います。

まぁ互換モジュールはお安いのであまり痛手ではないのですが、レンズを替えたらまた面白いことに使えるんじゃないかということで。
公式のラズパイカメラだとVR220とか言う広角レンズにできる改造キットもあるみたいだし。

とりあえずWebカメラとかではそこそこ使われてるM12×0.5のSマウントレンズを試してみることに。やすいし。
ちなみにレンズを外すとこんな感じ。
ここにSマウントレンズを取り付けられるようにレンズマウントをつけます。

フラットケーブルがあるので、加工しやすいように樹脂製のものを購入。
穴ピッチがちょうど良さそうなやつが2個で2ドルぐらいでした。
ガラス入り樹脂っぽくて結構硬かったのですが、とりあえずフラットケーブルを避けるぐらいのスリッドを入れます。でかすぎると光が漏れるので慎重に…

裏側からネジ止め。結構穴の近くに部品やパターンがあるので樹脂のスペーサーをつけました。

簡単に行くと思いきや…
最初からこの穴位置がなんか中心からずれてると思っていたけどやっぱりずれてる…
そのままでも一応使えたりするんだけど、レンズによってはダメそうなのでネジでの固定ではダメそう。純正モジュールだと良さげな位置なのになぁ

というわけで最終手段ホットボンドで固定。裏から見たらネジの半分ぐらいずれてました。
今回はとりあえず多少光が漏れたりするのは気にしないことに。そもそも基板自体が遮光されてないし。

肝心のレンズですが、一応2.8mmと3.6mmを用意しておきました。どちらも1ドルちょい。ともにF2.0でCMOSサイズ1/3で画角90°らしい。
Raspberry Pi CameraはCMOSサイズが1/4なので画角は90°より狭くなりそう。

とりあえず2.8mmの方は問題なく使えるんだけど、3.6mmの方は最大限にねじ込んでも10mmぐらいのところじゃないとピントが合わないのでマクロレンズみたいになってしまった。
M12のレンズはCCTV用で結構お安いのが手に入るのでいろいろ買って試してみようかなぁ

そういえばもともとのレンズより画質が良くなったように感じるんだけどやはりレンズの差って大きいのかな

追記:レンズ届いたので試してみた。