LEDマトリクスパネルを制御ArduinoTweetESP32を使って、Amazonで安価に売られている64x32ピクセルのLEDマトリクスに色々表示できるようにしてみました。あとは適宜ブレッドボードなど。Xの充電状況を測ってみるTweetBluetooth接続ができるUSB電圧・電流テスター「UM24C」を買ってみました。公式のAndroid端末やWindows用のソフトを使って値を読み出すことができます。自作のプログラムからこれを読み出してみました。カラーLCDがついていてなかなか派手ですが見やすい。上下に左右2つのボタンがついていて、これで操作します。操作HELP表示(英語)つき。これ単体で電圧や電流変化のグラフを見ることもできたりして、なかなか高機能です。入手方法Amazonでも購入できます。慣れてる人ならAliExpressで購入した方が安く買えます。選べますが、そちらはBluetooth通信機能がありませんのでご注意を。購入から1週間くらいで届きました。上位版?のUM25Cというのも出ているようですね。Type-Cボートがついているらしい。読み出してみるUSB電源につないだ状態でBluetoothデバイスを表示させてみると、普通のSPP(シリアルボートプロファイル)として見えます。Windowsマシンでは、UM24Cを追加すると、PINを聞かれ、「1234」を入力すれば接続できます。COMボートが2つ追加され、どちらか一方に接続して利用します。Instrumentsの計測プラットフォーム(NI-VISA)が丸っと入るため、かなり巨大です。)に接続してもデータが読めず。以下の手順で接続できました。接続できるようになりました。あとは、適当なプログラムでこのポートを開き、「0xf0」の1バイトを送信すると、130バイトほどのレスポンスが返ってきます。いうターミナル接続ソフトです。A...他にも電流積算値や抵抗値など、画面上に出ているものは大体そのまま全て並んでいることがわかります。」「0xf4」で積算値グループの切り替えやクリアができたりします。プログラムでロギングしてみるRubyでログを記録するプログラムを書いてみました。1endこれを実行すると1秒ごとにJSON形式で計測値が出力されます。Xの充電中の電流などを計測してみました。使って取得することができます。trueこれを定期的に記録して、UM24Cで測った計測値と合わせてグラフ化してみました。以下が残り5%の状態から100%までの、2時間半の充電中の状況です。単位が入り混じってしまっていますが、92-93%くらいまで充電されたところで充電電流がカクッと減る様子などがみて取れます。2700mAhと結構ぴったり一致しました。Xの最大容量は2800mAhですが、使っているうちに僅かに劣化したようです。いえ充電中も電源はONなので、iPhoneの消費と誤差がたまたま相殺したのでしょうかね。AMG8833、いわゆるGrid-EYEを使ってみました。www.switch-science.com上記の説明の通り、60度の四角錐の測定エリア(2次元)を8x8に分割した64個のピクセルについて、0〜80°Cの温度が得られます。時間分解能は10fpsです。I2Cで読み出してみました。SDA)の線で繋ぐだけで動作します。ESP8266の場合、ArduinoのWireライブラリはデフォルトでSDAにGPIO4、SCLにGPIO5を使用するため、この通りにしておくとスムーズです。(これ以外のピンでもピン番号さえ指定すれば動作します。)ESP8266はこちらのブレークアウトボードを使いました。ESP-WROOM-02-搭載mikroBUS-R-対応ブレークアウトボード-Ver-2基盤は以前別の目的でFusionPCBで作ったものを流用しています。GPIO13にはステータス確認用のLEDがついています。AMG8833が取得した10fpsの結果をリアルタイムに手軽に可視化して見るため、WebSocketでブラウザにデータを流して表示してみることにします。ESP8266上にWebサーバ/WebSocketサーバを乗せて、そこにWebブラウザで接続すれば見られるようにしましょう。AMG8833に対応したArduino用のライブラリはいくつか公開されていますが、今回はAdafruitが公開しているものを使いました。Libraryを検索してインストールします。いうライブラリも入れておきます。これは名前の通りWebSocketのサーバ/クライアント実装です。IDEで書き込みます。AMG8833に関連するのは以下の部分です。0x68はこのセンサのI2Cアドレスです(0x68と0x69を基盤上のジャンパで選択可能。Adafruitのライブラリではデフォルトが0x69になっていました。amg.readPixels(pixels);ESP8266を起動すると、指定したWi-Fiに接続し(接続中は1秒間隔でLEDが点滅し、接続成功すると3秒間隔の点滅になります)、Webサーバが起動します。」のように接続すると、以下のように8x8のグリッドにリアルタイムの出力値が表示されます(なお自分の方に向けたときに鏡像になるよう、左右反転して表示させています)。近距離なら人の形が識別できそう。センサから2mくらい離れたところで手を振ってみたところ。10fpsだと結構動きもわかります。暖房をつけている状態で部屋全体が入るくらいの距離にしてみると、天井近くの方が床付近よりも2〜3°Cくらい暖かいことがわかったりします。ここで見ているのは空気の温度ではなく、壁の温度だと思います。Request作成ページを開くコマンドを作りました。ghprとするだけでOK(なおブラウザを開くopenコマンドはMacの前提です)。Request先のブランチを推定する処理です。等として固定値を入れておくと良いでしょう。Qiが搭載されました。Qiでは受電機器から充電器に対して通信を行うことで、充電の開始/停止や電力の調整を行いながら動作しています。これにより異常があれば即時充電を止めるようになっているわけですね。通信速度は2kbpsで、受電側の負荷を変化させることで充電側に電力の変化として通信データを伝える後方散乱変調という仕組みが使われています。詳しくは以下のデータシートなどが参考になります。https://toshiba.semicon-storage.com/info/docget.jsp?did=14812&prodName=TC7763WBG実際にどんな通信がなされているか気になったので、この通信パケットをキャプチャしてみました。rubyTweetMacのターミナル上でRubyのpryを使っている際、Ctrl-Kなどでカットした文字列を貼り付けようとCtrl-Yをタイプすると、サスペンドしてしまうことがあります。ちなみにirbだと発動しません。pry$これはDSUSPという機能によるもの。Ctrl-Z(susp)が入力されたら直ちにジョブをサスペンドさせるのに対し、Ctrl-Y(dsusp)はこのキーで入力された制御文字をプロセスがreadしたタイミングでジョブをサスペンドさせるというもので、BSD互換の環境のみで利用可能な機能だそうです。なっているのが分かります。Liunx環境では発生しないこともあり、よくMacでだけハマって面倒なので、dsuspを無効化します。undefを実行すればOK。undefなどと書いておけば良いでしょう。15:21pryがCtrl-YでサスペンドしてしまうTweet広告を非表示にするもっと読むコメントを書く2017-04-24Node.jsでUNIX-likeにパイプ処理JavaScriptTweet巨大なテキストデータを標準入力(pipe等)から受け取り、1行ずつ何か処理をして、結果を標準出力(これもpipe等)に書くプログラムを書こうとしてハマるパターン。(なお文字コードのことはここでは忘れたことにするので、別途対応が必要かもしれない。}process.stdin.fdは非同期openされたfdを返すため、fs.readするとpipeにデータが来なくなった瞬間、例外になる。}});一見うまく行くように見える。いうかAPIドキュメントに載っているソースである。して試してみれば良い)。memoryお亡くなりになる。指定すれば同期readとなる(というかshellがopen(2)したfdがそのまま使われる)。書き出し}これも全データを一度に読み込もうとしてしまうため、メモリが枯渇する。bufferを使って何か処理して結果を出力。ここではbufferをそのまま出力する。buffer);}またしてもメモリが枯渇する。fs.writeはどんどんメモリにwriteすべきものを積んでしまうのだ...。process.stdout.writeも同じである。writepipeがストールした瞬間、例外。process.stdout.fdも非同期openされたfdなのである。n)を使って何か処理して結果を出力。ここでは入力をそのまま出力する。n));}行で分割したい1行ずつstdinを同期的に読んで返すreadline関数を作ってみる。改行で入力チャンクが切れるとは限らないので、チャンク同士を繋いでやる処理が必要になる。"\n");}BUFFER_SIZEはデフォルトのパイプバッファサイズである64KBにしてみた。これはC言語か何か?というような代物になってしまった。node.jsのプログラミングパラダイムでなんとかしたい。使えばバッファをいい感じに管理してくれて、入力にバックプレッシャーを伝えることができる。処理部分はstream.Transformを使ってTransformStreamとして実装する。LineStreamをpipeで挟むだけで、改行区切りで送ってくれるようになる。空行は消えるので注意。.pipe(process.stdout);問題点:Cっぽいやつより4倍遅い。バッファの量の設定等で早くなるかは不明。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。