= I2C 接続のセンサーを制御 = 説明は後で追加したい。取り急ぎメモのみ。 == コマンドラインから == {{{ [epics@centos-rpi2 iocexample]$ cat /proc/cpuinfo |grep Revision Revision : a01041 [epics@centos-rpi2 iocexample]$ uname -a Linux centos-rpi2 4.9.13-v7.1.el7 #1 SMP Mon Feb 27 10:45:31 UTC 2017 armv7l armv7l armv7l GNU/Linux }}} i2cモジュールをロードする {{{ [root@centos-rpi2 ~]# modprobe i2c-dev [root@centos-rpi2 ~]# modprobe i2c-bcm2708 [root@centos-rpi2 ~]# lsmod|more Module Size Used by i2c_bcm2708 5994 0 i2c_dev 6913 0 ipt_REJECT 1747 2 nf_reject_ipv4 3389 1 ipt_REJECT xt_tcpudp 2526 11 ...... }}} i2c関係のツールを確認 {{{ [root@centos-rpi2 ~]# yum search i2c 読み込んだプラグイン:fastestmirror Loading mirror speeds from cached hostfile =============================== N/S matched: i2c =============================== i2c-tools.armv7hl : A heterogeneous set of I2C tools for Linux i2c-tools-eepromer.armv7hl : Programs for reading / writing i2c / smbus eeproms i2c-tools-python.armv7hl : Python bindings for Linux SMBus access through : i2c-dev Name and summary matches only, use "search all" for everything. }}} とりあえず eeprom に関しては後で確認するとして、2つインストール {{{ [root@centos-rpi2 ~]# yum install i2c-tools i2c-tools-python [root@centos-rpi2 ~]# rpm -ql i2c-tools /etc/modprobe.d/i2c-dev.conf /etc/udev/makedev.d/99-i2c-dev.nodes /usr/bin/decode-dimms /usr/bin/decode-vaio /usr/sbin/i2c-stub-from-dump /usr/sbin/i2cdetect /usr/sbin/i2cdump /usr/sbin/i2cget /usr/sbin/i2cset .... [root@centos-rpi2 ~]# rpm -ql i2c-tools-python /usr/lib/python2.7/site-packages/smbus-1.1-py2.7.egg-info /usr/lib/python2.7/site-packages/smbus.so /usr/share/doc/i2c-tools-python-3.1.0 /usr/share/doc/i2c-tools-python-3.1.0/README }}} I/Oテストのため、まずは基板上のLEDをON/OFFしてみる {{{ [root@centos-rpi2 ~]# cat /sys/class/leds/led0/trigger none kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock [mmc0] timer oneshot heartbeat backlight gpio cpu0 cpu1 cpu2 cpu3 default-on input panic [root@centos-rpi2 ~]# cat /sys/class/leds/led1/trigger none kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock mmc0 timer oneshot heartbeat backlight gpio cpu0 cpu1 cpu2 cpu3 default-on [input] panic LED0 は mmc0 になっていて、SDカードの読み書きで点灯 LED1 は input になっているので電源電圧が十分あれば点灯する [root@centos-rpi2 ~]# echo none > /sys/class/leds/led0/trigger [root@centos-rpi2 ~]# echo 1 > /sys/class/leds/led0/brightness [root@centos-rpi2 ~]# echo 0 > /sys/class/leds/led0/brightness これで基板上のLEDが制御できることを確認した。 元に戻すのは [root@centos-rpi2 ~]# echo mmc0 > /sys/class/leds/led0/trigger }}} i2cに関しては https://wiki.centos.org/SpecialInterestGroup/AltArch/Arm32#head-008f0a6296760d4962dc98cb6ead76baa5c3c9de に手順が記載されている。RasPi2, 3 それぞれ違うので手順に従う。 具体的には {{{ /boot/config.txtに2行追加 dtparam=i2c1=on dtparam=i2c_arm=on /etc/modules-load.d/i2c.conf という名前のファイルを作成し、中に i2c-bcm2708 i2c-dev の2行を記載。 }}} その後、再起動 ログイン後に確認 {{{ [root@centos-rpi2 ~]# lsmod | grep i2c i2c_bcm2835 7017 0 i2c_dev 6913 0 i2c_bcm2708 5994 0 }}} {{{ [root@centos-rpi2 ~]# dmesg [ 0.000000] Booting Linux on physical CPU 0xf00 [ 0.000000] Linux version 4.9.13-v7.1.el7 (mockbuild@armv7-02.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) ) #1 SMP Mon Feb 27 10:45:31 UTC 2017 [ 0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c5387d [ 0.000000] CPU: div instructions available: patching division code ..... [ 5.054352] systemd[1]: Reached target Encrypted Volumes. [ 5.067410] systemd[1]: Starting Encrypted Volumes. [ 5.607119] i2c /dev entries driver [ 7.448169] EXT4-fs (mmcblk0p3): re-mounted. Opts: (null) [ 7.605797] systemd-journald[112]: Received request to flush runtime journal from PID 1 [ 7.989178] gpiomem-bcm2835 3f200000.gpiomem: Initialised: Registers at 0x3f200000 ..... }}} devディレクトリを確認 {{{ [root@centos-rpi2 ~]# ls /dev/i2c* /dev/i2c-1 }}} 作成されている。 {{{ [root@centos-rpi2 ~]# i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- }}} まだ何も繋いでいないので、これでO.K. 次にデバイスを接続。秋月の ADT7410 温度センサー。 http://akizukidenshi.com/catalog/g/gM-06675/ 500円はちと高い気もするが、お手軽にできるのはありがたい。 ピン配置は公式ドキュメントをみて https://www.raspberrypi.org/documentation/usage/gpio-plus-and-raspi2/ https://pinout.xyz/ {{{ [root@centos-rpi2 ~]# i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- }}} デバイスをアドレス 0x48 で認識している。O.K. dumpでデータを確認。 {{{ [root@centos-rpi2 ~]# i2cdump -y 1 0x48 No size specified (using byte-data access) 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef 00: 0c 30 80 00 20 00 05 00 49 80 05 cb 00 00 00 00 ?0?. .?.I???.... 10: 00 00 00 00 00 00 00 00 64 00 06 00 00 00 00 00 ........d.?..... 20: 0c 30 80 00 20 00 05 00 49 80 05 cb 00 00 00 00 ?0?. .?.I???.... 30: 00 00 00 00 00 00 00 00 64 00 06 00 00 00 00 00 ........d.?..... 40: 00 00 80 00 20 00 05 00 49 80 05 cb 00 00 00 00 ..?. .?.I???.... 50: 00 00 00 00 00 00 00 00 64 00 06 00 00 00 00 00 ........d.?..... 60: 00 00 80 00 20 00 05 00 49 80 05 cb 00 00 00 00 ..?. .?.I???.... 70: 00 00 00 00 00 00 00 00 64 00 06 00 00 00 00 00 ........d.?..... 80: 00 00 80 00 20 00 05 00 49 80 05 cb 00 00 00 00 ..?. .?.I???.... 90: 00 00 00 00 00 00 00 00 64 00 06 00 00 00 00 00 ........d.?..... a0: 00 00 80 00 20 00 05 00 49 80 05 cb 00 00 00 00 ..?. .?.I???.... b0: 00 00 00 00 00 00 00 00 64 00 06 00 00 00 00 00 ........d.?..... c0: 00 00 80 00 20 00 05 00 49 80 05 cb 00 00 00 00 ..?. .?.I???.... d0: 00 00 00 00 00 00 00 00 64 00 06 00 00 00 00 00 ........d.?..... e0: 00 00 80 00 20 00 05 00 49 80 05 cb 00 00 00 00 ..?. .?.I???.... f0: 00 00 00 00 00 00 00 00 64 00 06 00 00 00 00 00 ........d.?..... }}} 同じデータが繰り返していたりして、ちょっと不穏な動きをしている気がするが.... また、チップ自体は 16bit だが、マニュアル(データシート)をみると The power-on default setting has a 13-bit temperature data value. とある。 センサーを手で触って温度データ値が上下するかどうか確認する {{{ [root@centos-rpi2 ~]# i2cget -y 1 0x48 0x00 w 0x980e [root@centos-rpi2 ~]# i2cget -y 1 0x48 0x00 w 0x800e [root@centos-rpi2 ~]# i2cget -y 1 0x48 0x00 w 0x700e [root@centos-rpi2 ~]# i2cget -y 1 0x48 0x00 w 0x580e [root@centos-rpi2 ~]# i2cget -y 1 0x48 0x00 w 0x500e [root@centos-rpi2 ~]# i2cget -y 1 0x48 0x00 w 0x400e [root@centos-rpi2 ~]# i2cget -y 1 0x48 0x00 w 0x300e [root@centos-rpi2 ~]# i2cget -y 1 0x48 0x00 w 0x280e }}} 上位・下位を入れ替えれば、それなりの値か?要確認。 == EPICS から制御する == Asyn + drvAsynI2C + stream device という構成が良さそう。 * https://github.com/ffeldbauer/drvAsynI2C * https://github.com/ffeldbauer/epics-devgpio まだ疑問はあるが、protocolファイルで {{{ pi@raspberrypi:~/epics/app/i2cTest1/protocol $ more adt7410.proto Terminator = ""; LockTimeout = 500; ReplyTimeout = 100; ReadTimeout = 100; WriteTimeout = 100; MaxInput = 3; ExtraInput = Error; get { out 0x48; in "%03r"; } }}} としておいて、databaseで {{{ record(mbbiDirect, "ADT7410:GET") { field(DTYP, "stream") field(INP, "@adt7410.proto get() I2C") field(SCAN, ".2 second") } }}} とすれば値は読める。レコード名は example のままにしていた。変えるべき。 Raspbian Jessie with PIXEL で medm 表示すると [[Image(2017-06-14-235209_1824x984_scrot.png, 70%)]]