3軸磁気センサーLIS3MDの検討
2018年3月3日 - 未分類
3軸で磁気を測定できるLIS3MDの検討をしてみました。これは、カメラを動かすと、どの方向を見ているのか分からなくなるので、地磁気で方位を取得しようと考えたからです。何故、3軸も必要なのか、最初は分からなかったのですが、3軸加速度センサーと組み合わせて使う場合に3軸必要になる訳です。普通に、水平に置いて使う分には、2軸で十分でしょう。
LIS3MDは、I2CでRaspberry Pi Model3に接続しました。アドレスは0x1Eでした。
磁気センサーは、最初に、キャリブレーションが必要です。センサーを水平状態で一回り回転させます。回転中の出力値を記録すると、XYグラフができます。理想状態では、原点中心の完全な円になるはずですが、実際には、周辺の磁気に影響されるので円にはなりません。原点からずれた楕円になります。
先ずは、Z値が大きく外れた部分を削除し、X,Yの平均値を差し引きます。
原点に寄ってきました。ここから、楕円フィティングします。
Pythonのscipyを使えば、様々な関数をフィティングできます。
見事にフィッティングできています。楕円近似のpythonソースコードです。python3でmatplotをインストールするのに、ちょっと手間取りかもしれません。
後は、モーターで回転させて、自動的にキャリブレーションを取れるようにしたいと思います。上手く行けば、カメラが撮影している方角が記録できます。
#!/usr/bin/python3
import numpy as np
from scipy import odr
from scipy import optimize
from matplotlib.patches import Ellipse
import matplotlib.pyplot as plt
from scipy.stats import norm
def f(B, x):
return ((x[0]/B[0])**2+(x[1]/B[1])**2-1.)
#Least squares method with scipy.optimize
def fit_func(parameter,xy):
a = parameter[0]
b = parameter[1]
c = parameter[2]
residual = (a*xy[0]+b*xy[1]+c)
return residual
def f(B, x):
return ((x[0]/B[0])**2+(x[1]/B[1])**2-1.)
if __name__ == '__main__':
file_id = 'magdir.csv'
file_path = './'
rfile = file_path + file_id
data = np.loadtxt(rfile, comments='#' ,delimiter=',')
x_csv = data[:,0]
y_csv = data[:,1]
# sub average
x_ave=np.average(x_csv)
y_ave=np.average(y_csv)
x_csv = x_csv-x_ave
y_csv = y_csv-y_ave
xy = np.array([x_csv, y_csv])
#mdr = odr.Model(f, implicit=True)
mdr = odr.Model(g, implicit=True)
mydata = odr.Data(xy,y=1)
#myodr = odr.ODR(mydata, mdr, beta0=[1., 2.])
myodr = odr.ODR(mydata, mdr, beta0=[1., 2.,3.,4.])
myoutput = myodr.run()
myoutput.pprint()
ax = plt.subplot(111, aspect='equal')
plt.scatter(x_csv, y_csv) # raw data with randomness
ell = Ellipse(xy=(0., 0.), width=2.*myoutput.beta[0], height=2.*myoutput.beta[1], angle=0.0)
ell.set_facecolor('none')
ell.set_edgecolor('black')
ax.add_artist(ell) # fitted curve
plt.grid()
plt.show()
plt.show()
その後、8BYJ-48 Stepper Motorというステッピングモーターでセンサーを回転させて再測定しました。8BYJ-48 Stepper Motorは、安価なステッピングモーターです。RaspberryPiで4層の回転パルスを出して制御します。回転速度は、非常にゆっくりとしています。
低価格だが、不良品も多く含まれていて、制御基板のLEDが点灯しないのは普通のことだと思わなければならない。モーターの磁気の影響を受けるので、アルミパイプでモーターから100mm離して測定。
さすがに、手で回すよりもきれいなデータがとれました。Z軸方向のブレも少ないようです。