====== DI/DO を利用する ====== DI/DO コネクタが実装された下記機種では、DI/DO それぞれ 8ch/8ch が利用できます。 * [[http://www.centurysys.co.jp/products/linuxserver/mae320d16.html|MA-E320/D-16]] * [[http://www.centurysys.co.jp/products/linuxserver/mae350fd16.html|MA-E350/FD-16]] {{:mae3xx_ope:use_di_do:mae3xx_dido_00.jpg|DI/DOコネクタ}} DI/DO の利用方法を紹介します。 \\ ====== ハードウェア仕様 ====== ===== 電気的仕様 ===== ==== DI (入力) ==== |< 30em 8em 15em >| ^ 項目 ^ 内容 | |接点入力|電圧接点入力| |ポート数|8ch (DIN A0〜A3, B0〜B3)| |コモン|4ch/コモン| |入力電圧|DC12〜24V±10% (DC10.8V〜26.4V)| |入力閾値|ON : DC10V以上, OFF: DC3V以下| |入力電流|約2.5mA〜5mA| |入力インピーダンス|約6kΩ| |絶縁方式|フォトカプラ絶縁| |絶縁耐圧|DC500V1分間, 外部端子〜内部回路間| \\ ==== DO (出力) ==== |< 30em 8em 15em >| ^ 項目 ^ 内容 | |接点出力|オープンコレクタ出力| |ポート数|8ch (DOUT A0〜A3, B0〜B3)| |コモン|4ch/コモン| |負荷電圧|DC26.4V(最大)| |負荷電流|DC50mA(最大)| |ON電圧|DC1V以下| |OFF時漏洩電流|0.1mA以下| |保護機能|過電流保護| |絶縁方式|フォトカプラ絶縁| |絶縁耐圧|DC500V1分間, 外部端子〜内部回路間| \\ ===== ピンアサイン ===== {{:mae3xx_ope:use_di_do:mae3xx_dido_01.jpg?640|}} ^ △列No. ^ DO Group ^ ピン名称 ^ 機能 ^ ^ ◯列No. ^ DI Group ^ ピン名称 ^ 機能 ^ | 1| A |NC|未使用| | 21| A |DIN A COM|コモン A| | 2|:::|DOUT A0|DO_0| | 22|:::|DIN A0|port 0| | 3|:::|DOUT A1|DO_1| | 23|:::|DIN A1|port 1| | 4|:::|DOUT A2|DO_2| | 24|:::|DIN A2|port 2| | 5|:::|DOUT A3|DO_3| | 25|:::|DIN A3|port 3| | 6|:::|DOUT A COM|コモン A| | 26| B |DIN B COM|コモン B| | 7|:::|NC|未使用| | 27|:::|DIN B0|port 4| | 8|:::|NC|未使用| | 28|:::|DIN B1|port 5| | 9|:::|NC|未使用| | 29|:::|DIN B2|port 6| | 10|:::|NC|未使用| | 30|:::|DIN B3|port 7| | 11| B |NC|未使用| | 31| - |NC|未使用| | 12|:::|DOUT B0|DO_4| | 32|:::|NC|未使用| | 13|:::|DOUT B1|DO_5| | 33|:::|NC|未使用| | 14|:::|DOUT B2|DO_6| | 34|:::|NC|未使用| | 15|:::|DOUT B3|DO_7| | 35|:::|NC|未使用| | 16|:::|DOUT B COM|コモン B| | 36|:::|NC|未使用| | 17|:::|NC|未使用| | 37|:::|NC|未使用| | 18|:::|NC|未使用| | 38|:::|NC|未使用| | 19|:::|NC|未使用| | 39|:::|NC|未使用| | 20|:::|NC|未使用| | 40|:::|NC|未使用| \\ ===== 等価回路 ===== ==== DI (入力) ==== DI部は、フォトカプラと電流制限抵抗により構成されています。\\ A,Bグループともに共通コモンとなっています。 {{:mae3xx_ope:use_di_do:equivalent_circuit_di.png|}} \\ ==== DO (出力) ==== DO部は、フォトカプラと過電流保護素子により構成されています。\\ A,Bグループともに共通コモンとなっています。 {{:mae3xx_ope:use_di_do:equivalent_circuit_do.png?500|}} \\ ===== 端子台への変換 ===== {{:mae3xx_ope:ai_with_iio_subsystem:p1000613.jpg?400|端子台変換器 PCV5-1H202(東洋技研製)}} {{:mae3xx_ope:ai_with_iio_subsystem:pcv5-1h202_pinassign.png?800|端子台変換器 PCV5-1H202(東洋技研製)}} 端子台変換器 [[http://www.togi.co.jp/products/details.php?main=interface&c=73|PCV5-1H202(東洋技研製)]] を接続することにより、DIO 及び AIN ポートをスプリング圧結線方式の端子へ\\ 変換することができます。端子台変換器はオプションの DIO ケーブル、もしくは AI ケーブルにより一括接続が可能です。 購入先: [[http://jp.misumi-ec.com/vona2/detail/110500006010/|ミスミ]], [[http://www.amazon.co.jp/%E6%9D%B1%E6%B4%8B%E6%8A%80%E7%A0%94-TOGI-PCV5-1H202-%E3%82%B9%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%AD%E3%83%83%E3%82%AF%E5%BC%8F%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB-HIF3BA-20PA-2-54DSA%E7%94%A8/dp/B00P60F89W|Amazon.co.jp]] \\ ====== ソフトウェア ====== ===== DI (入力) ===== sysfs I/F でアクセスします。\\ 参考: [[https://www.kernel.org/doc/Documentation/gpio/sysfs.txt|GPIO Sysfs Interface for Userspace]] /sys/devices/ocp.3/50000000.gpmc/11000040.gpio/gpio/ 以下の gpiochip でアクセスします。\\ ボード構成により、gpiochip の番号がずれますので、あらかじめ全 DI ポートを export してあります。 DIポート一覧 root@plum:~# ls -l /tmp/DI/ total 0 lrwxrwxrwx 1 root root 23 Jun 19 11:40 0 -> /sys/class/gpio/gpio456 lrwxrwxrwx 1 root root 23 Jun 19 11:40 1 -> /sys/class/gpio/gpio457 lrwxrwxrwx 1 root root 23 Jun 19 11:40 2 -> /sys/class/gpio/gpio458 lrwxrwxrwx 1 root root 23 Jun 19 11:40 3 -> /sys/class/gpio/gpio459 lrwxrwxrwx 1 root root 23 Jun 19 11:40 4 -> /sys/class/gpio/gpio460 lrwxrwxrwx 1 root root 23 Jun 19 11:40 5 -> /sys/class/gpio/gpio461 lrwxrwxrwx 1 root root 23 Jun 19 11:40 6 -> /sys/class/gpio/gpio462 lrwxrwxrwx 1 root root 23 Jun 19 11:40 7 -> /sys/class/gpio/gpio463 v2.2.0 より、GPIO に DeviceTree から命名する機能を入れましたので、このように見えるようになります。 user1@plum:~$ ls -l /sys/class/gpio/DI_0* lrwxrwxrwx 1 root root 0 Aug 31 10:25 /sys/class/gpio/DI_00 -> ../../devices/platform/ocp/50000000.gpmc/11000040.gpio/gpiochip13/gpio/DI_00 lrwxrwxrwx 1 root root 0 Aug 31 10:25 /sys/class/gpio/DI_01 -> ../../devices/platform/ocp/50000000.gpmc/11000040.gpio/gpiochip13/gpio/DI_01 lrwxrwxrwx 1 root root 0 Aug 31 10:25 /sys/class/gpio/DI_02 -> ../../devices/platform/ocp/50000000.gpmc/11000040.gpio/gpiochip13/gpio/DI_02 lrwxrwxrwx 1 root root 0 Aug 31 10:25 /sys/class/gpio/DI_03 -> ../../devices/platform/ocp/50000000.gpmc/11000040.gpio/gpiochip13/gpio/DI_03 lrwxrwxrwx 1 root root 0 Aug 31 10:25 /sys/class/gpio/DI_04 -> ../../devices/platform/ocp/50000000.gpmc/11000040.gpio/gpiochip13/gpio/DI_04 lrwxrwxrwx 1 root root 0 Aug 31 10:25 /sys/class/gpio/DI_05 -> ../../devices/platform/ocp/50000000.gpmc/11000040.gpio/gpiochip13/gpio/DI_05 lrwxrwxrwx 1 root root 0 Aug 31 10:25 /sys/class/gpio/DI_06 -> ../../devices/platform/ocp/50000000.gpmc/11000040.gpio/gpiochip13/gpio/DI_06 lrwxrwxrwx 1 root root 0 Aug 31 10:25 /sys/class/gpio/DI_07 -> ../../devices/platform/ocp/50000000.gpmc/11000040.gpio/gpiochip13/gpio/DI_07 \\ DIポート以下のノード root@plum:~# ls -l /tmp/DI/0/ total 0 -rw-r--r-- 1 root root 4096 Jun 19 11:47 active_low lrwxrwxrwx 1 root root 0 Jun 19 11:47 device -> ../../../11000040.gpio -rw-r--r-- 1 root root 4096 Jun 19 11:47 direction drwxr-xr-x 2 root root 0 Jun 19 11:47 power lrwxrwxrwx 1 root root 0 Jun 19 11:47 subsystem -> ../../../../../../class/gpio -rw-r--r-- 1 root root 4096 Jun 19 11:40 uevent -rw-r--r-- 1 root root 4096 Jun 19 11:47 value value ノードを読むことで、DIの値を読むことができます。 root@plum:~# cat /tmp/DI/1/value 0 \\ ==== 割込サポート ==== v2.6.1α1 より、DI 回路の割込およびフィルタ機能をサポートしました。(([[https://www.centurysys.co.jp/products/linuxserver/mae350lad.html|MA-E350/LAD-20]] の 8bit ハードウェアカウンタ機能が実装された 前半 4channel 部の設定は [[mae3xx_ope:di_hardware_counter:start]] を参考。 ))\\ これにより、下記機能が利用できるようになります。 * チャタリング除去フィルタ (1ms / 5ms / 20ms / なし) * カウンタ * 変化待ち (poll() による) \\ sysfs のエントリが下記のとおり拡張されます。 root@plum:/sys/class/gpio/DI_00# ls -l /sys/class/gpio/DI_00/ total 0 -rw-r--r-- 1 root root 4096 Jun 26 15:10 active_low -rw-r--r-- 1 root root 4096 Jun 29 09:42 counter -rw-r--r-- 1 root root 4096 Jun 26 15:11 debounce lrwxrwxrwx 1 root root 0 Jun 26 15:10 device -> ../../../11000040.gpio -rw-r--r-- 1 root root 4096 Jun 26 15:10 direction -rw-r--r-- 1 root root 4096 Jun 29 09:20 edge drwxr-xr-x 2 root root 0 Jun 26 15:10 power lrwxrwxrwx 1 root root 0 Jun 26 15:10 subsystem -> ../../../../../../class/gpio -rw-r--r-- 1 root root 4096 Jun 26 15:10 uevent -rw-r--r-- 1 root root 4096 Jun 26 15:10 value root@plum:/sys/class/gpio/DI_00# \\ 追加されたエントリは下表のとおりです。 ^ entry ^ function ^ note | | counter | カウンタ値 R/W | 任意の値((32bit unsigned long)) にセット可能 | | debounce | フィルタ設定 R/W | 0 / 1 / 5 / 20 | | edge | 割込極性 R/W | none / rising / falling / both | \\ === counter === カウンタ値の読み出しおよび設定(クリア)を行います。 == 読み出し == root@plum:~# cat /sys/class/gpio/DI_00/counter 2841 root@plum:~# \\ == 設定(クリア) == root@plum:~# echo 0 > /sys/class/gpio/DI_00/counter root@plum:~# cat /sys/class/gpio/DI_00/counter 0 root@plum:~# \\ == カウンタ利用上の注意 == * 後述する "edge" 設定が、"rising" / "falling" / "both" の時に機能します。 * 内部では **32bit unsigned long** で値を保持しています。 \\ === debounce (チャタリング除去フィルタ設定) === チャタリング除去フィルタの設定値を読み書きします。 root@plum:~# cat /sys/class/gpio/DI_00/debounce 0 ms root@plum:~# echo 5 > /sys/class/gpio/DI_00/debounce root@plum:~# cat /sys/class/gpio/DI_00/debounce 5 ms root@plum:~# \\ == 設定方法 == * 0 / 1 / 5 / 20 を書き込むことで設定します。 * 他の値を書き込んだ場合、書き込んだ値より小さい値に設定されます。 root@plum:~# echo 11 > /sys/class/gpio/DI_00/debounce root@plum:~# cat /sys/class/gpio/DI_00/debounce 5 ms root@plum:~# echo 100 > /sys/class/gpio/DI_00/debounce root@plum:~# cat /sys/class/gpio/DI_00/debounce 20 ms root@plum:~# \\ === edge (割込極性設定) === 割込極性を設定します。\\ rising (立ち上がりトリガ) / falling (立ち下がりトリガ) / both (両エッジトリガ) / none (割込を使用しない) のいずれかを書き込みます。 root@plum:~# cat /sys/class/gpio/DI_00/edge none root@plum:~# echo rising > /sys/class/gpio/DI_00/edge root@plum:~# cat /sys/class/gpio/DI_00/edge rising root@plum:~# \\ ==== サンプルコード ==== 割込を利用したプログラムのサンプルです。 * [[mae3xx_devel:gpio_with_poll:start]] \\ ===== DO (出力) ===== LEDクラスドライバにマッピングしてあります。 root@plum:~# ls -l /sys/class/leds/DO_* lrwxrwxrwx 1 root root 0 Jun 19 11:41 /sys/class/leds/DO_0 -> ../../devices/leds_do.7/leds/DO_0 lrwxrwxrwx 1 root root 0 Jun 19 11:41 /sys/class/leds/DO_1 -> ../../devices/leds_do.7/leds/DO_1 lrwxrwxrwx 1 root root 0 Jun 19 11:41 /sys/class/leds/DO_2 -> ../../devices/leds_do.7/leds/DO_2 lrwxrwxrwx 1 root root 0 Jun 19 11:41 /sys/class/leds/DO_3 -> ../../devices/leds_do.7/leds/DO_3 lrwxrwxrwx 1 root root 0 Jun 19 11:41 /sys/class/leds/DO_4 -> ../../devices/leds_do.7/leds/DO_4 lrwxrwxrwx 1 root root 0 Jun 19 11:41 /sys/class/leds/DO_5 -> ../../devices/leds_do.7/leds/DO_5 lrwxrwxrwx 1 root root 0 Jun 19 11:41 /sys/class/leds/DO_6 -> ../../devices/leds_do.7/leds/DO_6 lrwxrwxrwx 1 root root 0 Jun 19 11:41 /sys/class/leds/DO_7 -> ../../devices/leds_do.7/leds/DO_7 各 DO の下の構成はこのようになっています。 root@plum:~# ls -l /sys/class/leds/DO_1/ total 0 -rw-r--r-- 1 root root 4096 Jun 19 11:50 brightness lrwxrwxrwx 1 root root 0 Jun 19 11:50 device -> ../../../leds_do.7 -r--r--r-- 1 root root 4096 Jun 19 11:50 max_brightness drwxr-xr-x 2 root root 0 Jun 19 11:50 power lrwxrwxrwx 1 root root 0 Jun 19 11:50 subsystem -> ../../../../class/leds -rw-r--r-- 1 root root 4096 Jun 19 11:50 trigger -rw-r--r-- 1 root root 4096 Jun 19 11:40 uevent sysfs LED クラスドライバと同様に使用することができます。