• Raspberry Pi
  • 連載コラム第1回
  • 連載コラム第2回
  • 連載コラム第3回
  • 連載コラム第4回
  • 連載コラム第5回
  • 連載コラム第6回
  • 連載コラム第7回
  • 連載コラム第8回
  • 連載コラム第9回
  • 連載コラム第10回

連載コラム
bar

Raspberry Pi
連載コラム 第1回
林 和孝(ビクトリーセブン)
書籍『Raspberry Piで遊ぼう!』絶賛発売中

SiriとRaspberry Piで声で命令するリモコンを実現する

2012年2月に発売され1年で100万台が出荷された35ドルのコンピューター、Raspberry Pi。今も世界中に向けて出荷されています。これから4回にわたって、Raspberry Piの魅力をお伝えしていきたいと思います。

よくSF映画で、声で身の回りの機器を動かすシーンを見かけます。主人公が朝起きて、洗面台に向かい「天気予報」と言えば鏡に天気予報が映し出されたり、「○○に電話」と言えば部屋の空間に相手の顔が映し出されて会話をしたりします。これはまだまだ未来の話、と思われるかもしれませんが、実はもう実現可能なところまできています。

それを実感できるのが、こちらの動画。iPhoneのSiriとRaspberry Piを使って、ガレージのドアや、部屋の照明、エアコンを声でコントロールしています。

iPhoneに向かって「Open garade door」と喋ると、「OK. I am opening your garage door.」と言って、ガレージのドアを開けてくれます。しかしiPhoneにそんな機能はありません。

これはAppleのやiOS搭載されている、Siriという音声認識を利用しています。本来であればAppleのサーバーと通信するものなのですが、 SiriProxyを使ってSiriの音声認識をRaspberry Piに迂回させています。この命令の内容をプログラムで判定し、接続された機器を制御する仕組みです。

SiriProxyの面白いのは、喋った内容が文字として送られてくるところです。音声で制御するシステムを作るには、今までは声を解析するところからはじめなければなりませんでした。しかしこれはiOSのSiriやAppleのシステムがやってくれますので、そういった特殊な技術は必要ありません。プログラムはRubyのプラグインを使うことで簡単に作成することができます。さらにRaspberry PiはGPIOポートの制御が容易に行えますから、GPIOポートに信号を送ってあげれば、Raspberry Piから家の中の機器をコントロールできるというわけです。

iPhoneとRaspberry Piと制御回路を組み合わせれば、SF映画の世界がもうすぐに実現しそうですね。

【著者のブログはこちら(Raspberry Piの話題が中心のブログです)】 http://blog.livedoor.jp/victory7com/

【書籍『Raspberry Piで遊ぼう!』の詳細ページはこちら】 http://www.rutles.net/products/detail.php?product_id=519/


Raspberry Pi
連載コラム 第2回
林 和孝(ビクトリーセブン)
書籍『Raspberry Piで遊ぼう!』絶賛発売中

Raspberry Pi+AirPlayが面白い

iPhoneやiPadにはAirPlayという、映像や音声をワイヤレスで別の機器に送信して再生する機能があります。AirPlayを使えばリビングの大画面テレビに、iPhoneの映像を映し出すことが可能です。そのためにはApple社のApple TVという製品が必要なのですが、XBMCというメディアセンターソフトを使用すると、Apple TVを持っていなくてもAirPlayに対応することができます。

Raspberry Pi用にはRaspbmcというRaspberry Pi版のXBMCがあります。SDメモリカードに書き込むためのイメージファイルが配布されていますから、ダウンロードしてSDメモリカードに書き込んであげれば、あとはRaspberry Piに挿して電源を入れるだけで完成です。初期設定ではAirPlayは有効になっていないので、設定画面でAirPlayを有効にすると、ネットワーク内のiPhone/iPadに自動的に認識されます。

この状態でメディアファイルを再生中にボリューム調整の画面を表示させると、出力先を切り替えるためのアイコンが現れます。ここでXBMC (raspbmc)を選択すれば、Raspberry Piに接続されたテレビの大画面に映し出されます。

正常に画面が出力されないアプリも多々ありますが、余っているSDメモリカードがあるならRaspbmcで試してみるのも面白いでしょう。

