秋月で売っている3軸加速度センサーKXM52-1050モジュールをV850付録基板につないでみました。このセンサーは2.7~5.5Vで動作します。出力は3.3V動作の場合、1.65Vを中心に上下660mV動きます。昨日のA/D変換を応用すれば電圧を数値にすることができます。
ブレッドボードの上に載っている8pinの基板が加速度センサーです。秋月ではチップを載せた基板の形(完成品)で売っています(800円)。パスコンとかも実装済みなので外付け部品なしで使えます。
加速度センサーということになっていますが、実際は重力センサーというか傾き角度センサーです。
値の変化は例えばx軸だと、傾けた角度が0度のときは1.65Vで90度までは増加して2.31Vになります。その後180度まで減少して1.65Vにさらに減少して270度では0.99Vになり、今度は増加して0度で1.65Vに戻ります。
y軸も似たような感じですが、z軸は上向きが2.31Vで下向きが0.99Vになっています。ニュートラルの状態が1.65Vです。この値は電源電圧のちょうど半分みたいです。増減するのは見ていますが、角度に比例して変化するかどうかはちゃんと調べていません。
LCDの表示は1列目がA/D変換から読み取った値を16進4桁でx y zの順に表示しています。2列目はmVに変換した10進4桁を同じくx y zの順に表示しています。3列目と4列目は偶数番目の測定結果です(1,2列目は奇数番目)。ブレッドボードを持ち上げて傾けると、傾けた角度に応じて値が変化します。
配線はAN0(CON2の1pin)がx軸(6pin)、AN1(CON2の2pin)がy軸(7pin)、AN2(CON2の3pin)がz軸(8pin)です。
A/D変換のモードはワンショットスキャンモード(複数チャネルを一回だけ変換するモード)を使っています。appliletでは0-2のように複数の(0からはじまる)チャネルを選択できます。モードが違うので動作も多少違います。割り込みは変換が全チャネル完了したときにはいります。変換結果の読み取り(AD_Read)も配列を渡すと一気に書き込んでくれます。実際には同時に変換しているわけではなくて1つずつ変換しています。わずかな時間差なので、ほぼ同時に変換していることになります。
メインはこんな感じです。昨日と違うのは、変換値を複数受け取るので配列にしたところと、結果の表示の部分だけです。
ソース中に'<'や'¥'があると化けたりしますね。'<'とかにするのが面倒です。
ブレッドボードの上に載っている8pinの基板が加速度センサーです。秋月ではチップを載せた基板の形(完成品)で売っています(800円)。パスコンとかも実装済みなので外付け部品なしで使えます。
加速度センサーということになっていますが、実際は重力センサーというか傾き角度センサーです。
値の変化は例えばx軸だと、傾けた角度が0度のときは1.65Vで90度までは増加して2.31Vになります。その後180度まで減少して1.65Vにさらに減少して270度では0.99Vになり、今度は増加して0度で1.65Vに戻ります。
0度 1.65V 0度~ 90度 増加 90度 2.31V (1.65V + 0.66V) 90度~180度 減少 180度 1.65V 180度~270度 減少 270度 0.99V (1.65V - 0.66V) 270度~360度 増加 360度 1.65V
y軸も似たような感じですが、z軸は上向きが2.31Vで下向きが0.99Vになっています。ニュートラルの状態が1.65Vです。この値は電源電圧のちょうど半分みたいです。増減するのは見ていますが、角度に比例して変化するかどうかはちゃんと調べていません。
LCDの表示は1列目がA/D変換から読み取った値を16進4桁でx y zの順に表示しています。2列目はmVに変換した10進4桁を同じくx y zの順に表示しています。3列目と4列目は偶数番目の測定結果です(1,2列目は奇数番目)。ブレッドボードを持ち上げて傾けると、傾けた角度に応じて値が変化します。
配線はAN0(CON2の1pin)がx軸(6pin)、AN1(CON2の2pin)がy軸(7pin)、AN2(CON2の3pin)がz軸(8pin)です。
A/D変換のモードはワンショットスキャンモード(複数チャネルを一回だけ変換するモード)を使っています。appliletでは0-2のように複数の(0からはじまる)チャネルを選択できます。モードが違うので動作も多少違います。割り込みは変換が全チャネル完了したときにはいります。変換結果の読み取り(AD_Read)も配列を渡すと一気に書き込んでくれます。実際には同時に変換しているわけではなくて1つずつ変換しています。わずかな時間差なので、ほぼ同時に変換していることになります。
メインはこんな感じです。昨日と違うのは、変換値を複数受け取るので配列にしたところと、結果の表示の部分だけです。
#define MAX_VOLT 3250 // 実測3.25V volatile short rdy; void main( void ) { unsigned short val[3]; // A/D変換結果 int i, v; lcd_init(); // LCD初期化 while(1){ // A/D変換 rdy = 0; AD_Start(); // 変換開始 while(!rdy) ; // 変換完了まで待つ AD_Read(val); // 変換結果を読む // 結果表示 for(i = 0; i < 3; i++){ lcd_puthexs(val[i]); // 変換結果の16進出力 lcd_putc(' '); } lcd_puts(" "); for(i = 0; i < 3; i++){ v = (MAX_VOLT * (int)val[i]) >> 10; // mVに変換 lcd_putdec4(v); // mV値の10進出力 lcd_putc(' '); } lcd_puts(" "); } }
ソース中に'<'や'¥'があると化けたりしますね。'&lt;'とかにするのが面倒です。
※コメント投稿者のブログIDはブログ作成者のみに通知されます