部屋の温度がとれていなかった

約半年間Raspberry Piにつないでいるセンサーから部屋の温度や湿度がとれていなかった。年末年始にRaspberry Piのソフトウェア・アップデートをした関係で動かなくなっていたようだ。

sudo i2cdetect -y 1

も動いていなかった。

Optional interfaces (I2C, I2S, SPI) and Device Treeによると3.18 kernelsからハードウェ構成の設定が変わったようで /boot/config.txt に有効にするインタフェースを記述しないといけなくなったようだ。

http://elinux.org/RPiconfigによると

  • Enables I2C on GPIO pins.
    • dtparam=i2c_arm=on
  • Enables I2S audio hardware.
    • dtparam=i2s=on
  • Enables SPI driver.
    • dtparam=spi=on

I2Cを使うので /boot/config.txtdtparam=i2c_arm=on を書き込んで復旧した。

そもそもはデータがとれていない時にアラートを上げるようにしないといけない。モニタリングツールにmuninを使っていて、確か閾値での通知が出来た気がするがちゃんと調べていない。単純にデータが取れなかったらメールアドレスかslackに通知するというバッチを書いたほうが早そうだが。。。

TechShop Tokyoの会員になるかどうか

TechShop内覧会にいってきました | スイッチサイエンスを読んで気になっている。

DIY工房で3Dプリンタを始めいろんな機材を触れる。

入会手数料: 3,000円税別
1日利用: 4,500円税別

ということらしい。それなりの機材が使えたり、スタッフに質問ができそうなので良さそう。六本木も近いし。
http://www.techshop.jp/

4月にオープンらしい。週末は混むと嫌だし、平日の営業時間が気になる。

公式Raspberry Piプロジェクト本

公式Raspberry Piプロジェクト本が https://www.raspberrypi.org/blog/official-raspberry-pi-projects-book/ で紹介されている。英語だけど。

12ポンド(2000円弱)で販売されているようだけど無料のPDFが上記サイトからダウンロードできた。
https://raspberrypi.org/magpi-issues/Projects_Book_v1.pdf

Otherwise, you can grab a copy from the Swag Store, get a copy in our app available for Android and iOS, or grab the free PDF of the whole thing!

普通に全部読めるけど、本当にタダでいいんだよね?と疑心を頂きつつ読んだ。

内容としては

  • Raspberry Piを使った人様の作品の紹介
  • Kanoなど販売されているような製品の紹介、レビュー
  • カメラモジュールなど手に入れられるものを使ったチュートリアル

など、いろいろあって楽しい。チュートリアルが勉強になり、人様の製品は刺激にもなる。

Raspberry Piで部屋の温度1年分とった

部屋で足元が寒くなってきて1年経ったことを思い出した。

約1年前くらいからRaspberry Piに温度・湿度センサーを付けて値をMuninという監視ツールで値をとってグラフにしていた。ようやく1年分のデータが取れた。緑が温度で青が湿度。

室内温度グラフ

4月頃ソフトウェアアップデートのトラブルでRubyのプログラムが動かない時期があってしばらく気が付かなかったのでデータが途切れている。あと最近机を移動した際に数日間、電源がはずれたまま気が付かなったせいで11月中に少し切れている。それ以外はちゃんとデータがとれててRaspberry Pi優秀。

最低が12度、最高が31度。冬の場合は体感的には10度代になってくると足が寒くてやってられなくなり12月下旬くらいから暖房を入れないと活動できなくなる。夏については今年はあまり暑くなかった記憶がある、やる気になれば冷房なしでもいけるかもしれないが作業に支障をきたすので普通にエアコンは使っていた。

湿度に関しては冬は加湿器を入れていて湿度は安定させている。対して夏は冷房をつけると著しく下がってる。一見、冬の方が湿度は保っているものの、この時期の方が朝に喉が痛くなっている気がする。今は室温は18度らしいが夜は結構足が寒い。微妙に体感と合っていない気もするがこんなもんだろうか。