Youtubeアプリも対応しています。

iPhoneとRaspberry Piと制御回路を組み合わせれば、SF映画の世界がもうすぐに実現しそうですね。

【著者のブログはこちら(Raspberry Piの話題が中心のブログです)】 http://blog.livedoor.jp/victory7com/

【書籍『Raspberry Piで遊ぼう!』の詳細ページはこちら】 http://www.rutles.net/products/detail.php?product_id=519/


Raspberry Pi
連載コラム 第3回
林 和孝(ビクトリーセブン)
書籍『Raspberry Piで遊ぼう!』絶賛発売中

Raspberry Piに小型液晶ディスプレイを内蔵する

Raspberry PiにはHDMIやコンポジット出力端子があるので、パソコン用のディスプレイやテレビに接続することができます。しかしせっかく手のひらサイズのコンピューターなのですから、ディスプレイも手のひらサイズにすれば、本体と一緒に持ち運んで使うこともできます。

raspicol3-1液晶ディスプレイには様々な種類のものがありますが、Raspberry Piに内蔵させるならコンポジット入力(ビデオ入力)のタイプがおすすめです。理由は、接続するだけで映るからです。映像出力用のプログラムの作成や設定は必要ありません。

本コラムではAdafruitの液晶ディスプレイを使用しました。小型の液晶ディスプレイはネットで購入することができます。サーチエンジンで「液晶ディスプレイ キット NTSC」などと検索すると、似たような商品が見つかると思います。写真では配線がわかりやすいようにケースの外に置いていますが、このサイズであればケースの中に収めることも可能です。

raspicol3-2Raspberry Piのコンポジット端子に直接はんだ付けすれば、ケースの外にケーブルを出さずに映像を映し出すこともできるでしょう。スピーカーを繋げばメディアプレイヤーにもなります。GPIOポートにボタンを付けて、押したボタンに応じてomxplayerコマンドでムービーファイルを再生したり、それを応用すれば、Shell Scriptでクイズゲームのマシンを作ることだって可能です。

ビデオとオーディオが単独で出力できるようなったことで、Raspberry Piの可能性は益々広がりますね。Raspberry Piを入手したら、ぜひいろいろと挑戦してみてください。

iPhoneとRaspberry Piと制御回路を組み合わせれば、SF映画の世界がもうすぐに実現しそうですね。

【著者のブログはこちら(Raspberry Piの話題が中心のブログです)】 http://blog.livedoor.jp/victory7com/

【書籍『Raspberry Piで遊ぼう!』の詳細ページはこちら】 http://www.rutles.net/products/detail.php?product_id=519/


Raspberry Pi
連載コラム 第4回
林 和孝(ビクトリーセブン)
書籍『Raspberry Piで遊ぼう!』絶賛発売中

AjaxでRaspberry PiのGPIO/サーボモーターを制御する

Raspberry Piの基板上にはGPIOポートのピンヘッダがあります。GPIOポートはソフトウェアから簡単に制御することができるため、ネットワーク経由でRaspberry Piに接続された機器を制御するというのは、まさにRaspberry Piの得意とするところです。GPIOポートを制御する方法は数多くありますが、たとえばコマンドラインから行うには以下のようなコマンドで制御できます。

# echo 4 > /sys/class/gpio/export
# echo out > /sys/class/gpio/gpio4/direction
# echo 1 > /sys/class/gpio/gpio4/value
# echo 0 > /sys/class/gpio/gpio4/value
# echo 4 > /sys/class/gpio/unexport

これはGPIO4をOUTモード(出力モード)にして、H(3.3V)とL(0V)を出力する場合の例です。C言語やPythonなどのプログラムを組まなくても、簡単なことならコマンドライン上で行えます。それではコマンドラインではなく、Webブラウザから制御するにはどうしたらいいでしょうか?

Webブラウザから制御するには通常Webサーバーと、GPIOポートの制御するCGIプログラムが必要です。プログラムも1から作らなければなりませんが、WebIOPiを使うととても簡単に、ブラウザからGPIOポートを制御するためのプログラムが作れます。WebIOPiはWebサーバーの機能を内蔵しており、インストールして起動するだけですぐに使えます。WebIOPiは単独でも使用できますが、REST APIに対応しているため、JavaScriptでGPIOポートの制御ができるのが大きな特徴です。AjaxでWebサイトを作ったりしている人にはおなじみの方法ですね。制御方法はとても簡単です。

