RaspberryPi3上のLXCコンテナからRaspberryPi3本体のI2Cにアクセスする


# やりたいこと
[RaspberryPi3にLXC/LXDを使ってコンテナ環境を作り](https://qiita.com/hatayan1126/items/79d9ba7f3dd1d3803f49)、その中のコンテナからRaspberryPi3本体にI2Cで接続された温度・湿度・気圧センサー(BME280)のデータを取得する。

# 環境
- Raspberry Pi 3 MODEL B
- Raspbian 9.4(stretch)

```shell-session
pi@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 9.4 (stretch)
Release:        9.4
Codename:       stretch
pi@raspberrypi:~ $
```


# やったこと

## RaspberryPi3本体でI2Cにアクセス

RaspberryPi3本体にI2Cのデバイスファイルがあることを確認

```shell-session
pi@raspberrypi:~ $
pi@raspberrypi:~ $ ls -l /dev/i2c-1
crw-rw---- 1 root i2c 89, 1  5月 29 23:22 /dev/i2c-1
pi@raspberrypi:~ $
```

i2cdetectコマンドやi2cdumpコマンドで値が取れるか確認

```shell-session
pi@raspberrypi:~ $
pi@raspberrypi:~ $ 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: -- -- -- -- -- -- 76 --
pi@raspberrypi:~ $
pi@raspberrypi:~ $ i2cdump -y 1 0x76
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: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
80: 85 50 89 32 82 33 6f 06 f2 6c 53 66 32 00 f1 92    ?P?2?3o??lSf2.??
90: ed d5 d0 0b 2c 23 69 ff f9 ff ac 26 0a d8 bd 10    ????,#i.?.?&????
a0: 00 4b ea 00 00 00 00 00 00 00 00 00 33 00 00 c0    .K?.........3..?
b0: 00 54 00 00 00 00 60 02 00 01 ff ff 1f 71 03 00    .T....`?.?..?q?.
c0: 00 00 27 ff 00 00 00 00 01 00 00 00 00 00 00 00    ..'.....?.......
d0: 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    `...............
e0: 00 6f 01 00 13 03 00 1e ad 41 ff ff ff ff ff ff    .o?.??.??A......
f0: ff 00 01 00 27 a0 00 4a fa 00 82 b5 00 75 40 80    ..?.'?.J?.??.u@?
pi@raspberrypi:~ $
```

## RaspberryPi3のデバイスファイルをコンテナに登録する
```shell-session
pi@raspberrypi:~ $
pi@raspberrypi:~ $ lxc config device add container1 i2c-1 unix-char source=/dev/i2c-1 path=/dev/i2c-1
Device i2c-1 added to container1
pi@raspberrypi:~ $
pi@raspberrypi:~ $ lxc config device show hty-db01
i2c-1:
  path: /dev/i2c-1
  source: /dev/i2c-1
  type: unix-char
pi@raspberrypi:~ $
```

## コンテナ側で確認

コンテナ側で /dev/i2c-1 が生成されているのを確認

```shell-session
pi@raspberrypi:~ $
pi@raspberrypi:~ $ lxc exec container1 /bin/bash
root@container1:~#
root@container1:~# ls -l /dev/i2c-1
crw-rw---- 1 root i2c 89, 1  6月 13 00:28 /dev/i2c-1
root@container1:~#
```

i2cdetectコマンドやi2cdumpコマンドで値が取れるか確認

```shell-session
root@container1:~#
root@container1:~# 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: -- -- -- -- -- -- 76 --
root@container1:~#
root@container1:~# i2cdump -y 1 0x76
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: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
80: 85 50 89 32 82 33 6f 06 f2 6c 53 66 32 00 f1 92    ?P?2?3o??lSf2.??
90: ed d5 d0 0b 2c 23 69 ff f9 ff ac 26 0a d8 bd 10    ????,#i.?.?&????
a0: 00 4b ea 00 00 00 00 00 00 00 00 00 33 00 00 c0    .K?.........3..?
b0: 00 54 00 00 00 00 60 02 00 01 ff ff 1f 71 03 00    .T....`?.?..?q?.
c0: 00 00 27 ff 00 00 00 00 01 00 00 00 00 00 00 00    ..'.....?.......
d0: 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    `...............
e0: 00 6f 01 00 13 03 00 1e ad 41 ff ff ff ff ff ff    .o?.??.??A......
f0: ff 00 01 04 27 a0 00 4a f9 00 82 b1 00 75 39 80    ..??'?.J?.??.u9?
root@container1:~#
root@container1:~# exit
pi@raspberrypi:~ $
```

コンテナ側でもI2Cデバイスの値が取れることが確認できたので、あとは[第39回「ラズベリーパイで温度・湿度・気圧をまとめて取得！AE-BME280でIC2通信」](http://deviceplus.jp/hobby/raspberrypi_entry_039/)を参考にPythonスクリプトで値を取ることができる。

# 感想
LXCコンテナからRaspberryPi3本体のデバイスファイルにアクセスできるなんで知りませんでした・・

# 参考
- [Container configuration](https://github.com/lxc/lxd/blob/master/doc/containers.md)
- [第39回「ラズベリーパイで温度・湿度・気圧をまとめて取得！AE-BME280でIC2通信」](http://deviceplus.jp/hobby/raspberrypi_entry_039/)