そういえばグラフの閾値で自動でエアコンつけるようなことを考えていたけど、Pebbleからリモートでオンオフできるやつ作ったからモチベーションを失った。

Pibrellaを使ってみた

PibrellaはRaspberry Piのエレクトロニクス学習ボードで、LEDやタクトスイッチやスピーカーなどがついていて、いわゆるLチカ(LEDを点滅)などを試す際に電子工作的な作業を飛ばしてプログラムに集中させてくれるものだと思う。

「ラズベリーパイの調理法」でいろいろ応用法が紹介されている。
http://raspi10.blog.fc2.com/blog-entry-138.html

Raspberry Piで目覚まし時計みたいなことしたいと思って調べている時にスピーカーを持っているということで見つけた。学習ボードだけど目覚ましやアラームに使えないかと思って買ってみた。

Amazonで調達。

セットアップ

http://pibrella.com/#setup

  1. Raspberry Piをシャットダウンする
  2. Pibrellaを接続する
  3. Pibrellaに電源(USB)を接続する

PibrellaはRaspberry Piに収まる程よいサイズなんだけど、電源をPibrellaから供給するようになるのでそのままだとケースが使えなくなる。GPIOケーブル使うか、ケースを修正するかなどが必要。

Pibrella

操作の準備

PythonやScratchから操作できる。今回はPythonライブラリを使う。

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python-pip
sudo pip install pibrella

Lチカ

とりあえずLチカする。

試す時は sudo python -i で対話的にやるのが吉。(GPIOにアクセスするのにroot権限が必要になる。)

赤LEDの点滅。0.2のところ変えると間隔を変えられる。

import pibrella
pibrella.light.red.blink(0.2, 0.2)

止める。

pibrella.light.red.off()

全部点滅

pibrella.light.pulse(0.2)

止める

pibrella.light.off()

終了はquit()をうつ。

音を鳴らす

pibrella.buzzer がある。コード読んだところ以下のようなメソッドがある。

  • buzz(frequency)
  • note(note)
  • success()
  • fail()
  • alarm()
  • stop()

fail()を試す。

pibrella.buzzer.fail()

変な音が鳴る。success() を試す。

pibrella.buzzer.success()

failを逆再生した変な音が鳴る。buzz() を試す。

pibrella.buzzer.buzz(1)

CDが音飛びしたようなカチカチ言う。
止める。

pibrella.buzzer.stop()

alarm()を試す。

pibrella.buzzer.alarm()

警報音のような面白い音が鳴る。
止める。

pibrella.buzzer.stop()

最後にnote()を試す。

pibrella.buzzer.note( 1 )

普通にビープ音的なものが鳴る。
止める。

pibrella.buzzer.stop()

さらにコードを読むとsuccess(),fail(),alarm()note(note) を呼び出し、 note(note)buzz(frequency) を呼び出している。frequencyってブザーの間隔だと思ったらまんま周波数のようだ。

success(),fail(),alarm()はある範囲のnoteをsleepを入れながら変えているだけ。

# Play a single note, mathmatically
# deduced from its index, offset from 440Hz
def note(self,note):
  note = float(note)
  a = pow(2.0, 1.0/12.0)
  f = 440.00 * pow(a,note)
  self.buzz(f)
  return True

肝心の音の大きさだけど、buzzerはパソコンのピープ音と比べても少し小さいのでこれが目覚ましになるかどうかは微妙なところ。何かの通知音としても使えるかもしれないけど、ヘッドフォンをしていたり、騒がしいところだと難しいかもしれない。でも、一応Buttonと組み合わせて実験してみるつもり。

まとめ、Pibrella楽しい

プログラミングの楽しさというのは自分のコードで何かを好きなようにコントロールできるところにあると思うので、こういう単純なものでも意外に楽しかった。Pythonのライブラリがうまくラップしてくれてる。確かに学習や教育用には良さそうだ。

