MPU6050センサーの値をNervesで取り込みできるようになりました。
測定結果をグラフ表示して正しい値がとれてるか動作を確認してみます。
Nerves Livebook
Livebookを使えば、簡単にグラフ表示できるので、Nerves Livebookを使ってみます。
はじめて使ってみたので、気になった部分をメモしておきます。
- Mix.installでもモジュールのインストールはできないけど、よく使うモジュールはインストールされている
- Circuits.I2C、Circuits.GPIO、Nxがあるので困る事はなさそう
- VegaLiteでデータをグラフ表示できる
- Nxもつかえる
ハマりポイント1
GenServerとの通信がTimeoutになってうまくいかない。簡単なGenServerだと問題ない。
原因
デフォルトの5秒のタイムアウトでは足りなかった。GenServer.callのタイムアウトを大きくして実行すればうまくいった。
素のNervesのiexから操作した時は、問題ありませんでしたが、Livebookから使うと時間かかるようです。
ハマりポイント2
一度、GenServerを起動すると、止められず、Livebookを再起動しないと再実行できない。
原因
普通のセルの中に書いていると、プロセスが終了しないので、起動したGenServerは止まりません。
Reconnect and setupのセルにプログラムを書くとセルの評価で、GenServerが止まった状態になりました。
このセルを評価した時に、新しいプロセスとして起動するのだと理解しました。
取得したデータをグラフ表示する
# データをマップに変換
formatted_data =
GenServer.call(pid, :get_log, 100000)
|> Enum.map(fn {yaw, pitch, roll, sampling_number} ->
%{
yaw: yaw,
pitch: pitch,
roll: roll,
sampling_number: sampling_number
}
end)
vl_spec =
VegaLite.new(
title: "MPU6050",
width: 600,
height: 500
)
|> VegaLite.data_from_values(formatted_data)
|> VegaLite.transform(fold: ["yaw", "pitch", "roll"], as: ["key", "value"])
|> VegaLite.mark(:line)
|> VegaLite.encode_field(:x, "sampling_number", type: :quantitative)
|> VegaLite.encode_field(:y, "value", type: :quantitative)
|> VegaLite.encode_field(:color, "key", type: :nominal)
# グラフをLivebookに表示
Kino.VegaLite.new(vl_spec)
測定結果
roll, pitch方向に傾けてみた時の測定結果です
傾けた後、水平に戻した時に、正確に0に戻っているので、精度もよさそうです。
まとめ
- Raspi zero Wでは、遅いけど、Livebookを使えた
- 取り込んだデータを表示するのに便利
- 初期化が絡むものは、setupのセルに書く
今回の角度の取得は、complementaryフィルタを使ってますが、Nxが使えるので、カルマンフィルターの実装が簡単にできるのかも。カルマンフィルターについてもうちょっと理解できたら、試してみたいです。