前提・実現したいこと
raspberry pi3で加速度センサを作ろうとしています。
OSはlinux 使用言語はpython3です。
使用加速度センサはadxl345で、i2c通信にて接続しています。
発生している問題・エラーメッセージ
一定間隔(0.01秒刻み)でセンサから値を取得するプログラムを組んでいますが、
たまに大きく刻み時間を外してしまうことがあります。これを解決したいです。
for文内で取得した時刻(time_act)の差分を取ってみると、ほとんど刻みdt(0.01秒)で打刻できていますが、
まれに1秒とか2秒とかになってしまいます。
計測値の取得に時間がかかっているか、あるいは取得している時刻がおかしくなるタイミングがあるかと思っています。
この問題の解決法でなくとも、例えばRTCのようなものを外付けすれば一定刻みでセンサ値取得が可能なるなど、別の視点からの回答でも構いません。
知見をお持ちの方、何卒宜しくお願い致します。
該当のソースコード
python
1N = 1000000 2dt = 0.01 3VAL = [[0, 0, 0]]*N 4time_all = [[0,0,0,0,0]]*N 5time_act = [0]*N 6act_dt = [0]*N 7 8dta = 0.0001084814598456673 9 10t1 = time.perf_counter() 11for i in range(N): 12 tt1 = time.perf_counter() 13 VAL[i] = adxl345.getAxes() 14 tt2 = time.perf_counter() 15 t2 = dt-(time.perf_counter() - t1) -dta 16 tt3 = time.perf_counter() 17 if t2 > dta: 18 tt4 = time.perf_counter() 19 time.sleep(t2) 20 t1 = time.perf_counter() 21 tt5 = time.perf_counter() 22 time_act[i] = t1 23 tt6 = time.perf_counter() 24 time_all[i] = [tt2-tt1,tt3-tt2,tt4-tt3,tt5-tt4,tt6-tt5] 25 26
※adxl345.getAxes()がセンサから値を取得するコマンドです。
x,y,zの3成分を取得しています。実行時間は概ね0.0001秒くらいなので、for文自体は十分に刻み0.01秒で回せると考えています。
試したこと
各処理にかかっている時刻を計測しました(tt2-tt1,tt3-tt2など)。
これをグラフ化すると、以下のようになりました。
縦軸は処理にかかった時間です。ループ1周の時間は0.01秒となってほしいのですが、ある種周期的にそれが崩れています。
補足情報(FW/ツールのバージョンなど)
python 3.5.3
Raspbian GNU/Linux 9
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/01 12:34