2015年4月18日

BME280を使ってRaspberry Pi 2から温度/湿度/気圧を取得しようとした

”取得してみた”ではなく、”取得しようとした”という事でまだデータは取れていないのですが(汗)、今日はRaspberry Pi 2にお仕事をさせようと、スイッチサイエンスさんから最近発売された温湿度・気圧センサーモジュール「BME280」を使ってみる事にしました。

前に”Raspberry Piに温度/気圧センサーを取り付ける”で使ったモジュールはBMP085というやつで、これはI2C接続と公開されているプログラムでサクッと温度と気圧が取得でき、現在も実家でモリモリ動いているのですが、今回のBME280では温度と気圧に加えて湿度も取得できるという事で、もうすぐやってくる梅雨の時期とか観測できそうとRaspberry Pi 2で使えるかどうかを調査する事もなく勢いで買ってみた次第です。
チップ自体はBMP085と同じくらい小さいのですが、ジャンパーピンの半田付けは自分でやる必要があり、ちょっと曲がってしまいつつもなんとか半田付け完了。

じゃあ早速I2C接続でデータ取得だ!と思ってスイッチサイエンスさんの使い方ページを見たところ、何やら抵抗が必要になるらしい。。あいにく手元になかったので、夕方急いで千石電商で1/4W抵抗10KΩを2つと追加のジャンパー線を買ってきました。
(でも色の順番を見ると書いてあるのと違う気がする。。)

ブレッドボード上の接続は先のページ(Arduino Unoですが)に従って接続。最初3.3VとGNDを逆にしてしまい、Rasperry Pi 2が落ちる現象に遭遇して冷や汗。テストする習慣を身につけてないと。

気を取り直してI2C接続のコマンドを実行したところ、無事認識とレジスタ値の取得は成功。ただ、使い方ページを見るとレジスタには結果の値が入っているのではなく、基準値?の他に補正値が入っており、それを使って計算する必要があるようです。
# 0x76で認識
$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- 76 --                         