例)GPIO4のOUTモードに設定
リクエスト先 /GPIO/4/function/out (※POSTで送信)

例)GPIO4にH(3.3V)を出力
リクエスト先 /GPIO/4/value/1 (※POSTで送信)

例)GPIO25の状態を読み込む
リクエスト先 /GPIO/25/value (※GETで送信)

例)GPIO18に接続されたサーボモーターの角度を45°に設定
リクエスト先 /GPIO/18/pulseAngle/45 (※POSTで送信)

以下はサーボモーターと2つのLEDをAjaxで制御する例です。jQueryを使ってWebIOPiのAPIにHTTPリクエストを送信しています。

スマートフォンのブラウザからアクセスすると、サーボモーターを動かすためのボタンとスライダーが現れます。スライダーというのはHTML5で新しく加わった左右/上下に動かせるインターフェースのことで、ここではスライダーの上下に連動してサーボモーターも上下に動くようにしています。

<デモ動画>

C言語やPythonはわからないけどJavaScriptなら得意!という人は、是非チャレンジしてみるとよいでしょう。

iPhoneとRaspberry Piと制御回路を組み合わせれば、SF映画の世界がもうすぐに実現しそうですね。

【著者のブログはこちら(Raspberry Piの話題が中心のブログです)】 http://blog.livedoor.jp/victory7com/

【書籍『Raspberry Piで遊ぼう!』の詳細ページはこちら】 http://www.rutles.net/products/detail.php?product_id=519/


Raspberry Pi
連載コラム 第5回
林 和孝(ビクトリーセブン)
書籍『Raspberry Piで遊ぼう!』好評発売中

Raspberry Pi専用カメラモジュールで遊ぼう part 1

Raspberry Piの基板上にはCSIソケットという、カメラモジュール専用のインターフェースがあります。カメラモジュールが開発中であることは伝えられていましたが、2013年5月中旬にやっと販売が開始され、一般の人でも入手できるようになりました。価格は25ドル程度(約2500円)です。

Raspberry PiではUSB接続のWebカメラも使用することもできますが、Raspberry Pi専用のカメラモジュールは5Mピクセルの画素センサーを搭載しており、2592x1944ピクセルの画像の撮影や、1080p/H264形式で30フレーム/秒の動画を撮影することができます。しかもカメラモジュールの基板は25x24mmと非常に小型なので、ケースに組み込んで使うことも可能です。

<発売を伝える記事raspberrypi.org>
Camera board available for sale!

本コラムでは3回にわたり、カメラモジュールを使って基本的な制止画の撮影から、動画撮影、応用編として”デジカメ”の作成をしていきたいと思います。

まずはカメラモジュールに対応させるため、Raspberry Piのファームウェアを最新のものに更新します。以下の手順はDesignSpark の記事を参考にさせていただきました。

$ sudo apt-get update
$ sudo apt-get upgrade

続いてRaspi-configを起動して、カメラを有効(Enable)に設定します。Raspi-configもバージョンアップされ、今までとは若干構成が変わっているようです。

$ sudo raspi-config

設定が終わったらRaspberry Piを再起動します。これでカメラモジュールが使えるようになりました。まずは制止画を撮影してみましょう。制止画の撮影にはraspistillコマンドを使用します。

$ raspistill -o image.jpg

-oオプションで保存したいファイル名を指定します。このコマンドを実行するとディスプレイに5秒間映像が表示され、この5秒間の最後の時点の内容が保存されます。プレビューの時間を変更したい場合は-tオプションを使います。単位はミリ秒です。(1000=1秒)

$ raspistill -o image.jpg -t 1000

逆にプレビュー不要ですぐに撮影したい場合は-nオプションを使います。ただしある程度プレビュー時間をとらないと、ホワイトバランスが自動調整されないようです。

$ raspistill -o image.jpg -n -t 0

