kdenologue

たまに何か作ります。

EnOceanっていう商品に関するメモその他いろいろ

先月とあるコンテストでEnOceanっていう部品を使ったのでこれに関するメモを色々忘備録的に載せていこうと思います。

概要

※内容の正確さは保証しません。間違っていたら指摘していただけるとうれしいです。

EnOceanは、ドイツで開発された環境発電を利用した無線通信技術(やそれを利用した製品シリーズ)のこと。イメージとしてはZigBeeみたいなもの(?)。日本だとローム株式会社が主要取扱い会社。企画推進団体のメンバーでもあるらしい。

環境発電っていうのは、例えばボタンを押す動作そのもので発電するとか、微弱な環境光でも発電するとか、あるいは窓に貼り付けて外気温と室温の温度差で発電するとか、ようは低消費電力な回路とエネルギーストレージと発電回路を組み合わせて電池不要で動作するというものである。実際に動かしてみるとわかるのだが、ボタンを押すとたしかに電波が飛ぶ。しかも電池が入っていないらしい。なんともまあ不思議なものである。

無線は1GHz未満のいわゆるサブギガ帯で、よく使う2.4GHzとかが埋まっていても干渉しにくい。あと、4Gとかで言われるプラチナバンドに近いので、無線LANよりは(出力の大小はともかく)障害物の多い環境でもよく届くらしい。315MHzも使えるらしいけどよくわからない。あと技適OKです。

どんなところで使われてるの、という例としては、壁等に傷をつけてはならない(=配線ができない)寺でEnOceanの「押す動作で発電するボタン」を照明のスイッチとして使うなどがあるらしい。あとは、単純に配線がいらないので(奥だけ/利用する瞬間で発電)、ビル内部とかにたくさんおいて空調管理とかにも使っているらしい。

製品種類

さて、EnOceanには色々製品があって、公式で出しているものや同じ技術を組み込んだOEM製品とかも多い。とりあえず公式で出しているものを並べるが、これがなんともまあわかりにくい名前で・・・・

同じ内容の製品でも、国によって使う電波が違う。ので、製品名が若干異なるのだ。とりあえず、国内品は太文字にしておくとする。

製品名 内容
EOP3000 Programmer
EDK350,EDK350U,EDK400J 開発キット
EOP350 開発キットに入ってるプログラム書き込みボード
PTM210,PTM210U,PTM210J ボタン
STM300,STM300U,STM400J エナジーハーベスティング無線モジュール
STM330,STM332,STM431J 温度センサモジュール
STM429J 磁石開閉センサモジュール
TCM300,TCM300U,TMC410J ゲートウェイプログラマブル送受信機
USB300,USB300U,USB400J USBゲートウェイ
HSM100 湿度センサ
EO3100I Dolphin V4(SoC)と同義,温度センサ内蔵

STM400JとTMC410Jはほとんど同じで、STM400Jの方はセンサノード側として使いやすくピンが設定されているらしい。

STM 400JはTCM 410J(別途説明予定)とハードウェア的にはほぼ同等ですが、センサノードとして消費電力を極力抑えた動作のために、スリープとウェイクアップ用のピンがハード的に用意されている点が異なります。青枠で囲まれたピンがTCM 410Jとの差分で、TCM 410Jのこれらのピンはn.c.(接続なし)となっています。
http://micro.rohm.com/jp/techweb_iot/upload/2017/08/graf_20170817_15.gif
送信モジュール:STM 400J | 基礎知識 | ROHM TECH WEB

STM429JとSTM431Jはほとんど同じで、429Jは書き込み用のピンヘッダーがついておらず、代わりに磁石でON/OFFするスイッチがついている。

EO3100IはSoCの名前(?)で、基本的にどのモジュールもこれを使っている。STM400Jのシールドの中にはこれとXTALとアンテナ用回路等が入っているし、STM431Jなんかはこれらに加えて充電回路がついている(がシールドされていない)。

HSM100湿度センサはSTM431Jのピンヘッダに接続して使うタイプなのだが、乗ってるセンサの情報は特になくて、STM431Jに書き込まれてるプログラムを見た感じPWMっぽい信号を吐いてくれるもののよう。

