2021年5月22日土曜日

USB HID-UARTブリッジ CH9350を使ってみる

秋月新商品で、CH340でおなじみWCH製、
USB HID-UART相互変換ブリッジICが出ていました。

USBマウス・キーボード用シリアル通信制御IC 
CH9350L: 半導体 秋月電子通商-電子部品・ネット通販
https://akizukidenshi.com/catalog/g/gI-16308/
 
早速先週末店頭で購入したので試してみます。
USB HIDホストになるUSBポート、USB HIDスレーブ(デバイス)になるUSBポート、
UARTのTx/Rxが付いています。

KVM Switch用に使うことが想定されているようで
このIC同士をシリアルで結ぶと、片方のホスト端子に繋いだUSBキーボードを、
もう片方のスレーブ端子につないだUSBコネクタでPCと接続させることができます。
[キーボード]--USB-->[Rx IC]--UART-->[Tx IC]--USB-->[PC]
という構図です。UARTをバススイッチで切り替えるのは容易ですし、
PCにはHIDとして認識させたまま切り離すとかできそうなのでKVMには最適ですね。
さらに、RS-422ドライバを載せたりすると相当延長できそうですよね。
そんなICです。

本来の使い方ではありませんが、UARTの通信を読めれば、
汎用のUSB HID-UARTとして、
マイコンに、面倒なSPI接続のUSBホストICを繋いだりせず
USBキーボードを接続できるのではと思い買ってみました。


データシート通りにこんな感じの配線で仮組みしてみました。
電源はUSBプラグからVBUSを入力、
ボタンを押しながらUSB接続するとUSBスレーブモード、
何もせずつなぐと電源供給のみで、USB HID to UARTブリッジとして動きます。

電源を入れて、USBキーボードとUSB-UART変換をつなぎ、
Tera TermのデバッグモードでUART出力をバイナリ表示してみるとこんな感じでした。


何も入力していないとき、
0x57 0xAB 0x82 0xA3
が繰り返し流れています。
入力すると、こんな感じのフォーマットでキー入力が拾えることがわかりました。


中国語データシートでなかなか読むのが難しく、詳しくは調べておらず、
現物合わせなのですが、Headersとなっている部分はおそらく状態表示も含んでいて、
微妙に変化があるかもしれませんが、
8バイト目から13バイト目にキー入力が表示されていました。
キー入力のフォーマットは、USB HID仕様の、Usage IDが表示されているようです。

何も入力していなくてもダーっと0x57 0xAB 0x82 0xA3が流れていて、
目で追うのは大変なのでPython3でパーサーを作りました。

押したキーがUsage IDのテーブルを参照して文字で表示できるようになっています。



おまけでNum Lock、Caps Lock、Scroll LockのLEDの制御ギミックも入れています。
これって、キーボードが状態を保持しているんじゃなくてホスト側からの司令で
点いていたんだなぁという発見がありました。(何もしないと点かない)

M5Stackなどの画面付きマイコンボードで文字入力をするのには、GROVEコネクタ1本で
かなり楽ちんに接続できてよさそうです。ぜひ一度お試しください。

2021年3月21日日曜日

えっ、まだESP32にRTC外付けしてるんですか!?

煽り気味のタイトルで始めてみましたが、今回はESP32の内蔵RTCの話をしようと思います。
ESP32にはRTCが内蔵されています。

RTC timer: Allows keeping the system time during any resets and sleep modes, only the power-up reset leads to resetting the RTC timer. The frequency deviation depends on an RTC Clock Source and affects accuracy only in sleep modes, in which case the time will be measured at 6.6667 us resolution.

公式のWikiにも書いてあるとおり、スリープ中も使えるクロックです。
deepsleepの復帰をタイマーで設定するAPIなんかはこのクロックを使っています。
ただ、このクロックは、標準では内蔵RCオシレーターを使うようになっており、
実測したところ30分でも数秒以上の誤差が出ることもありました。
何時何分のデータかタイムスタンプが重要なアプリケーションや、
正確な起動時間が求められるタイマーとしてはこのままでは使うことができません。