保存したファイルはSFTPなどでPCに転送すれば、普通にPCでも見ることができます。WWWサーバー用のディレクトリに保存してライブカメラを作ったり、shell scriptなどを組み合わせて、画像をメールで送るシステムも簡単に作れそうですね。

•Raspberry Piのカメラモジュールで撮影した画像(縮小しています)

もしRaspberry Piのコンソール上で画像を確認したい場合は、fbi(linux framebuffer imageviewer)で表示することができます。まずはfbiをインストールします。

$ sudo apt-get install fbi

たとえば先ほど撮影したimage.jpgを表示したい場合は、次のコマンドを実行します。fbiでは複数の画像ファイルを指定して、スライドショー表示をすることでもできます。終了するにはESCかqをタイプします。

$ fbi image.jpg -a

もし画像を3秒間だけ表示させて終了したい場合は次のようにします。-tオプションは秒数、-1は1回だけ表示するという意味です。なお-aは自動ズームで、-aを付けないとズームした状態で表示されます。

$ fbi image.jpg -a -t 3 -1

raspistillコマンドにはこのほかにも画質の調整オプションがあったり、タイムラプス機能(一定間隔で撮影する機能)などもありますので、詳しくは引数を付けずにraspistillコマンドを実行して、HELPを見てみるとよいでしょう。

次回のコラムでは動画の撮影について、その次のコラムではGPIOポートにボタンを取り付けてデジカメの作成に挑戦します。


Raspberry Pi
連載コラム 第6回
林 和孝(ビクトリーセブン)
書籍『Raspberry Piで遊ぼう!』好評発売中

Raspberry Pi専用カメラモジュールで遊ぼう part 2

前回のコラム『Raspberry Pi専用カメラモジュールで遊ぼう part 1』では、カメラモジュールで制止画を撮影する方法を説明しましたが、今回は動画について説明していきたいと思います。

カメラモジュールを使用するには、まずはじめにRaspberry Piのファームウェアを最新のものにアップデートする必要があります。セットアップ手順はpart 1(第5回)のコラムをご覧ください。

Raspberry Pi専用のカメラモジュールでは1080p(1920x1080ピクセル)で動画を撮影することができます。Raspberry Piの場合、USB接続のWebカメラでは320x240ピクセルでさえカクカクした動画になってしまうことがありますが、このカメラモジュールを使えば非常に滑らかな動画の撮影が可能になります。

動画の撮影にはraspividコマンドを使用します。-oオプションで保存したいファイル名を指定します。-tオプションは撮影する秒数の指定で、単位はミリ秒です(1000=1秒)。10秒撮影する場合は-t 10000と指定します。

撮影した動画をRaspberry Piに接続したディスプレイで再生するには、omxplayerコマンドで表示させることができます。omxplayerの引数にファイル名を指定するだけでRaspberry Piのディスプレイ上で再生され、1080pの動画であってもとても滑らかに再生できるのが特徴です。

$ raspivid -o video.h264 -t 10000

omxplayerはとても便利です。デスクトップ環境を使用していなくても動画を画面に出力できるので、コマンドラインから容易に動画の再生ができます。特にshell scriptと組み合わせて、自動的に動画を再生するようなシステムを作るときに便利です。

raspividコマンドは標準では1080p(1920x1080ピクセル)で撮影されますが、高解像度なぶん、たった10秒間撮影しただけでも20MBものファイルサイズになってしまいます。解像度を下げればファイルサイズも小さくなりますので、保存する画面サイズを変更したい場合は-w(横)と-h(縦)オプションで変更してみるとよいでしょう。

$ omxplayer video.h264

本コラムでは3回にわたり、カメラモジュールを使って基本的な制止画の撮影から、動画撮影、応用編として”デジカメ”の作成をしていきたいと思います。

まずはカメラモジュールに対応させるため、Raspberry Piのファームウェアを最新のものに更新します。以下の手順はDesignSpark の記事を参考にさせていただきました。

$ omxplayer video.h264
$ raspivid -o video.h264 -t 10000 -w 640 -h 480

-bオプションでビットレートを変更することができます。たとえば10MBits/sにしたい場合は-b 10000000とします。

$ raspivid -o video.h264 -t 10000 -b 10000000

