Raspberry Pi Expansion Board (X100) (2014/01/04)

ラズベリーパイ用の拡張ボードが昨年の年末に出てきたので早速入手して試してみました。

ボードは www.suptronics.com の Raspberry Pi Expansion Board というもので、英アマゾンdealextreeme (dx.com) から入手できます。私は dealextreeme (dx.com) に 12月22日に発注して、元旦に到着しました。送料込みで4000円ほどでした。包装が非常に簡素だったため、ピンが少し曲がった状態でしたが、安く入手できたので良しとしましょう。

10インチのLCDディズプレイモジュールも発注したのですが、液晶が割れた状態で到着したので、もしちゃんと(?) 入手できたら、また紹介したいと思います。

今回入手したもの

写真中央のX100 拡張ボードは右側の Raspberry Pi と全く同じ大きさです。拡張ボードの下に付属品を並べています。 USBハブとして Raspberry Pi のUSBポート1つをセルフパワーのUSBポート3つにするコネクタ、Raspberry Pi の HDMI 出力を拡張ボードの HDMI 入力に接続するためのコネクタ、ネジとスペーサ、リセットスイッチをつなぐ2ピンのコネクタが付属します。



Raspberry Pi Expansion Board (X100)

送られてきた X100 拡張ボードには、何も説明書が入っていませんでした。 www.suptronics.com の説明がすべてのようです。まあコネクタに接続すれば動作すると思われます。リアルタイムクロックについては、これを書いている2014/01/04 現在古いカーネルのバージョン(3.6.11)に対応したドライバしか公開されていません。後半でドライバを使わないでリアルタイムクロックを試してみます。

X100 拡張ボードは、Raspberry Pi とGPIOコネクタとリセットスイッチ用コネクタ、プラスチック製のスペーサ2本で固定します。カメラモジュールのケーブルを通す細長い穴も開いています。



基板の裏側に高精度リアルタイムクロックの NXP PCF2129AT が搭載されています。精度は 100 万分の 3 以内ということで、1 年では最大 95 秒の誤差になります。表にはSDカードスロット、裏側にはマイクロSDのカードスロットがあります。SDカードとマイクロSDカードは同時に使えないそうです。ここのSDカードは 「/dev/sda」 でアクセスできました。



AC アダプター

X100 には 6V - 23V を入力として 5V 3A まで供給できる DC-DC 変換器が付いています。今回用意した電源は、12V の ACアダプタ(3.8A)です。 電源として DC 12V が必要な液晶ディスプレイも接続するつもりなので、2分岐DCケーブル も用意しています。MicroUSB の電源アダプタを使わず、12V のACアダプタからRaspberry Piにも電源を供給します。 ACアダプタが最大 45W なので20ワット程度は余裕ではないかと考えています。 下の写真の最も手前のコネクタがACアダプタのためのものです。外径5.5mm、内径2.1mm の普通のDCプラグ用です。消費電力は下の写真の状態で 7W (ワットチェッカー による実測値) でした。

アナログディスプレイ用のコネクタに液晶ディスプレイを接続しても、ディスプレイの解像度はRaspberry Pi 側で正しく認識出来ました。プロジェクタに接続する場合には便利かもしれません。下の写真では、うっかりACアダプタを接続しないで、MicroUSB側から給電してしまいました。それでも拡張ボードは動作しました。



無線LAN USBアダプタ

Raspberry Pi を 12V の AC アダプタだけを接続する PC として使用することを考えているため、USBポートに無線LANアダプタを接続します。 今回は 150Mbpsの超小型の無線LANアダプタ を用意しました。この無線LANアダプタもUSBポートに挿入するだけで認識します。

 
$ lsusb
Bus 001 Device 004: ID 0411:01a2 BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM Wireless LAN Adapter [Ralink RT8070]


2013-12-20-wheezy-raspbian でリアルタイムクロックを使う