自動ビルドが失敗したら赤LEDをつけるとか、天気が晴れだったら緑LEDをつけるとか、メールが来たらbuzzerを鳴らすとか、アイディア次第ではそのままでも実用的にも使える気がするし、4入力と4出力のポートがあるのでいろいろ応用もできそう。

半田付けに必要なことはRaspberry Piが教えてくれた

タイトルはネタ。釣りではない。Raspberry Piで温度センサーを扱うにあたって今まで逃げていた半田付けに取り組んだ。今まで半田付けが必要なことはひたすら避けていた未経験者。いろいろ調べて以下のようなものをAmazonで購入した。

検索すると白光とgootがメジャーなメーカーどころ。取り立てて理由はないけど白光を選択。

スポンジでこて先を綺麗にするのは古い話で最新のやつは真鍮ワイヤーでクリーニングするらしい。スポンジタイプはもちろん使ったことはないが真鍮ワイヤーで何ら問題はなかった。

巻はんだ、初心者は細い方がいいらしい。ちょっとずつ落とせるからだと思う。

最初下手くそだったので付け過ぎたときに取るものが必要だった。実はスポイトで空気圧で吸い取るタイプを最初買ったのだけどうまく使いこなせずに吸い取り線を買った。こっちは使いこなせた。

目に飛んだらヤバイとか恐怖心を煽られて購入。

半田が机に落ちたらヤバイよと恐怖心を煽られて購入。

なんだかんだで一式揃えると1万円くらいかかってます。

実際の半田付け作業は、電子工作系の本には半田付けのやり方が書いているものの、当て方、離し方、タイミングとスピードがみじんもわからないので動画をいろいろ見ました。動画は見本になってよかった。

最初の一回目は下手くそすぎて回路が動かなかった。原因ははんだこての温度設定をちゃんとしていなくて温度が低すぎて半田をうまく溶かすことができていなかった。

日がたってから再チャレンジした二回目でこての温度をあげたらまるで動画の見本のようにうまくできるようになった。

ちょっとした断線なら治せる気がする。もう半田付けは怖くない。

Raspberry Piに温度センサーを繋いでRubyで取得してみた

なぜかRaspberry Piが3台ある。1台は電子工作用、1台は自鯖置き換え用、もう1台はちょっとしたWebサービス動かす用。どれも並行して進めていてなんかブログ書くタイミング逃している。

そんな中、温度センサーを使ってみる編が進んだの書くことにした。

購入したのは HIH-6130 デジタル温度センサスイッチサイエンスさんで購入した。USBで取る方が簡単かもしれないけど、電子工作してみたかったのでこれにした。

基本的に HIH-6130 湿度センサー を使う の記事を大変参考にさせていただいた。

プロトタイプは同じくスイッチサイエンスさんで購入したAdafruit Raspberryにブレッドボードを乗せてやっていた。

Raspberry Pi

i2c関連のセットアップ

OSはRaspbian。

sudo apt-get install i2c-tools
sudo adduser pi i2c
sudo shutdown -r now
sudo modprobe i2c-bcm2708
sudo modprobe i2c-dev
sudo vi /etc/modules

で以下を追加する

i2c-bcm2708
i2c-dev
sudo vi /etc/modprobe.d/raspi-blacklist.conf 

で i2c-bcm2708 の行をコメントアウト

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

blacklist spi-bcm2708
# blacklist i2c-bcm2708
sudo i2cdetect -y 1
sudo i2cdump -y 1 0x27

でデータが取れればok。

Rubyでi2c

参考: Raspberry Pi View topic – Use I2C with Ruby

この i2c ライブラリを使うことにした。

$ sudo apt-get install ruby1.9.1 ruby1.9.1-dev
$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [arm-linux-eabihf]

ややこしいがruby1.9は1.9系のインストールだけど、たしかこのパッケージに問題があってruby1.9.1が作られたのでAPTのruby1.9.1でインストールされるのは1.9系の現行バージョン1.9.3になる(1.9.1が入るわけではない)。この時点では2.0系のパッケージはなかった。

ちなみにrbenvなどでやるとビルドにすごい時間がかかるそうなのでAPTのパッケージで我慢する。

