ものづくりブログ

ゼロからスタートして何かを作って世に出すまでのことを書くブログです.

Raspberry PiでGPIOの値をTweetする方法

 

こんにちは.

 

これまで仮想ファイルを操作する方法WiringPiを使用する方法などいくつかのGPIOの使用例を解説してきましたが,今回はさらに一歩進んで,GPIOで取得したデータをTwitterに投稿してみたいと思います.

 

使用する回路は以前作ったPIRセンサの回路と同じものです(下図).

 

f:id:daisukekmr:20150128003525p:plain

 

f:id:daisukekmr:20150128003609p:plain

 

手順は以下のとおりです[1].

 

1. ラズパイでTweetするための準備をする

2. シェルスクリプトで自動的にTweetさせてみる

 

シェルスクリプトって何?と思われたと思いますが,追ってご説明します.

 

 

 

1. ラズパイでTweetするための準備をする

 

まずはラズパイからつぶやくためのTwitterのアカウントを作成します.これは普通のTwitterアカウントを作成するだけですので手順は割愛します.すでにお持ちのアカウントを使用されても問題ありません.

 

次に,ラズパイにttytterというアプリケーションをインストールします.これはラズパイ用のTwitterクライアントです.

 

ラズパイにログインしたら以下のコマンドを実行します.

 

sudo apt-get install ttytter

 

完了したら次はアカウントの認証を行います.Twitterに外部アプリケーションから書き込みなどを行う際は,事前に認証を行っておく必要があります.そうでないと好き勝手に他人のアカウントでつぶやいたりできてしまうためです.TwitterではoAuthという技術が採用されています[2].他のサービスでもこのoAuthは採用されていますので,今後も出てくることがあるかもしれません.どのサービスでも同じような手続きで認証を取ることになります.

 

ttytter -ssl

 

以下の文字列が出てきたらEnterキーを押します.

 

Press RETURN/ENTER to continue or CTRL-C NOW! to abort.

 

すると以下のようにURLが表示されますので,そのURLにMacのブラウザからアクセスします.

 

1. Visit, in your browser, ALL ON ONE LINE,

https://api.twitter.com/oauth/...

 

すると以下の様なページが開かれますので,あらかじめ作っておいたTwitterアカウントでログインします.

 

f:id:daisukekmr:20150201004843p:plain

 

ログイン後,PINと呼ばれる数字が出るので,これをメモしておきます.

 

ラズパイの画面で,下記のように聞かれているはずなので,そこにメモしたPINを入力します.

 

5. A PIN will apper. Enter it below.

Enter PIN> 

 

入力後Enterキーを押して下記の文字列が出れば認証成功です.

 

Request from http://api.twitter.com/oauth/access_token ... SUCCEED!

 

準備が完了していればラズパイのコマンドラインからつぶやくことができるはずなので試してみましょう.

 

ttytter -ssl -status="Hello, World."

 

先ほどのアカウントでちゃんとつぶやかれているか見てみましょう.

 

 

 

2. シェルスクリプトで自動的にTweetさせてみる

 

これでラズパイからTweetする準備が整いました.でもこれならMacからつぶやいたほうが楽ですし手っ取り早いです.

 

そこで登場するのがシェルスクリプトです[3].

 

今までコマンドは1行ずつ打ち込んでいましたが,これをまとめて入力してしまうのがシェルスクリプトです.

 

実際に作成してみましょう.

 

nano pirtest.sh

 

#!/bin/sh

#10秒間隔でGPIOの値をつぶやくスクリプト

 

##GPIOポートの設定

LED=4

PIR=25

 

##GPIOの値に応じてつぶやく内容を設定

message1="1"

message2="0"

 

##GPIOのモード設定

gpio -g mode $LED out

gpio -g mode $PIR in

 

##メインの部分

echo "人がいるかいないかをつぶやきます"

while true ; do

 

     ##センサの値を取得

     status=`gpio -g read $PIR`

 

     ##PIRの値が0だった場合

     if [ $status -eq 0 ] ; then

          gpio -g write $LED 0

          echo "ツイートしています..."

          ttytter -ssl -status="$message2 `date +%H:%M`"

          echo "ツイートしました"

     fi

 

     ##PIRの値が1だった場合

     if [ $status -eq 1 ] ; then

          gpio -g write $LED 1

          echo "ツイートしています..."

          ttytter -ssl -status="$message1 `date +%H:%M`"

          echo "ツイートしました"

     fi

 

##10秒待って繰り返す