ちなみにこういうのは多分ROHMなどの開発/販売元に聞くのが一番です。

通信

製品が揃ったところで、どう通信するのかという所だが、正直規格を網羅することはできなかったので最低限「PCでEnOceanノードから送られてきた情報を読むことができる」というのを目標にする。

ノード
EnOcean Equipment Profile(EEP)と呼ばれるプロファイルに基づいてノードはデータを送っている(例:32bitのデータのうち[x:y]は温度データ、[y:z]はピンの状態、等)。各ノードには個別のIDが振られていて、データ受信側でこのIDとプロファイルを一致させて解釈する必要があるのだと思う。

EnOcean同士の通信
EnOcean Radio Protocol(ERP2)というプロトコルにもとづいてやり取りしている。

ホスト
EnOcean Serial Protocol(ESP3)という内容で受け取ったデータをシリアル経由で見ることができる。一番メジャーなのは、ERP2のデータ+ヘッダと誤り訂正符号みたいな構成。

もちろん色々制御コマンド等ERP2の仕様書には載っていて、色々できるんだろうなという雰囲気はわかるがそこまで読んではいない。

ESP3に関連した話をすると、よくあるUSB-Serial変換を使ってモジュールとは通信をしていて、基本的にEOP350(開発ボード)やUSB400J(USB)はモジュールとFTDIのチップが乗っているだけである。

ツール

DolphinV4 API Configurator
EO3100Iのピンの入出力設定や各種機能の無効有効等の初期化用コードを吐いてくれるツール。自分でファームウェア書き換えるときに使う。

DolphinV4 Calibration
SoC内蔵温度センサーやタイマなどのキャリブレーションを実行するツール。EOP350みたいな書き込みツールが必須。

DolphinV4 Module Configurator
上に紹介した各モジュールのデフォルトファームの機能をあとから設定するツール。例えば、STM431Jは単体で温度センサとしても振る舞うし、HSM100を使うと湿度もとれるのだが、構成を変えるごとにファームを書き換えるのは非効率なので予めコードは書き込んでおいてあとから有効無効を切り替えるようにしておく。で、あとから書き換えるツールがこれ。
他にもセンサの起動間隔を変えたりプロファイルの設定を行ったりと非常にお世話になる。例えば、STM431JにはADCするピンが1つ設定されていて、プロファイルを切り替えるとADCが動いたりする。というのは、温度だけ送信するプロファイルにADCの結果は不必要なので、このプロファイルのときはADCが無効になっている。ADCした結果を送信するっていうプロファイルを設定してあげると、回路が動いてデータにも結果が乗る。

デフォルトファームで何ができるのさ?ってときはこのツールを見るとだいたいつかめる。結構色々できるので、非常にお世話になるし大体これで満足。

DolphinV4 Programer
文字通りファームの書き込み用ツール。
デフォルトファームは読み出し禁止になっているが、ソースコード&バイナリは公開されているので自分で好きなように書き換えても元に戻せる。

Dolphin View
EnOceanから送られてくるデータを見たり送信したりするツール。EOP350+TMC410JとかUSB400Jを接続すると各ノードから送られてくるデータが見れる。色々できるらしいが、専ら自分はデータビュワーとして使ってた。
前述したように、送られてくるデータがどのプロファイルなのかを設定してあげないと正しくデータ表示をすることができない。

uVision V5
ファームウェアコンパイルとかするIDE。容量制限があるのでデフォルトファームウェアソースコードはそのままだとビルドできない(なんてこった)。ちなみにEO3100IはMCS 51というシリーズのアーキテクチャを利用したマイコンらしい。このシリーズは結構互換性を保って各社開発しているらしいので、uVision以外でも開発はできるのかも。ちなみにCのバージョンが古いのか、ブロックの途中でuint8 x;などと変数宣言するとエラーが出る。なるほどな?。

試しに何かやってみる

ここまで色々説明したので、実際に何かやってみるとする。STM431JのADCを利用して可変抵抗の値を送信するという流れを非常にざっくりとだが書いておく。