そこで、DS3231のようなI2C RTCを接続し、スリープの復帰をGPIO割り込みにして、
RTCのINTピンを使って起こすなんてことをよくしていると思います。
しかし、実はESP32内蔵のRTC、よくRTCに使われる32.786kHzのクロックを
外部から供給して、外付けRTC並の高精度な時刻保持ができるのです。
上記リンクを少し下へスクロールすると、 RTC Clock Sourceという項目があります。
そこには
・Internal 150kHz RC oscillator (default)
・External 32kHz crystal
・External 32kHz oscillator at 32K_XN pin
・Internal 8.5MHz oscillator, divided by 256 (~33kHz)
という利用できるクロックソースのリストがあります。
それぞれ、
標準で使用されるRCオシレーター、
外付け32k水晶
XNピンへのクロック入力
内蔵8.5MHzオシレーターの分周
となっていますが、標準のRCはご存知のようにかなり精度が悪いです。
また、8.5MHzから分周するのも、周波数安定度は高いものの、
周波数が近似値なので均一にかなりずれます。絶対時間での誤差ではRCのほうがマシでした。
そこで、32kHzの水晶を外部に接続する方法を試してみました。


ひどい話ですね。これまで流通していたESP-WROOM-32では
うまくRTC用クロックソースの水晶を発振できませんでした。
そんな矢先、秋月でもチップバージョン3のWROOM-32Eが発売されていたので
本当にそちらでは動くのか試してみました。

水晶のドライブに必要な回路はデータシートの11-12ページに書いてあります。


GPIO32, 33に並列に抵抗を入れて、あとは水晶と負荷容量をつなぐだけです。
並列の抵抗は5M~10MΩとされていたので、手持ちのある5.1Mを使いました。


なお、ハードウェア的に接続するだけで自動的に水晶が使われるわけではなく、
ビルドオプションでクロックソースを別途設定する必要があります。


idf.py menuconfigで
Component config->ESP32-specific
RTC clock sourceでEnterを押して
External 32kHz crystalを選択
Number of attempts to repeat 32k XTAL calibrationでEnterを押して、
適当に数値を増やす
(これをしないと、発振の開始が間に合わずRCに切り替わってしまいます。)
なお、この数値を莫大な数値にすると、
発振できない場合にブートローダー内でWDT Resetが掛かりブートループになります。

うまく発振できないと、ブートローダーでこのようにエラーが出て、RCに切り替わります。


プローブを当てて、発振できているのにこの表示になる場合は、
Number of attempts to repeat 32k XTAL calibrationの数値を増やすといいと思います。


うまく発振できると、App cpu upの周りでエラーが表示されなくなります。
このように、ESP-WROOM-32Eでは外付けの水晶を使ったRTCクロックソースを
使用することができました。

この状態で実際に仕事で使ってみていますが、半日時計合わせをしなくても
1秒以内の誤差になっているため、
外付けRTCなしでも絶対時刻が重要なアプリケーションで使用できています。

ちなみに、秋月で売っているESP-WROOM-32Eは、技適マークが刻印されておらず、
シールが添付されていますが、3月のロットからは技適マークが入るようになっています。

Changes of the marking on ESP32-WROVER-E and ESP32-WROVER-IE to add new certification identification

実際にDigiKeyで3月に購入したものについては、技適マークが入っていました。

2021年1月10日日曜日

WindowsでphpMyAdminを使う+多段SSHポートフォワードでDBのポートが通るようにする

サーバーサイドは本番環境は自分は作らず、試作や検証目的のことが多いので、
データベースは1つのVPS上にMariaDB+Webサーバ&phpMyAdminの環境を構築して
SSHポートフォワードで直接サーバ内のphpMyAdminを開いてSQLを投げていたのですが、
たまに本番環境のDBも時折直接編集する必要が出てきて、
Amazon AWS VPC内にあるRDSを多段踏み台経由で操作する必要ができました。
接続の構成としてはこんな感じ。

ひとまずRLoginで多段踏み台経由でRDSと接続するポートをSSHポートフォワーディング、
やはりGUIで操作したいのでMySQL Workbenchを使ってやっていたのですが、
phpMyAdminのほうが慣れていてやっぱり使いやすいよなということで、
ローカルにphpMyAdmin環境を構築し、リモートDBを参照できるように設定してみました。
結果はうまくいっていつもどおりphpMyAdminからRDSを操作できています。
ぱっと調べてもコピペで動くページが見つからなかったので手順をまとめておきます。

構成:
OS: Windows 10(x64) WSLも使わないしあんまりバージョンは問わない
Webサーバ: nginx version: nginx/1.19.6
php: PHP 8.0.0 (cgi-fcgi) (built: Nov 24 2020 22:02:53)
ターミナル: RLogink (x64) Version 2.25.6 (2020/12/09)
phpMyAdmin: 5.0.4