sleep 10

done

 

 

最初から順に解説していきます.

 

#!/bin/sh

ここはシェルスクリプトを使用するときのきまりのようなものです.おまじないだと思って入力しましょう.

 

#10秒間隔でGPIOの値をつぶやくスクリプト

#で始まる行はコメント扱いなので,人間用の説明文です.

 

##GPIOポートの設定

LED=4

PIR=25

GPIOのポートを設定します.C言語で言うところのdefineのような使い方ですが,defineはシェルスクリプトにはないため、変数を使用しています.

 

##GPIOの値に応じてつぶやく内容を設定

message1="1"

message2="0"

GPIOの値に応じたつぶやき文言を変数に代入しています.これにより、つぶやく内容を変えたくなったときにここだけ変更すればよくなります.

 

##GPIOのモード設定

gpio -g mode $LED out

gpio -g mode $PIR in

このコマンドはGPIO PINの入出力を指定するものでした(以前の記事).シェルスクリプトでは変数の値を読むときは変数の頭に$を付けるため,LEDとPIRの頭に$がついています.ようするにそれぞれ4 PINと25 PINを出力と入力に指定しているのです.

 

##メインの部分

echo "人がいるかいないかをつぶやきます"

echoでコマンドライン上に文字列を表示させることが出来ます.これによりプログラムが今どのような処理をしているかや,どのような状態にあるかをユーザに知らせることが出来ます.

 

while true ; do

whileを使用するとその直後の条件が真である,すなわちtrueである限り,doとdoneの間にある処理を繰り返すことができます.このばあい条件がtrueになってますので,永遠に繰り返し続けることになります.

 

     ##センサの値を取得

     status=`gpio -g read $PIR`

statusという変数に$PIR PINの値を代入しています.このように変数への代入などでコマンドを使用する場合は``でくくる必要がります.Shift + 7で入力する'ではなく,私のキーボードの場合右の方のShift + @で入力することが出来ました.

 

     ##PIRの値が0だった場合

     if [ $status -eq 0 ] ; then

ifはC言語と同じく,直後の条件が真の時,thenとfiの間の命令を実行する機能です.

ここではstatusの値が0の時,です.C言語では等しいことを示す符号は==でしたが,シェルスクリプトでは-eqを使用します.

 

         gpio -g write $LED 0

         echo "ツイートしています..."

          ttytter -ssl -status="$message2 `date +%H:%M`"

          echo "ツイートしました"

   fi

LEDに接続したGPIOの値を0にすることで,LEDを消灯させます.

また,echoで今ラズパイが実行している処理をコマンドラインに表示して,ttyttlerの機能を使ってつぶやいています.その時も$を使用して変数の値を参照しています.message2は"0"でしたね.その後にある`date + %H:%M`は日時を取得するコマンドです.これにより,何月何日の何時何分時点でセンサがどの値だったかがわかるということです.

fiはif文の終わりを表しています.

 

     ##PIRの値が1だった場合

     if [ $status -eq 1 ] ; then

          gpio -g write $LED 1

          echo "ツイートしています..."

          ttytter -ssl -status="$message1 `date +%H:%M`"

          echo "ツイートしました"

     fi

こちらも上のif分と基本は同じですね.変数が変わっているだけです.

 

##10秒待って繰り返す

sleep 10

done

 sleepは指定した秒数何もせずに待つ命令です.これを入れないとラズパイの処理速度の許すかぎり超高速でTweetしてしまうので,多分Twitter側に負荷かけすぎといわれてアクセスを禁止されてしまいます.

doneでwhileの繰り返し処理の範囲の終わりを表します.

 

シェルスクリプトが書けたら,control+Oで保存し,control+Xでnanoを閉じます.

 

次は実際にシェルスクリプトを実行してみます.まずは下記のコマンドで先ほど保存したファイルを実行することを許可します.

 

chmod 755 pirtest.sh

 

そして実行します.

 

./pirtest.sh

 

説明は以上です.実際に実行してみて,ちゃんと動くか試してみましょう.動いたら自分なりに少し改造してみましょう.次回は私の改造例を示したいと思います.

 

 

参考文献

[1]Raspberry Piで遊ぼう! 改訂第3版 〜 モデルB+完全対応

[2]Syncer「Twitter APIで、アプリケーションを登録する方法」(http://syncer.jp/twitter-api-create-application)

[3]シェルスクリプト入門(http://www.k4.dion.ne.jp/~mms/unix/shellscript/index.html)