sudo gem install i2c
#!/usr/bin/env ruby

require 'rubygems'
require 'i2c'

class HIH6130

  def initialize(path, address = 0x27)
    @device = I2C.create(path)
    @address = address
  end

  def fetch_humidity_temperature
    s = @device.read(@address, 0x04)
    hum_h, hum_l, temp_h, temp_l = s.bytes.to_a

    status = (hum_h >> 6) & 0x03
    hum_h = hum_h & 0x3f
    hum = (hum_h << 8) | hum_l
    temp = ((temp_h << 8) | temp_l) / 4

    return status, hum * 6.10e-3, temp * 1.007e-2 - 40.0
  end

end

sensor = HIH6130.new('/dev/i2c-1')

10.times do
  p sensor.fetch_humidity_temperature
  sleep(1)
end

このプログラムはスイッチサイエンスさんのリンクにあったサンプルスケッチをそのまま移植した。

最初、Adafruitの上に置いたブレッドボードで動かしたら33度と出力されて計算間違っているのかな?と思ったら普通にRaspberry Piの熱が伝わっている感じだったので離してみたら5度下がった。部屋の温度計と大体同じになったのでちゃんと動いているっぽい。部屋の温度が高いのはいろんなデバイスが熱風を発しているため。

センサーを離さないといけないと分かったので最終的にどのような形態にするのかも考えなきゃいけないなぁ。

とりあえず次はこれをmuninのプラグインに書きなおして、グラフ化する予定。最終目標は赤外線信号を発信して、自動でエアコンつけたり消したりすること。

Raspbian初期セットアップの備忘録

2台目のRaspberry Piのセットアップの時点ですでに本を読みながらやるのが面倒になったのでまとめることにした。当方OS X。予めraspbian.imgをダウンロードして解凍しておくこと。自分用にカスタマイズした備忘録なのでこれみてわからない人はおとなしく本を買うか、ググること。

RaspbianをSDカードに焼く (OSX での作業)

df -hでSDカードのディスク名をチェック。/dev/diskNsXがディスク名なら/dev/rdiskNがrawディスク名となる。今回使ったimgは2013-05-25-wheezy-raspbian、手元のMacでは /dev/disk2s1 がSDカードになっている。

cd ~/Download
sudo diskutil unmount /dev/disk2s1
sudo dd bs=1m if=2013-05-25-wheezy-raspbian.img of=/dev/rdisk2
sudo diskutil eject /dev/disk2s1

起動+日本locale設定 (Raspberry Pi での作業)

最初の起動時にraspi-configが起動するのでパーティションの拡張(初期イメージのままだと2GBまでしか使えない)と日本locale設定だけする。日本語フォントがないとja_JP.UTF-8で文字化けするのでLocaleの設定はMacからリモートで繋いでからでも良いかもしれない。

  • Expand Filesystem
  • Internationalisation Options > Change Timezone > Asia > Tokyo
  • Internationalisation Options > Change Locale > ja_JP.UTF-8
  • Internationalisation Options > Change Keyboard Layout > Generic 101-key PC > Other > Japanese > Japanese > The default for the keyboard layout > No compose key

パッケージの更新 (Raspberry Pi での作業)

リブート後、Username: pi Password: raspberry でログインしパッケージを更新。

pi@raspberrypi
sudo apt-get update
sudo apt-get upgrade

Vimを使う (Raspberry Pi での作業)

nanoが使いこなせないので /usr/bin/vim.tiny を選択する

pi@raspberrypi
sudo apt-get install vim
sudo update-alternatives --config editor

hostnameの変更 (Raspberry Pi での作業)

hostnameを変更しておく、デフォルトだとraspberrypiなので複数台管理するとややこしくなる。

/etc/hostname で raspberrypi を rpi02 にする。
/etc/hosts で raspberrypi を rpi02 に書き直す。

sudo shutdown -r NOW で再起動しておく。

SSHの設定 (OSX での作業)

