= CONTEC CPIシリーズ用(RaspberyPi用HATサイズ拡張ボード)IOC = [https://www.contec.com/jp/lp/daq-control/raspberry-pi-cpi-series/ CONTEC製RaspberyPi用HATサイズ拡張ボード]用IOCを作成したので、設定方法と使い方を記述する。[[br]] ほとんどがドライバ設定方法しか書いてない、、、 == HW接続 == RaspberryPiに必要な機能のボードを接続する。[[br]] この時ボード付属のピンヘッダを使用するが、そのままでは高さが足りないので、必要に応じてスペーサーを使用して高さを合わせる。[[br]] また、各ボードにはロータリースイッチがあるので、複数枚スタックする時には番号が重ならないように設定しておく。 今回は、 * [https://www.contec.com/jp/products-services/daq-control/pc-helper/raspberry-pi-card/cpi-rry-16/feature/ ​半導体リレー接点出力 CPI-RRY-16] * [https://www.contec.com/jp/products-services/daq-control/pc-helper/raspberry-pi-card/cpi-dio-0808l/feature/ デジタル入出力 8ch 絶縁 12~24VDC CPI-DIO-0808L] * [https://www.contec.com/jp/products-services/daq-control/pc-helper/raspberry-pi-card/cpi-ai-1208li/feature/ 絶縁アナログ入力 CPI-AI-1208LI] * [https://www.contec.com/jp/products-services/daq-control/pc-helper/raspberry-pi-card/cpi-ao-1602lc/feature/ 絶縁アナログ出力 CPI-AO-1602LC] を使用した。 == RaspberryPi環境設定 == Raspberry Piに今回使用するボードの実行環境を整備する。[[br]] 今回は[https://cerldev.kek.jp/trac/EpicsUsersJP/wiki/intro/20230302_KEK ​加速器セミナー(2023)]で作成したディスクイメージを使用したが、[https://help.contec.com/pc-helper/api-tool-lnx/jp/APITOOL.htm#t=mergedProjects%2FCAIO%2Fdriver_spec%2Fcommon_linux.htm メーカー推奨(?)バージョン]で環境を構築してもいい。 今回のIOC作成環境には、!RaspberryPi 3B+を使用したが、初代以外のRaspberryPi(HATコネクタの互換性のため)ならば動くと思う(保証はしない!) '''実はここが一番の難所。''' === カーネルヘッダ === デバイスドライバのインストールには、Linuxカーネルヘッダが必要なので、事前にインストールしておく。 {{{ # apt install -y raspberrypi-kernel-headers }}} ​加速器セミナー(2023)のディスクイメージを使用する場合、{{{apt update}}}をしてしまった後なので、普通にパッケージインストールするとカーネル{{{6,x}}}のパッケージがインストールされてしまう。[[br]] ドライバのコンパイルには5.xが必要なので、古いライブラリを[http://archive.raspberrypi.org/debian/pool/main/r/raspberrypi-firmware/ ここ]から直接ダウンロードしてインストールする。[[br]] 今回使用したのは、テスト環境で使用しているカーネルのバージョンに合わせて[http://archive.raspberrypi.org/debian/pool/main/r/raspberrypi-firmware/raspberrypi-kernel-headers_1.20230106-1_arm64.deb 2023/1/6版]にした。[[br]] {{{ # apt remove -y raspberrypi-kernel-headers # apt install ./raspberrypi-kernel-headers_1.20230106-1_arm64.deb }}} === メーカー製ドライバのダウンロード === [http://pfconrg07.kek.jp:8082/trac/cerl/raw-attachment/ticket/1280/caio530F.tgz AIO制御用ドライバー​]と[http://pfconrg07.kek.jp:8082/trac/cerl/raw-attachment/ticket/1280/cdio_820F.tgz DIO制御用ドライバー]は​[https://www.contec.com/jp/products-services/daq-control/pc-helper/daq-software/api-aio(lnx)/price/ CONTECのHP]からダウンロード可能(要ユーザー登録) === ドライバのインストール === AIOとDIOは別々にインストールする必要があるが、インストール方法はほぼ同じ。[[br]] 例として、AIOドライバをインストールした時のログを記述するが、DIOは{{{caio->cdio}}}に読み替えればいい。 ドライバーをRaspberryPiにコピーして展開。 {{{ epics@raspberrypi:~ $ mkdir epics epics@raspberrypi:~ $ cd epics/ epics@raspberrypi:~/epics $ tar ztvf caio530F.tgz epics@raspberrypi:~ $ cd epics/caio530F/contec/caio }}} ドライバーのコンパイルは、rootになって実行。 {{{ epics@raspberrypi:~/epics/caio530F/contec/caio $ sudo su - }}} 展開したドライバをコンパイルしてインストール。 {{{ root@raspberrypi:~# cd /home/epics/epics/caio530F/contec/caio/ root@raspberrypi:/home/epics/epics/caio530F/contec/caio# make root@raspberrypi:/home/epics/epics/caio530F/contec/caio# make install }}} 他にもi2cを有効化する必要があるらしいので、raspi-configでi2cを有効化。 {{{ root@raspberrypi:/root# raspi-config 3 Interface Options -> I5 I2C -> Would you like the ARM I2C interface to be enabled? Yes }}} 設定を変更したら、RaspberryPiを再起動。 === ボード認識設定 === このままではボードが認識されないので、[https://contec.e-srvc.com/app/answers/detail/a_id/2184/ FAQのCPIシリーズが認識しません]を参考に、{{{/boot/config.txt}}}に{{{dtparam=i2c_vc=on}}}を追記して再起動。 これで認識されるようになるが、'''こんな記述はマニュアルにはない!!!'''[[br]] とりあえず認識されているかを確認するために、i2cbusを見てみる。[[br]] どうやらi2cbusを2つ使うようで、0と1では違うデバイスが見えている。 {{{ root@raspberrypi:/home/epics/epics/caio530F/contec/caio/config# i2cdetect -y 0 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: 50 51 52 -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- root@raspberrypi:/home/epics/epics/caio530F/contec/caio/config# i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- 22 -- -- -- -- -- 28 -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- }}} 0に見えているのが、今回接続したボードのアドレスのようで、試しにロータリースイッチを変更すると番号が変わることが確認できた。 === ドライバ設定 === このボードをプログラムから使用する際には、ドライバをインストールするだけでなく各ボードに名前を設定する必要がある。[[br]] ドライバをコンパイルすると、ディレクトリに{{{config}}}ディレクトリが作成され、その中の{{{config}}}を実行することでボード名を設定する。[[br]] {{{ root@raspberrypi:/home/epics/epics/caio530F/contec/caio/config# ./config ---------------------------------- CONTEC API-AIO(LNX) Configuration ---------------------------------- Message : Auto detecting devices. ................................................................................... .. -------------------------------------------------------------------------------- Devices list -------------------------------------------------------------------------------- DeviceName Product Name ID IP/Master IP Status [1]:+ AIO000 CPI-AI-1208LI 1 [2]:+ AIO001 CPI-AO-1602LC 0 -------------------------------------------------------------------------------- [#]:Select device [o]:List sort [r]:Redetect devices list [d]:Delete device [a]:Add device manually [e]:Diagnostic report [s]:Save settings [q]:Exit Please select the device to set up. Please input >s ******************************************************************************** Save OK?(y/n):y Message : Setting file is 'contec_aio.conf'. Message : Start script file is 'contec_aio_start.sh'. Message : Stop script file is 'contec_aio_stop.sh'. Confirm(y):y .. -------------------------------------------------------------------------------- Devices list -------------------------------------------------------------------------------- DeviceName Product Name ID IP/Master IP Status [1]: AIO000 CPI-AI-1208LI 1 [2]: AIO001 CPI-AO-1602LC 0 -------------------------------------------------------------------------------- [#]:Select device [o]:List sort [r]:Redetect devices list [d]:Delete device [a]:Add device manually [e]:Diagnostic report [s]:Save settings [q]:Exit Please select the device to set up. Please input >q ******************************************************************************** }}} DIOの場合、 {{{ root@raspberrypi:/home/epics/epics/cdio_820F/contec/cdio/config# ./config ---------------------------------- CONTEC API-DIO(LNX) Configuration ---------------------------------- Message : Auto detecting devices. ........................................................................................................................................................ .. -------------------------------------------------------------------------------- Devices list -------------------------------------------------------------------------------- DeviceName Product Name ID IP/Master IP Status [1]: DIO000 CPI-RRY-16 2 [2]:+ DIO001 CPI-DIO-0808L 3 -------------------------------------------------------------------------------- [#]:Select device [o]:List sort [r]:Redetect devices list [d]:Delete device [a]:Add device manually [e]:Diagnostic report [s]:Save settings [q]:Exit Please select the device to set up. Please input >s ******************************************************************************** Save OK?(y/n):y Message : Setting file is 'contec_dio.conf'. Message : Start script file is 'contec_dio_start.sh'. Message : Stop script file is 'contec_dio_stop.sh'. Confirm(y): Confirm(y):y .. -------------------------------------------------------------------------------- Devices list -------------------------------------------------------------------------------- DeviceName Product Name ID IP/Master IP Status [1]: DIO000 CPI-RRY-16 2 [2]: DIO001 CPI-DIO-0808L 3 -------------------------------------------------------------------------------- [#]:Select device [o]:List sort [r]:Redetect devices list [d]:Delete device [a]:Add device manually [e]:Diagnostic report [s]:Save settings [q]:Exit Please select the device to set up. Please input >q ******************************************************************************** }}} ドライバにアクセスするためには、付属ライブラリ内にある{{{contec_aio_start.sh}}}と{{{contec_dio_start.sh}}}を実行する必要があるそうなので、マニュアルに従って{{{/etc/rc.local}}}に記述する。 {{{ root@raspberrypi:/root# emacs -nw /etc/rc.local cd /home/epics/epics/caio530F/contec/caio/config/ ./contec_aio_start.sh cd /home/epics/epics/cdio_820F/contec/cdio/config/ ./contec_dio_start.sh }}} ちなみにこのスクリプトを実行するためには、実行に必要なファイルを適当なディレクトリにコピーすることが求められているが、今回は展開先で直接実行するようにしておいた。 後日、ボードを追加したり、ボードID(ロータリースイッチ)を変更した場合には、再度{{{config}}}をし直す必要があるので注意する。 == IOC == IOCは、{{{ai,bi,ao,bo,mbbiDirect,mbboDirect}}}をサポートしている。 まだ実戦投入はしていないが、動作確認済みのものを上げておく。 [attachment:contecCPI_IOC_1_0.tar.gz] ちなみに今回は最低限各ポートに読み書きができるようにしてあるだけなので、高速化や割り込みには対応していない。[[br]] 改変は自由なので、変更したら公開してもらうとありがたい。[[br]] バージョン管理はローカルのgitlabでしか行っていないが、後日公開したいと考えている。 === db ファイル === * INP,OUT field * {{{$(NAME)}}}: {{{config}}}で設定したデバイス名 * {{{$(PORT)}}}: ポート番号(bi,bo,mbbiDirect,mbboDirect) * {{{$(CH)}}}: チャネル番号(ai,ao,bi,bo) * ai record {{{ record(ai, "$(USER):ANALOG:CH$(CH):GET") { field(DTYP, "devAiCPI") field(INP, "@$(NAME) $(CH)") field(SCAN, "1 second") } }}} * ao record {{{ record(ao, "$(USER):ANALOG:CH$(CH):SET") { field(DTYP, "devAoCPI") field(OUT, "@$(NAME) $(CH)") } }}} * bi record {{{ record(bi, "$(USER):BIT:PORT$(PORT):CH$(CH):GET") { field(DTYP, "devBiCPI") field(INP, "@$(NAME) $(PORT) $(CH)") field(SCAN, "1 second") } }}} * bo record {{{ record(bo, "$(USER):BIT:PORT$(PORT):CH$(CH):SET") { field(DTYP, "devBoCPI") field(OUT, "@$(NAME) $(PORT) $(CH)") } }}} * mbbiDirect record {{{ record(mbbiDirect, "$(USER):BYTE:PORT$(PORT):GET") { field(DTYP, "devMbbiDirectCPI") field(INP, "@$(NAME) $(PORT)") field(SCAN, "1 second") } }}} * mbboDirect record {{{ record(mbboDirect, "$(USER):BYTE:PORT$(PORT):SET") { field(DTYP, "devMbboDirectCPI") field(OUT, "@$(NAME) $(PORT)") } }}}