Single-board computer: which, why and what for

きっかけ

最近そこそこ資金的余裕が出てきたので、ArduinoやRapberry Pi、mbed...らを買おうかと思い立った。
これらは『開発ボード』だとか『シングルボードコンピュータ』だとか呼ばれているのだけれど、
既に挙げたもの以外にもこの英語版Wikipediaのページにあるように、似たようなものがある。
そこで、どのようなものがあるか、どう違うのか、そもそも開発ボードではどんなことをするものなのか、
できるのか、やりたいのか、を調べたり考えたりしたので、まとめる。

はじめに: マイコン vs フルスペックコンピュータ

調べ始めて知ったのだけれど、世にたくさんある、そして似たようにみえる開発ボードは、大きく分けて2つにわかれる。
  • マイコン
  • フルスペックコンピュータ
前者はArduinoなんかが有名で、後者はRaspberry Piが有名だ。
でも、こいつらはどう違うんだろう?

後者のほうが簡単だ: Linux。それだけ。
Rapberry Pi は、性能は低いがれっきとした「コンピュータ」だ。
こいつはそこそこリッチなCPUとそこそこリッチなメモリを積み、その上にLinux が動いている。

Linuxが動いてるから、「なんでも」できる。もちろんなんでもといっても性能上の制約はあるけど、ふつうのソフトウェア(たとえばC, C++ はもちろん、Python, Ruby, PHP, ...)がなんでも動く。
SSHでログインすることもできるし、ふつうのデバイスをつかうことだってできる。例えば、USB無線LANアダプタなど。

いっぽう、前者はちょっと厄介だ。
マイコンは、マイクロコントローラの略で、こいつみたいな感じの小さな制御用のチップだ。
単なる制御用コントローラでしかないから、いわゆる「ふつうのコンピュータ」に求めることができるわけじゃない。

Arduinoは、Atmel AVRのマイコンをのせている。
自分のコンピュータのうえで、付属の開発環境(Arduino SDK)でC"っぽい"言語でプログラムを書き、コンピュータからUSBを通じてArduinoにプログラムを書き込むと、そいつが動く。

確かに、色々なことができる。でも、OSが動いてるわけじゃないから、同時にひとつのプログラムしか動かせない。
それにもちろん、SSHで外からシェルを開けるわけでもないし、etc...

ざっくりと: 性能比較

ざっくりと性能を見ていこう。
  • Arduino Uno
  • Raspberry Pi (Model B+)
    • CPU: Broadcom BCM2835 700 MHz (ARM)
    • RAM: 512 MB
    • 映像出力: HDMI × 1, コンポジット × 1
    • 音声出力: HDMI (ステレオ), 3.5 mmジャック(ステレオ)
    • I/O: 8ピン
    • 消費電力: 150〜350 mA × 5V (=0.75W〜)
    • 価格: ¥3940 (RSオンライン)
  • BeagleBone (Black)
    • CPU: TI Sitara AM335x 1 GHz
    • RAM: 512 MB
    • 映像出力: Micro-HDMI × 1
    • 音声出力: HDMI (ステレオ)
    • I/O: 65ピン
    • 消費電力: 210〜460 mA × 5V (=1.05W〜)
    • 価格: ¥6500 (秋月電子通商…だか品切れ中のようだ)

ここで、Arduinoがマイコン、Intel Galileo がその互換ボードなのに対し、
Raspberry Pi、BeagleBone Black が フルLinux のボードだ。
すでに述べたように、Arduino はマイコンだから、性能面ではとても低い。
それに対し、Raspberry Pi や BeagleBone はボードひとつのサイズしかないにもかかわらず、とても性能が良いことがみてとれる。

おまけ:

あわせ、比較のために Intel Gallileo を挙げてみた。これは、Arduino Uno 互換の開発ボードだが、CPUと大きいRAMをつんでいて、中ではフルスペックのLinuxが動いている。
ただし、こう聞くと、両方のいいとこどりのように聞こえるけど、I/Oがとても遅いという話がある。

また、電源周りの取り扱いに難があって、電源をいれるときは電源→USBの順に、切るときはUSB→電源の順にはずさないといけない。(最悪、ボートが壊れる)
開発ボードとしては、手軽さも重要だから、これは割と痛いのではなかろうか。

以下のページも参考になる:

なにをする?なにができる?

でも、そもそも開発ボードを買って何をするのだろう。何が出来るのだろう。 というわけで、その点について軽く検討をしてみた。

カードキーを自作しよう

必要なもの:
  • モノを動かす: サーボ
  • カードを読む: FeliCa
たとえば、FeliCaリーダーとサーボを組み合わせて、カードキーシステムを自作してしまうのはどうだろう?
こういう話は前々からあって、
  • libpasori -- FeliCaのカードリーダーの非公式ライブラリ。プログラムからカードリーダーを読み書きすることができるようになる。
  • DIY door-lock system - YouTube -- 上をつかって、サーボを制御するマイコンも組み合わせて、実際に動くシステムを組んだ例。