現在最新の 2013-12-20-wheezy-raspbian はLinux カーネルとしてバージョン 3.10.24 が使われています。 現時点では 3.6.10 用のリアルタイムクロックのドライバを含むカーネル (https://www.suptronics.com/downloads/rtc-3.6.11.tar.gz) は公開されていますが、3.10.24用にコンパイルされたドライバは公開されていません(2014/06/27追記 3.12.22+ でドライバモジュールがサポートされました)。 ここでは、I2Cインターフェイスを通して直接チップのレジスタを読み書きして時刻を読み込んでみます。

カーネル

$ uname -a
Linux raspi512 3.10.24+ #614 PREEMPT Thu Dec 19 20:38:42 GMT 2013 armv6l GNU/Linux

カーネルモジュール

組み込まれているカーネルモジュール

$ lsmod
snd_bcm2835            16165  0 
arc4                    1683  2 
rt2800usb              16720  0 
rt2800lib              67495  1 rt2800usb
crc_ccitt               1529  1 rt2800lib
rt2x00usb              11492  1 rt2800usb
snd_soc_bcm2708_i2s     5474  0 
regmap_mmio             2806  1 snd_soc_bcm2708_i2s
rt2x00lib              44267  3 rt2x00usb,rt2800lib,rt2800usb
snd_soc_core          131268  1 snd_soc_bcm2708_i2s
regmap_spi              1897  1 snd_soc_core
mac80211              315610  3 rt2x00lib,rt2x00usb,rt2800lib
snd_pcm                81593  2 snd_bcm2835,snd_soc_core
snd_page_alloc          5156  1 snd_pcm
regmap_i2c              1645  1 snd_soc_core
snd_compress            8076  1 snd_soc_core
snd_seq                53769  0 
snd_timer              20133  2 snd_pcm,snd_seq
cfg80211              209273  2 mac80211,rt2x00lib
snd_seq_device          6473  1 snd_seq
rfkill                 19138  2 cfg80211
leds_gpio               2059  0 
led_class               3688  2 leds_gpio,rt2x00lib
snd                    61291  7 snd_bcm2835,snd_soc_core,snd_timer,snd_pcm,snd_seq,snd_seq_device,snd_compress

/etc/modules

/etc/modules には起動時にロードするカーネルモジュールが記述されています。

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.

snd-bcm2835

/etc/modprobe.d/raspi-blacklist.conf

/etc/modprobe.d/raspi-blacklist.conf には、ほとんどのユーザは使うことが無いため、起動時にロードしないカーネルモジュールを記載しています。

# blacklist spi and i2c by default (many users don't need them)

blacklist spi-bcm2708
blacklist i2c-bcm2708

モジュールの設定変更

/etc/modules の変更

i2c-bcm2708 と i2c-dev を追加します。i2c-dev を組み込むとデバイスファイル /dev/i2c* ができます。

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.

snd-bcm2835
i2c-bcm2708
i2c-dev

/etc/modprobe.d/raspi-blacklist.conf の変更

i2c-bcm2708 を使うため、「blacklist i2c-bcm2708」 をコメントアウトします。

# blacklist spi and i2c by default (many users don't need them)

blacklist spi-bcm2708
# blacklist i2c-bcm2708

reboot して確認 (Expansion Board 無し)

カーネルモジュールの確認

i2c_dev と i2c_bcm2708 が確認できます。

$ lsmod
Module                  Size  Used by
i2c_dev                 5557  0 
snd_bcm2835            16165  0 
arc4                    1683  2 
rt2800usb              16720  0 
snd_soc_bcm2708_i2s     5474  0 
regmap_mmio             2806  1 snd_soc_bcm2708_i2s
rt2800lib              67495  1 rt2800usb
crc_ccitt               1529  1 rt2800lib
rt2x00usb              11492  1 rt2800usb
rt2x00lib              44267  3 rt2x00usb,rt2800lib,rt2800usb
snd_soc_core          131268  1 snd_soc_bcm2708_i2s
regmap_spi              1897  1 snd_soc_core
snd_pcm                81593  2 snd_bcm2835,snd_soc_core
snd_page_alloc          5156  1 snd_pcm
regmap_i2c              1645  1 snd_soc_core
mac80211              315610  3 rt2x00lib,rt2x00usb,rt2800lib
snd_compress            8076  1 snd_soc_core
snd_seq                53769  0 
snd_timer              20133  2 snd_pcm,snd_seq
snd_seq_device          6473  1 snd_seq
cfg80211              209273  2 mac80211,rt2x00lib
rfkill                 19138  2 cfg80211
leds_gpio               2059  0 
led_class               3688  2 leds_gpio,rt2x00lib
snd                    61291  7 snd_bcm2835,snd_soc_core,snd_timer,snd_pcm,snd_seq,snd_seq_device,snd_compress
i2c_bcm2708             3949  0 

i2c-tools のインストール

i2c-tools がインストールされていないことを確認

$ dpkg -l |grep i2c

i2c-tools のパッケージを確認

$ apt-cache search i2c-tools
i2c-tools - heterogeneous set of I2C tools for Linux
pypy-smbus-cffi - This Python module allows SMBus access through the I2C /dev

i2c-tools のインストール

$ sudo apt-get install i2c-tools
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  icelib libblas3gf liblapack3gf
Use 'apt-get autoremove' to remove them.
Suggested packages:
  libi2c-dev python-smbus
The following NEW packages will be installed:
  i2c-tools
0 upgraded, 1 newly installed, 0 to remove and 8 not upgraded.
Need to get 59.5 kB of archives.
After this operation, 223 kB of additional disk space will be used.
Get:1 https://mirrordirector.raspbian.org/raspbian/ wheezy/main i2c-tools armhf 3.1.0-2 [59.5 kB]
Fetched 59.5 kB in 1s (32.0 kB/s)
Selecting previously unselected package i2c-tools.
(Reading database ... 62660 files and directories currently installed.)
Unpacking i2c-tools (from .../i2c-tools_3.1.0-2_armhf.deb) ...
Processing triggers for man-db ...
Setting up i2c-tools (3.1.0-2) ...
/run/udev or .udevdb or .udev presence implies active udev.  Aborting MAKEDEV invocation.

インストールされたコマンド

$ ls -l /usr/sbin/i2c*
-rwxr-xr-x 1 root root 14912 Jul 27  2012 /usr/sbin/i2cdetect
-rwxr-xr-x 1 root root 19328 Jul 27  2012 /usr/sbin/i2cdump
-rwxr-xr-x 1 root root 14444 Jul 27  2012 /usr/sbin/i2cget
-rwxr-xr-x 1 root root 18268 Jul 27  2012 /usr/sbin/i2cset

デバイスファイルの確認

$ ls -l /dev/i2c*
crw-rw---T 1 root i2c 89, 0 Jan  3 17:24 /dev/i2c-0
crw-rw---T 1 root i2c 89, 1 Jan  3 17:24 /dev/i2c-1

i2c バスのスキャン

Raspberry Pi単体では、何も接続していないのでどちらのバスも何も検出されません。

$ i2cdetect -l
i2c-0   unknown     bcm2708_i2c.0                       N/A
i2c-1   unknown     bcm2708_i2c.1                       N/A

$ sudo i2cdetect 0
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-0.
I will probe address range 0x03-0x77.
Continue? [Y/n] y
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         

$ sudo i2cdetect 1
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x03-0x77.
Continue? [Y/n] y
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         

reboot して確認 (Expansion Board 有り)

Raspberry Pi に X100 Expansion Board を接続して再起動します。

カーネルモジュールの確認

i2c_dev と i2c_bcm2708 が確認できます。

$ lsmod
Module                  Size  Used by
i2c_dev                 5557  0 
snd_bcm2835            16165  0 
arc4                    1683  2 
rt2800usb              16720  0 
snd_soc_bcm2708_i2s     5474  0 
regmap_mmio             2806  1 snd_soc_bcm2708_i2s
rt2800lib              67495  1 rt2800usb
crc_ccitt               1529  1 rt2800lib
rt2x00usb              11492  1 rt2800usb
rt2x00lib              44267  3 rt2x00usb,rt2800lib,rt2800usb
snd_soc_core          131268  1 snd_soc_bcm2708_i2s
regmap_spi              1897  1 snd_soc_core
snd_pcm                81593  2 snd_bcm2835,snd_soc_core
snd_page_alloc          5156  1 snd_pcm
regmap_i2c              1645  1 snd_soc_core
mac80211              315610  3 rt2x00lib,rt2x00usb,rt2800lib
snd_compress            8076  1 snd_soc_core
snd_seq                53769  0 
snd_timer              20133  2 snd_pcm,snd_seq
snd_seq_device          6473  1 snd_seq
cfg80211              209273  2 mac80211,rt2x00lib
rfkill                 19138  2 cfg80211
leds_gpio               2059  0 
led_class               3688  2 leds_gpio,rt2x00lib
snd                    61291  7 snd_bcm2835,snd_soc_core,snd_timer,snd_pcm,snd_seq,snd_seq_device,snd_compress
i2c_bcm2708             3949  0 

i2c バスのスキャン

今回は Raspberry Pi に X100 Expansion Board を接続しているため、I2Cバスの 1 番側にデバイスが検出されました。チップアドレスの 0x51 はリアルタイムクロック(PCF2129AT) です。 リアルタイムクロック用のドライバがなくてもデバイスとして認識できます。

$ i2cdetect -l
i2c-0   unknown     bcm2708_i2c.0                       N/A
i2c-1   unknown     bcm2708_i2c.1                       N/A

$ sudo i2cdetect 0
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-0.
I will probe address range 0x03-0x77.
Continue? [Y/n] y
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         
$ sudo i2cdetect 1
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x03-0x77.
Continue? [Y/n] y
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- 51 -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         

i2c-tools で時刻を読む

I2Cバスの 1 番、チップアドレスの 0x51 ということがわかったので、I2Cインターフェイスを通して直接チップのレジスタを読み書きして時刻を読み込んでみました。レジスタ番号 0x03 から 0x09 に年月日時分秒が格納されているので、それを読んで表示するスクリプトです。 リアルタイムクロックに使われているNXP 2129ATのデータシート(PCF2129AT.pdf)にレジスタの使い方が記載されています。

$ cat getrtc.sh 
#!/bin/sh

Y=`i2cget -y 1 0x51 0x09 b`
M=`i2cget -y 1 0x51 0x08 b`
D=`i2cget -y 1 0x51 0x06 b`
h=`i2cget -y 1 0x51 0x05 b`
m=`i2cget -y 1 0x51 0x04 b`
s=`i2cget -y 1 0x51 0x03 b`
echo "year : $Y"
echo "month: $M"
echo "day  : $D"
echo "hour : $h"
echo "min  : $m"
echo "sec  : $s"

実行

値は BCD 形式で返ります。4ビットで 1 桁を表しているため、16進表記でもそのまま10進数として読めます。 以下の例では2014年01月04日00時03分56秒となります。

$ sudo ./getrtc.sh 
year : 0x14
month: 0x01
day  : 0x04
hour : 0x00
min  : 0x03
sec  : 0x56

時刻の書き換えはデータアドレス(0x03 から 0x09)に対して「i2cset」コマンドで値を書き込めば設定できます。下の例は0時を1時に変更しています。再度読み込むと2014年01月04日01時04分26秒のように変更されていることが確認できます。

$ sudo i2cset -y 1 0x51 0x05 0x01 

jun@raspi512 ~ $ sudo ./getrtc.sh 
year : 0x14
month: 0x01
day  : 0x04
hour : 0x01
min  : 0x04
sec  : 0x26

今日(2014/01/04)現在は、システムクロックとして使えていませんが、そのうち対応されるでしょう。カーネルの3.11以降は、PCF2127/2129用のドライバが標準でLinuxのカーネルのソースに含まれているので、待つことにします。



続く...