Raspberry pi 2でTSL2561を使ってpythonで照度を取得する

シェアする

サバフェス2016の課題をコリコリといじっております。いなばです。

会場でセンサーとしてTSL2561という照度センサーを頂いているので、これを使ったものを作りたいわけですが、ちょっとハマったところもあるので、メモがてらまとめておこうと思います。

TSL2561をラズパイ2につなぐ

まずはこれ。

Fritzing のパーツ画像がないので後で時間のあるときにでも作ってみますが、文字ベースで言うなら、

  • ラズパイの1番からTSL2561の3vo
  • ラズパイの3番からTSL2561のSDA
  • ラズパイの5番からTSL2561のSLC
  • ラズパイの6番からTSL2561のGND

にそれぞれ配線してあげればいいみたいです。

j8header-2b-medium

TSL2561-medium

I2C関係

TSL2561とラズパイ2はI2Cという方法で接続します。I2Cについては、Wikipediaの説明をざっと見てみましたが、要するに複数のセンサーを繋いだりするときに簡単にできるやり方、というくらいの理解で良さそうです。

ラズパイ2でI2Cを使うにはいくつか準備が必要です。

ラズパイ2 本体の設定

「本体」という表現も語弊がありますが、要はラズパイのカーネルで、I2Cを有効にしてあげないと使えません。

色々方法はあるようですが、ここではターミナルで

を実行し、「9 Advanced Options」から「A7 I2C」を選択してやるのが一番簡単そうです。

上記を実行したあと、再起動が必要なので、

します。

再起動後、

してやると、以下のように出力が出ると思います。

細かい出力は違うかもしれませんが、i2c_bcm2708とi2c_devが見えていれば良いようです。

接続と動作の基本的な確認

上記で一応カーネルモジュールが読み込まれたところまでは分かるのですが、やはり念のため通信して確認してみたいところです。

てことで、i2c-toolsというパッケージをインストールし、i2cdetectというコマンドで確認します。

出力はこんな感じになると思います。

こんな感じで、39番が見えていれば良いと思います。

Pythonから照度をとる

2016/3/21追記

一つ書き忘れていました。PythonからI2Cデバイスを使うにあたり、

が必要です。

2016/3/21追記ここまで

ここでちょっとハマりました。後述するように、TSL2561 からデータを取るための実装は複数あるようで、実装によって精度というかクセが異なるようです。

当初は、

温度や湿度のセンサーの他に手軽に扱えるセンサーに照度センサーがあります。単位はルクスで計測できます。今回はAdafruit (

でも紹介されている

rpihacks - Code and config files to go along with the Raspberry Pi Hacks book.

を使ってみたのですが、どうもこちらではなかなかうまく行きませんでした。

上記のスクリプト(に手を加えたもの)で、連続して値を取ることはできるのですが、急激に明るさが変わるとそこからデータが不安定になるようで、例えば動作中に部屋の明かりを消す、であるとか、強い照明を当てる、といった刺激を与えると、その後、同じ明るさの状態に戻しても取得できる照度が異なったりしていました。

で、その辺りについても触れている

を参考にしてみたところ、うまい具合に行きました。

具体例は上記のサイトで公開されているとおりですが、念のためこちらにも手順を貼っておきます。

まず、

Example code to use an Adafruit TSL2561 light sensor with Python on a RaspberryPi

にあるものを使うので、zipファイルをwgetで入手しておきます。

次に、入手したzipファイルを展開します。

展開したディレクトリに移動して実行してみると…

以下のように、quick2wireがない、と怒られます。

ざっと調べてみたところ、quick2wire はI2Cデバイスをラズパイ上のPythonから扱うためのライブラリのようです。

で、さっそくquick2wireをインストールしてみます。

これでOKです。参考にしたサイトでは、quick2wireのインストール時にsetup-toolsというパッケージのインストールが必要だったようですが、2016年3月時点の環境では不要でした。

さて、改めて先ほどのスクリプトを実行してみますが…

今度は別の内容で怒られます。どうやら、/dev/i2c-0 がない、と怒っているようです。

この問題についても、参考にしたサイトに記載されていたので恐れるに足らず、ということで、同じようにシンボリックリンクを張って対応してみます。

3/21追記

上記の方法で作成したシンボリックリンクは、何故か再起動すると消えちゃってました。

なので、/etc/rc.local に上記のコマンドを記述しておいたところうまいこといっているようです。

3/21追記ここまで

さて、三度目の正直ということで、改めて実行してみます。

お、なんかイイ感じに出力されてます。

念のため、上記のスクリプトを連続して呼んでみましたが、出力は安定しています。

この実装が大丈夫そうなことは確認できたので、同梱されているTSL2561.example.pyも試してみます。

出力はこんな感じになります。

先ほどの出力結果と似ていますが、最後にLuxという形で照度らしきデータが数値化されているのがイイ感じです。

今回私が作ろうとしている課題では、明るさのデータを連続して取得できればいいので、TSL2561.example.pyを適当な名前のファイルにコピーしたうえで、以下のように編集してみました。

クラス自体がデバッグ的にいくつか文字列を出力してしまいますが、とりあえずこれは後で対処するとして、出力はこんな感じになります。実行中の環境としては、最初の5秒は部屋の中の普通の灯りで、次の5秒は手でセンサー部分を軽く覆っています。その後、覆っていた手をどけて5秒後に、iPhoneのLEDでセンサー部分を照らしています。

通常時が1500ルクス強、というのは、例えば

皆さん、今日も元気バリバリ「おは用語」〜! 部屋を見渡せば、日常生活やオフィスの...

を参照すると、かなり明るすぎるのですが、私の自室がそんなに明るすぎる気はしていないので、照度センサが明るい方向に取りすぎているような気はします。ですが、今回の私の使い方では、明るさの変化さえ取れればいいので、その観点では、上記の出力は、明るい状態→暗い状態→明るい状態→すごく明るい状態→明るい状態ときちんと数字が推移しており、かなり安定しているように思えます。

ひとまず、ラズパイで明るさを取得する、ということについては、これで良いことにしようと思います。

スポンサーリンク
レクタングル大
レクタングル大

シェアする

フォローする