ディスプレイ、キーボード、マウスの接続をやめたいのでリモートで操作できるようにする。

自宅では使っている無線LANルータ(NECのAtermシリーズ)にMACアドレスで固定IPを割り当てる機能があるので機器側で静的IPを設定するのではなくルータで固定IPをDHCPで割り当てる方法をとっている。

ifconfigでMACアドレスをチェックし、無線ルータの機能でDHCPの固定IPを割り当てておく。IP覚えなくていいようにOS X側の/etc/hostsで名前を設定する。2台目なのでrpi02とした。

192.168.1.xx    rpi02 raspberry02

sshの公開鍵を送りつける。(ssh-copy-idはHomebrewからインストールできる)

Terminal(OSX)
ssh-copy-id pi@rpi02

sshでRaspberry Piにログインして、sshのrootのログインとパスワード認証を無効にしておく。

ssh pi@rpi02
sudo vi /etc/ssh/sshd_config
/etc/ssh/sshd_config
#PermitRootLogin yes
PermitRootLogin no
#PasswordAuthentication yes
PasswordAuthentication no

ssh再起動

pi@raspberrypi
sudo /etc/init.d/ssh restart

パスワード変更 (OSX からの作業)

2013-05-25-wheezy-raspbianの初期イメージではpi/raspberry, rootはパスワードなしになっているので狙われないように変えておく。出来ればpiユーザ自体を使わないようにするのがいいが、piユーザじゃないとうまくいかないというのを何かで見た気がするので様子見。

pi@raspberrypi
ssh pi@rpi02
passwd
sudo passwd root

Raspberry PiにRaspbian入れてみる

IMG_0007

(シールはメモプリで作った)

Raspberry PiはBeagleBoardと似ていてOSを入れたSDカードをさしてブートできる。OSとしてはDebianベースのRaspbian、FedoraベースのPidoraなどがあるようだ。

Raspberry Pi/Downloadsのところで代用的なOSのイメージがダウンロードできる。RHEL系は企業向きっぽくて遊びの気分にならないのでRaspbianを入れることに。インストール済みのSDカードも売っている模様。

NOOBSというスタート用のツールがあって簡単にOSをセットアップできるようになっているようだ。メリットはSDカードにファイルコピーして起動するだけでセットアップが簡単で安全なところ、デメリットはRaspberry Pi上でイメージを書くためとても時間がかかるということ(Raspbianのimgは2GBほどある)。なのでこの方法は試さずに直接SDカードにRaspbianのimgを書くことにした。

OS Xで直接SDカードにimgを書き込む方法はNOOBSを使うよりも速いという点がメリットでデメリットは少し操作が危険ということ。SDカードのデバイス名とハードディスクのデバイス名がよく似ているので間違ってシステムドライブにimgを書き込むという事故が起きるかもしれない。

とは言え普通にやってみた。df -hでSDカードのディスク名をチェック。/dev/diskNsXがディスク名なら/dev/rdiskNがrawディスク名となる。今回使ったimgは2013-05-25-wheezy-raspbian

cd ~/Download
sudo diskutil unmount /dev/ディスク名
sudo dd bs=1m if=2013-05-25-wheezy-raspbian.img of=/dev/rawディスク名
sudo diskutil eject /dev/ディスク名

ディスク名は間違えないよう注意である。

Raspbianの初期設定は本の内容を参考にした。

最初の正直な感想は思ったより快適ということ。2000円くらいのデバイスなのでもっと遅いかと思っていた。確かにちょっとしたプログラミングならこれで十分なのかもしれない。問題はマウスやキーボード、HDMIケーブルなどの周辺機器の方が高いということだが気にしたら負けや。

ケースは別売りでこれを買いました。

Raspberry Pi衝動買い

Raspberry Pi

というか、先に本を買っていた。

Raspbian “wheezy”を入れられると聞いて衝動買い。

何をつくるか決めていないのに・・・安いからまぁいっかな。

この辺のライブラリを使って遊んでみる予定。
https://github.com/jwhitehorn/pi_piper