基本動作例4: EPICS-Arduinoによる LED-PWM 調光制御

検証目標

  • ハードウェア(Arduino)の出力状態をPWM制御する検証.

前提条件

  • 前回同様.

  • PWMでLEDを調光する.

Arduinoプログラム:(PWM 制御)の転送

  • シリアル制御(USB)から、明るさ信号を送信し、PWM制御する.

  • Arduino プログラムは以下である.

arduino_LEDcontrol_02.ino

// arduino PWM output program //

int    pin_LED    = 5;
int    usb_bpm    = 19200;

void setup() {
  // put your setup code here, to run once:
  pinMode( pin_LED, OUTPUT );
  Serial.begin( usb_bpm );
}

void loop() {
  // put your main code here, to run repeatedly:
  
  if ( Serial.available() > 0 ){
    int iRecv = Serial.parseInt();
    if ( iRecv > 255 ){
      iRecv = 255;
    } else if ( iRecv < 0 ){
      iRecv = 0;
    }
    analogWrite( pin_LED, iRecv );
  }
}
  • pythonからの制御テストコードは以下である.

test__pwmLED.py
# -*- coding: utf-8 -*-
import serial

com_num   = "/dev/cu.usbmodem142201"
baud_rate = 19200

def main():

    ser = serial.Serial( com_num, baud_rate, timeout=1)
    while True:

        print( " input PWM control value ( 0 < val < 255, or type quit ) >>> ", end="" )
        int_cmd   = input()
        byte_cmd  = bytes( int_cmd, encoding="ascii" )
        
        if ( int_cmd == "quit" ): break
        ser.write( byte_cmd )
        
    ser.close()

if __name__ == '__main__':
    main()

IOC構築

IOC構築 / テスト の手順

  • アプリ名は、参考URL(下記)に従い、pwmLEDとする.

  • また、.dbやレコード名などは、全てpwmLEDへ統一する.

  • IOC-App 構築の手順は、以下である.

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

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

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

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

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

    6. make 、及び、st.cmdの実行、camonitorにより、経時変化を観察する.

以下、上記手順について詳述する.

1. ベースアプリの作成

  • makeBaseApp.plを用いたベースアプリの作成

    $ mkdir -p ~/epics/app/pwmLED
    $ cd  ~/epics/app/pwmLED
    $ makeBaseApp.pl -t ioc pwmLED
    $ makeBaseApp.pl -i -t ioc pwmLED
    

2. 共通コンパイル設定事項の編集 ( configure/RELEASE )

  • configure/RELEASEに、共通のコンパイル設定(モジュールの場所等、)を例えば以下のように記載する.

    ASYN   = /home/epics/epics/support/asyn
    STREAM = /home/epics/epics/support/StreamDevice
    

3. データベースファイルとコンパイルの準備

  • データベース及び使用するモジュールの情報を記載し、${HOME}/epics/app/pwmLED/pwmLEDApp/Db/pwmLED.dbを作成する.

    pwmLED.db
    record( stringout, "epics:pwmLED" )
    {
      field( DESC, "pwm of LED" )
      field( DTYP, "stream" )
      field( OUT , "@pwmLED.proto putval PS1")
      field( SCAN, "I/O Intr" )
    }
    
  • データベースのコンパイル対象として、上記の"pwmLED.db"を追加.

    @ pwmLEDApp/Db/Makefile
    
    DB += pwmLED.db
    
  • その他モジュールを利用する場合は、IOCの通信コードのコンパイルに使用するモジュール情報を、 "pwmLEDApp/src/Makefile" に記載し、コンパイルできるようにする.

    @ pwmLEDApp/src/Makefile
    
    pwmLED_DBD  += stream.dbd
    pwmLED_DBD  += asyn.dbd
    pwmLED_DBD  += drvAsynSerialPort.dbd
    
    pwmLED_LIBS += stream
    pwmLED_LIBS += asyn
    

4. StreamDeviceの設定ファイル ( "protocol" )の作成

  • ディレクトリ "protocols"を作成し、StreamDeviceの入出力情報を記載する.

    $ mkdir $HOME/epics/app/pwmLED/protocols
    
    pwmLED.proto
    Terminator = CR LF;
    
    putval{
      out "%s";
    }
    

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

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

    st.cmd
    #!../../bin/linux-arm/pwmLED
    
    #- You may have to change pwmLED to something else
    #- everywhere it appears in this file
    
    < envPaths
    epicsEnvSet("STREAM_PROTOCOL_PATH", ".:../../protocols")
    
    cd "${TOP}"
    
    ## Register all support components
    dbLoadDatabase "dbd/pwmLED.dbd"
    pwmLED_registerRecordDeviceDriver pdbbase
    
    ## Load record instances
    #dbLoadRecords("db/xxx.db","user=epics")
    
    dbLoadRecords( "db/pwmLED.db" )
    drvAsynSerialPortConfigure ("PS1","/dev/ttyACM0")
    asynSetOption( "PS1", 0, "baud", "19200" )
    
    
    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/pwmLED/iocBoot/iocpwmLED/st.cmd
    

6. make 及び、初期化スクリプト "st.cmd" の実行

  • ベースディレクトリにて make する.

    $ cd $HOME/epics/app/pwmLED/
    $ make distclean
    $ make
    
  • 初期化スクリプトを実行する.

    $ cd $HOME/epics/app/pwmLED/iocBoot/iocpwmLED/
    $ sudo ./st.cmd
    

LEDのPWM制御状況の確認

ローカルからのcamonitor

  • 別コンソールを立ち上げて、以下コマンドを実行

    epics@raspberrypi: ~ $ caput epics:pwmLED 0   ( H も可 )
    epics@raspberrypi: ~ $ caput epics:pwmLED 10  ( H も可 )
    epics@raspberrypi: ~ $ caput epics:pwmLED 20  ( H も可 )
    epics@raspberrypi: ~ $ caput epics:pwmLED 240 ( H も可 )
    
  • 明るさが変更されることを確認した.

OPI(手元macOS)からのCA

  • pyEpicsからCA.

    $ python3
    >>> import epics
    >>> epics.caput( "epics:pwmLED",  10 )
    >>> epics.caput( "epics:pwmLED", 240 )
    
  • OPIからIOCを介して、 "LEDのPWM制御" を実施することができた.

参考URL