OMRONオムロンモジュール

本ページには広告が含まれています。

環境センサーからセンサー値を取得します。

構文
OMRON.DeviceInformation( UUID, cache )
OMRON.LatestSensingData( field, cache )
OMRON.LatestCalculationData( field, cache )
OMRON.LatestDataLong( type, data )
引数
UUID 必須
取得する項目のUUID
field 必須
取得する項目のフィールド
type 必須
取得する項目のタイプ
cache 省略可
キャッシュから取得するかを示すブール値
戻り値

プログラム

UWSC

Pythonプログラム

以下はPythonのプログラムで、OMRONモジュールと同じフォルダに2JCIE-BU01.pyというファイル名で保存します。

Python

環境センサー

環境センサーの準備

OMRONモジュールで値を取得するために以下の環境センサーを使用します。

センサー値はPythonでは取得出来たがSENSOR関数 (スクリプト関数)では取得出来なかったので、UWSCからPythonを経由して値を取得します。

Pythonがインストールされていない場合は、Pythonのインストールを参考にインストールを済ましておいてください。

2JCIE-BU01で取得できる項目は以下のとおりです。

  1. 温度
  2. 湿度
  3. 照度
  4. 気圧
  5. 騒音
  6. 3軸加速度
  7. eTVOC
  8. 不快指数
  9. 熱中症警戒度
  10. 振動情報(地震回数、振動回数、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に修正して動作しない場合はこちらを確認してください。

Python

Python

また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バイト以上のデータはすべてリトルエンディアンで記述します。

HeaderLengthPayloadCRC-16
2 byte2 byteN byte2 byte
0x520x42L byteH byte-L byteH 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になるので省略。
係数1000000000000101
項\(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
この係数部分のみを抽出し次数の高い順に並べバイナリ形式(2進数)で表すと0b1000 0000 0000 0101で16進数では0x8005となります。
係数1010000000000001
項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}\)
一方、次数の低い順に並べると0b1010 0000 0000 0001で16進数では0xA001となります。
初期値
0xFFFF

巡回冗長検査を求める手順を以下に示します。

  1. CRCレジスタの初期値を0xFFFFにする。
  2. CRCレジスタとメッセージの初めの8bitデータのXORを計算し、結果をCRCレジスタに戻す。
  3. MSBは0で埋めながら、CRCレジスタを1bit右シフトする。
  4. LSBからシフトされたbitが0ならば、3の手順を繰り返す。1ならばCRCレジスタと0xA001でXORを計算し、結果をCRCレジスタに戻す。
  5. 8bit分シフトするまで3、4の手順を繰り返す。
  6. パケットの最後まで処理していなければ、CRCレジスタとパケットの次の8bitのXORを計算してCRCレジスタに戻し、3の手順から繰り返す。

CRC-16を求めるPythonのブログラムです。

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)が入ります。

ホストコントローラ

コマンドを送信するときのペイロードフレーム形式です。

CommandAddressData
1 byte2 byteN byte
-L byteH byteL byte…H byte
Command
ReadもしくはWriteを指定
CommandContents
0x01Read
0x02Write
Address
実行する内容に応じたAddressをリトルエンディアン形式で指定
Data
Addressに応じた内容をリトルエンディアン形式で指定
レスポンスのフォーマット

コマンドを送信して問題なくデータが取得できたときのペイロードフレーム形式です。

CommandAddressData
1 byte2 byteN byte
-L byteH byteL byte…H byte
Command
ReadもしくはWriteを返します。
CommandContents
0x01Read
0x02Write
Address
ホストコントローラで指定されたAddressを返します。
Data
ホストコントローラで指定されたAddress、Dataによって取得された内容に対応したDataを返します。
エラー時のフォーマット

問題が発生しデータを正常に取得できなかったときのペイロードフレーム形式です。

CommandAddressCode
1 byte2 byte1 byte
-L byteH byte-
Command
ReadもしくはWriteを返します。エラー発生時はCommandのMSBを1とした値(0x80を加えた値)となります。Read、Write以外のCommandを受信した場合はUnknown(0xFF)を返します。
CommandContents
0x81Read error
0x82Write error
0xFFUnknown
Address
ホストコントローラで指定されたAddressを返します。
Code
発生したエラー内容に対応したコードを返します。
CodeDescriptionContents
0x01CRC errorCRC-16計算が誤っている場合
0x02Command errorCommandにRead, Write以外が指定された場合
0x03Address errorAddress listに記載されていないAddressが指定された場合
0x04Length errorAddressで指定されているLengthが間違っている場合
0x05Data errorWriteの書き込み範囲外を指定された場合
0x06BusyFLASH Memoryアクセス中など内部処理している場合
コマンドの生成

共通フレーム形式とペイロードフレーム形式を組み合わせた全体のフレーム形式を以下にそれぞれ示します。

ホストコントローラもしくはレスポンス

共通フレーム形式とペイロードフレーム形式は以下のとおりです。

共通フレーム形式
HeaderLengthPayloadCRC-16
2 byte2 byteN byte2 byte
0x520x42L byteH byte-L byteH byte
ペイロードフレーム形式(ホストコントローラもしくはレスポンス)
CommandAddressData
1 byte2 byteN byte
-L byteH byteL byte…H byte

共通フレーム形式のPayloadにペイロードフレーム形式(ホストコントローラ)を代入すると、コマンドを送受信するときのフレーム形式は以下のようになります。

HeaderLengthPayloadCRC-16
CommandAddressData
2 byte2 byte1 byte2 byteN byte2 byte
0x520x42L byteH byte-L byteH byteL byte…H byteL byteH byte
エラー時

エラー時はレスポンスでDataを返していた部分が1 byteのCodeになります。

共通フレーム形式
HeaderLengthPayloadCRC-16
2 byte2 byteN byte2 byte
0x520x42L byteH byte-L byteH byte
ペイロードフレーム形式(エラー時)
CommandAddressCode
1 byte2 byte1 byte
-L byteH byte-

HeaderLengthPayloadCRC-16
CommandAddressCode
2 byte2 byte1 byte2 byte1 byte2 byte
0x520x42L byteH byte-L byteH byte-L byteH byte
取得例

デバイスの情報(形2JCIE-BU01 環境センサ(USB型) ユーザーズマニュアルのP101「4.5.25 Device information (Address: 0x180A)」を参照)を取得するときは以下のようになります。

HeaderLengthPayloadCRC-16
CommandAddressData
2 byte2 byte1 byte2 byte0 byte2 byte
0x520x420x050x000x010x0A0x180xFC0x8D
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を指定する必要ないので空欄

使い方

UWSC
結果
プレーンテキスト

参考文献

  1. 環境センサをカスタマイズする | Pi Zero Easy IoT
  2. ESP32からBLEでオムロン環境センサ(2JCIE-BL)に繋ぐ #OMRON - Qiita
  3. BLE Scanner (Connect & Notify) - Google Play のアプリ
  4. https://ja.wikipedia.org/wiki/%E5%B7%A1%E5%9B%9E%E5%86%97%E9%95%B7%E6%A4%9C%E6%9F%BB
  5. 16 bit CRC Calculation || Error Detection|| Modbus RTU || Using Reflected (or Reverse) Polynomial - YouTube
  6. http://wwwa.pikara.ne.jp/polaris/CRC16-IBM.pdf