続いてRaspi-configを起動して、カメラを有効(Enable)に設定します。Raspi-configもバージョンアップされ、今までとは若干構成が変わっているようです。

$ sudo raspi-config

raspividコマンドにはこのほかにも画質の調整オプションがあったり、エフェクト機能などもありますので、詳しくは引数を付けずにraspividコマンドを実行してHELPを見てみてください。 またffmpegをインストールすれば、カメラの映像を動画配信サービスにも配信することができます。動画の配信は配信サービスがやってくれますので、何百人が同時にアクセスしてきても視聴することができます。
以下はカメラのH.264形式の映像をFLV形式に変換してUstreamに送信する例です。(RTMP URLとストリームキーはご自身の番組のものに書き換えてください)

#!/bin/sh
RTMP_URL="rtmp://x.xxxxxxxx.fme.ustream.tv/ustreamVideo/xxxxxxxx"
STREAM_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

raspivid -o - -t 99999999 -w 352 -h 288 \
  | avconv -f h264 -i - \
  -b 800k \
  -f flv "$RTMP_URL/$STREAM_KEY flashver=FME/3.0\20(compatible;\20FMSc/1.0)"

次回のコラムではGPIOポートにボタンを取り付けて”デジカメ”の作成に挑戦します。


Raspberry Pi
連載コラム 第7回
林 和孝(ビクトリーセブン)
書籍『Raspberry Piで遊ぼう!』好評発売中

Raspberry PiのGPIOポートに電子機器を接続すれば、ネットワーク経由で様々な機器をコントロールすることができます。ネットワーク経由でコーヒーメーカーのスイッチを入れたり、猫にエサをやる装置などは昔からありましたが、Raspberry Piならより手軽に、実用的なものを作ることができます。

家電製品を制御するにはいくつか方法があります。

  1. コンセントの100Vの電源をON/OFFする
  2. ボタンの配線を引っ張り出す
  3. リモコンの信号を送信する

(1)はソリッドステートリレーなどを使って100Vの電源を制御する方法がありますが、万が一配線がショートした場合は火災の危険もあり、無人の状態で使用することには不安が残ります。
(2)は機器のボタンから配線を引っ張り出してきて、ボタンを押したのと同じ状態を再現する方法ですが、その機器を改造する必要があり、保証が受けられなく恐れがあります。
(3)は赤外線の信号を送信するだけなので改造も必要なく、リモコンが1台増えたようなものです。
【注意】家電製品をリモートコントロールする際は安全面に注意が必要です。たとえば冬場にヒーターをつける場合、もしもカーテンや衣類がヒーターの上に落ちていても普通は気が付きます。しかしその場に居ない場合はその状況がわかりません。特にヒーターなどの電熱機器はリモートコントロールせず、目の届く場所だけで使用してください。

Raspberry Piでリモコンの赤外線の信号を送信するには、赤外線LEDが必要です。通常のLEDは赤や青、白などの目に見える色が光りますが、赤外線LEDは赤外線を出すLEDです。使い方も普通のLEDと変わりありません。今回は赤外線が遠くまで届くようにするため、出力の大きい赤外線LED(IF=100mA)を使用しました。GPIOポートの出力電流では足らないため、トランジスタでLEDを駆動させています。

(※各パーツの値は例です。製作される場合は実際のパーツに合わせて計算してください)

今回はケースの中に収納させるために、ユニバーサル基板を使用しました。赤外線LEDは将来取り付け位置を変更できるように、脱着式になっています。今回はRCAプラグ内に収めました。
このRaspberry Piのケースはアクリルケースのため、RCAプラグ用の穴を開ける加工も容易にできます。

赤外線LEDはコントロールしたい機器の方向に向けなくてはなりません。そこで今回はLANケーブルを接続せずに、WiFiアダプタでネットワークに接続するようにしました。邪魔なLANケーブルがなくなり、電源さえ取れればどこにでも設置することができます。
赤外線でリモコンの信号を送信するためには、どんな信号を送信するのかという情報が必要です。この回路にはPL-IRM-2161-C438という「赤外線リモコン受光モジュール」を使用していて、リモコンから送信した信号を読み取ることができます。つまり、Raspberry Piを学習リモコンにしてしまうということです。

