RaspberryPiとUbuntuでEPICSはじめました#3 EPICSのIOC設定
この記事は、EPICS(Experimental Physics and Industrial Control System)の初学用にまとめた記事です。
RaspberryPIをIOC化しよう!
前回の記事ではepicsのインストールを説明しました。
次にepics上でIOC設定を行う方法です。
epics-devgpioのインストール
IOC上でGPIOを制御するにはepics用にGPIO制御コードが必要です。
最初から作るのは大変なので今回はepics-devgpioを利用させてもらうことにしました。
まずmodules配下にRaspberryPi用のrpiディレクトリを作成、同様にdevgpioを作成してそこで準備します。
epics@ubuntu:/opt/epics/base$ cd /opt/epics/base
epics@ubuntu:/opt/epics/base$ mkdir -p modules/rpi/devgpio
epics@ubuntu:/opt/epics/base$ cd modules/rpi/devgpio
epics@ubuntu:/opt/epics/base/modules/rpi/devgpio$
ダウンロードします
wget https://github.com/ffeldbauer/epics-devgpio/archive/master.zip
epics@ubuntu:/opt/epics/base/modules/rpi/devgpio$ wget https://github.com/ffeldbauer/epics-devgpio/archive/master.zip
--2020-07-03 04:56:28-- https://github.com/ffeldbauer/epics-devgpio/archive/master.zip
Resolving github.com (github.com)... 52.69.186.44
Connecting to github.com (github.com)|52.69.186.44|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://codeload.github.com/ffeldbauer/epics-devgpio/zip/master [following]
--2020-07-03 04:56:28-- https://codeload.github.com/ffeldbauer/epics-devgpio/zip/master
Resolving codeload.github.com (codeload.github.com)... 13.112.159.149
Connecting to codeload.github.com (codeload.github.com)|13.112.159.149|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [application/zip]
Saving to: ‘master.zip’
master.zip [ <=> ] 170.00K --.-KB/s in 0.06s
2020-07-03 04:56:28 (2.96 MB/s) - ‘master.zip’ saved [174076]
epics@ubuntu:/opt/epics/base/modules/rpi/devgpio$ ls -l
total 172
-rw-rw-r-- 1 epics epics 174076 Jul 3 04:56 master.zip
epics@ubuntu:/opt/epics/base/modules/rpi/devgpio$
master.zipを解凍してmakeします。
unzipがない場合は先にインストールしましょう。
解凍するとできるepics-devgpio-masterは20160302に変更しておきます。
# unzipがあるか確認
epics@ubuntu:/opt/epics/base/modules/rpi/devgpio$ unzip
Command 'unzip' not found, but can be installed with:
sudo apt install unzip
# ない場合は先にunzipをインストール
epics@ubuntu:/opt/epics/base/modules/rpi/devgpio$ sudo apt install unzip
[sudo] password for epics:
...
# unzipを使いepics-devgpioのmaster.zipを解凍
epics@ubuntu:/opt/epics/base/modules/rpi/devgpio$ unzip master.zip
Archive: master.zip
...
epics@ubuntu:/opt/epics/base/modules/rpi/devgpio$ ls -l
total 176
drwxrwxr-x 6 epics epics 4096 Jun 11 2019 epics-devgpio-master
-rw-rw-r-- 1 epics epics 174076 Jul 3 04:56 master.zip
# makeする
epics@ubuntu:/opt/epics/base/modules/rpi/devgpio$ cd epics-devgpio-master
epics@ubuntu:/opt/epics/base/modules/rpi/devgpio/epics-devgpio-master$ ls
BeagleBoneBlack-PermFix Makefile configure documentation
LICENSE README.md devgpioApp
epics@ubuntu:/opt/epics/base/modules/rpi/devgpio/epics-devgpio-master$ make
...
# epics-devgpio-masterは20160302に変更
epics@ubuntu:/opt/epics/base/modules/rpi/devgpio/epics-devgpio-master$ cd ..
epics@ubuntu:/opt/epics/base/modules/rpi/devgpio$ mv epics-devgpio-master 20160302
まずアプリケーション作成用のディレクトリを準備して使えるテンプレートを探します。
# 作業用ディレクトリの作成
epics@ubuntu:/opt/epics/base$ cd /opt/epics/base
epics@ubuntu:/opt/epics/base$ mkdir -p app/rpi_gpio
epics@ubuntu:/opt/epics/base$ cd app/rpi_gpio
# epicsのテンプレートを探す
epics@ubuntu:/opt/epics/base/app/rpi_gpio$ makeBaseApp.pl -l
Valid application types are:
support
example
caPerl
ioc
caClient
Valid iocBoot types are:
ioc
example
テンプレートは色々ありますが、いきなり空からスタートは大変なのでexampleを使用します。
作成したらとりあえずmakeしてみると・・・。
# exampleテンプレートを使用してrpi_gpioを作成
epics@ubuntu:/opt/epics/base/app/rpi_gpio$ makeBaseApp.pl -t example rpi_gpio
# どんなんができたか確認
epics@ubuntu:/opt/epics/base/app/rpi_gpio$ ls -l
total 12
-rw-rw-r-- 1 epics epics 900 Jul 3 05:28 Makefile
drwxrwxr-x 2 epics epics 4096 Jul 3 05:28 configure
drwxrwxr-x 4 epics epics 4096 Jul 3 05:28 rpi_gpioApp
# iocBootを作成
epics@ubuntu:/opt/epics/base/app/rpi_gpio$ makeBaseApp.pl -i -t example rpi_gpio
Using target architecture linux-arm (only one available)
The following applications are available:
rpi_gpio
What application should the IOC(s) boot?
The default uses the IOC's name, even if not listed above.
Application name?
# 本当にできたか確認
epics@ubuntu:/opt/epics/base/app/rpi_gpio$ ls -l
total 16
-rw-rw-r-- 1 epics epics 900 Jul 3 05:28 Makefile
drwxrwxr-x 2 epics epics 4096 Jul 3 05:28 configure
drwxrwxr-x 3 epics epics 4096 Jul 3 05:29 iocBoot
drwxrwxr-x 4 epics epics 4096 Jul 3 05:28 rpi_gpioApp
# makeしてみる
epics@ubuntu:/opt/epics/base/app/rpi_gpio$ make
...
# st.cmdができていることを確認
epics@ubuntu:/opt/epics/base/app/rpi_gpio$ ls iocBoot/iocrpi_gpio
Makefile README envPaths st.cmd
epics@ubuntu:/opt/epics/base/app/rpi_gpio$
st.cmdができていました。まだgpioの操作はいれていませんが、動作させてみます。
epics@ubuntu:/opt/epics/base/app/rpi_gpio$ cd iocBoot/iocrpi_gpio
epics@ubuntu:/opt/epics/base/app/rpi_gpio/iocBoot/iocrpi_gpio$ ls -l
total 16
-rw-rw-r-- 1 epics epics 124 Jul 3 05:29 Makefile
-rw-rw-r-- 1 epics epics 369 Jul 3 05:29 README
-rw-rw-r-- 1 epics epics 133 Jul 3 05:32 envPaths
-rw-rw-r-- 1 epics epics 642 Jul 3 05:29 st.cmd
# chmodで実行できるように変更する
epics@ubuntu:/opt/epics/base/app/rpi_gpio/iocBoot/iocrpi_gpio$ chmod +x st.cmd
epics@ubuntu:/opt/epics/base/app/rpi_gpio/iocBoot/iocrpi_gpio$ ls -l
total 16
-rw-rw-r-- 1 epics epics 124 Jul 3 05:29 Makefile
-rw-rw-r-- 1 epics epics 369 Jul 3 05:29 README
-rw-rw-r-- 1 epics epics 133 Jul 3 05:32 envPaths
-rwxrwxr-x 1 epics epics 642 Jul 3 05:29 st.cmd
epics@ubuntu:/opt/epics/base/app/rpi_gpio/iocBoot/iocrpi_gpio$
実行!
epics@ubuntu:/opt/epics/base/app/rpi_gpio/iocBoot/iocrpi_gpio$ ./st.cmd
#!../../bin/linux-arm/rpi_gpio
< envPaths
epicsEnvSet("IOC","iocrpi_gpio")
epicsEnvSet("TOP","/opt/epics/base-7.0.4/app/rpi_gpio")
epicsEnvSet("EPICS_BASE","/opt/epics/base")
cd "/opt/epics/base-7.0.4/app/rpi_gpio"
## Register all support components
dbLoadDatabase "dbd/rpi_gpio.dbd"
rpi_gpio_registerRecordDeviceDriver pdbbase
## Load record instances
dbLoadTemplate "db/user.substitutions"
dbLoadRecords "db/rpi_gpioVersion.db", "user=epics"
dbLoadRecords "db/dbSubExample.db", "user=epics"
#var mySubDebug 1
#traceIocInit
cd "/opt/epics/base-7.0.4/app/rpi_gpio/iocBoot/iocrpi_gpio"
iocInit
Starting iocInit
############################################################################
## EPICS R7.0.4
## Rev. 2020-07-03T02:07+0000
############################################################################
iocRun: All initialization complete
## Start any sequence programs
#seq sncExample, "user=epics"
epics>
dblコマンドで取得可能なレコードのリストをみます。exapleには取得できるようにサンプルが用意されています。
epics> dbl
epics:line:b
epics:aiExample
epics:aiExample1
epics:ai1
epics:aiExample2
epics:ai2
epics:aiExample3
epics:ai3
epics:compressExample
epics:circle:step
epics:circle:period
epics:subExample
epics:aSubExample
epics:circle:tick
epics:xxxExample
epics:circle:angle
epics:line:a
epics:circle:x
epics:circle:y
epics:calcExample
epics:calcExample1
epics:calc1
epics:calcExample2
epics:calc2
epics:calcExample3
epics:calc3
epics:rpi_gpio:version
epics>
C+cで一旦終了してgpioの操作する処理を入れます。
まずは、epics-devgpioを使えるように環境へ追加します。
epics@ubuntu:/opt/epics/base/app/rpi_gpio$ vi ./rpi_gpioApp/src/Makefile
2行追加します。
rpi_gpio_DBD += devgpio.dbd
devgpioのデータベースを追加する
rpi_gpio_LIBS += devgpio
同ライブラリを追加します
# rpi_gpio.dbd will include these files:
rpi_gpio_DBD += base.dbd
rpi_gpio_DBD += xxxSupport.dbd
rpi_gpio_DBD += dbSubExample.dbd
rpi_gpio_DBD += devrpi_gpioVersion.dbd
rpi_gpio_DBD += rpi_gpioHello.dbd
rpi_gpio_DBD += initTrace.dbd
rpi_gpio_DBD += devgpio.dbd
...
# Link in the code from our support library
rpi_gpio_LIBS += rpi_gpioSupport
rpi_gpio_LIBS += devgpio
...
パスが通っていないので通します。
epics@ubuntu:/opt/epics/base/app/rpi_gpio$ vi configure/RELEASE
DEVGPIO = $(EPICS_BASE)/modules/rpi/devgpio/20160302
を追加します。DEVGPIO は分かりやすい名前ならば何でも問題ないです。
# If using the sequencer, point SNCSEQ at its top directory:
#SNCSEQ = $(MODULES)/seq-ver
DEVGPIO = $(EPICS_BASE)/modules/rpi/devgpio/20160302
# EPICS_BASE should appear last so earlier modules can override stuff:
EPICS_BASE = /opt/epics/base
epics-devgpioが使えるようになったのでGPIOのIFを追加します。
devgpio.dbを新規作成します。
epics@ubuntu:/opt/epics/base/app/rpi_gpio$ cd /opt/epics/base/app/rpi_gpio
epics@ubuntu:/opt/epics/base/app/rpi_gpio$ vi ./rpi_gpioApp/Db/devgpio.db
devgpio.dvの中身は、GPIO02へON/OFFを出力するIFを追加します。
ここはRaspberry Pi 3 Model B Ver.2の定義を記述していますが、
Raspberry Pi 3 Model B+を使うときはGPIOの番号表を見て書き換えが必要な箇所です。
# /opt/epics/base/app/rpi_gpio/rpi_gpioApp/Db/devgpio.dbの中身
record(bo, "GPIO:GPIO2:OUT") {
field(DTYP, "devgpio")
field(OUT, "@2 H")
field(ZNAM, "OFF")
field(ONAM, "ON")
}
同じディレクトリのMakefileへ「DB += devgpio.db」を追加します。
epics@ubuntu:/opt/epics/base/app/rpi_gpio$ vi ./rpi_gpioApp/Db/Makefile
以下のように修正します。
#...
# Install databases, templates & substitutions like this
DB += circle.db
DB += dbExample1.db
DB += dbExample2.db
DB += rpi_gpioVersion.db
DB += dbSubExample.db
DB += user.substitutions
DB += devgpio.db
...
追加したdbの呼び出しと初期化を追加します。
epics@ubuntu:/opt/epics/base/app/rpi_gpio$ vi ./iocBoot/iocrpi_gpio/st.cmd
2行追加します。
dbLoadRecords "db/devgpio.db", "user=epics"
rpigio.dbを読み込みレコードをデータベースへ登録します
GpioConstConfigure "RASPI B REV2"
epics-devgpioの初期化を行いRaspberryPi のGPIO構成が利用できるように初期化します。
ここはRaspberry Pi 3 Model B Ver.2の定義を記述していますが、
Raspberry Pi 3 Model B+を使うときは書き換えが必要な箇所です。
RaspberryPiの以下が選べるようになっています。
RASPI B REV2 :Raspberry Pi 3 Model B Ver.2用の定義
RASPI B+ :Raspberry Pi 3 Model B+用の定義
BEAGLEBONE BLACK :RaspberryPIではないようなので省略
# /opt/epics/base/app/rpi_gpio/iocBoot/iocrpGi_gpio/st.cmd の編集
...
## Load record instances
dbLoadTemplate "db/user.substitutions"
dbLoadRecords "db/rpi_gpioVersion.db", "user=epics"
dbLoadRecords "db/dbSubExample.db", "user=epics"
dbLoadRecords "db/devgpio.db", "user=epics"
GpioConstConfigure "RASPI B REV2"
rpi_gpioを再度makeします。
epics@ubuntu:/opt/epics/base/app/rpi_gpio$ make
できましたので実行してみましょう!
sudoをつけて実行しないと
GPIO:GPIO2:OUT: GpioManager::exportPin: Could not open export file: Permission denied
って怒られます。sudo ./st.cmdで実行。
epics@ubuntu:/opt/epics/base/app/rpi_gpio$ cd iocBoot/iocrpi_gpio
epics@ubuntu:/opt/epics/base/app/rpi_gpio/iocBoot/iocrpi_gpio$ sudo ./st.cmd
[sudo] password for epics:
#!../../bin/linux-arm/rpi_gpio
< envPaths
epicsEnvSet("IOC","iocrpi_gpio")
epicsEnvSet("TOP","/opt/epics/base-7.0.4/app/rpi_gpio")
epicsEnvSet("DEVGPIO","/opt/epics/base/modules/rpi/devgpio/20160302")
epicsEnvSet("EPICS_BASE","/opt/epics/base")
cd "/opt/epics/base-7.0.4/app/rpi_gpio"
## Register all support components
dbLoadDatabase "dbd/rpi_gpio.dbd"
rpi_gpio_registerRecordDeviceDriver pdbbase
## Load record instances
dbLoadTemplate "db/user.substitutions"
dbLoadRecords "db/rpi_gpioVersion.db", "user=epics"
dbLoadRecords "db/dbSubExample.db", "user=epics"
dbLoadRecords "db/devgpio.db", "user=epics"
GpioConstConfigure "RASPI B REV2"
GpioConst: Loading Look-Up table for Raspberry Pi B Rev2
#var mySubDebug 1
#traceIocInit
cd "/opt/epics/base-7.0.4/app/rpi_gpio/iocBoot/iocrpi_gpio"
iocInit
Starting iocInit
############################################################################
## EPICS R7.0.4
## Rev. 2020-07-03T02:07+0000
############################################################################
iocRun: All initialization complete
## Start any sequence programs
#seq sncExample, "user=epics"
epics> dbl
epics:rpi_gpio:version
epics:circle:tick
GPIO:GPIO2:OUT
epics:aSubExample
epics:circle:step
epics:circle:period
epics:compressExample
epics:circle:angle
epics:line:a
epics:circle:x
epics:circle:y
epics:calcExample
epics:calcExample1
epics:calc1
epics:calcExample2
epics:calc2
epics:calcExample3
epics:calc3
epics:line:b
epics:aiExample
epics:aiExample1
epics:ai1
epics:aiExample2
epics:ai2
epics:aiExample3
epics:ai3
epics:subExample
epics:xxxExample
epics>
dblでリストをみると、GPIO:GPIO2:OUTが追加されているのが見えます。
dbpf GPIO:GPIO2:OUT 1と0を書き込むとGPIOがON/OFFされる。
適当なLEDを繋ぐか、テスターやオシロスコープで確認してみると良いかも。
epics> dbpf GPIO:GPIO2:OUT 1
DBF_STRING: "ON"
epics> dbpf GPIO:GPIO2:OUT 0
DBF_STRING: "OFF"
epics>
動作させたまま、新しいターミナルを開きsshでRaspberryPIへepicsアカウントへログインします。
caget GPIO:GPIO2:OUT
caput GPIO:GPIO2:OUT 1、0でGPIOがON/OFFとなることを確認できます。
cam
epics@ubuntu:~$ caget GPIO:GPIO2:OUT
GPIO:GPIO2:OUT OFF
epics@ubuntu:~$ caput GPIO:GPIO2:OUT 1
Old : GPIO:GPIO2:OUT OFF
New : GPIO:GPIO2:OUT ON
epics@ubuntu:~$ caget GPIO:GPIO2:OUT
GPIO:GPIO2:OUT ON
epics@ubuntu:~$ caput GPIO:GPIO2:OUT 0
Old : GPIO:GPIO2:OUT ON
New : GPIO:GPIO2:OUT OFF
epics@ubuntu:~$ caget GPIO:GPIO2:OUT
GPIO:GPIO2:OUT OFF
epics@ubuntu:~$
説明の為先のepicsを動作させた方をターミナル1
あとのcatget/catputをターミナル2とします。
ターミナル2側でcamonitor GPIO:GPIO2:OUTを呼ぶと、ON/OFF状態が返ってきて、そのまま表示が止まっています。
epics@ubuntu:~$ camonitor GPIO:GPIO2:OUT
GPIO:GPIO2:OUT 2020-07-03 09:42:58.890684 OFF
このままターミナル1側でdbpf GPIO:GPIO2:OUT 1を設定すると。
epics> dbpf GPIO:GPIO2:OUT 1
DBF_STRING: "ON"
epics>
ターミナル2側のログが出力されます。
epics@ubuntu:~$ camonitor GPIO:GPIO2:OUT
GPIO:GPIO2:OUT 2020-07-03 09:42:58.890684 OFF
GPIO:GPIO2:OUT 2020-07-03 09:46:42.644234 ON
ターミナル1側はepics本体上の操作になりますが、ターミナル2側は何も操作していなくても通知されてきました。
簡単な操作はこれくらいにして、次はネットワーク経由で別のPCから使ってみましょう。