2013年12月17日火曜日

Raspberry Pi と PHP で遊ぼう

このエントリはPHP Advent Calendar 2013の17日目の記事です。
前日はDQNEOさんのhello worldの内部的な挙動を追ってみたでした。

こんにちは。 @oasynnoum と申します。
このエントリでは電子工作への足がかりとして、 PHP から Raspberry Pi の GPIO へアクセスする方法をいくつか紹介したいと思います。

Raspberry Pi Type B
左上部に見えるトゲトゲが GPIO ピン


そもそも電子工作ってなに?

早速 Wikipedia の電子工作の項から引用すると、
電子工作(でんしこうさく)とは、大量生産を目的としない電子機器の設計や製作のことである。
とあります。なるほど、確かに私自身がやってることに当てはまりそうです。
電子部品には様々ありますが、私の手元にあるものから以下にその一例を紹介します。


画像中の部品は上段左から抵抗コンデンサスイッチ(タクトスイッチ)LED(発光ダイオード)トランジスタ、次いで下段左から AVR マイコン圧電スピーカーサーボモーターと並んでいます。
こういったものを用いて現実世界に物理的にアプローチするのです。

電子部品は秋月電子通商スイッチサイエンスRSコンポーネンツストロベリーリナックスといったオンラインショップで購入できます。

何ができるの?

Web を検索すればいろいろな人のいろいろな作例を見つけることができます。
電子工作歴の浅い私自身は以下のようなものを一ヶ月半ほど前に工作してみました。


これは扇風機への私の熱い情熱とトランジスタへの誤解が生み出したまさに迷作です。
本来、アドベントカレンダーのネタとしてこのしょぼい回路の説明を試みるつもりでしたが、書き進めるうちに、トランジスタの端子を誤って扱っていることに気づきました。それにも関わらず動くシロモノになっています。ちなみにリモコンの電池消耗が早いです。


Raspberry Pi のセットアップ

Raspberry Pi のセットアップはとても簡単です。
一番簡単なのは SD カードに Raspberry Pi のホームページで紹介されている Linux をコピーする方法です。ソフトウェアのインストールもディストリビューション付属のパッケージマネージャーで簡単に行えます。
今更に書くことは無いように思いますが、Raspberry Pi 環境構築メモでその雰囲気が少しは伝わるかもしれません。


PHP の GPIO へのインタフェース

今回は以下の2つのライブラリを試してみました。

WiringPi-PHP

php-gpio


WiringPi-PHP

WiringPi は GPIO に Arduino 風にアクセスするための C API です。この作者自らがいろいろな言語へのバインディングを開発しています。 WiringPi-PHP もその一つで、 PHP 拡張として C で実装されています。上の私のデモ動画では WiringPi-PHP を用いています。

WiringPi-PHP には PHP スクリプトの example が用意されていないようです。
しかし元の WiringPi には C で書かれた簡潔な example がたくさん用意されていて、 WiringPi-PHP の API もほとんど同じなので、特に困ることはないと思います。

次のコードは上の動画で用いたものです。
wiringpi-php-example.php



php-gpio

php-gpio はいろいろと WiringPi-PHP とは対照的です。
実装は PHP で行われており、オブジェクト指向な API を持っています。 example もたくさん用意されています。
また、 composer でプロジェクトに組み込めるため導入は WiringPi-PHP よりも簡単です。

次のコードは上の WiringPi-PHP の例を php-gpio の API で書きなおしたものです。
php-gpio-example.php


ややこしい点

上の2つのコードでは変数 $pin に制御対象の GPIO ピンの番号が代入されています。
それぞれ 6 と 25 となっていますが、実は物理的には同じピンを指しています。
以下に Raspberry Pi の GPIO ピンの配置とそれぞれのフレームワークでの番号付けの対応を示します。

Raspberry Pi ピンの配置


ピン配置番号(ピン機能名称) php-gpioでの番号 WiringPi-PHPでの番号
11(GPIOピン17) 17 0
12(GPIOピン18) 18 1
13(GPIOピン21) 21 2
15(GPIOピン22) 22 3
16(GPIOピン23) 23 4
18(GPIOピン24) 24 5
22(GPIOピン25) 25 6


じゃいつやるか?

以上、長々と Raspberry Pi での PHP によるスクリプティングについてご紹介させていただきました。

単純に電子工作は楽しいです。
電子工作での Hello, World である LED 点灯を初めて行ったときの感動は、初めて marquee タグで文字を、まさしく、縦横無尽に画面上をスクロールさせた時の感動に匹敵するものでした。
様々な電子部品をつないで、どのように現実世界に作用を及ぼすか試行錯誤する過程は私の場合失敗ばかりですが、やはり楽しいです。


明日は@do_akiさんですね。楽しみにしてます!



0 件のコメント:

コメントを投稿