その学習リモコンを実現するのが、LIRC(Linux Infrared Remote Control)というソフトウェアです。インストール方法や使い方については本コラムでは割愛させていただきますが、「Raspberry Pi LIRC」「Raspberry Pi リモコン」などと検索すると、詳しく説明されたページが出てきますので、興味がある方は挑戦してみてください。


リモコンからの信号を読み取り、Raspberry Piに設定すれば、あとはコマンドを実行するだけでその機器のコントロールができるようになります。
テレビの電源を入れる例
$ irsend SEND_ONCE TV power

最後に、これをスマートフォンのブラウザから実行できるようにしましょう。

今回はブラウザ上でボタンが押されたら、上記のコマンドを実行する簡単なプログラムを作成してみました。これでShellにログインしてコマンドを実行しなくても、スマートフォンからコントロールすることができます。ブロードバンドルーターのNATの設定でサーバーを公開するようにすれば、インターネットからRaspberry Piにアクスセスすることもできます。これで猛暑の日も、家に帰る前にエアコンをONしておけば、帰ったときには冷え冷えですね。

いたずらで勝手に電源を入れられないように、パスワードをかけておくのをお忘れなく。


Raspberry Pi
連載コラム 第8回
林 和孝(ビクトリーセブン)
書籍『Raspberry Piで遊ぼう!』絶賛発売中

ボタン長押しでシャットダウンする電源ボタンを作ろう

Raspberry Piには電源ボタンがありません。起動するにはMicro USBの電源コードを挿すだけでよいため、電源ボタンがなくても特に不自由することはありません。しかし電源を切る際、いきなりMicro USBの電源コードを抜くと、SDメモリカードのデータが壊れてしまう可能性があります。そのため電源を切る際は、シャットダウンコマンドを実行しなくてはなりません。

そこで今回は、電源を切るためのボタンを作ってみます。電源ボタンは写真のようにGPIOポートに接続しました。自作PC用のリセットボタンを使ってもかまいません。
ボタン入力はGPIO22を使用し、ボタンが押されたらGPIO22に3.3Vを加えるようにします。

【接続例】
[PIN15] GPIO22 ---- ボタン ---- [PIN17] +3.3V

電源ボタンは軽く触れただけでは作動しないように、5秒以上押し続けないと作動しないようにします。これを制御するプログラムは、以下のシェルスクリプトで行います。

【サンプルスクリプト】shutdown-daemon.sh

#!/bin/sh
GPIO=22     #使用するGPIOポート
PUSHTIME=5  #押す秒数

#初期設定(in=入力モード、low=プルダウン)
echo "$GPIO" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio$GPIO/direction
echo "low" > /sys/class/gpio/gpio$GPIO/direction
#5秒間押されるまで待つ
cnt=0
while [ $cnt -lt $PUSHTIME ] ; do
  data=`cat /sys/class/gpio/gpio$GPIO/value`
  if [ "$data" -eq "1" ] ; then
    cnt=`expr $cnt + 1`
  else
    cnt=0
  fi
  sleep 1
done

#シャットダウンの実行
shutdown -h now

このスクリプトでは、まずはじめにGPIO22を入力ポートとして使用するための初期設定を行います。次にボタンが5秒間押されるまで繰り返すループがあります。ここではGPIO22の状態を読み込んで、ボタンが押されていたらカウンターの値を+1します。1秒待機して再びGPIO22の状態を読み込みます。これを繰り返して5秒になるまで待機しています。もしボタンを途中で離してしまった場合は、カウンターは0に戻ります。5秒以上押した場合はこのループを抜けますので、その下のシャットダウンコマンドが実行されるという仕組みです。

スクリプトを保存したら、実行できるようにパーミッションを設定します。

$ chmod 755 shutdown-daemon.sh

起動時にこのスクリプトが実行されるように、/etc/rc.local に以下の行を追加します。(スクリプトを/home/pi/の下に置いた場合の例です)このファイルの編集はスーパーユーザーで行います。

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

su -c /home/pi/shutdown-daemon.sh &
exit 0

Raspberry Piを再起動すれば、自動的にこのスクリプトがバックグラウンドで走り続けます。最後の & を付け忘れると起動処理がここで止まってしまいますので、& を付け忘れないように気をつけてください。

