読者です 読者をやめる 読者になる 読者になる

hsuetsugu’s diary

ITの技術的なことに関して主に書きます。Rとpythonとd3.jsとAWSとRaspberryPiあたりを不自由なく使いこなせるようになりたいです。

(35連休)12日目:Raspberry Pi(はじめての電子工作①:WEBIOPiでスマートフォンでLEDを点灯させるところまで)

ジャンパワイヤとか、LEDとか少し部品を揃えたので、電子工作を始めました。*1
本日は、定番のLEDを光らせるというのをやってみました。ほんとに初歩的なところから始めて、WEBIOPiでスマホでLEDを制御するところまでいけました。楽しい・・・!
そのうち赤外線モーションセンサとかを接続してみる予定です。

前提と目次

前提

Raspberry Piのセットアップ関連は終わらせている前提です。
今回のを実施する上で前提となるのは下記あたりかな。
http://hsuetsugu.hatenablog.com/entry/2014/08/10/181408
http://hsuetsugu.hatenablog.com/entry/2014/08/11/112032

目次

①LEDをただただ光らせる
②LEDの点灯をRaspberry Piで制御してみる。
 1)コマンドラインでLEDを制御
 2)WiringPiでLEDを制御する
 3)RubyでLEDを制御してみる(プログラムでチカチカさせる)
③PWMでLEDの明るさを制御してみる
スマートフォンでGPIOを制御してみる

※RaspberryPiのGPIOポートのピン配置については下記サイトをご参照ください。
http://www.myu.ac.jp/~xkozima/lab/raspTutorial3.html

①LEDをただただ光らせてみる

下記のように接続して、無事、点灯しました。電源端子はPin1、GNDはPin6で、LEDには極性があるので、長い方(アノード)をプラス側、短い方(カノード)をマイナス側に接続します。
f:id:hsuetsugu:20140827003412j:plain

②LEDの点灯をRaspberry Piで制御してみる。

いろんなやり方でやってみました。

WiringPiのインストール

Raspberry Pi用のGPIOのライブラリであるWiringPiをいれます。これを使うことで、コマンドラインからGPIOを制御できるようになるようです。

$ sudo apt-get install libi2c-dev
$ sudo apt-get install git-core
$ git clone git://git.drogon.net/wiringPi
$ cd wiringPi/
$ ./build
$ gpio -v
gpio version: 2.20
Copyright (c) 2012-2014 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
  Type: Model B, Revision: 2, Memory: 512MB, Maker: Sony 

配線

GPIO4(Pin7)にLEDを接続して、GPIOポートを制御します。
f:id:hsuetsugu:20140827003417j:plain

1)コマンドラインでLEDを制御する

  • piユーザがgpioというグループに属するか確認します。あればpiユーザでGPIO関係のファイルにアクセスできるようです。
$ sudo su
# id -Gn pi
pi adm dialout cdrom sudo audio video plugdev games users netdev input spi gpio
root@raspberrypi:/home/pi
# exit
  • どのGPIOポートを使うのか宣言。これで下記の通りgpio4という仮想ディレクトリができます。
$ echo 4 > /sys/class/gpio/export
$ cd /sys/class/gpio
$ ls
export  gpio4  gpiochip0  unexport
  • 入出力の方向をoutで宣言
$ echo out > /sys/class/gpio/gpio4/direction
  • 点灯させる
$ echo 1 > /sys/class/gpio/gpio4/value
  • 消灯させる
$ echo 0 > /sys/class/gpio/gpio4/value

2)WiringPiでLEDを制御する

  • モードの設定
$ gpio -g mode 4 out
  • 点灯させる
$ gpio -g write 4 1
  • 消灯させる
$ gpio -g write 4 0

3)RubyでLEDを制御してみる

参考URL:Raspberry PiとRubyでLED制御 - Raspberry Pi 電子工作
これをそのままやってみて、無事チカチカしてくれました。

$ cd /home/pi
$ sudo ruby lchika4.rb

lchika4.rb

io = open("/sys/class/gpio/export", "w")
io.write(4)
io.close

dir = open("/sys/class/gpio/gpio4/direction", "w")
dir.write("out")
dir.close

out = 1
10.times do
  v = open("/sys/class/gpio/gpio4/value", "w")
  v.write(out)
  v.close
  out = out == 1 ? 0 : 1
  sleep 0.5
end

uexport = open("/sys/class/gpio/unexport", "w")
uexport.write(4)
uexport.close

③PWMでLEDの明るさを制御してみる

GPIOの出力は0か1か(0Vか3.3Vか)しかないので、明るさを変更することは通常できませんが、PWM(Pulse Width Modulation:パルス幅変調)という仕組みでOnとOffの長さの比率をコントロールすることにより、本当はOn/Offしているだけなのですが、その時間感覚を調整することで人間の目には明るさの違いとして感じられるようになるようです。

配線

PWMに対応したポートはGPIO18なので、LEDをGPIO18(Pin12)に接続します。

明るさを調整してみる。

  • GPIO18をPWM出力モードで宣言する
$ gpio -g mode 18 pwm
  • 明るさを指定する。
$ gpio -g pwm 18 1023
$ gpio -g pwm 18 255
$ gpio -g pwm 18 127

スマートフォンでGPIOを制御してみる

最後に、Raspberry Pi用のGPIO制御フレームワークであるWEBIOPiを使ってLEDを制御してみます。

WEBIOPiをインストール

$ wget http://webiopi.googlecode.com/files/WebIOPi-0.6.0.tar.gz
$ tar xvfz WebIOPi-0.6.0.tar.gz
$ cd WebIOPi-0.6.0/
$ sudo ./setup.sh

WEBIOPiの起動

$ sudo /etc/init.d/webiopi start
  • システム起動時に起動されるように
$ sudo update-rc.d webiopi defaults
  • piユーザでコンテンツがアップロードできるように
$ sudo chown pi -R /usr/share/webiopi/htdocs

ブラウザで確認

WEBIOPiは簡易Webサーバー機能があるらしく、ブラウザからすぐにGPIOの制御ができます。http://raspberrypi.local:8000/とみてみると、下記のような画面がでてきます。
f:id:hsuetsugu:20140827001003p:plain
ここでGPIO Headerをクリックすると、下の画面に遷移し、Raspberry PiのGPIOポートの配置と各ポートの状態が表示されます。GPIO18(Pin12)に接続しているので、この「12」というところをクリックすると出力が0→1→0・・・と変化していき、それにあわせてLEDも点灯・消灯します。
f:id:hsuetsugu:20140827001012p:plain

当たり前ですが、同じネットワークに接続しているスマホからも上記操作ができました。一応、ここまででもスマホでLEDの点灯・消灯を制御できたことになります。

WEBIOPiのAPI

下記にまとまっています。
RESTAPI - webiopi - Internet of Things framework - Google Project Hosting

REST APIなので、Apache/phpで制御する仕組みをやってみようと思いますが、長くなったので今回はここで終わりにします。続きます。

*1:前回のRStanの計算が終わらないという理由もありますが・・。