多段SSHポートフォワードでSQL用のポートが通るようにする
RLoginをダウンロード
Tera termのスクリプトとかでもできるみたいなんですが、
RLoginならGUIで全部設定できるので最近は結構使っています。
少しスクロールしたところに、GitHubからダウンロード、実行プログラム…
という項目があります。
64bit Windows 10なのでrlogin_x64.zipをダウンロードしました。
インストーラではなく解凍したところにいきなり実行ファイルがあるので、
適当な場所へ移動しておいたほうがいいと思います。

起動するとServer Selectというダイアログが出るので、新規をクリック

まずはエンドポイントとなる踏み台の接続情報を埋めていきます。
ホスト名に踏み台のホスト名あるいはIPアドレスを入力
ユーザー名に接続ユーザー名、パスワードログインが可能ならパスワード
鍵認証の場合は、SSH認証鍵ボタンで鍵ファイルを選択
エントリー欄にわかりやすい名前(踏み台1など)をつけておく

プロトコル項目のポートフォワードをクリック

新規をクリックしてSSH2ポートフォワード設定ウインドウで
Local Socksを選択
Host: localhost、Port: 11022(任意)
でOK

一旦つないでみて、SSH接続できたら踏み台1の設定はOK。
VPC内にあるDB接続用踏み台の接続プロファイルを作成
再びServer Selectウインドウで新規をクリック

右上にあるタブ(上)、前接続先(下)の下のプルダウンで
先ほど作成した接続プロファイルを選択

IPアドレス(Host名)、ユーザー、認証情報を入力
プロキシ設定ボタンでSelect Proxy Protocol: SOCKS5を選択
Server OptionでProxy Server Address: localhost
Socket Portを先ほど設定したポート 11022に設定してOK

プロトコル→ポートフォワードウインドウを開く
Listened: Local、 Host:localhost、 Port: 13306(任意)
Connect: Host: RDSのIPアドレス、 Port: 3306
に設定してOK

Server Selectに戻り、踏み台2のほうに接続すると、
自動的に多段SSH接続してくれて、RDSのポートも通るようになる。

Nginx+phpMyAdminを使えるようにする
上記手順でlocalhost:13306でRDSと接続できるようになったので、
phpMyadminをセットアップ。

Nginxをダウンロード
nginx/Windows-1.19.6 を選びました。解凍してC:\nginxに移動しました。

phpをダウンロード
x64 Non Thread Safe のZipをダウンロードしました。解凍してC:\phpに移動しました。

phpMyAdminをダウンロード
右側にDownloadってリンクボタンがあります。
解凍して、C:\nginx\html\phpmyadminに移動しました。

C:\nginx\conf\nginx.confをエディタで開き、
location ~\.php$...の部分のコメントアウトを外して有効にして、
SCRIPT_FILENAMEの行を修正します。

        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

とりあえずphpが動くようになったか確認してみます。
C:\nginx\html\phpinfo.phpに以下の内容のファイルを保存します。

<?php
phpinfo();
?>

Nginxとphp-cgiの起動スクリプトを作成します。
C:\nginx\run.batに以下の内容のファイルを保存します。

start nginx.exe
start C:\php\php-cgi.exe -b 127.0.0.1:9000

停止用スクリプトも作成します。
C:\nginx\stop.batに以下の内容のファイルを保存します。

  nginx -s stop
  taskkill /F /IM php-cgi.exe

run.batを実行して、
http://localhost/phpinfo.php
を開いて、
phpinfoが正常表示できれば準備完了です。
停止するときはstop.batを実行すればphp-cgiとnginxが停止します。


phpMyAdminの設定を行います。
C:\nginx\html\phpmyadmin\config.sample.inc.phpをコピーして、同じフォルダにconfig.inc.phpとして保存します。
内容を以下のように編集します。

  $cfg['Servers'][$i]['host'] = 'localhost';
  $cfg['Servers'][$i]['port'] = '13306';

ポートフォワードでローカルホストの13306でRDSと接続できるようにしたので、
host: localhost、port: 13306にします。
portの項目がない場合は行を追加すればOKです。
コメントアウトされている場合はコメントアウトを解除して設定を有効にしてください。
保存して、
http://localhost/phpmyadmin/index.php
を開くとphpMyAdminが開きます。
RDSの接続情報を入れればRDSをphpMyAdminで操作できます。



2021年1月2日土曜日

ジョゼと虎と魚たちを見た感想

劇場版ヴァイオレット・エヴァーガーデンを見てから、一人映画もなかなかいいなと思い、
ご飯食べにでかけた先で折角来たのでみたいな感じで、
ヴァイオレット・エヴァーガーデンは3回も見たりしてました。
大人向けアニメ映画自体それほどぶわーっと人が入る映画でもないので、
館内もわりと閑散としていてコロナ禍向きのエンターテインメントだなと思っています。
映画館ごとに椅子の座り心地とか、スピーカーのセッティングが違うのがわかり、好みもわかってきたような気がします。