必要なもの
STM431J(温度センサモジュール)、EOP350(書き込みボード)、USB400J(USB受信機)
全部揃えるなら開発キットEDK400Jを買うのがいいけど、値段がね・・・・

どうやるか?
なんと、STM431JにはSetPointという機能があって、プロファイルを変えてあげるとADCが動くファームウェアが予め書き込まれているのである。これ、何に使うんだろう?とおもったけどこういうことらしい。

https://www.enocean-alliance.org/wp-content/uploads/2017/09/SR07_PMS_reinweiss_Gira_Esprit_Glas_mint_Sonne-Mond_Sun-Moon.jpg
EasySens® SR07 x - EnOcean Alliance

なるほど、ツマミの位置で設定が変えられるようにするのか、なるほどなぁ。

さて、わかってしまえばかんたんである。

回路
データシートより抜粋。
f:id:kden:20171007160416p:plain
f:id:kden:20171007160506p:plain
つまり、ADPI0ピンがADCの入力nなっていて、SWPWRピンが(プログラムから自動でON/OFFされる)電源になっているので、ここに可変抵抗をはさみましょうという話である。

ピンヘッダはハーフピッチの2×10なので、秋月だとこれかな。
akizukidenshi.com

プログラム
先程述べたように、デフォルトファームウェアでどうにかなるので、必要なのはDolphinV4 Module Configuratorである。プルダウンメニューからこのようにプロファイルを選べる。
f:id:kden:20171007161000p:plain

デフォルトはA5-02-05で、これは単に温度センサーの値を送信するのみ。データ内容は32bitで0x000000TTの形式、TTが温度。このプロファイルをA5-10-03にすると、先程のADCが動作して入力電圧も送信される。内容は0x0000AATTでAAがADCの結果(8bit)。

ちなみにOccupancy Buttunについて述べたプロファイルもあって、なんぞこれと思ったがこういうことらしい。

A radio telegram will be transmitted in case of a significant change of measured temperature or set point values or if the external occupancy button is pressed.
データシートより。

というわけで、プルダウンメニューからプロファイルを選択し直して、EOP350にSTM431J指して、Writeボタンを押すとめでたくプロファイルが書き換わる。あとは、自作した可変抵抗付きの基板にSTM431Jを指すと、めでたく可変抵抗の値が送信されるという具合である。他にも、データを送信するスレッショルドとか、送信間隔も同じように調整できるが、詳しくは割愛。


受信してみる
ビューワソフトでも見れるのだが、他の自作ソフトとかでも情報を受け取ってコネコネしたい!みたいな時は、ESP3の仕様書を見る。基本的に送られてきたデータはRADIO_ERP2というデータ構造をシリアル通信で受け取ることになる。仕様書の2.9 Packet Type 10: RADIO_ERP2を参照。

f:id:kden:20171007162451p:plain

0x55を待機、受け取ったら後続データを数個読み取り、テレグラム長を読み取ってそれが満たされるまでを1データとして、CRCをチェック、エラーがあったら破棄して、エラーがなければパケットタイプを見て、RADIO_ERP2だったらノードIDとデータが記述されているはずなのでノードIDがほしいノードのものか見て・・・・という感じのプログラムになりそう。データは連続で送られてきて、間隔は100ms以下であることが仕様らしいのでこれをもとにタイムアウトするとだいたいのデータは処理できるかな。



とまあ非常にざっくりとだけどメモということで、もし誰かが必要としている情報が載っていたら嬉しいかなくらいの気持ちで。やっぱり難所は値段が高いことである。

同じようなエナジーハーベスティングする無線モジュールというとTWI-LITEが思いつく。EnOceanとTWI-LITE、どちらがいいのかというと周波数も違うしなんとも。すくなくとも工作に使うなら値段や入手性、日本語環境から言ってTWI-LITEだが、企業がオリジナル電池レス製品作るぜ!ってなるとEnOceanのほうが有利なのかなぁ。
エナジーハーベスト(環境発電)電源管理モジュール - MONO-WIRELESS.COM

というわけで業界はこんな感じのことをやろうとしているらしい。
www.ntt.com



以下の本は、この記事を書いているときに知ったものです。\(^o^)/
www.amazon.co.jp
www.amazon.co.jp