基本動作例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 プログラムは以下である.

A Arduino program to measure the voltage between 2 registers.

// 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 構築の手順は、以下である.

    1. ベースアプリ の作成.

    2. configure/RELEASE に共有するモジュールのインストールパスを追記.

    3. "simpleReadApp" 内の データベース情報、及び、コンパイル用のMakefileへ追記する.

    4. StreamDevice 用の プロトコル を、 protocols/simpleRead.proto として作成する.

    5. IOC初期化スクリプト( iocBoot/iocsimpleRead/st.cmd ) を編集し、実行可能とする.

    6. 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を作成する.

    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
    
    simpleRead.proto
    Terminator = CR LF;
    
    getVal{
      in "%d";
    }
    

5. IOC 初期化スクリプト "st.cmd" の編集

  • IOC初期化スクリプト ( iocBoot/iocsimpleRead/st.cmd ) に、以下の情報を記載する.

    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 完了後の最終的なディレクトリツリーは以下.

Directory tree after compilation.
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