見出し画像

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から使ってみましょう。


この記事が気に入ったらサポートをしてみませんか?