Changes between Initial Version and Version 1 of epics/arduino/simpleRead


Ignore:
Timestamp:
09/25/18 16:23:49 (6 years ago)
Author:
Takashi Obina
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • epics/arduino/simpleRead

    v1 v1  
     1= Arduino と EPICS を使った簡単な例 =
     2家庭でも遊べるように、簡単なサンプルをつくる。
     3
     4== 準備 ==
     5 * Arduino Uno
     6 * PC
     7   * Arduino 統合開発環境(IDE)を公式サイト( https://www.arduino.cc/en/Main/Software )からダウンロード・インストールする
     8   * 今回は Windows / ver 1.8.7 を使用した
     9 * Raspberry Pi
     10   * 今回はRaspberry Pi2 Model Bを使用した(Pi3でも可能のはず)
     11   * EPICSインストールについては[wiki:epics/raspberrypi 別の記事を参照]
     12 * USB ケーブル
     13 * ブレッドボード、ジャンパー系ブル
     14 * 半固定抵抗と固定抵抗(今回は手元にあった 1kΩのモノを使用)
     15
     16== 方針 ==
     17[!RasPi (epics IOC)] --[USB]--[Arduino]--AnalogIN--register [[br]]
     18
     19* アナログ入力を読み込み、シリアル経由でホストに通信。最初はPCを使って動作検証し、その後EPICS化する。
     20* Arduino Uno の場合、0-5Vを 10bit(0-1024)で読み込むことが可能
     21* 5V 電圧+可変抵抗+固定抵抗(破損防止)で
     22  * 今回は手元にあった 1kΩの可変抵抗+1kΩの固定抵抗
     23* ブレッドボードに配線[図]
     24
     25
     26== PCにてスケッチの検証 ==
     27構成としては
     28[PC] --[USB]--[Arduino]--AnalogIN
     29という単純な構成。[[br]]
     30
     311秒に1回、ADCの値をシリアル経由でホストPCに送るスケッチを作成する。
     32{{{
     33int analogPin = 0;
     34int val = 0;
     35
     36void setup() {
     37  Serial.begin(19200);
     38}
     39
     40void loop() {
     41  val = analogRead(analogPin);
     42  Serial.println(val);
     43  delay(1000);
     44}
     45}}}
     46Arduinoにダウンロードし、IDEで「シリアルモニター」を開くと、1秒に1回ADCのカウント値が表示される。[[br]]
     47この状態で可変抵抗を動かすと、カウント値が変わることを確認する。
     48
     49
     50== Raspberry Pi に接続 ==
     51次にUSBケーブルをPCから抜いて、Raspberry Pi に Arduino を接続する。[[br]]
     52まずは dmesg を確認
     53{{{
     54[ 3433.753691] usb 1-1.2: new full-speed USB device number 6 using dwc_otg
     55[ 3433.898077] usb 1-1.2: New USB device found, idVendor=2a03, idProduct=0043
     56[ 3433.898099] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=220
     57[ 3433.898109] usb 1-1.2: Product: Arduino Uno
     58[ 3433.898120] usb 1-1.2: Manufacturer: Arduino Srl
     59[ 3433.898129] usb 1-1.2: SerialNumber:
     60[ 3433.938398] cdc_acm 1-1.2:1.0: ttyACM0: USB ACM device
     61[ 3433.939634] usbcore: registered new interface driver cdc_acm
     62[ 3433.939644] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
     63}}}
     64のように、ttyACM0 として認識されている。となればあとは簡単で、rootになってから適当なターミナルプロ
     65ラムで接続すれば良い。ここでは使いなれた GNU Screen を使って、デバイス名と通信速度を指定する
     66{{{
     67pi@raspberrypi:~ $ sudo su -
     68root@raspberrypi:~# screen /dev/ttyACM0 19200
     69}}}
     70正常に接続できれば、1秒ごとにターミナル上にADCカウント値が表示される。[[br]]
     71GNU Screenを終了するにはホットキー(デフォルトではCTRL-a)を押してから、kを押せば良い(killコマンド)。
     72※分からなければgoogleで 「GNU Screen の使い方」を検索
     73
     74
     75== EPICS IOC 作成 ==
     76ここまでくれば、あとはEPICSのIOCを書く。
     77単純に Stream Device で読み込むだけで良いので、
     78simpleReadという名前でapplicationを作る。
     79{{{
     80pi@raspberrypi:~/epics/app/arduino $ makeBaseApp.pl -t ioc simpleRead
     81pi@raspberrypi:~/epics/app/arduino $ makeBaseApp.pl -i -t ioc simpleRead
     82Using target architecture linux-arm (only one available)
     83The following applications are available:
     84    simpleRead
     85What application should the IOC(s) boot?
     86The default uses the IOC's name, even if not listed above.
     87Application name?
     88pi@raspberrypi:~/epics/app/arduino $
     89}}}
     90configure/RELEASEを編集
     91{{{
     92pi@raspberrypi:~/epics/app/arduino $ vi configure/RELEASE
     93
     94ASYN=/opt/epics/R315.5/modules/soft/asyn/4-31
     95STREAM=/opt/epics/R315.5/modules/soft/stream/2-7-7
     96}}}
     97
     98srcディレクトリで、MakefileにstreamDeviceの
     99 * SerialPortドライバーを追加
     100 * asyn ライブラリを追加
     101の2つを追記
     102{{{
     103pi@raspberrypi:~/epics/app/arduino/simpleReadApp/src $ vi Makefile
     104
     105# simpleRead.dbd will be made up from these files:
     106simpleRead_DBD += base.dbd
     107
     108# Include dbd files from all support applications:
     109simpleRead_DBD += asyn.dbd
     110simpleRead_DBD += stream.dbd
     111simpleRead_DBD += drvAsynSerialPort.dbd
     112
     113# Add all the support libraries needed by this IOC
     114simpleRead_LIBS += asyn
     115simpleRead_LIBS += stream
     116
     117}}}
     118
     119Dbディレクトリでdatabaseファイルを追加
     120{{{
     121vi read1.db
     122
     123record(longin, "TEST:READ_INT") {
     124  field(DESC, "adc raw input")
     125  field(DTYP, "stream")
     126  field(INP,  "@simple.proto getval PS1")
     127  field(SCAN, "I/O Intr")
     128}
     129}}}
     130
     131Dbディレクトリの Makefile に db ファイルを追加
     132{{{
     133pi@raspberrypi:~/epics/app/arduino/simpleReadApp/Db $ vi Makefile
     134
     135DB += read1.db
     136}}}
     137
     138Dbディレクトリに protocol file を作成
     139{{{
     140vi simple.proto
     141
     142Terminator = CR LF;
     143getval {
     144 in "%d";
     145}
     146
     147}}}
     148
     149make すると、とても遅い。セルフコンパイルなので仕方ないのだが.....クロスコンパイル環境を整えねば。
     150stream device のサイト http://epics.web.psi.ch/software/streamdevice/ も参照。
     151
     152startupディレクトリで st.cmd コマンド編集
     153{{{
     154pi@raspberrypi:~/epics/app/arduino/iocBoot/iocsimpleRead $ vi st.cmd
     155
     156dbLoadRecords("db/read1.db")
     157epicsEnvSet("STREAM_PROTOCOL_PATH", ".:../../simpleReadApp/Db")
     158drvAsynSerialPortConfigure ("PS1","/dev/ttyACM0")
     159asynSetOption ("PS1", 0, "baud", "19200")
     160
     161}}}
     162
     163{{{
     164pi@raspberrypi:~/epics/app/arduino/iocBoot/iocsimpleRead $ chmod +x st.cmd
     165pi@raspberrypi:~/epics/app/arduino/iocBoot/iocsimpleRead $ sudo ./st.cmd
     166}}}
     167
     168エラーが出ていないことを確認すること。[[br]]
     169別ターミナルを開いて、
     170{{{
     171camonitor TEST:READ_INT
     172}}}
     173とする。
     174あるいは、PC上でCSSを実行して、このレコードをモニター・グラフ表示する。
     175