| 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 | |