# レジスタ値を全て取得
$ sudo i2cdump -y 1 0x76 b
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
80: 84 70 89 8f 60 05 f0 06 4b 6f 6c 68 32 00 8f 90    ?p??`???Kolh2.??
90: ee d5 d0 0b 14 1c f2 ff f9 ff ac 26 0a d8 bd 10    ???????.?.?&????
a0: 00 4b 3d 00 00 00 00 00 00 00 00 00 33 00 00 c0    .K=.........3..?
b0: 00 54 00 00 00 00 60 02 00 01 ff ff 1f 60 03 00    .T....`?.?..?`?.
c0: 00 00 00 ff 00 00 00 00 00 00 00 00 00 00 00 00    ................
d0: 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    `...............
e0: 00 60 01 00 15 08 00 1e 68 41 ff ff ff ff ff ff    .`?.??.?hA......
f0: ff 00 00 00 00 00 00 80 00 00 80 00 00 80 00 80    .......?..?..?.?
サンプルスケッチや公式のソースを見てみたものの、気軽に移植できそうではなかったので今日はここまで。。有志の方がRasPi対応版ソースを公開される事を信じて待つ事にしたいと思います。

2015年4月13日

Gunosy.go#12に参加してきました


一昨日のFlashAirハッカソンに続き、今日は株式会社グノシーさんで行われたGo言語の勉強会であるGunosy.go#12に参加してきました。

今回のテーマは”GolangNotHttpNight”という事で、httpを使わないGo言語という切り口でさまざまな発表が行われました。
(追ってプレゼン資料とかも公開されるかと思うのでメモ書きで)

gomaについて

  • JavaのDomaにインスパイアされたDBアクセスフレームワーク
  • CRUDするコードを生成(dao/entity/sql)
  • SQLファイルはそのまま使える
  • DB側を正とするため、テーブル定義が変わっても再生性すればOK
  • 別のSQLライブラリと併用して使える
  • go-bindataを使ってバイナリにパッケージ化することも可能
  • xormを使ってテーブル構成情報を取得
  • テンプレートエンジンにはERB風のegoを使用

golintを使おう

  • 17個の関数でファイルごとにチェック
  • lint.goしきい値を設定

go-timeoutもしくはUnixツールをgolangで書く話

  • mackerelエージェントはGo言語製
  • 内部ではメトリクス投稿と収集それぞれのgoroutineを実行
  • チャンネルをキューのように管理
  • エージェントのプラグインはGolangじゃなくてもOK
  • GNU CoreutilsのtimeoutコマンドをGolangで
  • plan9はexit codeが数字じゃない
  • GolangでUnixっぽい事をやろうとすると大変

Golang+RasPiで趣味的IoT入門的な話

  • gobotembdの利用推奨
  • GOARCH=arm go buildしたものがRasPiで動く
  • gobotはMQTTも初期からサポート
  • embdはもう少し低レイヤ
  • 軽量などで個人工作での組み込みには使いやすい

Goでのステート管理の仕方

  • HTTPは基本stateless
  • cookieなどを使って間接的にステート管理
  • FSM(有限状態機械)
  • gotoでどんなFSMも書けるが見通しが悪い
  • tail call elimination(末尾再帰)
  • 関数と同じシンタックスでgotoを書ける
  • 最適化などの影響で実装系に依存
  • goroutineだとスタックを消費しない
  • 複数のFSMが同時に動く状態を自然に書ける
  • Golangでも将来的にはtail call eliminationが改善されるかも?

GoとTOML

  • XMLは人間が書くものじゃない
  • TOML = Advanced INI
  • 人間が読みやすく配列&階層構造が扱える
  • BurntSushi/toml
  • DecodeFile呼び出しで構造体に値がマッピングされる
  • 設定をTOMLにエクスポートすることも可能

Goでゲームを作る

  • cgoを使ってOpenGLを呼べる
  • GCあっても二次元のゲームくらいなら大丈夫
  • gxuiはシンプルなターンベースゲームならいける
  • Ebiten
  • SNESライクな2Dゲームフレームワーク
  • ENGi
  • もう一つの2Dゲームフレームワーク
  • Updateはどういうタイミングで呼ばれるのか分からない
  • 引数のdtを使って時差が分かる

DBじゃないoracleの話

  • Golangは公式や準公式の支援ツールがたくさんある
  • golang.org/x/tools/oracle
  • IDEのようなソースコード解析

GoConについて


この後の懇親会では、みなさんの会話に耳を傾けつつ、Go言語を会社で導入していくための四方山話や最近の開発動向など、刺激のある時間を過ごすことができました。
(+ピザごちそうさまでした!)

個人的にはgobotやembdのIoT回りが意外と充実しているのを知ることができたのが収穫でした。この前のFlashAirハッカソンと合わせて、開発にGo言語を使ってみるきっかけにしていきたいところです。

2015年4月12日

FlashAirハッカソンに参加してきました

昨日になりますが、川崎の東芝スマートコミュニティーセンターで開催されたFlashAirハッカソンに参加してきました。

FlashAirは、Eye-FiのようなSDカードに無線LAN機能が搭載された製品で、一般的にはEye-Fiと同様にカメラで撮影された画像がFlashAirに保存されたら、それを無線LAN経由でネットに送信する、といった事に使われます。

ただ、FlashAirが他の製品と違うところとして、無線LAN機能やSDIOといったハードウェアの機能が開発者にAPIとして公開されており、それらを使ってカメラ以外の用途にも使えるようになっている事です。

個人的にRaspberry Piに始まり、同じSDカードに無線LAN機能を持つFlucard Pro(発熱がすごい)や、SDカードをWiFiで共有(しかも内蔵電池あり)するPQI Air Driveなど、数千円で買えるネットワーク機器に目がなく、今回も3,000円でFlashAir+使い方の説明が聞ける(^o^)と知り、思い切って申し込んだ次第です。

午前中は「ユーザーズミーティング」という事で、東芝さんの技監(響きがかっこいい)の方のご挨拶から、共催のFIXSTARSさんによるFlashAir概要説明、余熱@れすぽんさんのFlashAirプロトタイピング環境のご紹介(MTO-EV101はお値段聞きそびれたorz)、各人に配布されたFlashAirを使ったワークショップが行われた後、同じく共催のMicrosoftさんとMakuakeさんの製品とサービスのご紹介がありました。

ランチ休憩のあと午後は、FlashAirを使ったアイデアを時間内に考える”アイデアソン”で、最初に運営のGUGENさんからオリエンテーリング(共創の原理や諦めた課題などすごく参考になりました)から始まり、自分のアイデアを形にしていくアイデアブラッシュアップ(自分のアイデアを3分間で説明→ブレインライティングシートにアイデアを書いて回覧&肉付け→そのシートをまた別の方に3分間プレゼン→それを経て一番いいアイデアをスケッチブックにまとめる)を経て、最後に皆さんのスケッチブックを見ていいと思ったものに投票を行う形で行われました。

その後投票結果の集計が行われ、上位数名の方のアイデアをピックアップし、残った方は各人のスキルが役立つアイデアにチームとして参加する形で、今度はチーム内でそのアイデアを来週のハッカソンでどう形にしていくかのミーティングが行われました。

そのミーティングが終わった後は、その結果を5分間でプレゼン&質疑応答を行うという流れを行ってその日は終了。午後の部はアイデアソン初体験ということもあり最後までたどたどしかったですが、新しいサービスの生み出し方や熱量はとても新鮮に感じることができました。

#ちなみに会場に折りたたみ傘忘れたのは私ですorz
#勉強会参加するといつも忘れるなぁ。

とりあえず頂いたFlashAirはまだ使えていませんが、今回の経験を刺激にして自分も暇があればなんか使えないかなーと考えてみたいと思います。
(FlashAir版IFTTTとかやりたい。カードが刺さる/抜ける/ネットワークに参加する/SDカードに書き込まれるなどを検知したら指定された動作やWebHookを呼び出すみたいな。まずはそういうイベントが拾えるか調べねば。。)