これで、電源ボタンを押すだけでシャットダウンできるようになりました。ディスプレイやキーボードを接続せずに使用している場合など、本体で電源が切れるようになると便利です。

【著者のブログはこちら(Raspberry Piの話題が中心のブログです)】 http://blog.livedoor.jp/victory7com/

【書籍『Raspberry Piで遊ぼう!』の詳細ページはこちら】 http://www.rutles.net/products/detail.php?product_id=519/


Raspberry Pi
連載コラム 第9回
林 和孝(ビクトリーセブン)
書籍『Raspberry Piで遊ぼう!』絶賛発売中

1-wire温度センサーで部屋の温度を測定しよう

Raspberry PiのGPIOポートには、シリアルポートのほか、I2CやSPIといった電子デバイスと通信するための機能を持ったインターフェースがあります。そのインターフェースに対応したセンサーを取り付ければ、Raspberry Piからセンサーの値を読み取ることができます。

今回実験するのは1-wire接続のデジタル温度センサー DS18B20 です。1-wireとは1本の信号線だけで、低速なデータの送受信と電力供給ができる規格です。バス接続のため複数のデバイスを接続することもできます。
Raspbian OSでは1-wire用のモジュールをロードするだけで1-wireデバイスにも対応し、ファイルを読み書きする感覚で使用できるので、とても簡単です。今回はDS18B20を以下のようにRaspberry Piに接続します。DS18B20の2番ピンDQがデータ用のピンなので、これをGPIO4に接続します。

接続例

まずはじめにRaspberry Piを最新のバージョンにアップデートしておきましょう。

$ sudo apt-get update
$ sudo apt-get upgrade
アップデートが終わったら、1-wireデバイス用のモジュールを起動時に読み込むように設定します。スーパーユーザーで /etc/modules に以下の2行を追加します。
w1-gpio
w1-therm
もし起動後に読み込ませたい場合は、以下のコマンドでもモジュールを読み込ませることができます。
$ sudo modprobe w1-gpio
$ sudo modprobe w1-therm
/etc/modulesの編集が終わったら再起動します。
$ sudo shutdown -r now
これで準備は完了です。温度センサーが認識されるかどうか確認します。まだGPIOポートに接続していない場合は接続してください。認識されると/sys/bus/w1/devices/の中に仮想のディレクトリが作成されます。lsコマンドでみると、28-000…ではじまるフォルダ(シンボリックリンク)が出てきました。
$ ls /sys/bus/w1/devices/
28-000003daaec3 w1_bus_master1
これが接続した温度センサーのデバイスIDです。複数接続している場合は、複数表示されます。デバイスIDは個々のデバイス毎に異なりますので、以下の説明は適宜ご自身の温度センサーのデバイスIDに読み替えてください。 温度センサーの値を取得するには、そのデバイスのフォルダの w1_slave というファイルを読み込みます。
$ cat /sys/bus/w1/devices/28-000003daaec3/w1_slave
8c 01 4b 46 7f ff 04 10 2e : crc=2e YES
8c 01 4b 46 7f ff 04 10 2e t=24750
色々な値が出てきますが、t=の値が温度です。1000倍された値のため、この例の場合は 24.750度 ということになります。このように全くプログラムを使用せず、ファイルを読むだけで簡単に温度センサーの値を読み取ることができました。 最後に簡単なスクリプトを作って、温度だけをわかりやすく表示させるようにしてみたいと思います。以下のサンプルスクリプトではPerlで t= の部分の値を抜き出して、1000で割った値を出力しています。(DEVID=の部分はご自身のデバイスIDにしてください) サンプルプログラム ds18b20.sh
#!/bin/sh
DEVID="28-000003daaec3"

cat /sys/bus/w1/devices/$DEVID/w1_slave \    
| perl -e 'while(<stdin>){ if(/t=([0-9]+)/){print $1/1000,"\n";} }'
パーミッションを設定して実行すれば、温度だけが表示されて見やすくなりました。
$ chmod 755 ds18b20.sh
$ ./ds18b20.sh
24.75

