これは MMA7361 3軸アナログ加速度センサ の Nucleo F401RE 用のライブラリです。詳しい説明はLibrary中のReadMe.hに記載しています。文字化けや開けない場合はダウンロードしてみてください。Google Chrome では見れるはずです。

Dependents:   Nucleo_L3GD20_MMA7361_Kalman

Committer:
hirokimineshita
Date:
Sun Feb 01 03:56:22 2015 +0000
Revision:
0:ad6f3a862ed5
Child:
1:3541f3ed831d
this is 1st up of mma7361

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hirokimineshita 0:ad6f3a862ed5 1 これは MMA7361 3軸アナログ加速度センサ の Nucleo F401RE 用のライブラリです。AnalogInポート によるA/D変換をしています。
hirokimineshita 0:ad6f3a862ed5 2 センサのスリープモードを解除するためにSLピンにVDDを入れてください。
hirokimineshita 0:ad6f3a862ed5 3 0gピンを使うことでセンサが自由落下しているときにhighを返すらしいですが、試してはいません。
hirokimineshita 0:ad6f3a862ed5 4 今まで使ってきて、STピンが働いているのかはよくわかりませんでした。最初コンパイルする際注意が出てくるかもしれませんが、
hirokimineshita 0:ad6f3a862ed5 5 無視してください。
hirokimineshita 0:ad6f3a862ed5 6 参考:http://shokai.org/blog/archives/7701
hirokimineshita 0:ad6f3a862ed5 7
hirokimineshita 0:ad6f3a862ed5 8 初期化(nameはなんでもいいです)
hirokimineshita 0:ad6f3a862ed5 9
hirokimineshita 0:ad6f3a862ed5 10 mma7361 name;
hirokimineshita 0:ad6f3a862ed5 11
hirokimineshita 0:ad6f3a862ed5 12 Xピン:PA_0 Yピン:PA_1 Zピン:PA_4 gSピン:PH_1 STピン:PH_0
hirokimineshita 0:ad6f3a862ed5 13 で接続します。
hirokimineshita 0:ad6f3a862ed5 14
hirokimineshita 0:ad6f3a862ed5 15
hirokimineshita 0:ad6f3a862ed5 16 mma7361 name(X,Y,Z);
hirokimineshita 0:ad6f3a862ed5 17
hirokimineshita 0:ad6f3a862ed5 18 Xピン:X Yピン:Y Zピン:Z gSピン:PH_1 STピン:PH_0
hirokimineshita 0:ad6f3a862ed5 19 で接続します。
hirokimineshita 0:ad6f3a862ed5 20
hirokimineshita 0:ad6f3a862ed5 21
hirokimineshita 0:ad6f3a862ed5 22 mma7361 name(X,Y,Z,ST);
hirokimineshita 0:ad6f3a862ed5 23
hirokimineshita 0:ad6f3a862ed5 24 Xピン:X Yピン:Y Zピン:Z gSピン:PH_1 STピン:ST
hirokimineshita 0:ad6f3a862ed5 25 で接続します。
hirokimineshita 0:ad6f3a862ed5 26
hirokimineshita 0:ad6f3a862ed5 27
hirokimineshita 0:ad6f3a862ed5 28 mma7361 name(X,Y,Z,ST,gS);
hirokimineshita 0:ad6f3a862ed5 29
hirokimineshita 0:ad6f3a862ed5 30 Xピン:X Yピン:Y Zピン:Z gSピン:gS STピン:ST
hirokimineshita 0:ad6f3a862ed5 31 で接続します。
hirokimineshita 0:ad6f3a862ed5 32
hirokimineshita 0:ad6f3a862ed5 33
hirokimineshita 0:ad6f3a862ed5 34 関数
hirokimineshita 0:ad6f3a862ed5 35
hirokimineshita 0:ad6f3a862ed5 36 name.calibration();
hirokimineshita 0:ad6f3a862ed5 37
hirokimineshita 0:ad6f3a862ed5 38 PCでターミナルソフトを用いて使います。Serialの設定は必要ありません。
hirokimineshita 0:ad6f3a862ed5 39 TeraTerm での動作確認済みです。センサの値を取得、
hirokimineshita 0:ad6f3a862ed5 40 初期値等を2次元配列 mat[4][3] (3×4行列) に入れます。
hirokimineshita 0:ad6f3a862ed5 41 ターミナルソフト上に出る指示に従ってやれば問題ないです。
hirokimineshita 0:ad6f3a862ed5 42 配列 mat[4][3] については mma7361.cpp に記載してます。
hirokimineshita 0:ad6f3a862ed5 43
hirokimineshita 0:ad6f3a862ed5 44 name.set_each_num(A00,A10,A20,A01,A11,A21,G00,G10,G20,G01,G11,G21,range);
hirokimineshita 0:ad6f3a862ed5 45
hirokimineshita 0:ad6f3a862ed5 46 | A00 A10 A20 |
hirokimineshita 0:ad6f3a862ed5 47 mat = | A01 A11 A21 |
hirokimineshita 0:ad6f3a862ed5 48 | G00 G10 G20 |
hirokimineshita 0:ad6f3a862ed5 49 | G01 G11 G21 |
hirokimineshita 0:ad6f3a862ed5 50
hirokimineshita 0:ad6f3a862ed5 51 測定範囲:range (=0のとき1.5G =1のとき6.0G)
hirokimineshita 0:ad6f3a862ed5 52 に設定します。
hirokimineshita 0:ad6f3a862ed5 53 A00~G21の値を def (=-1) にするとその値は変更しません。
hirokimineshita 0:ad6f3a862ed5 54
hirokimineshita 0:ad6f3a862ed5 55
hirokimineshita 0:ad6f3a862ed5 56 name.set_num(&new_mat,range);
hirokimineshita 0:ad6f3a862ed5 57
hirokimineshita 0:ad6f3a862ed5 58 配列 mat に new_mat をうつします。並び方を間違えないように注意してください。
hirokimineshita 0:ad6f3a862ed5 59 new_mat = {A00,A10,A20,A01,A11,A21,G00,G10,G20,G01,G11,G21}としてもいい。
hirokimineshita 0:ad6f3a862ed5 60 測定範囲を range に設定します。
hirokimineshita 0:ad6f3a862ed5 61 A00~G21の値を def (=-1) にすると変更しません。
hirokimineshita 0:ad6f3a862ed5 62
hirokimineshita 0:ad6f3a862ed5 63
hirokimineshita 0:ad6f3a862ed5 64 name.set_range(range);
hirokimineshita 0:ad6f3a862ed5 65
hirokimineshita 0:ad6f3a862ed5 66 測定範囲を range に設定
hirokimineshita 0:ad6f3a862ed5 67
hirokimineshita 0:ad6f3a862ed5 68
hirokimineshita 0:ad6f3a862ed5 69 name.clear_mat();
hirokimineshita 0:ad6f3a862ed5 70
hirokimineshita 0:ad6f3a862ed5 71 配列 mat に mma7361.h で定義された A00 から G21 までを代入します。初期化の際に使われていて、
hirokimineshita 0:ad6f3a862ed5 72 実際のプログラム中では使う必要はありません。
hirokimineshita 0:ad6f3a862ed5 73
hirokimineshita 0:ad6f3a862ed5 74
hirokimineshita 0:ad6f3a862ed5 75 var = name.read_bit(axis);
hirokimineshita 0:ad6f3a862ed5 76
hirokimineshita 0:ad6f3a862ed5 77 var:int型の戻り値(12bit)
hirokimineshita 0:ad6f3a862ed5 78 axis: x_axis (=0)、y_axis (=1)、z_axis (=2) で軸を指定します。
hirokimineshita 0:ad6f3a862ed5 79 指定した軸の加速度をA/D変換したのを何もせずに返します。
hirokimineshita 0:ad6f3a862ed5 80 name.read_u16 を軸指定で簡単にできるようにしただけです。
hirokimineshita 0:ad6f3a862ed5 81
hirokimineshita 0:ad6f3a862ed5 82
hirokimineshita 0:ad6f3a862ed5 83 var = name.read_bit_0(axis);
hirokimineshita 0:ad6f3a862ed5 84
hirokimineshita 0:ad6f3a862ed5 85 var:int型の戻り値
hirokimineshita 0:ad6f3a862ed5 86 axis: x_axis、y_axis、z_axis で軸を指定。
hirokimineshita 0:ad6f3a862ed5 87 指定した軸の加速度をA/D変換したのを配列 mat にしたがって加速度がないときに
hirokimineshita 0:ad6f3a862ed5 88 0になるように引き算したものです。
hirokimineshita 0:ad6f3a862ed5 89
hirokimineshita 0:ad6f3a862ed5 90
hirokimineshita 0:ad6f3a862ed5 91 var = name.read_by_g(axis);
hirokimineshita 0:ad6f3a862ed5 92
hirokimineshita 0:ad6f3a862ed5 93 var:float型の戻り値
hirokimineshita 0:ad6f3a862ed5 94 axis: x_axis、y_axis、z_axis で軸を指定。
hirokimineshita 0:ad6f3a862ed5 95 指定した軸の加速度を配列 mat に従って計算し、何Gかを返します。
hirokimineshita 0:ad6f3a862ed5 96
hirokimineshita 0:ad6f3a862ed5 97
hirokimineshita 0:ad6f3a862ed5 98 name.low_pass_filter(&int_bit,axis);
hirokimineshita 0:ad6f3a862ed5 99
hirokimineshita 0:ad6f3a862ed5 100 int_bit:前回のこの関数で得られたセンサ値(int)を保持している変数。
hirokimineshita 0:ad6f3a862ed5 101 axis: x_axis、y_axis、z_axis で軸を指定。
hirokimineshita 0:ad6f3a862ed5 102 これは擬似的にローパスフィルタをやっています。これによりノイズを消去します。
hirokimineshita 0:ad6f3a862ed5 103 ただ、反応が鈍くなったり、遅くなったりします。変数を1つ用意してください。やってる計算は下の通りです。
hirokimineshita 0:ad6f3a862ed5 104 現在の値 = 0.9 × ひとつ前の値 + 0.1 × センサの値
hirokimineshita 0:ad6f3a862ed5 105 参考:http://android.ohwada.jp/archives/334
hirokimineshita 0:ad6f3a862ed5 106 純粋に加速度を得たときはあまり使わない方がいいかもしれないです。
hirokimineshita 0:ad6f3a862ed5 107 bit値に対して行っており、戻り値は name.read_bit(axis) の値にローパスフィルタを掛けたものになっています。
hirokimineshita 0:ad6f3a862ed5 108 最初は収束するまでに時間がかかるので何百個かのデータをとって捨てるか、後述の関数 name.set_1st_bit() を
hirokimineshita 0:ad6f3a862ed5 109 つかって初期化してください。
hirokimineshita 0:ad6f3a862ed5 110
hirokimineshita 0:ad6f3a862ed5 111
hirokimineshita 0:ad6f3a862ed5 112 name.show_mat();
hirokimineshita 0:ad6f3a862ed5 113 配列 mat をターミナルソフトに表示させます。形は3×4です。
hirokimineshita 0:ad6f3a862ed5 114
hirokimineshita 0:ad6f3a862ed5 115
hirokimineshita 0:ad6f3a862ed5 116 var = name.bit_to_g(bit,axis);
hirokimineshita 0:ad6f3a862ed5 117
hirokimineshita 0:ad6f3a862ed5 118 var:float型の戻り値
hirokimineshita 0:ad6f3a862ed5 119 bit:変換したいデジタル値(int)
hirokimineshita 0:ad6f3a862ed5 120 axis: x_axis、y_axis、z_axis で軸を指定。
hirokimineshita 0:ad6f3a862ed5 121 与えられたデジタル値を配列 mat にしたがって0にあわせ、重力加速度に変換します。
hirokimineshita 0:ad6f3a862ed5 122
hirokimineshita 0:ad6f3a862ed5 123
hirokimineshita 0:ad6f3a862ed5 124 name.set_1st_bit(&var,axis,dir);
hirokimineshita 0:ad6f3a862ed5 125
hirokimineshita 0:ad6f3a862ed5 126 var:int型の変数
hirokimineshita 0:ad6f3a862ed5 127 axis: x_axis、y_axis、z_axis で軸を指定。
hirokimineshita 0:ad6f3a862ed5 128 dir:float型の値。重力加速度を打ち消す加速度がその軸に対してどのくらい働いているか。大まかでいい。(-1~1)
hirokimineshita 0:ad6f3a862ed5 129 ローパスフィルタを使う前にこれを使ってセンサ値を格納する変数を初期化しておくと
hirokimineshita 0:ad6f3a862ed5 130 早くセンサ値に収束します。これを使わなくてもいいですが、フィルタを通した最初の300個ぐらいの値
hirokimineshita 0:ad6f3a862ed5 131 は正しくなくなります。dirの値が正確であればあるほど速く収束します。dirの値が毎回異なるときは
hirokimineshita 0:ad6f3a862ed5 132 0を入れておくことで、収束にかかる時間を減らすことができます。
hirokimineshita 0:ad6f3a862ed5 133
hirokimineshita 0:ad6f3a862ed5 134
hirokimineshita 0:ad6f3a862ed5 135 var = name.rotate(&var_a,a_axis,&var_b,b_axis);
hirokimineshita 0:ad6f3a862ed5 136
hirokimineshita 0:ad6f3a862ed5 137 var:int型の戻り値
hirokimineshita 0:ad6f3a862ed5 138 var_a: aのセンサ値を保管している場所
hirokimineshita 0:ad6f3a862ed5 139 a_axis: aの軸、x_axis、y_axis、z_axis で軸を指定。
hirokimineshita 0:ad6f3a862ed5 140 var_b: bのセンサ値を保管している場所
hirokimineshita 0:ad6f3a862ed5 141 b_axis: bの軸、x_axis、y_axis、z_axis で軸を指定。
hirokimineshita 0:ad6f3a862ed5 142 軸 b から軸 a への回転の角加速度(ラジアン)を計算します。なかで上述の関数 name.bit_to_g() を使っているので
hirokimineshita 0:ad6f3a862ed5 143 そこを考慮してください。並進方向が入ると正しい値を返せません。
hirokimineshita 0:ad6f3a862ed5 144 加速度が0.01Gより小さいときは0Gとしています。軸 b が 0G のときは返る値も0となります。
hirokimineshita 0:ad6f3a862ed5 145
hirokimineshita 0:ad6f3a862ed5 146
hirokimineshita 0:ad6f3a862ed5 147 var = name.rad_to_deg(rad);
hirokimineshita 0:ad6f3a862ed5 148
hirokimineshita 0:ad6f3a862ed5 149 var:float型の戻り値(度)
hirokimineshita 0:ad6f3a862ed5 150 rad:変換したい値(ラジアン)
hirokimineshita 0:ad6f3a862ed5 151 値をラジアンから度に変換してそれを返します。角度、角速度、角加速度に対して使えます。
hirokimineshita 0:ad6f3a862ed5 152 πを初期では3.1415926535にしていますが、mma7361.h のなかで define されている PI の値を変更する
hirokimineshita 0:ad6f3a862ed5 153 ことで変えることができます。