2015年7月6日

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


以前挑戦してダメだったRaspberry Pi 2とBME280ですが、こちらの記事でセンサー情報取得プログラムにPython版が出たことを知り、合わせてI2C用プルアップ抵抗?の接続も不要のように見えたので、以前と同様にジャンパー線で直接接続する形にしてみました。

この方式だと3.3VとGNDを余計に消費してしまいますが、それ以外のセンサーを繋ぐ予定も無いため、とりあえずはこれで運用してみようと思います。

2015年6月21日

Go Conference 2015に参加してきました

先々月にGunosy.go#12にお邪魔させてもらったりと、今年はGo言語と触れ合う機会が多いのですが、今日は抽選で外れたものの繰り上げ当選する事ができたGo Conference 2015にお邪魔してきました。

内容の詳細は発表者さんが公開されているプレゼン資料をご確認頂くとして、とりあえずメモを載せておきます。

It's an exciting time to be a gophar(キーノート:Francesc Campoy@google さん)

  • Golangのチームに入って3年
  • Golangは今年で5歳
  • 今年8月頃にGo 1.5がリリース予定
  • Go 1.5は全てをGo言語で記述
  • C言語を知らなくてもGo言語の改善に貢献できるようになる
  • SSA(Single Static Assignment)
  • New SSA Backend planはGo 1.6から
  • go vet
  • ソース分析で使われるgo oracle
    • サポートがあるエディターはvim(vim-go)とemacs
  • godoc -anlytics=pointerでgodoc中に呼び出し元一覧が記載される
  • gomobile tool
  • とりあえず今はAndroidのみサポート
    • これ全てでアプリを記述するのは難しそう
  • 依存性管理ツールが今後提供されるかも?

What I Talk About When I Talk About CLI Tool By Golang(SOTA@楽天 さん)

  • 社内でcloud foundryを使っている
  • 直感的なUI/UX
  • https://github.com/docker/docker/tree/master/pkg/mflag
    • ロングオプションとショートオプションを同時に指定できる
  • https://github.com/mitchellh/cli
    • サブコマンドのインターフェースを定義
    • テストがしやすい
  • 他のコマンドと協調動作する
  • os.Exitはdeferを実行せず終了するので、mainでExitする
  • io.WriterをRun()に渡すとテストがしやすい
  • https://github.com/tcnksm/go-latest
    • 使われているコマンドが最新版かチェック
  • https://github.com/tcnksm/gcli
    • いい感じのコマンドラインツール雛形を出力してくれる
  • 質疑応答
    • 引数を渡すとき--hogeの後空白か=だとどっちがいい? → =つけずにやってる
    • cliパッケージを作るときにcli.goとの違い → フラグが独自のカスタマイズがされている、exitコードが独自
    • エラーコード以外の情報を返すべきか → iota使ってやってる
    • 標準入力(ファイル入力)の使い方 -とかファイル名なかったりとか → 普通に下手にベタに書いてる

Generative Programming in Go(MIYAKE Yusuke@GMO Pepabo さん)

  • コードからコードを出力する
  • Goでは標準でコードをパースしてASTを出力する機能がある
  • 構造体のコメント欄に"+AR"があるとActiveRecordの振る舞いを生成
  • generics:構造体に対して個々の型を扱う共通のメソッドを生成
  • https://github.com/clipperhouse/gen
  • パフォーマンス:コード生成でリフレクションを回避
  • https://github.com/pquerna/ffjson
  • DSL:ASTのメソッド名/コメント/タグから定義を補完して生成
  • なんでもgenerateはよくない
  • テストは生成物に対して行う
  • 質疑応答
    • ソースコード管理はどうするか?→ 生成した結果までバージョン管理する
    • 参考にした資料 → clipperhouse/genなど

GoのASTをいじくって新しいツールを作る(vvakame@topgate さん)

  • structのjsonタグを都度書くのはつらい
  • https://github.com/favclip/jwg
  • 構造体のコメントに+jwgを書いてgo:generateするとjsonタグを自動生成
  • 内部情報や開発環境のみ出力といった対応も可
  • ASTで構造体の各要素(名前、種類、変数名、変数の型)が取れる
  • https://github.com/favclip/genbase
  • jwgのライセンスはMIT

