| | 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 | |
| | 31 | 1秒に1回、ADCの値をシリアル経由でホストPCに送るスケッチを作成する。 |
| | 32 | {{{ |
| | 33 | int analogPin = 0; |
| | 34 | int val = 0; |
| | 35 | |
| | 36 | void setup() { |
| | 37 | Serial.begin(19200); |
| | 38 | } |
| | 39 | |
| | 40 | void loop() { |
| | 41 | val = analogRead(analogPin); |
| | 42 | Serial.println(val); |
| | 43 | delay(1000); |
| | 44 | } |
| | 45 | }}} |
| | 46 | Arduinoにダウンロードし、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 | {{{ |
| | 67 | pi@raspberrypi:~ $ sudo su - |
| | 68 | root@raspberrypi:~# screen /dev/ttyACM0 19200 |
| | 69 | }}} |
| | 70 | 正常に接続できれば、1秒ごとにターミナル上にADCカウント値が表示される。[[br]] |
| | 71 | GNU Screenを終了するにはホットキー(デフォルトではCTRL-a)を押してから、kを押せば良い(killコマンド)。 |
| | 72 | ※分からなければgoogleで 「GNU Screen の使い方」を検索 |
| | 73 | |
| | 74 | |
| | 75 | == EPICS IOC 作成 == |
| | 76 | ここまでくれば、あとはEPICSのIOCを書く。 |
| | 77 | 単純に Stream Device で読み込むだけで良いので、 |
| | 78 | simpleReadという名前でapplicationを作る。 |
| | 79 | {{{ |
| | 80 | pi@raspberrypi:~/epics/app/arduino $ makeBaseApp.pl -t ioc simpleRead |
| | 81 | pi@raspberrypi:~/epics/app/arduino $ makeBaseApp.pl -i -t ioc simpleRead |
| | 82 | Using target architecture linux-arm (only one available) |
| | 83 | The following applications are available: |
| | 84 | simpleRead |
| | 85 | What application should the IOC(s) boot? |
| | 86 | The default uses the IOC's name, even if not listed above. |
| | 87 | Application name? |
| | 88 | pi@raspberrypi:~/epics/app/arduino $ |
| | 89 | }}} |
| | 90 | configure/RELEASEを編集 |
| | 91 | {{{ |
| | 92 | pi@raspberrypi:~/epics/app/arduino $ vi configure/RELEASE |
| | 93 | |
| | 94 | ASYN=/opt/epics/R315.5/modules/soft/asyn/4-31 |
| | 95 | STREAM=/opt/epics/R315.5/modules/soft/stream/2-7-7 |
| | 96 | }}} |
| | 97 | |
| | 98 | srcディレクトリで、MakefileにstreamDeviceの |
| | 99 | * SerialPortドライバーを追加 |
| | 100 | * asyn ライブラリを追加 |
| | 101 | の2つを追記 |
| | 102 | {{{ |
| | 103 | pi@raspberrypi:~/epics/app/arduino/simpleReadApp/src $ vi Makefile |
| | 104 | |
| | 105 | # simpleRead.dbd will be made up from these files: |
| | 106 | simpleRead_DBD += base.dbd |
| | 107 | |
| | 108 | # Include dbd files from all support applications: |
| | 109 | simpleRead_DBD += asyn.dbd |
| | 110 | simpleRead_DBD += stream.dbd |
| | 111 | simpleRead_DBD += drvAsynSerialPort.dbd |
| | 112 | |
| | 113 | # Add all the support libraries needed by this IOC |
| | 114 | simpleRead_LIBS += asyn |
| | 115 | simpleRead_LIBS += stream |
| | 116 | |
| | 117 | }}} |
| | 118 | |
| | 119 | Dbディレクトリでdatabaseファイルを追加 |
| | 120 | {{{ |
| | 121 | vi read1.db |
| | 122 | |
| | 123 | record(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 | |
| | 131 | Dbディレクトリの Makefile に db ファイルを追加 |
| | 132 | {{{ |
| | 133 | pi@raspberrypi:~/epics/app/arduino/simpleReadApp/Db $ vi Makefile |
| | 134 | |
| | 135 | DB += read1.db |
| | 136 | }}} |
| | 137 | |
| | 138 | Dbディレクトリに protocol file を作成 |
| | 139 | {{{ |
| | 140 | vi simple.proto |
| | 141 | |
| | 142 | Terminator = CR LF; |
| | 143 | getval { |
| | 144 | in "%d"; |
| | 145 | } |
| | 146 | |
| | 147 | }}} |
| | 148 | |
| | 149 | make すると、とても遅い。セルフコンパイルなので仕方ないのだが.....クロスコンパイル環境を整えねば。 |
| | 150 | stream device のサイト http://epics.web.psi.ch/software/streamdevice/ も参照。 |
| | 151 | |
| | 152 | startupディレクトリで st.cmd コマンド編集 |
| | 153 | {{{ |
| | 154 | pi@raspberrypi:~/epics/app/arduino/iocBoot/iocsimpleRead $ vi st.cmd |
| | 155 | |
| | 156 | dbLoadRecords("db/read1.db") |
| | 157 | epicsEnvSet("STREAM_PROTOCOL_PATH", ".:../../simpleReadApp/Db") |
| | 158 | drvAsynSerialPortConfigure ("PS1","/dev/ttyACM0") |
| | 159 | asynSetOption ("PS1", 0, "baud", "19200") |
| | 160 | |
| | 161 | }}} |
| | 162 | |
| | 163 | {{{ |
| | 164 | pi@raspberrypi:~/epics/app/arduino/iocBoot/iocsimpleRead $ chmod +x st.cmd |
| | 165 | pi@raspberrypi:~/epics/app/arduino/iocBoot/iocsimpleRead $ sudo ./st.cmd |
| | 166 | }}} |
| | 167 | |
| | 168 | エラーが出ていないことを確認すること。[[br]] |
| | 169 | 別ターミナルを開いて、 |
| | 170 | {{{ |
| | 171 | camonitor TEST:READ_INT |
| | 172 | }}} |
| | 173 | とする。 |
| | 174 | あるいは、PC上でCSSを実行して、このレコードをモニター・グラフ表示する。 |
| | 175 | |