Raspberry Pi で IO-Link を行ってみたので紹介します.
IO-Link とは?
IO-LINK はセンサ・アクチュエータとコントローラをデジタル通信でつなぐ FA 向けのデジタル通信規格です.
規格の概要は「IO-Link」で検索すると色々でてきますので,そちらを参照するのが良いです.(追記: 解説を書きました)
Raspberry Pi から使う上では下記の特徴があることを押さえておくと理解がスムーズと思います.
- マスター・スレーブ方式の 1対1通信
- 物理層としては,24V の UART 通信 (ただし,UART と違って,1 が L です)
- 通信を行うときは,80µs の間 500mA で通信ラインをドライブして通信開始を通知 (WakeUp)
最後の項目は,『堅牢な IO-Link ソリューション』[キャッシュ] では次のように紹介されていて,言い得て妙だなという感じです.24V で 500mA ですからまさに「大声」です.
その問題とは、センサ出力を忠実に送信しているIO-LinkデバイスにWake-upを知らせる方法です。答えは「大声で叫ぶ」ことです。
上記のような特徴を踏まえると,Raspberry Pi で IO-Link 通信を行うには何らかの PHY IC が必要になることが見えてきます.
インターフェース回路
PHY IC はいくつかのメーカから出ているのですが,その中で周辺回路が最もシンプルだったのが ADI の LTC2874 でしたので,こちらを使うことにしました.
回路図はこんな感じ.
実際に組んだ回路は,LTC2874 評価ボードの回路図[キャッシュ] を参考に,保護用のダイオードを追加しました.
Mouser で購入する場合の BOM はこんな感じです.M12 コネクタは他で大体しても良かったかも.
Mouser 番号 | メーカ 番号 | メーカ | 数量 | 価格 (JPY) |
755-PTZTFTE2536B | PTZTFTE2536B | ROHM Semiconductor | 2 | ¥39.9 |
584-LTC2874IFE#PBF | LTC2874IFE#PBF | Analog Devices Inc. | 1 | ¥2,059.1 |
523-M12A04PMMPSF8001 | M12A-04PMMP-SF8001 | Amphenol | 1 | ¥611.2 |
523-M12A04BFFBSR7001 | M12A-04BFFB-SR7001 | Amphenol | 1 | ¥1,341.7 |
603-RL0603FR-070R2L | RL0603FR-070R2L | Yageo | 1 | ¥38.9 |
512-FQT7N10LTF | FQT7N10LTF | ON Semiconductor | 1 | ¥74.3 |
512-S100 | S100 | ON Semiconductor | 1 | ¥55.5 |
667-EEU-EB1H101SJ | EEU-EB1H101SJ | Panasonic | 1 | ¥57.8 |
187-CL31B105KBHNFNE | CL31B105KBHNFNE | Samsung Electro-Mechanics | 2 | ¥7.1 |
Raspberry Pi とは UART および SPI で接続します.
もし,Raspberry Pi との接続端子数を減らしたい場合は,MAXIM の MAX14819 とかを使うと良いかもしれません.こちらは SPI のみつなげば OK です.
完成した基板はこんな感じになります.LTC2874 の実装にはサンハヤトの SSP-52 を使いました.
地味にハマるのが,LTC2874 の TXD 端子は UART の受信端子になることです.結線としては,Raspberry Pi の TXD 端子を LTC2874 の TXD (RXD ではない!)と接続するのが正しいです.
ソフト
基本的には,WakeUp を送った後で,IO-Link の通信仕様に従って通信する形となります.ソフトを作る上では,IO-Link の規格書[キャッシュ]の下記の章が参考になると思います.
- 5.3.3.1 Transmission method
- 5.3.3.3 Wake-up current pulse
- 7.3.6.2 Transmission of ISDUs
- Annex A Coding, timing constraints, and errors
- Annex B Parameter and commands
- Annex J Example sequence of an ISDU transmission
ちょっと注意が必要なのが,環境に酔っては通信時に LTC2874 過電流を検出してしまうことがあることです.症状としては,M-Sequence を UART で連続して送ると 2 個目以降が C/Q ラインに流れないというものになります.この症状が出た場合,SIO_MODE レジスタを 1 にして,過電流検出の時間を 480us に拡大するとことで回避できます.
キーエンスの流量センサ FD-Q10C
IO-Link のサンプルとして,キーエンスの流量センサ FD-Q10C と通信を行うスクリプトを作ってみましたので紹介します.
コード全体は,下記にあります.
規格書と照らし合わせて読んでいただければ,何やってるかは理解できると思います.
まとめ
Raspberry Pi で IO-Link 通信を行って流量計と通信を行ってみました.
IO-Link 対応の FA 機器はヤフオクでもそこそこ出回っていますし,通信可能距離は 20m と長いので,用途にハマれば色々と便利に使えそうです.
コメント