ヴァイオレット・エヴァーガーデンを見るときに予告編で何度か見ていた、
「ジョゼと虎と魚たち」を今度は見ようと思っていて、
たまたま最寄りの映画館の予約を見たら1席しか予約入っていなかったので
空いてていいじゃんと今日行ってきました。
結局僕を含めて5人くらいしか入ってなかったです。この回、赤字なのでは…


さて、内容ですが、
生まれつき足が動かないようで、車椅子に乗ったジョゼと、
アルバイトでもダイビングショップで働くダイビングをライフワークにしている学生、管理人と、
ダイビングショップのアルバイトの同僚が主な登場人物です。
ひょんなことから主人公の大学生は「管理人」としてジョゼの世話焼きのアルバイトを始めます。
ジョゼはおばあちゃんと二人暮らし。
おばあちゃんには外は危険で恐ろしい猛獣ばかりと言い聞かされながら毎日家の中で過ごしています。
ふわふわした可愛らしい見た目ですが毒舌で横暴。
自分の部屋のふすまを閉めたまま、ふすま越しに管理人に無茶な要求をして使い走らせます。
高額な時給を目当てに管理人は必死で要求に答えますが、
掛け持ちバイト先のダイビングショップの同僚に、「アイツ絶対泣かす」とボヤきます。



ある日、いつものようにジョゼの家へ行くとジョゼの姿がありません。
管理人はおばあちゃんと一緒に探し回ります。ジョゼを見つけた管理人は、
これからたくさんジョゼと一緒に外の世界へ出歩くことになります…

ネタバレはこれくらいにしときます。予告見た感じだと全然話わからなかったので、
これくらいの情報は知ってても良かったなと思ったのをまとめたのが上のあらすじです。

内容ではありませんが、音楽がヴァイオレット・エヴァーガーデンと同じEvan Callさんで、
とても情景に合った効果的なBGMになっていたと思います。
舞台は大阪の市街地で、ちょうど先日マジミラ併催イベントの通天ミクを見に行ったので記憶に新しい町並みが丁寧に描かれていました。

主人公の管理人はひたむきで人当たりもいい好青年。
自身の夢、目標に対して一歩一歩近づいていきます。
この時点で、僕はこういう人に弱いので自己実現を応援したくなります。
一つステップを進むたび、こちらもうれしくなります。
夢を掴むためのステップを自分で組み立てて一歩ずつ進んで行く感じがよく描かれています。
僕自身進路とかを真面目に考えたことがほとんどなくて、
成り行きで大学卒業まで進んできたので、しっかりとした夢や目標がある人に憧れる部分があるのかなと思います。
ストレートに何もかもうまく行ってしまうと物語にならないのでやはり挫折があります。
絶望で空っぽになってしまったところ、仲間に夢を思い出させてもらう、月並みなパターンですが、内容が、本当に自分も頑張ろうと思うだろうなという説得力のあるエピソードになっています。

ジョゼも、家に閉じ込められていたところから、怖い世界だと思っていた外の世界に触れ、
友達もできて、自分の生き方や目標を見つけます。


「何者」という映画があって、就職活動を描く作品で、
大してやりたいこともないけどどっかに入らないといけない。
何社受けても面接で落とされる。じゃあどんな自分を作って面接で見せたらいいんだろう。
そもそもこんなことはなんの意味があるんだろう?
みたいな鬱々とした作品なのですが、その逆って感じですね

今就職活動中や、受験する大学を決めようみたいな進路について考えている学生は、
やりたいことがない人も、多少なりとも夢がある人も「何者」よりはジョゼを見たほうがいいと思いますw
やりたいことがあって、自分でそのためにどうしたらいいか考え、歩きながら、
そのやりたいことに対して周りの理解や応援があると、
それが実現してもしなくても本当に幸せだろうなと思うのですよ。
自分がそうじゃなくても夢を追う人を支える側になり、一歩一歩自己実現に近づくのを共に喜ぶこともやはり幸せだろうなとダイビングショップの仲間を見ていて思いました。

本音ですか?
管理人のように芯のあるヤツだったら人生豊かで楽しいだろうなと思いました。
自分でバシィッ!と目標を決めて突き進むのは自分の人生を作り上げていく感じがするんだろうなと。
僕なんか成り行きで薄っぺらい人生を歩んでいますよ。それが不幸とまでは感じませんが。