こんなものがある。以上の例は、2007年(!)だから、かなり昔だ。

では、これをもっと手軽に実現できるだろうか?
まずArduinoから。結論からいうと、(恐らく)できる。
Arduinoには、FeliCaのカードを読むセンサーつき拡張ボードがあって、こいつを使うとFeliCaのカード情報を読むことが出来る。
たとえば、この例では、ArduinoとFeliCaリーダーを組み合わせて、Suicaの残高照会機をつくっている。
実際にこいつで鍵のシステムを作っているところもある(1)、(2)。
DIY door-lock system - YouTube と同じ団体が作っている。

ではRaspberry Piではどうだろう?結論からいうと、こっちもできる。 Raspberry Pi は Linux だ。しかもUSB端子がついてるから、USBのカードリーダーさえ動作すれば、作れる。
同じことを考えるひとはたくさんいるようで、Googleで検索した限りだと、動くようだ。
ただし、鍵システムについてもRaspberry Piのほうが良いかもしれない。
このようなシステムの場合、鍵データを登録しておくデータベースが必要だ。
データベースは、内蔵するにしてもLinux上で扱ったほうが楽だろうし、
もっと言えば、
  • サーバにデータベースおいて、組織内からアクセスすればウェブから登録・削除ができるようにする
  • リモートからコマンドで強制的に鍵を開け閉めする
などを考えた場合には、Raspberry Piのほうが間違いなく良いだろう。

ちなみに、今まではカードの読み込みについて主に話したけれど、実際に鍵を開け閉めするには、モーターを制御できる必要もある。
こういった、モーターをつかって決まった角度きっちり動かすには、サーボを使う。
ロボコンなんかにでてる機体を見たことあるだろうか?こいつらの腕とか脚についている黒くて四角い箱が、サーボだ。
こいつはいい値段がするが、ミニ四駆に入っているような安いモーターと違って、チップからきっちりと制御することができる。角度とか。
サーボの制御だけれど、Raspberry Pi だとこんなツールたちが使えるようだ。

ネットワークから流せるスピーカーを作ろう

必要なもの:
  • 離れた場所に置く: WiFi
  • 音を入れよう/音を出そう : Audio I/O
MacやiPhoneで使えるAirPlayをご存知だろうか。
こいつは、ネットワーク経由でスピーカーに音がだせたり、モニターに出力できたりするやつで……Appleのページを見たほうが早い
こいつのようなことはできるのだろうか?
結論から言おう。Raspberry Pi ならできる。
先ほど「こいつのような」と言ったが、実際は「AirPlayサーバそのもの」がつくれてしまう。
AirPlay は Apple のプロプライエタリな規格なうえ、通信はAESで暗号化されているから、メーカーにのみ供給された専用の鍵がないと互換製品をつくることができない。 ところが、だ。
世の中には脆弱性のある製品から暗号化キーを抜き取った上、プロトコルを解析するやつがいるもので、
軽く上げただけでも20の実装がある。しかも、こいつらの多くはオープンソースだ。
で、繰り返すけど、Raspberry Pi はLinuxだ。だから、こいつらを動かすのはたやすい。
実際、
こんなふうにすぐ作れる。別途チップを買ってきたりする必要すらない(!)
ただし:「You may notice some glitchy noise. This is due to the analog output, which is not a real DAC, but a simple PWM generator. 」
音に期待はできなそう…でも、Linuxだから、USBサウンドカードを挿せば簡単に解決するらしいことも書かれている。

では Arduino は?
不明だ。少なくともGoogleで検索した限りでは。
不明だけれど、まともなネットワークプログラミングをやろうとしたら、スレッドが必要だ。
マイコンでどこまで頑張れるのだろう?
もうひとつ。
ここまでは音を出すはなしだったが、オーディオサーバーだと設置場所が天井や棚の上など、高い位置になることもあるだろう。
こんなとき、ケーブルを這わせるのは微妙。
Raspberry Piは、Linuxだから、USBの無線LANアダプターを使うことができる。
ただし、こういったケースでは、アダプタの消費電力を考えて、電源つきのハブを使うことを考えておこう。

センサーでデータを収集しよう

  • センサーでデータを収集しよう
これは、できるかできないかで言ったら、ArduinoもRaspberry Piもできるに決まっている。これができなかったらどうしろというのだ。 だから、むしろどうやるか、どんな例があるかをざっくりと検索してみる。
色々できるだけでなく、それがPythonだのRubyだのをつかって簡単にできるのも、すごく良さそうだ。

結論

マイコンに馴染みがあるか、低消費電力でなければダメだ!という場合、もしくはI2C経由でのI/Oでは困る、という場合でもなければ、
Raspberry Pi Model B+を使ったほうが「色々」「簡単に」できて楽だろう。
BeagleBone Black のI/Oポートの多さは魅力的だが、いかんせん値段が高いのが気になる。
また、消費電力が大きいのも、この手の「モノと組み合わせて使える」ボードとしては気になるところ。