アナログ出力3軸加速度センサー(約1000円)KXM52-1050を
使って加速度を読み取ります。上の写真の左端の真ん中で赤と黒のケーブルに埋もれ
てしまっています。これを用いてボードが動き始める
のを加速度として感知します。
このあいだ作ったバーコードリーダーと組み合わせて、
装置が動いたら、バーコードリーダーを作動させ、
読み取ったデーターをEtherNetを通じてWEBサーバーとなって公開します。
装置が静止していたらバーコードリーダーを休ませておきます。
この素子は、電源電圧を5Vとして、加速度 a m/s^2で加速すると、
Vout= a/g +2.5 (V) のアナログ出力が得られます。ここでgは
重力加速度(g = 9.8m/s^2)で2.5Vはセンサーの出力が常に正の
電圧になるようにするためのオフセット電圧です。
たとえば、素子のz軸を上向きにして静止させると、x方向とy方向の加速度は0
なのでVx=Vy=2.5Vの出力が、z方向には重力により Vz=3.5Vの出力がでます。
さらにこの素子をxが負の方向に5 m/s^2で加速すると、
Vx=-5/9.8+2.5=1.99V、Vy=2.5V、Vz=3.5Vの出力が得られます。
また、静止した状態でx軸を中心に30度傾けたとすると、重力
加速度がz軸のセンサーとy軸のセンサーの両方で測定されるので、
Vx=2.5V、Vy=sin(30°)+2.5V、Vz=cos(30°)+2.5となり、静止
していても姿勢が変化すると出力も変化します。
さて、この加速度センサーの電圧の変化ででボードの運動をモニター
するわけですが、実際に使うときにボードの向きがどのように置かれ
るかはわかりませんし、ボード必ず水平におく必要があったりするのは
面倒です。またオフセットの2.5Vも安定して変化しない保証は
余りないでしょうから、データの扱いにすこし工夫が必要です。
地球上で「静止」(正しくは「静止を含む等速度運動」)
しているとは、「重力の大きさが一定で、向きも変わらない」という
ことなのでセンサーの出力をxyz3次元のベクトルで扱い重力の
効果とオフセットの値を差し引く必要があります。
#define Ndata 16 #define Dg 100 int ave_gX[Ndata]; int ave_gY[Ndata]; int ave_gZ[Ndata]; long sum_gX,sum_gY,sum_gZ; .....
aX=(analogRead(sX)); aY=(analogRead(sY)); aZ=(analogRead(sZ)); .....
sum_gX-=ave_gX[wp]; ave_gX[wp]=aX; sum_gX+=aX; sum_gY-=ave_gY[wp]; ave_gY[wp]=aY; sum_gY+=aY; sum_gZ-=ave_gZ[wp]; ave_gZ[wp]=aZ; sum_gZ+=aZ;
wp=(wp+1)&(Ndata-1);
a0X=aX-sum_gX/Ndata; a0Y=aY-sum_gY/Ndata; a0Z=aZ-sum_gZ/Ndata; g=a0X*a0X+a0Y*a0Y+a0Z*a0Z;
if((g>(Dg))||(g<(-Dg))){