RaspberryPiのUSB接続を認識する
RaspberryPi で USB デバイスの抜き差しに応じてアプリの起動/終了をしたかったのでその調査メモ。
Linux では USB 制御は udev と言う仕掛けを使うらしい。
/etc/udev/rules.d/ に目的のデバイスの *.rules ファイルを記述すればOK。
rules ファイルは先頭が数字になっているので多分その順番で処理されるものと思われる。
rules の書き方は man udev でマニュアルが見れるが正直分かり辛い。
とりあえずサンプルをググりながら手持ちのJoyStickを認識する設定を書いてみた。
ルールファイル
/etc/udev/rules/10-joystick-test.rules:
ACTION=="add",\ SUBSYSTEMS=="usb", \ ATTRS{idVendor}=="0d9d", \ ATTRS{idProduct}=="3011", \ KERNEL=="js*", \ RUN:="/tmp/test1.sh start", \ OPTIONS+="last_rule" ACTION=="remove",\ SUBSYSTEMS=="usb", \ ENV{ID_VENDOR_ID}=="0d9d", \ ENV{ID_MODEL_ID}=="3011", \ KERNEL=="js*", \ RUN:="/tmp/test1.sh stop", \ OPTIONS+="last_rule"
- 1つの定義は1行で記述する。改行は「\」でエスケープできる。
- 比較演算子が条件、代入演算子が処理と考えれば良い。
- ACTION: "add"が接続、"remove"が切断。
- SUBSYSTEMS: USB の場合は固定。
- ATTRS: udevadm info コマンドで取れる属性値。
- ENV: udevadm monitor コマンドで取れる環境変数値。
- KERNEL: /dev/ 以下の名前と思えば良い。*はワイルドカード。
- RUN: 実行スクリプト
- OPTIONS: 多分無くても良い。サンプルに書いてあったのでそのまま。
- add と remove で ATTRS と ENV の違いが有ることに注意。
udevadm info コマンド
以下のコマンドでデバイスの情報を色々表示してくれる。
$ sudo udevadm info -a -p $(udevadm info -q path -n /dev/input/js0)
但し、2013年6月時点のOSでは表示後ハングアップしてしまう。
Vendor/Productは dmesg でも見れるので無理に使う必要は無い。
udevadm monitor コマンド
起動して置いて USB を抜き差しすると接続ログとデバイス情報が吐き出される。
$ udevadm monitor
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent
UDEV [258008.515110] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1:1.0/input/input18/js0 (input)
ACTION=add
DEVLINKS=/dev/input/by-id/usb-HuiJia_4Axes_16Key_GamePad-joystick /dev/input/by-path/platform-bcm2708_usb-usb-0:1.2.1:1.0-joystick
DEVNAME=/dev/input/js0
DEVPATH=/devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1:1.0/input/input18/js0
ID_BUS=usb
ID_INPUT=1
ID_INPUT_JOYSTICK=1
ID_MODEL=4Axes_16Key_GamePad
ID_MODEL_ENC=4Axes\x2016Key\x20GamePad
ID_MODEL_ID=3011
ID_PATH=platform-bcm2708_usb-usb-0:1.2.1:1.0
ID_PATH_TAG=platform-bcm2708_usb-usb-0_1_2_1_1_0
ID_REVISION=4b24
ID_SERIAL=HuiJia_4Axes_16Key_GamePad
ID_TYPE=hid
ID_USB_DRIVER=usbhid
ID_USB_INTERFACES=:030000:
ID_USB_INTERFACE_NUM=00
ID_VENDOR=HuiJia
ID_VENDOR_ENC=HuiJia\x20
ID_VENDOR_ID=0d9d
MAJOR=13
MINOR=0
SEQNUM=1031
SUBSYSTEM=input
TAGS=:udev-acl:
UDEV_LOG=3
USEC_INITIALIZED=258008048772
実行スクリプト
/tmp/test1.sh:
#!/bin/bash
echo `date` $0 $1 $DEVNAME >> /tmp/test.log
- 環境変数 DEVNAME はデバイス名が入っている。
- その他に設定される環境変数はスクリプト内で env を実行すれば分かる。
実行結果
/tmp/test.log:
Sun Jul 21 18:46:35 JST 2013 /tmp/test1.sh start /dev/input/js0
Sun Jul 21 18:46:38 JST 2013 /tmp/test1.sh stop /dev/input/js0
ちゃんと呼ばれている。
後は JoyStick の操作を読み取って任意の処理を行うスクリプトを起動させれば良い。
RaspberryPiはshutdownボタンとか無いのが以外に不便なのだがこれで実現できる。 -> RaspberryPiでJoypadからコマンド入力
RaspberryPiをDNSにする
前から自宅LAN用のDNSが欲しかったんだけど24時間稼働というハードルが以外に高く 実現できないでいた。
RaspberryPiにちょうど良いのでDNSにしてみた。
デフォルトでは入っていないようなのでインストール。
$ sudo apt-get install bind
しかし、この後困った。/etc/named.conf が無いのだ。
色々ググってやっと分かった。Debian系は /etc/bind/ なのね。
しかも named.conf が幾つかに分割されていて独自のお作法が有る様子...
良く分かんないけど適当にやったら動いたからメモっとく。
/etc/bind/named.conf.options:
acl localnet {
192.168.0.0/24;
127.0.0.1;
};
options {
directory "/var/cache/bind";
allow-query { localnet; };
allow-transfer { none; };
forwarders { 192.168.0.1; }; # 家のルータはNS持ってるので
forward only;
dnssec-validation auto;
auth-nxdomain no; # conform to RFC1035
listen-on-v6 { any; };
};
PS. forwardersが効いていなかったので修正
allow-transfer { localnet; };
dnssec-validation no;
/etc/bind/named.conf.local:
zone "myhome.jp" {
type master;
file "/etc/bind/myhome.jp.zone";
};
zone "0.168.192.in-addr.arpa" {
type master;
file "/etc/bind/myhome.jp.rev";
};
/etc/bind/myhome.jp.zone:
$TTL 86400
@ IN SOA ns.myhome.jp. root.myhome.jp. (
2013063001 ; Serial
3600 ; Refresh
900 ; Retry
604800 ; Expire
86400 ) ; Negative Cache TTL
;
@ IN NS ns.myhome.jp. ; this host
@ IN A 127.0.0.1
@ IN AAAA ::1
ns IN A 192.168.0.7 ; this host
rpi IN A 192.168.0.7 ; this host
router IN A 192.168.0.1 ;
/etc/bind/myhome.jp.rev:
$TTL 86400
@ IN SOA ns.myhome.jp. root.myhome.jp. (
2013063001 ; Serial
3600 ; Refresh
900 ; Retry
604800 ; Expire
3600 ) ; Negative Cache TTL
;
@ IN NS ns.myhome.jp.
7 IN PTR rpi.myhome.jp.
1 IN PTR router.myhome.jp.
で bind 再起動。
$ sudo service bind9 restart
参照側PCでDNSを設定して確認する。
$ sudo vi /etc/resolve.conf
domain myhome.jp
nameserver 192.168.0.7
$ nslookup rpi
Server: 192.168.0.7
Address: 192.168.0.7#53
Name: rpi.myhome.jp
Address: 192.168.0.7
$ nslookup 192.168.0.7
Server: 192.168.0.7
Address: 192.168.0.7#53
7.0.168.192.in-addr.arpa name = rpi.myhome.jp.
問題無さげ。地味に嬉しい。
RaspberryPiのパーティション
とりあずOSを入れただけなのでその他の設定したメモです。
固定IPの設定
DHCPは不便なので固定IPを振ります。
$ sudo vi /etc/network/interfaces #以下の修正を入れる
#iface eth0 inet dhcp
iface eth0 inet static
address 192.168.0.xxx
netmask 255.255.255.0
gateway 192.168.0.1
パーティションの切り直し
img ファイルは2Gの状態なのでSDカードサイズの16Gまで使えるようにします。
単純に最大まで使うだけならば raspi-config コマンドの expand_rootfs から行えます。
しかし、書込回数に上限のあるSDカードで /var
がルートパーティションに有るのは嫌なので手動で
/var 専用のパーティションを切る事にしました。
-> と思ったのですが今時のフラッシュメモリはウェアレベリング機能が入っていて同じセルに書き込まないらしいです。 なので意味無いのですがせっかくなのでパーティション分け方法のメモとして残します。
- ルートパーティションを10Gに拡張
$ sudo fdisk /dev/mmcblk0 Command (m for help): p Device Boot Start End Blocks Id System /dev/mmcblk0p1 8192 122879 57344 c W95 FAT32 (LBA) /dev/mmcblk0p2 122880 XXXXXXX XXXXXXX 83 Linux Command (m for help): d Partition number (1-4): 2 Partition 2 is deleted Command (m for help): n Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): p Partition number (1-4, default 2): 2 First sector (2048-xxxxxxx, default 2048): 122880 ←元と同じStart Last sector, +sectors or +size{K,M,G} (8192-xxxxxxx, default xxxxxxx): +10G Using default value 10485760 Command (m for help): p Device Boot Start End Blocks Id System /dev/mmcblk0p1 8192 122879 57344 c W95 FAT32 (LBA) /dev/mmcblk0p2 122880 21094399 10485760 83 Linux Command (m for help): w $ sudo reboot
- ルートパーテションのファイルシステムを再構築します。
$ sudo resize2fs /dev/mmcblk0p2 $ df Filesystem 1K-blocks Used Available Use% Mounted on rootfs 10321208 1462516 8421024 15% / /dev/root 10321208 1462516 8421024 15% / devtmpfs 216132 0 216132 0% /dev tmpfs 44880 232 44648 1% /run tmpfs 5120 0 5120 0% /run/lock tmpfs 89740 0 89740 0% /run/shm /dev/mmcblk0p1 57288 18960 38328 34% /boot
- 拡張領域に/var用の1Gのパーティションを切ります。
$ sudo fdisk /dev/mmcblk0 Command (m for help): p Device Boot Start End Blocks Id System /dev/mmcblk0p1 8192 122879 57344 c W95 FAT32 (LBA) /dev/mmcblk0p2 122880 21094399 10485760 83 Linux Command (m for help): n Partition type: p primary (2 primary, 0 extended, 2 free) e extended Select (default p): e Partition number (1-4, default 3): Using default value 3 First sector (2048-30881791, default 2048): 21094400 ←End+1 Last sector, +sectors or +size{K,M,G} (21094400-30881791, default 30881791): Using default value 30881791 Command (m for help): p Device Boot Start End Blocks Id System /dev/mmcblk0p1 8192 122879 57344 c W95 FAT32 (LBA) /dev/mmcblk0p2 122880 21094399 10485760 83 Linux /dev/mmcblk0p3 21094400 30881791 4893696 5 Extended Command (m for help): n Partition type: p primary (2 primary, 1 extended, 1 free) l logical (numbered from 5) Select (default p): l Adding logical partition 5 First sector (21096448-30881791, default 21096448): Using default value 21096448 Last sector, +sectors or +size{K,M,G} (21096448-30881791, default 30881791): +1G Command (m for help): p Device Boot Start End Blocks Id System /dev/mmcblk0p1 8192 122879 57344 c W95 FAT32 (LBA) /dev/mmcblk0p2 122880 21094399 10485760 83 Linux /dev/mmcblk0p3 21094400 30881791 4893696 5 Extended /dev/mmcblk0p5 21096448 23193599 1048576 83 Linux Command (m for help): w $ sudo reboot
- 作成したパーティションに現在の /var の内容をコピーして次回からマウントされるようにします。
$ sudo mkfs -t ext4 /dev/mmcblk0p5 $ sudo mount /dev/mmcblk0p5 /mnt $ sudo apt-get install rsync #デフォルトでは入ってませんでした $ sudo rsync -av /var/ /mnt $ sudo vi /etc/fstab #以下の一行追加 /dev/mmcblk0p5 /var ext4 defaults,noatime 0 1 $ sudo reboot
$ df Filesystem 1K-blocks Used Available Use% Mounted on : /dev/mmcblk0p5 1032088 675428 304232 69% /var
拡張領域に余裕を残してあるのはこの /var に書き込め無くなったら
別のパーティションを切って引っ越す作戦です。
RAMディスクを使う作戦も有るのですが
/var 全部はカバーできないしメモリが減るのでこの方法でしばらく試して見ようと思います。
これでやっと落ちついて作業ができます。
RaspberryPiを購入してみた
気になっていたRaspberry-Piを買ってみた。
購入先は正規代理店の RSコンポーネンツ株式会社 から。
ここはアマゾンより安いのでお勧めだが個人の場合、幾つか注意事項がある。
- 個人でも「通常のRSとのお取り引き」を選んでユーザ登録を行う。
- 土日祝日の配送は行わないので配送先に平日受け取れる場所を設定する。
- 支払いは「クレジット」か「代引」とする。
基本的に法人相手の取り引きを行う会社だが例外的に個人でも受け付けていると形。
で発注すると翌日には届いちゃう。
専用ケースも購入したが保管用のケースが付いてくるのでこれに穴空けしても充分な感じ。
その他に買った物。
SDカードは新調したほうが良いと思うがその他は手持ちがあれば不要。
セルフ電源付きのUSBハブはUSB-HDDとか繋げる時には必要になるので無ければ買って置いた方が良いと思います。
インストール
ググれば沢山出て来ますが一応メモります。
以下のサイトからOS(201X-xx-xx-wheezy-raspbian.zip)をDLします。
展開して中の img ファイルをSDカードに書き込みます。
$ sudo dd if=201X-xx-xx-wheezy-raspbian.img of=/dev/XXX bs=10240000
書き込み先のデバイス名はOS依存です。FreeBSDでUSB接続の場合は /dev/da0 とかです。 Windowsの場合は専用ツールが必要だったりします。適当にググってください。
OSを書き込んだSDカードを挿入し電源を繋げれば起動します。
LANケーブルを差して置けば DHCP で sshd が起動するので ssh で接続します。
$ ssh pi@192.168.0.x
Password: raspberry
ログインできればセットアップ終了です。
動画再生
動画プレーヤーが最初からOSに入っているのでYoutubeから落してきたmp4を再生してみます。
$ omxplayer PentaAsibuto.mp4
Full-HD(1920x1080p/30fps) の動画ファイルをモニタの都合で 1280x720p 再生しています。
この時のCPU使用率は15%程度で、コマ落ち等全くありませんでした。
とりあえず準備が整いました。
大変なのはここからですが...
UbuntuでMouse over Active windowの設定
Ubuntu ではマウスクリックでウインドウが一番上に来てアクティブ化する。
Windows から入った人は当り前と感じるかも知れないが昔の X Window ではマウスカーソルが乗っているだけでそのウインドウがアクティブになるのが普通だった。 しかもアクティブ・ウインドウが一番上にはならない。
したがって一部でもウインドウが見えていればそのウインドウに入力ができる。
マウス・オーバー・アクティブ・ウインドウと言うんだけど慣れるとウインドウ間のコピペ 等が非常にやりやすくなる。
言葉では分かりづらいと思うが以下の画面の状態のままコンソールにコマンド入力ができる。 ブラウザからコンソールに複数コピペする場合に一々ブラウザが裏に行かないので非常に楽になる。
で、ubuntu でこの状態にする方法が以外に面倒臭かったので忘れないようにメモ
このサイトの情報を元にUbuntu 13.04でclassic-gnomeモード場合はこうする。
$ gsettings set org.gnome.desktop.wm.preferences focus-mode sloppy
$ gsettings set org.gnome.desktop.wm.preferences auto-raise false
$ gsettings set org.gnome.desktop.wm.preferences raise-on-click false
その他の条件は元ネタサイトを参照してください。
ubuntuの人は一度試してみて下さい。戻れなくなります。
Window7でも一応できる様ですが、多分下のウインドウの操作は出来ないでしょう。
- Win7:すぐに忘れる脳みそのためのメモ