wiki:epics/raspberrypi/setup_epics_i2c

Version 3 (modified by obina, 2 years ago) (diff)

--

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 という構成が良さそう。

まだ疑問はあるが、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 表示すると

Attachments (1)

Download all attachments as: .zip