基本動作例2: ArduinoのAD変換端子からの入力読取り¶
検証目標¶
ハードウェア(Arduino)を遠隔制御する検証.
前提条件¶
IOCは "RaspberryPi" 、OPIは手元PCのmacOS、制御機器は "Arduino Uno" .
Arduino-RaspberryPi間はUSB接続、RaspberryPi-mac間はLANケーブルで接続する.
Arduinoの5V-GND端子間に 1KΩ抵抗x2個、さらにLEDを直列に接続し、さらに抵抗の中間地点に Arduino A0端子を接続する.A0から、A/D変換(ADC)によってデジタル値に変換した値を読み取る.
制御モジュールとして、 "StremDevice" を使用する.
その他、 asyn , "pyEpics" を適宜使用する.
作業ディレクトリ: ${HOME}/epics/app/simpleRead/ ( ${HOME}=/home/epics/ )
Arduinoプログラム(ADC )の転送¶
Arduino プログラムは以下である.
// use A0-plug to check the voltage. //
//
// parameters //
int analogPin = 0;
int val = 0;
int sampleRate = 19200;
int interval_ms = 1000
void setup() {
Serial.begin( sampleRate );
}
void loop() {
val = analogRead( analogPin );
Serial.println(val);
delay( interval_ms );
}
上記プログラムは、Arduino IDE を使用してArduinoへ転送しておく.(手元PCからでも勿論、可)
IOC構築¶
IOC構築 / テスト の手順¶
アプリ名は、参考URL(下記)に従い、simpleReadとする.
また、.dbやレコード名などは、全てsimpleReadへ統一する.
IOC-App 構築の手順は、以下である.
ベースアプリ の作成.
configure/RELEASE に共有するモジュールのインストールパスを追記.
"simpleReadApp" 内の データベース情報、及び、コンパイル用のMakefileへ追記する.
StreamDevice 用の プロトコル を、 protocols/simpleRead.proto として作成する.
IOC初期化スクリプト( iocBoot/iocsimpleRead/st.cmd ) を編集し、実行可能とする.
make 、及び、st.cmdの実行、camonitorにより、経時変化を観察する.
以下、上記手順について詳述する.
1. ベースアプリの作成¶
makeBaseApp.plを用いたベースアプリの作成
$ mkdir -p ~/epics/app/simpleRead $ cd ~/epics/app/simpleRead $ makeBaseApp.pl -t ioc simpleRead $ makeBaseApp.pl -i -t ioc simpleRead
2. 共通コンパイル設定事項の編集 ( configure/RELEASE )¶
configure/RELEASEに、共通のコンパイル設定(モジュールの場所等、)を例えば以下のように記載する.
ASYN = /home/epics/epics/support/asyn STREAM = /home/epics/epics/support/StreamDevice
3. データベースファイルとコンパイルの準備¶
データベース及び使用するモジュールの情報を記載し、${HOME}/epics/app/simpleRead/simpleReadApp/Db/simpleRead.dbを作成する.
record(longin,"epics:simpleRead") { field(DESC, "A/D convertor raw input signal" ) field(DTYP, "stream") field(INP, "@simpleRead.proto getval PS1") field(SCAN, "I/O Intr") }
データベースのコンパイル対象として、上記の"simpleRead.db"を追加.
@ simpleReadApp/Db/Makefile DB += simpleRead.db
その他モジュールを利用する場合は、IOCの通信コードのコンパイルに使用するモジュール情報を、 "simpleReadApp/src/Makefile" に記載し、コンパイルできるようにする.
@ simpleReadApp/src/Makefile simpleRead_DBD += stream.dbd simpleRead_DBD += asyn.dbd simpleRead_DBD += drvAsynSerialPort.dbd simpleRead_LIBS += stream simpleRead_LIBS += asyn
4. StreamDeviceの設定ファイル ( "protocol" )の作成¶
ディレクトリ "protocols"を作成し、StreamDeviceの入出力情報を記載する.
$ mkdir $HOME/epics/app/simpleRead/protocols
Terminator = CR LF; getVal{ in "%d"; }
5. IOC 初期化スクリプト "st.cmd" の編集¶
IOC初期化スクリプト ( iocBoot/iocsimpleRead/st.cmd ) に、以下の情報を記載する.
#!../../bin/linux-arm/simpleRead #- You may have to change simpleRead to something else #- everywhere it appears in this file < envPaths # -- n.k. added -- # epicsEnvSet("STREAM_PROTOCOL_PATH", ".:../../protocols") cd "${TOP}" ## Register all support components dbLoadDatabase "dbd/simpleRead.dbd" simpleRead_registerRecordDeviceDriver pdbbase ## Load record instances #dbLoadRecords("db/xxx.db","user=epics") # -- n.k. added -- # dbLoadRecords ("db/simpleRead.db") # drvGenericSerialConfigure( "PS1", "/dev/ttyACM0" ) # asynSetPortOption( "PS1", "baud", "19200" ) drvAsynSerialPortConfigure ("PS1","/dev/ttyACM0") asynSetOption ("PS1", 0, "baud", "19200") # -- n.k. added -- # cd "${TOP}/iocBoot/${IOC}" iocInit ## Start any sequence programs #seq sncxxx,"user=epics"
Warning
(隘路事項) dbLoadRecord, dbLoadDatabaseの順番が逆になったりすると、うまく動作しない.しかも、".db"ファイルの1行目がおかしいというエラーメッセージがでるので、ミスリーディングである.st.cmd前後の状態も確認すべきである.
スクリプトに実行権限を与えておく.
$ chmod u+x $HOME/epics/app/simpleRead/iocBoot/iocsimpleRead/st.cmd
6. make 及び、初期化スクリプト "st.cmd" の実行¶
ベースディレクトリにて make する.
$ cd $HOME/epics/app/simpleRead/ $ make distclean $ make
初期化スクリプトを実行する.
$ cd $HOME/epics/app/simpleRead/iocBoot/iocsimpleRead/ $ sudo ./st.cmd
make 完了後の最終的なディレクトリツリーは以下.
epics@raspberrypi:~/epics/app/simpleRead $ tree
.
├── Makefile
├── bin
│ └── linux-arm
│ └── simpleRead
├── configure
│ ├── CONFIG
│ ├── CONFIG_SITE
│ ├── Makefile
│ ├── O.Common
│ ├── O.linux-arm
│ │ └── Makefile
│ ├── RELEASE
│ ├── RULES
│ ├── RULES.ioc
│ ├── RULES_DIRS
│ └── RULES_TOP
├── db
│ └── simpleRead.db
├── dbd
│ └── simpleRead.dbd
├── iocBoot
│ ├── Makefile
│ └── iocsimpleRead
│ ├── Makefile
│ ├── envPaths
│ └── st.cmd
├── lib
│ └── linux-arm
├── protocols
│ └── simpleRead.proto
└── simpleReadApp
├── Db
│ ├── Makefile
│ ├── O.Common
│ ├── O.linux-arm
│ │ └── Makefile
│ └── simpleRead.db
├── Makefile
└── src
├── Makefile
├── O.Common
│ └── simpleRead.dbd
├── O.linux-arm
│ ├── Makefile
│ ├── simpleRead
│ ├── simpleRead.dbd.d
│ ├── simpleReadMain.d
│ ├── simpleReadMain.o
│ ├── simpleRead_registerRecordDeviceDriver.cpp
│ ├── simpleRead_registerRecordDeviceDriver.d
│ └── simpleRead_registerRecordDeviceDriver.o
└── simpleReadMain.cpp
19 directories, 33 files
epics@raspberrypi:~/epics/app/simpleRead $
ADCの動作状況の確認¶
ローカルからのcamonitor¶
別コンソールを立ち上げて、以下コマンドを実行
epics@raspberrypi: ~ $ camonitor epics:simpleRead
OPI(手元macOS)からのCA¶
pyEpicsからCA.
$ python3 >>> import epics >>> epics.caget ( "epics:simpleRead" ) >>> epics.camonitor( "epics:simpleRead" )
OPIからIOCを介して、制御( 電圧モニタ ) を実施することができた.
参考URL¶
Arduino-EPICS サンプル ( KEK-EPICS Users JP, https://cerldev.kek.jp/trac/EpicsUsersJP/wiki/epics/arduino/simpleRead )