環境センサーからセンサー値を取得します。
- 構文
- OMRON.DeviceInformation( UUID, cache )
OMRON.LatestSensingData( field, cache )
OMRON.LatestCalculationData( field, cache )
OMRON.LatestDataLong( type, data )
- 引数
- UUID 必須
- 取得する項目のUUID
- field 必須
- 取得する項目のフィールド
- type 必須
- 取得する項目のタイプ
- cache 省略可
- キャッシュから取得するかを示すブール値
- 戻り値
プログラム
Pythonプログラム
以下はPythonのプログラムで、OMRONモジュールと同じフォルダに2JCIE-BU01.pyというファイル名で保存します。
環境センサー
環境センサーの準備
OMRONモジュールで値を取得するために以下の環境センサーを使用します。
センサー値はPythonでは取得出来たがSENSOR関数 (スクリプト関数)では取得出来なかったので、UWSCからPythonを経由して値を取得します。
Pythonがインストールされていない場合は、Pythonのインストールを参考にインストールを済ましておいてください。
2JCIE-BU01で取得できる項目は以下のとおりです。
- 温度
- 湿度
- 照度
- 気圧
- 騒音
- 3軸加速度
- eTVOC
- 不快指数
- 熱中症警戒度
- 振動情報(地震回数、振動回数、SI値)
詳しい製品情報については2JCIE-BU 環境センサ(USB型)/形式/種類 | オムロン制御機器をご覧ください。
マニュアルは形2JCIE-BU01 環境センサ(USB型) ユーザーズマニュアルを参照。
USBドライバーのインストール
Windowsでこの環境センサーからのデータを取得するには、USBドライバーをインストールする必要があります。USBドライバーとは、USBデバイスをパソコンに接続して使用できるようにするソフトウェアのことです。
形2JCIEシリーズ ソフトウェアダウンロード使用許諾 | オムロン電子部品サイト - Japanを開き、ご承諾事項に同意しますにチェックを入れダウンロードページを開きます。
ダウンロードファイル、環境センサ (USB型)、USBドライバにある2jcie-bu01_usbdriver.zipをダウンロード、解凍します。
インストールの手順は環境センサ(USB 型)(2JCIE-BU01) ドライバーインストール説明書のPDFファイルをダウンロードし参考にしてください。
環境センサ(2JCIE-BU01)をパソコンのUSBポートに接続します。
スタートを右クリックしメニューからデバイス マネージャーを開きます。
Windows\ほかのデバイス\2JCIE-BU01を右クリックしドライバーの更新を選択します。
ドライバーの検索方法が表示されるので、コンピューターを参照してドライバーを検索を選択します。
参照で解凍した2jcie-bu01_usbdriverのフォルダを指定しを選択します。
ドライバーが正常に更新されましたと表示されるので、閉じるを選択します。
問題なく更新できていればWindows\ユニバーサル シリアル バス コントローラー\OMRON Environment Sensor 2JCIE-BU01が追加されます。
Windows\ほかのデバイス\USB Serial Portを選択し、ドライバーの更新を選択します。
ドライバーの検索方法が表示されるので、コンピューターを参照してドライバーを検索を選択します。
参照で解凍した2jcie-bu01_usbdriverのフォルダを指定しを選択します。
ドライバーが正常に更新されましたと表示されるので、閉じるを選択します。
Windows\ポート(COMとLPT)に2JCIE-BU01 Serial Port (COM3)と表示されていればドライバーのインストールは完了です。
Pythonのインストール
まずDownload Python | Python.orgでPythonをダウンロードし、EXEファイルを実行します。
Use admin privileges when installing py.exeとAdd python.exe to PATHにチェックを入れInstall Nowをクリックします。
それぞれ管理者権限でpy.exeをインストール、python.exeを環境変数に追加という意味です。
Install Nowのすぐ下に記載されてるC:\Users\akita\AppData\Local\Programs\Python\Python313にインストールされます。これはユーザー名やインストールするバージョンによって変わります。
すぐにインストール処理が開始されます。
ユーザー アカウント制御が表示されたらはいを選択し、デバイスに変更を加えることを許可します。
インストールが続行されるので、完了するまでしばらく(5分程度)待機します。
Setup was successfulと表示されたらインストールは完了です。Disable path length limitはクリックせずCloseを選択し終了します。
Pythonのパスを通す
インストール時にAdd python.exe to PATHを選択していれば以下の手順は不要です。
スタートを右クリック、システム、システムの詳細設定、環境変数、*** のユーザー環境変数の変数名Pathを選択して編集、環境変数名の編集ウィンドウが開くので、新規で以下の2つを追加します。
usernameにはユーザー名、Python313はインストールするPythonのバージョンによって変わってくるので適宜修正してください。
パスが通っていればコマンドプロンプトでpythonと実行したときにバージョンが表示されます。
- 結果
スクリプトの準備
Pythonのインストールが完了したら、実際にスクリプトを実行してみます。ここでは、オムロン公式がGitHubで公開しているPythonのスクリプトを実行してみます。GitHub - omron-devhub/2jciebu-usb-raspberrypi · GitHubを開きCode、Download ZIPをクリックしZIPファイル(2jciebu-usb-raspberrypi-master.zip)をダウンロードします。
解凍したらsample_2jciebu.pyをメモ帳などのテキストファイルで開き、の103行目(serialモジュールSerial関数)を以下のように/dev/ttyUSB0からCOM3に書き換えます。Serial関数の第一引数は接続するシリアルポートを表していて、シリアルポートはUSBドライバーのインストールが完了したときにWindows\ポート(COM と LPT)で2JCIE-BU01 Serial Port後ろの括弧内に記載されているので、COM3に修正して動作しない場合はこちらを確認してください。
またsample_2jciebu.pyを実行するにはpySerialというパッケージが必要で事前にインストールしておく必要があります。コマンドプロンプトもしくはPowerShellで以下のプログラムを実行することでインストールができます。
スクリプトの実行
コマンドプロンプトでpythonの後にスクリプトのパス名を指定することでスクリプトを実行することができます。解凍してシリアルポートを編集したsample_2jciebu.pyのパス名を指定してください。
python、半角スペースと入力したあとにファイルをドラッグアンドドロップで指定することできます。
- 結果
以下のようなエラーが出る場合も、何度か試していると結果を取得できることもあります。
- 結果
PySerialのインストール
モジュールが見つからずインポート出来なった場合は、以下のようなエラーが発生します。今回はModuleNotFoundError: No module named 'serial'というシリアル通信を行うためのライブラリが読み込めていません。
- 結果
PySerialはPythonでシリアル通信を行うためのライブラリが必要で以下のプログラムをコマンドプロンプトまたはPowerShellで実行しインストールします。
- 結果
アンインストールするにはコマンドプロンプトまたはPowerShellで以下のプログラムを実行します。
- 結果
サンプルプログラムの実行
ユニバーサル シリアル バス コントローラー、OMRON Environment Sensor 2JCIE-BU01も同様にドライバーを更新します。
ドライバーをインストールする前だとエラーが発生します。
- 結果
コマンドプロンプトで以下を実行しエラーが発生する場合は、ドライバーのインストールができていません。
- 結果
- 結果
Stirling
Pythonではバイナリデータを扱うのでStirlingの詳細情報 : Vector ソフトを探す!をインストールしておくと良いです。
USB通信
通信仕様
USB通信の通信仕様は以下の表の通りです。形2JCIE-BU01 環境センサ(USB型) ユーザーズマニュアルP69を参照。
| 項目(Item) | 仕様(Spec) |
|---|---|
| 通信速度(Baud rate) | 115200bps |
| データ長(Data size) | 8bit |
| ストップビット(Stop bit) | 1bit |
| パリティ(Parity) | なし |
| フロー制御(Flow Control) | なし |
フレーム形式
共通フレーム形式
USB通信で送受信する際のフレーム形式を以下に示します。2バイト以上のデータはすべてリトルエンディアンで記述します。
| Header | Length | Payload | CRC-16 | |||
|---|---|---|---|---|---|---|
| 2 byte | 2 byte | N byte | 2 byte | |||
| 0x52 | 0x42 | L byte | H byte | - | L byte | H byte |
- Header
- フレームの開始を表す。ASCIIコードのBR(0x4252)で固定
- Length
- PayloadからCRC(末尾)までのデータ長をリトルエンディアンで指定
- Payload
- コマンドに応じたフレームを設定。Payload部はUSB originalの要求内容、BLE commonの要求内容によって異なる。ペイロードフレーム形式を参照。
- CRC-16
- HeaderからPayload末尾までのCRC結果をリトルエンディアンで指定
巡回冗長検査(CRC-16)の計算
CRC-16(CRC-16-IBMとも呼ばれる)は巡回冗長検査の一種で、データ通信でデータの誤りを検出するのに使用されます。
- 生成多項式
- 生成多項式とは、巡回冗長検査でデータの誤りを検知するための多項式です。送信データをこの多項式で割った結果を付与し、受信側でその値を再計算することでデータの誤りを検知することができます。CRC-16-IBMの生成多項式は以下に示すとおりです。
\[x^{16}+x^{15}+x^{2}+1\]
生成多項式そのままでは計算に使用できないので、生成多項式からバイナリ形式に変換した値を求めます。
まず生成多項式の係数が0になる項も省略せずに定数項まで書き出します。 \[1x^{16}+1x^{15}+0x^{14}+0x^{13}+0x^{12}+0x^{11}+0x^{10}+0x^{9}+0x^{8}+0x^{7}+0x^{6}+0x^{5}+0x^{4}+0x^{3}+1x^{2}+0x+1 \times 1\] この多項式の項と係数を分けると以下の表のようになります。CRC-16のとき\(x^{16}\)の係数は必ず1になるので省略。
この係数部分のみを抽出し次数の高い順に並べバイナリ形式(2進数)で表すと0b1000 0000 0000 0101で16進数では0x8005となります。係数 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 項 \(x^{15}\) \(x^{14}\) \(x^{13}\) \(x^{12}\) \(x^{11}\) \(x^{10}\) \(x^{9}\) \(x^{8}\) \(x^{7}\) \(x^{6}\) \(x^{5}\) \(x^{4}\) \(x^{3}\) \(x^{2}\) \(x\) 1
一方、次数の低い順に並べると0b1010 0000 0000 0001で16進数では0xA001となります。係数 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 項 1 \(x\) \(x^{2}\) \(x^{3}\) \(x^{4}\) \(x^{5}\) \(x^{6}\) \(x^{7}\) \(x^{8}\) \(x^{9}\) \(x^{10}\) \(x^{11}\) \(x^{12}\) \(x^{13}\) \(x^{14}\) \(x^{15}\) - 初期値
- 0xFFFF
巡回冗長検査を求める手順を以下に示します。
- CRCレジスタの初期値を0xFFFFにする。
- CRCレジスタとメッセージの初めの8bitデータのXORを計算し、結果をCRCレジスタに戻す。
- MSBは0で埋めながら、CRCレジスタを1bit右シフトする。
- LSBからシフトされたbitが0ならば、3の手順を繰り返す。1ならばCRCレジスタと0xA001でXORを計算し、結果をCRCレジスタに戻す。
- 8bit分シフトするまで3、4の手順を繰り返す。
- パケットの最後まで処理していなければ、CRCレジスタとパケットの次の8bitのXORを計算してCRCレジスタに戻し、3の手順から繰り返す。
CRC-16を求めるPythonのブログラムです。
ブラウザ上で値を確認したい場合は、以下のテキストボックスにデータを入れることでCRC-16を求めることができます。
サンプルとして表示している0x52 0x42 0x05 0x00 0x01 0x0A 0x18は4.5.25 Device information (Address: 0x180A)のデバイス情報を取得するときのコマンドで、Header、Length、Payloadの項目を表しています。
コマンドとして送信するにはこれらの末尾にCRC-16を付与する必要があります。0x52 0x42 0x05 0x00 0x01 0x0A 0x18のCRC-16を求めると0x8DFCとなり、下位ビットから8bitずつ並べるとCRC-16を含めたコマンドは0x52 0x42 0x05 0x00 0x01 0x0A 0x18 0xFC 0x8Dとなります。
ペイロードフレーム形式
共通フレーム形式のPayloadに以下のCommand、Address、Data(エラー発生時はCode)が入ります。
ホストコントローラ
コマンドを送信するときのペイロードフレーム形式です。
| Command | Address | Data | |||
|---|---|---|---|---|---|
| 1 byte | 2 byte | N byte | |||
| - | L byte | H byte | L byte | … | H byte |
- Command
-
ReadもしくはWriteを指定
Command Contents 0x01 Read 0x02 Write - Address
- 実行する内容に応じたAddressをリトルエンディアン形式で指定
- Data
- Addressに応じた内容をリトルエンディアン形式で指定
レスポンスのフォーマット
コマンドを送信して問題なくデータが取得できたときのペイロードフレーム形式です。
| Command | Address | Data | |||
|---|---|---|---|---|---|
| 1 byte | 2 byte | N byte | |||
| - | L byte | H byte | L byte | … | H byte |
- Command
-
ReadもしくはWriteを返します。
Command Contents 0x01 Read 0x02 Write - Address
- ホストコントローラで指定されたAddressを返します。
- Data
- ホストコントローラで指定されたAddress、Dataによって取得された内容に対応したDataを返します。
エラー時のフォーマット
問題が発生しデータを正常に取得できなかったときのペイロードフレーム形式です。
| Command | Address | Code | |
|---|---|---|---|
| 1 byte | 2 byte | 1 byte | |
| - | L byte | H byte | - |
- Command
- ReadもしくはWriteを返します。エラー発生時はCommandのMSBを1とした値(0x80を加えた値)となります。Read、Write以外のCommandを受信した場合はUnknown(0xFF)を返します。
Command Contents 0x81 Read error 0x82 Write error 0xFF Unknown - Address
- ホストコントローラで指定されたAddressを返します。
- Code
-
発生したエラー内容に対応したコードを返します。
Code Description Contents 0x01 CRC error CRC-16計算が誤っている場合 0x02 Command error CommandにRead, Write以外が指定された場合 0x03 Address error Address listに記載されていないAddressが指定された場合 0x04 Length error Addressで指定されているLengthが間違っている場合 0x05 Data error Writeの書き込み範囲外を指定された場合 0x06 Busy FLASH Memoryアクセス中など内部処理している場合
コマンドの生成
共通フレーム形式とペイロードフレーム形式を組み合わせた全体のフレーム形式を以下にそれぞれ示します。
ホストコントローラもしくはレスポンス
共通フレーム形式とペイロードフレーム形式は以下のとおりです。
| Header | Length | Payload | CRC-16 | |||
|---|---|---|---|---|---|---|
| 2 byte | 2 byte | N byte | 2 byte | |||
| 0x52 | 0x42 | L byte | H byte | - | L byte | H byte |
| Command | Address | Data | |||
|---|---|---|---|---|---|
| 1 byte | 2 byte | N byte | |||
| - | L byte | H byte | L byte | … | H byte |
共通フレーム形式のPayloadにペイロードフレーム形式(ホストコントローラ)を代入すると、コマンドを送受信するときのフレーム形式は以下のようになります。
| Header | Length | Payload | CRC-16 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Command | Address | Data | |||||||||
| 2 byte | 2 byte | 1 byte | 2 byte | N byte | 2 byte | ||||||
| 0x52 | 0x42 | L byte | H byte | - | L byte | H byte | L byte | … | H byte | L byte | H byte |
エラー時
エラー時はレスポンスでDataを返していた部分が1 byteのCodeになります。
| Header | Length | Payload | CRC-16 | |||
|---|---|---|---|---|---|---|
| 2 byte | 2 byte | N byte | 2 byte | |||
| 0x52 | 0x42 | L byte | H byte | - | L byte | H byte |
| Command | Address | Code | |
|---|---|---|---|
| 1 byte | 2 byte | 1 byte | |
| - | L byte | H byte | - |
| Header | Length | Payload | CRC-16 | ||||||
|---|---|---|---|---|---|---|---|---|---|
| Command | Address | Code | |||||||
| 2 byte | 2 byte | 1 byte | 2 byte | 1 byte | 2 byte | ||||
| 0x52 | 0x42 | L byte | H byte | - | L byte | H byte | - | L byte | H byte |
取得例
デバイスの情報(形2JCIE-BU01 環境センサ(USB型) ユーザーズマニュアルのP101「4.5.25 Device information (Address: 0x180A)」を参照)を取得するときは以下のようになります。
| Header | Length | Payload | CRC-16 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Command | Address | Data | |||||||||
| 2 byte | 2 byte | 1 byte | 2 byte | 0 byte | 2 byte | ||||||
| 0x52 | 0x42 | 0x05 | 0x00 | 0x01 | 0x0A | 0x18 | 0xFC | 0x8D | |||
- Header
- 0x5242で固定
- Length
- PayloadCRC-16のデータ長の合計である5 byte(=1+2+0+2)を指定。0x0005なので0x05、0x00とリトルエンディアン形式で指定
- Command
- 取得するときは0x01(Read)を指定
- Address
- Device informationのAddressは0x180Aなので0x0A、0x18とリトルエンディアン形式で指定
- Data
- Device informationで取得時Dataを指定する必要ないので空欄
使い方
- 結果
参考文献
- 環境センサをカスタマイズする | Pi Zero Easy IoT
- ESP32からBLEでオムロン環境センサ(2JCIE-BL)に繋ぐ #OMRON - Qiita
- BLE Scanner (Connect & Notify) - Google Play のアプリ
- https://ja.wikipedia.org/wiki/%E5%B7%A1%E5%9B%9E%E5%86%97%E9%95%B7%E6%A4%9C%E6%9F%BB
- 16 bit CRC Calculation || Error Detection|| Modbus RTU || Using Reflected (or Reverse) Polynomial - YouTube
- http://wwwa.pikara.ne.jp/polaris/CRC16-IBM.pdf
公開日:
更新日:
