Raspberry Piで電子工作

前回のエントリで紹介した、Getting Started With Raspberry Piにあるサンプルを作ってみた。


Raspberry Pi専用の部品についてはAdafruitが一番充実していて、ここから輸入しないとダメかなと思っていたが、スイッチサイエンスがいくつか取り扱っているようなので、GPIOリボンケーブルほかいくつか買ってみた*1
LEDはスイッチサイエンスで欲しいのが品切れだったので、秋月電子から通販で赤100個パックや3色LED10個パックなどを適当に買った*2
USBカメラは、elinux.orgを見てロジクールのC310にしてみた。


raspberry-pi-python-sample · GitHub


最初に、本の通りシェルとPythonからLEDを光らせてみた。初めてだと、これだけでもうきうきする。PythonのソースはO'Reillyのサイトにもある。



次に、USBカメラからの画像を顔認識して髭を付けてみた。これも本の通り。速度は全然ダメで、1コマ処理するのに数秒かかる。それに、顔認識だけならRaspberry Piを使う理由もない。



で、この二つができれば顔認識したらLEDが光る、つまり顔センサーができる。以下のコードはディスプレイにカメラの画像を表示するバージョン。たったこれだけ*3。表示しないならコードは数行短くて、X Windowも不要*4。こちらのfacesensorNoView.pyを参照のこと。ここまでやると、俄然Raspberry Piを使ってる感じがしてくる。


facesensor.py

from SimpleCV import Camera,Display
from time import sleep
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(25,GPIO.OUT)

myCamera = Camera(prop_set={'width':320,'height':240})
myDisplay = Display(resolution=(320,240))

while not myDisplay.isDone():
  frame = myCamera.getImage()
  faces = frame.findHaarFeatures('face')
  if faces:
    for face in faces:
	  print "Face at: " + str(face.coordinates())
    GPIO.output(25,GPIO.HIGH)
  else:
    print "No faces detected."
    GPIO.output(25,GPIO.LOW)
  frame.save(myDisplay)
  sleep(.1)


印象としては、とても簡単にハードウェアにアクセスできる。JBossなどの特定のプロセスの生死を監視してLEDを光らせる、とかXFDもさほど難しくないだろう。今のところRaspbianでいろいろやろうと思うと速度がイマイチだが、最適化はまだまだみたいだし、改善されていくんだろう。
今回は本に従ってPythonで作ったが、JavaからGPIOを扱うPi4Jライブラリもあるから、今度触ってみたい。


余談:
Raspberry Pi専用として使えるディスプレイ、キーボード、バッテリがないので、Raspberry Piとの接続方法をAdafruitで紹介されていたAT&T Laptop Dock for Motorola ATRIX 4Gを買おうかどうしようか迷っている。海外だと安価に中古が買えるようだけど、日本には正規品が入ってきてないから高いなぁ…。

LOGICOOL ウェブカム HD画質 120万画素 C310

LOGICOOL ウェブカム HD画質 120万画素 C310

*1:Raspberry Pi スキルバッジもちょっと欲しかった。というか任意の絵柄を刺繍のアイロンプリントにしてくれるサービスがあればいいなぁ。

*2:大したことをやってないから壊れないと思っていたけど、Raspberry Piの3.3V端子につながったジャンパピンがちょっとブレッドボード上のLEDの端子に触れてしまったらあっさり焼き切れた。

*3:詳細はGetting Started With Raspberry Pi (Make: Projects)を見てね

*4:Xを起動しないなら速いかと思ったけど、どっちにしろ遅いことには変わらなかった。