A Tale of Go REPL(motemen@hatena さん)

  • https://github.com/motemen/gore
  • Go言語でREPL環境
  • Goのeval = go run
  • ASTに一旦変換して.goにして実行
  • go runした結果を出力する
  • 変数やパッケージが使われてない系のエラーは無理やり使って対応
  • 質疑応答
    • goreの補完はどうやっているか? → gocodeに問い合わせている
    • goreの副作用のあるコードはundoやclearと合わせて今後対応予定

Debugging Go Code with GDB(kaneshin@eureka さん)

  • print debugのデメリット アドホックなコードを書いてしまう
  • GDBを使うと処理の中断ができる
  • gcflagsで最適化オプションをOFFにする
  • ldflags -wでバイナリサイズが減る
  • WAFはRevelを使っている
    • Revelにした理由:CTOが選んだ。なるべく枯れているものを利用
    • 個人的にはWAF使わない方がいいんじゃないか
  • WAFとgdbは相性が悪い
  • gdbのバージョンを確認する

Scaling Sourcegraph with Go(Gabriel Aszalos@sourcegraph さん)

1binary 自己完結型の 形態素解析器 kagome を 作ってみた話(ikawaha@パシフィックポーター さん)

  • https://github.com/ikawaha/kagome
  • pure goな形態素解析器
  • 辞書同梱
  • Javaで実装された形態素解析器Kuromoji
  • 辞書はJarの中に含まれている
  • Goの場合はgo-bindataで含める

Gaurun / A general push notification server in Go(cubicdaiya@mercari さん)

  • https://github.com/mercari/gaurun
  • Push通知リクエストをHTTP APIで受けて非同期にAPNsやGCMに送信処理を実行
  • - goroutineの数はパフォーマンスが下がるので無制限に作らない
  • - https://github.com/fukata/golang-stats-api-handler
  • - サーバーのモニタリング内容を出力
  • - 質疑応答
  •   - APIでエラーが出たときのハンドリング → アクセスログとエラーログを別に出力
  •   - リークしてた事の解決方法 → 外部のライブラリが悪さしてたのでforkして修正
  •   - goroutineを使ってキューシステムのチューニング → 定常用とキャンペーン用でプロセスを分ける

Goと電子工作とロボット(HideyukiTakei@beatrobo さん)

ピクシブ社内広告サーバーでのGoの開発・運用(catatsuy@pixiv さん)

  • UNIX Domain Socketで繋いでいる理由=TCP 3way Handshakeのコストが高かった
  • https://github.com/circus-tent/circus
  • mozilla製プロセス管理ツール
  • ダウンタイムを起こさないようにするために利用
  • go build ldflagsでgitのリビジョン番号を埋め込む
  • https://github.com/pmylund/go-cache
  • memcachedへのアクセスが重いためアプリケーション側でキャッシュ
  • cpufrequtilsで常にCPUがフルスピードで動くように
    • 広告サーバーとMySQLサーバーでは効果があった
  • ログ出力はCircusから直接Goが出力するように変更
  • プロファイリングが取りやすいのでパフォーマンスが必要な場合でも使いやすい
  • 質疑応答
    • インフラは何を使っているか → 実サーバーを使っている
    • ログをCircus経由で出すとリソースを食う原因は? → Circus自体の調査はしていない

Goで共通基盤システムを作っている話(Ryota Nishio@CyberAgent さん)

  • Realtime Messaging Platformを作っている(OSS化予定)
  • mqtt, websocket, protobuf, msgpack, zeromq, consul
  • 開発体制は3名
  • デプロイが非常に容易
  • テストやベンチマークが標準装備
  • versioning/vendoringの問題 現在はgodepを使っている
  • 標準パッケージが宝の山
  • 選定の際は自分でベンチマークを取る
  • genericsないのどうしてる? reflectは使わない

懇親会&LT大会(リンクのみ)

2015年4月18日

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

2015-07-06 取得することができました

”取得してみた”ではなく、”取得しようとした”という事でまだデータは取れていないのですが(汗)、今日は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対応版ソースを公開される事を信じて待つ事にしたいと思います。