Raspberry Piならこのように簡単にセンサーの値を読み取ることができますので、温度で制御する機械を作ったり、マシン室の温度監視用など、いろいろと便利な使い方ができそうです。測定日時と共にファイルに記録していけば温度ロガーにもなりますね。読み取った値をツイートしたり、Open JTalkを使ってRaspberry Piに喋らせても面白いでしょう。

【著者のブログはこちら(Raspberry Piの話題が中心のブログです)】 http://blog.livedoor.jp/victory7com/

【書籍『Raspberry Piで遊ぼう!』の詳細ページはこちら】 http://www.rutles.net/products/detail.php?product_id=519/


Raspberry Pi
連載コラム 第10回
林 和孝(ビクトリーセブン)
書籍『Raspberry Piで遊ぼう!』絶賛発売中

X'masにRaspberry PiでLEDキャンドルを作ろう

もうすぐクリスマスですね。街のあちらこちらでイルミネーションが輝いていて、自宅でもクリスマスツリーの飾り付けをするという方も多いでしょう。Raspberry Piを持っているのでしたら、Raspberry Piもクリスマスの飾り付けに加えてしまうのはいかがでしょうか?

今回はRaspberry PiでLEDキャンドルを作ってみたいと思います。LEDを単に光らせるだけではなく、炎が揺らめいているように光らせます。

用意するものはおなじみのLチカセットと、ティッシュペーパーです。ティッシュペーパーは小さくちぎっておきます。

ちぎったティッシュペーパーをLEDに巻き付けます。こうすることで光がティッシュペーパーに反射して、指向性の強いLEDの光が柔らかくなります。

次にLEDをキャンドルホルダーで囲います。このキャンドルホルダーはメモ用紙を切って、テープで止めただけものです。

これでハードウェア部分は完成です。続いてソフトウェア部分を準備します。

GPIOポートの出力はデジタルですから、LEDをオンさせるかオフさせるしかできません。このままでは単にLEDが点灯しているだけで、キャンドルらしくありません。しかし目に見えない速さでオンとオフを繰り返すと、目の錯覚で明るくなったり暗くなったように見え、明るさに強弱をつけることができます。このように高速でオンとオフを繰り返す方法をPWMと言います。

今回はWiringPi (https://projects.drogon.net/raspberry-pi/wiringpi/)のSoftware PWM Libraryを使って、LEDの明るさを調整します。コラムでは詳しい説明は割愛させていただきますが、書籍『Raspberry Piで遊ぼう!』では使用例などを解説していますので、興味がある方は見てみてください。まずはWiringPiをインストールします。

$ sudo apt-get install libi2c-dev
$ sudo apt-get install git-core
$ git clone git://git.drogon.net/wiringPi
$ cd wiringPi
$ ./build
次にプログラムを用意します。(yuragi.c)
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>

#define LED_PORT 4        /* GPIO4 */
#define RANGE 100
int main (void) {
    int i, pw;
    float ff = 0.5;
    //初期化
    if(wiringPiSetupGpio() == -1) return 1;
    softPwmCreate (LED_PORT, 0, RANGE);
    while (1) {
        if(ff < 0.5) {
            ff =  ff + 2 * ff * ff;  
        } else {
            ff = ff - 2 * (1 - ff) * (1 - ff);
        }

        if(ff < 0.05) {
            ff = (float) rand() / RAND_MAX / 2;
        }
        if(ff > 0.95) {
            ff = (float) rand() / RAND_MAX / 2 + 0.5;
        }

        pw = ff * RANGE;
        softPwmWrite (LED_PORT, pw);
        delay(80);
    }

    return 0;
}

炎の揺らめきは「1/fゆらぎ」で表現しています。値を変えると揺らめき方も変わってきますので、キャンドルっぽく見えるように値を調整してみるとよいでしょう。このプログラムはC言語なので、実行する前にコンパイルします。

$ cc -o yuragi yuragi.c -lwiringPi
無事コンパイルが終わったら、部屋を暗くしてプログラムを実行してみましょう。
$ sudo ./yuragi

なんとなくキャンドルっぽくなりましたね。赤いLEDなのでちょっと違和感はありますが、オレンジ色のLEDにすればもっとキャンドルっぽくなるでしょう。