2022年10月15日

USBカメラ変換基板 白黒ビットマップ保存モード

今回はUSBカメラ変換基板に追加した新機能について紹介したいと思います。

ちょっとした機械学習等で画像データを利用する場合、データ処理を軽くするため、2値化した画像を用いることが多くあります。実際に160x120のビットマップ画像を保存すると16ビットカラーで1ファイル37.5kB程度となります。一方、同じ160x120のビットマップ画像でも白黒ビットマップの場合、1ファイル2.4kBと1/10以下にファイル容量自体も減らすことができます。

そのような用途にも容易に導入できるようにUSBカメラ変換基板側で白黒ビットマップの保存ができる機能を追加してみました。機能としてはUSBカメラで取得したカラービットマップ画像を大津の2値化を用いて閾値を求め、白黒ビットマップに変換し、SDカード等に保存できる機能です。


実際に白黒ビットマップ保存機能を実装して取得したイメージを紹介したいと思います。

221004_191332_0.bmp

160x120のカラービットマップ画像


221004_191342_0.bmp

白黒モード有効時に160x120の白黒ビットマップ画像

光の反射や陰の部分等、2値化によって少しカラー画像と比べて変化している部分がありますが、大津の2値化として上手く働いており、概ね意図した白黒変換ができていることが確認できました。今回追加した白黒ビットマップ保存の新機能はgithub上のv1.1.0以降のファームウェアにSDカードを用いてアップデートすることで利用可能です。なお、白黒ビットマップ保存はデフォルトでは無効化されています。monコマンドで白黒ビットマップ保存を有効化した場合でも電源再投入やリセット等で設定が無効化されるため、利用する場合は再度、有効化する必要があります。今後も機会を見つけてUSBカメラ変換基板の応用例や機能等紹介したいと思います。
posted by Crescent at 00:00| Comment(0) | TrackBack(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2022年09月24日

WebシリアルAPI+Chart.js +USBシリアルI2C変換基板

今回はWebシリアルAPIを用いたツールの応用編として、Chart.jsを組み合わせてみました。USBシリアルI2C変換基板を介してI2Cデバイスをブラウザから制御、取得したデータからChart.jsで可視化するデモツールを実装してみました。実際に作成したツールをgithub.ioに公開しています。

温度湿度センサSHT31、温度湿度気圧センサBME280について、2秒間隔でデータを取得し、取得したデータをChart.jsで可視化するツール(SHT31用BME280用)を実装してみました。


Graph.jpg


データはサーバ等を介さずにブラウザ内で保持され、そのままグラフ化しています。そのたえめ、オフライン環境でも一度、Chart.jsライブラリ含めてダウンロードすれば、オフライン環境でも動作可能です。また、ブラウザ内で保持された変数をcsvとして出力できる機能も合わせて実装してみました。

初めてChart.jsを使ってみましたが、最近のバージョンではAPIの仕様が変わっているようで少し実装に戸惑いました。例えば、各軸の軸ラベルはxAxes、scaleLabelではなく、下記のx、title、textのようにChart.jsバージョン3.xから変更になっているようです。


let options = {
 scales: {
  x:{title:{display: true, text: 'x軸'}},
  y:{title:{display: true, text: 'y軸'}}
 },
 plugins:{legend:{display: false}}
};


また、グラフのデータをクリアする場合はchartXX.destroy()では再度、グラフ設定や軸のオプション等を設定し直す必要があります。そのため、単に描画のみをクリアする場合は下記のようにグラフデータの変数をx軸、y軸ともに配列をクリアして、グラフ更新すると簡単にクリアできることが分かりました。

data.labels=[];
data.datasets[0].data=[];
chartXX.update();


その他、I2Cデバイスのレジスタアドレスを指定した読み書きのツールも実装してみました。


I2CReadWrite.jpg

Chart.js等と組み合わせて簡単にグラフを描画できるのはWebAPIならではの活用だと思いました。今後は他のライブラリやAPI、センサ等にも対応したいと思います。
posted by Crescent at 00:00| Comment(0) | TrackBack(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2022年09月10日

WebシリアルAPI+USBシリアルI2C変換基板

今回はWebシリアルAPIを用いたツールについて紹介したいと思います。WebシリアルAPIはブラウザのAPIでWebサイトのJavaScriptを使用してPCのシリアルポートにアクセスできる機能です。

WebシリアルAPIで何ができるかというと、新しくソフトやツールをインストールしなくとも、ブラウザからあるサイトにアクセスするとPCのシリアルポートを介してコマンドを送ったり、受信したりすることが簡単に実現できます。残念ならが、WebシリアルAPIに対応したブラウザはEdgeもしくはChromeのみ対応となっており、22年9月時点ではFirefoxやSafariは対応していません。対応したブラウザからアクセスする必要があります。既に有名な使用例として、シリアルターミナルEspruino Web IDE等があります。

今回はWebシリアルAPIを用いて、USBシリアルI2C変換基板を介してI2Cデバイスをブラウザから制御するツールについて紹介します。実際に作成したツールをgithub.ioに公開しています。



メインページ.jpg

メインページから各デバイスのページに移動してください。今回はSHT31のデモを紹介します。USBシリアルI2C変換基板に温度湿度センサSHT31を接続して、ページにアクセスします。


COM_Select.jpg

接続ボタンを押すと、PCに接続れたCOMポートの一覧が表示されるため、USBシリアルI2C変換基板のポートを選択します。今回はCOM7を選択しました。PC環境やこれまでの接続履歴によってポートは変わるため、不明な場合はデバイスマネージャ等からUSBシリアルI2C変換基板を抜き差しして該当するCOMポートを確認してください。


SHT31.jpg

初期化ボタンを押して、取得ボタンを押すと上記のように温度と湿度を取得することが簡単にできました。コードはMITライセンスとして各htmlファイル内に埋め込んでいます。htmlファイルのみでオフラインやローカル環境(htmlファイルをダウンロードしてからローカルで使用する)でも動作可能です。

今回はWebシリアルAPIを用いてUSBシリアルI2C変換基板から温度湿度センサSHT31と通信しました。今後は他のデバイス等を含めた応用的な機能を開発し、メインページに順次公開したいと思います。ただ、Windows環境では使用する中でWebシリアルAPIはサンプルAPIそのままのコードであっても時折、接続できなくなることがあり、ページの再読み込みやPCの再起動等が必要になる場合がありました。非常に便利なAPIであるものの、少し未完全な部分があるようです。
posted by Crescent at 00:00| Comment(0) | TrackBack(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2022年08月13日

1-WireマスタコンバータDS2485

1-WireはGNDと電力を兼ねた信号線1本だけで低速なデータ転送を行うシリアルインターフェイス規格です。I2CやSPIと違って基板内や基板同士の通信でなく、外部に延長することを目的としていたシリアル通信規格のため、最長で数百m以上ケーブルを伸ばしてセンシングすることが可能です。

今回、紹介するのはI2Cから1-Wireデバイスを制御するための1-Wireマスタコンバータ、DS2485です。126Byteのバッファ、0.75kbit(32Bytex3)のEEPROMを搭載しています。I2Cから1-Wireに変換するコンバータとして、従来のDS2482、DS2483、DS2484等がありますが、DS2485は細かいタイミング調整やバッファ、EEPROM等を備えています。一方、コマンド等は従来と互換性がなくなっています。また、標準では3.3V系専用で5V系には対応していません。5V系で動作させるためにはレベル変換が必要です。なお、DS2485に備えられたGPIOはユーザ側でオープンドレインIOとして利用可能ですが、データシート内のP.38のP-Channel Enableビット等があることから仕様上はストロングプルアップのP-FET制御用のIOを想定しているようです。


マイコンから直接、1-Wireを制御する場合に比べて、1-Wireマスタコンバータを使用するとI2Cからコマンドを書き込んだり、値を読み込んだりするだけで通信できるため、マイコン側の負荷が低減できます。特に1-Wireはタイミングにセンシティブなため、一般的なマイコンで実装すると1-Wireの通信中は処理が占有されてしまいがちです。そのような場合に便利なのが1-Wireマスタコンバータです。

1-Wireマスタコンバータ、DS2485の変換基板を作成して、有名な1-Wire温度センサ、DS18B20を接続してみました。


1Wire.jpg

1-Wireで必要なコマンドが1-Wireマスタコンバータに予め実装されているため、簡易に1-Wire機能を実装することが可能です。実装後の動作確認ではすんなり動作せず、原因を追ったところ、初期設定が必要なレジスタがあることが分かりました。1-WireマスタコンバータDS2485として電源投入後、Master Reset 62hコマンドくらいで、その他のタイミング等はデフォルト値で問題ありません。ただ、RPUP/BUFコマンドについてはエラッタなのか、デフォルト値から変更が必要なことが分かりました。RPUP/BUF Registerの初期値は803Chとなっており、一般的な条件では0006hに設定変更が必要です。他のレジスタはデフォルトで0006hになっているにも関わらず、RPUP/BUFだけは0006hに変更が必要なため、分かりづらく、注意が必要だと思いました。

1-Wireは省配線でありながら、1-Wire温度センサ、DS18B20の他、熱電対やEEPROMメモリ、I2C/SPIブリッジ等の様々なデバイスがあることから、色々試してみたいと思いました。
posted by Crescent at 00:00| Comment(0) | TrackBack(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする

2022年07月23日

ST製気圧センサLPS25HB注意点

ST製気圧センサLPS25HBを使っていて、うまく気圧データを取得できないという問題に遭遇したため、その対処方法について紹介したいと思います。今回は秋月電子で販売されているLPS25HBの変換基板を使用しました。

現象としては一般的なI2Cデバイス同様にアドレス、レジスタを指定して、データをまとめて読み出すという流れでLPS25HBから気圧データを3byte分読み出すと同じ値のデータが3つ読み出され、意図した値が読み出せてないということが分かりました。データシートをよく見るとLPS25HBは一般的なI2Cデバイスと異なり、まとめてデータを読み出す際の自動アドレスインクリメントがデフォルトで無効化されているということが分かりました(データシートP.25)。自動アドレスインクリメントを有効化する場合はレジスタの最上位ビットに1をセットして読み出すと記載があります。自動アドレスインクリメントとは、2バイト以上のデータを読み出す際に先頭のレジスタのみ指定すると自動的にレジスタをインクリメントして一括で2バイト以上のデータを読み出せる機能です。

つまり、LPS25HBで気圧データ等を取得する場合、個々のレジスタを指定して1つずつ読み出すか、レジスタの最上位ビットに1をセットして読み出す必要があります。

例えば気圧データの場合、レジスタはPRESS_OUT_XL 0x28、PRESS_OUT_L 0x29、PRESS_OUT_H 0x2Aとなり、0x28を指定して3回読み出しするのでなく、レジスタの最上位ビットに1をセットした0xA8を指定して3回読み出しする必要があります。同様に温度の場合は0x2Bでなく、0xABを指定する必要があります。


他のST製気圧センサをざっと調べてみたところ、自動アドレスインクリメントがデフォルトで無効化されているのはLPS25HBのみということが分かりました。



製品名アドレスインクリメント有無
ILPS22QS
LPS22CH
LPS22DF
LPS22HB
LPS22HH
LPS25HB×
LPS27HHTW
LPS27HHW
LPS28DFW
LPS33K

LPS25HBを使用する際は自動アドレスインクリメントがデフォルトで無効化されていることに注意してください。一般的な多くのI2Cデバイスはアドレスの自動インクリメントが有効化されていますが、ごく稀に自動アドレスインクリメントがデフォルトで無効化されているデバイスがあります。LPS25HBに限らず、I2Cデバイスの読み出しで同じ値が読み出されるという場合は自動アドレスインクリメントの設定がどうなっているか確認した方が良いと思いました。
posted by Crescent at 00:00| Comment(0) | TrackBack(0) | 電子部品 | このブログの読者になる | 更新情報をチェックする