0

Raspberry PiのGPIOを使う

Raspberry Piの基板上のIC(BC2835)から出ているGPIOを使ってみた。
とりあえず3Vを出してLEDを光らせたり、スイッチをつないでon/offを検出したりした。
がんばればPWMやI2Cもできる。

回路

まずGPIOをオスメスのジャンパワイヤでブレッドボードに引き出す。
23,24番とGNDを引き出してLEDをつないだ。
18番とVCCの間にタクトスイッチを入れて、100Ωのプルダウン抵抗もつけた。

ピン配置は
RPi Low-level peripherals – eLinux.org
に書いてある。


デバイスファイルからGPIOを操作

Raspbianの場合、/sys/class/gpio/以下のデバイスファイルに標準入力するとGPIOが使える。
sudo su
echo 24 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio24/direction
echo 1 > /sys/class/gpio/gpio24/value ## LED点灯
echo 0 > /sys/class/gpio/gpio24/value ## LED消灯
rootじゃないと書き込めないのだが、sudoでpipeの右辺にroot権限を持たせる方法がよくわからなかったので事前にsudo suした。


pi_piper gemを使う

WiringPiが先存在してて有名なようだが、試したら動かなかった(エラーも出ない)のでpi_piperを使う。
WiringPiはC拡張だが、pi_piperはFFIとEventMachineを使ってGPIOを使っている。
・・・のだけど、ソースを読んだ感じたぶんFFIを使っているのはBC2835のI2C機能などを使う部分だけで、単純なdigital read/writeの操作はデバイスファイルごしにFile.openでやっている。
入力ピン状態変化イベントが遅く感じるのも、eventmachine使ってるのにThreadやsleep使ったりしているせいだと思う。ちょっと手を入れるとすごく速くなりそうなのであとでやる。


インストール
sudo gem install pi_piper
ネイティブコードをコンパイルするので少し時間がかかる。


pi_piperでLEDの点滅

GPIO 23,24番を1秒ごとに点灯消灯した。
非常にオブジェクト指向で良いと思う。

blink.rb
require 'pi_piper'

pin_a = PiPiper::Pin.new :pin => 24, :direction => :out
pin_b = PiPiper::Pin.new :pin => 23, :direction => :out

loop do
pin_a.on
pin_b.off
sleep 1
pin_a.off
pin_b.on
sleep 1
end
これも実行にはroot権限が必要
sudo ruby blink.rb


pi_piperでスイッチの押下判定

18番スイッチのon/off変化をイベントで取得した。
require 'pi_piper'

PiPiper.watch :pin => 18 do
puts "#{last_value} -> #{value}"
end

PiPiper.wait

ボタンを押したり離したりする毎にprintされる。

1

Raspberry PiのSDカードをコピーする

Raspberry Piはアプリケーションを動かしている時はスペックに不満は無いんだけど、セットアップに時間がかかる。
CPUが遅いからraspbianをインストールして色々セットアップが済むまで6時間以上はかかる。

そこで、よく使うものをあらかじめインストールしつつ、ssh鍵やhistoryなどは削除したものをイメージファイルにしておくことにした。
イメージファイルになっていれば何枚でも別のSDカードに複製できる。


ここに置いた

http://masuilab.org/~sho/furnicomp/README.md
http://masuilab.org/~sho/furnicomp/raspi/


必要なもの

4GBのSDカード、MacかLinux


SDカードからイメージに書き出し


SDカードのデバイス名をチェック
mount
df

イメージに書き出し
diskutil umountDisk /dev/rdisk1
sudo dd if=/dev/rdisk1 of=20130710-furnipi.dmg bs=1m
diskutil eject /dev/disk1
4GBのdmgファイルができる。
元になるSDカードのサイズでイメージのファイルサイズが決まるので、4GBのSDカードを使うようにしている。


gzに固めるとかなり小さくなる。1GB前後になった
tar -zcvf 20130710-furnipi.tar.gz 20130710-furnipi.dmg


日付を付けて http://masuilab.org/~sho/furnicomp/raspi/ にアップロードした

イメージからSDカードへ書き込む


unzip
tar -zxvf 20130710-furnipi.tar.gz


書き込む
diskutil umountDisk /dev/rdisk1
sudo dd if=20130710-furnipi.dmg of=/dev/rdisk1 bs=1m
diskutil eject /dev/disk1


起動


普通にRaspberry Piにさせば起動できる。
ログインはデフォルトのpi:raspberry

4GB以上のSDカードを使っている場合は、raspi-configでパーティションを拡張すれば全領域が使える。
sudo raspi-config
sudo reboot

0

Raspberry PiにrbenvでRuby2.0.0インストールした

aptのrbenvが0.3.0と古かったので

Ubuntu12.04にrbenvインストールして、crontabやdaemontoolsも設定した

と同じ手順で0.4.0をgitから入れた。
けどビルドに2時間以上かかったので、aptで1.9.3-p194を入れればいいと思う。


crontabや、foremanで書きだしたupstartも

/home/pi/.rbenv/shims/bundle exec ruby hogehoge.rb
で起動したら問題なく動いた。

0

Raspberry Pi/Raspbianでupstartを使う

% sudo apt-get install upstart
でsysvinitが消えてupstartが入り、
一度リブートしたら有効になった。

11

Raspberry Piに喋らせる

Raspberry Piが音声で状況報告してくれると、画面を接続していなくても状況がわかって便利です。
音はUSBスピーカで出した方がいいですね。ヘッドフォン端子からの出力は無音でもブチブチ音が出ててきびしい。

OSはraspbian使ってる。

OpenJTalkをインストールする


Mac/Linuxに日本語を喋らせるに書いたOpenJTalkをセットアップする

sudo apt-get install open-jtalk open-jtalk-mecab-naist-jdic htsengine libhtsengine-dev hts-voice-nitech-jp-atr503-m001

デフォルトの声が怖いのでMMD agentの声を入れる
wget http://downloads.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.3/MMDAgent_Example-1.3.zip
unzip MMDAgent_Example-1.3.zip
sudo cp -R MMDAgent_Example-1.3/Voice/* /usr/share/hts-voice/

OpenJTalkに喋らせるコマンドを作った。適当な場所に置いておく。
jsay はい
で喋る。


スピーカ

USBスピーカ接続するとドライバインストールや設定なしですぐ音がだせる。


音をヘッドフォン端子から出す

R-Pi Troubleshooting – eLinux.orgより
sudo amixer cset numid=3 1
1じゃなく2にするとHDMIから出る。0は自動判別


ヘッドフォン端子の音量調節

sudo apt-get install alsa-utils
amixer set PCM 0%
amixer set PCM 20%
のようにして設定する。
でもプチプチ音がひどい。

ファームウェアアップデート

ファームウェアアップデートしたら音が良くなるらしいのでやってみる
https://github.com/Hexxeh/rpi-update
READMEの通りにやる。
Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS
Performing self-update
sARM/GPU split is now defined in /boot/config.txt using the gpu_mem option!
Updating firmware (this will take a few minutes)
fatal: Failed to resolve 'HEAD' as a valid ref.
動かない。


結論:USBスピーカ買え