PSoCと3軸加速度センサーでXYZ軸の加速度を計測する

psoc_3g_01.gif
今回はPSoCに3軸加速度センサーを接続してX軸、Y軸、Z軸の3方向の加速度を表示する。

加速度センサーには秋月電子で800円程度で売られている「KXM52-1050」を利用した。この加速度センサーは5Vでも3.3Vでも動作し、出力はXYZ軸それぞれが独立したアナログの電圧として取り出せるものだ。感度もよく(1000mV/g)、使い勝手がいい。

psoc_3g_02.gif
利用するモジュールをプロジェクトに追加する。まず「ADCs」にある「TRIADC」を右クリックして現れるメニューから「Select」を選択して追加する。この「TRIADC」は3つの入力を持つA/Dコンバーターだ。今回の3軸加速度センサーを利用するのにうってつけだろう。

psoc_3g_03.gif
次にアンプを追加する。「Amplifiers」の「PGA」を右クリックして「Select」を選択する。このアンプは1入力1出力なので、3軸分、合計3つを追加する。3つ追加するには同じ操作(「Amplifiers」の「PGA」を右クリックして「Select」を選択するという操作)を3回繰り返す。

psoc_3g_04.gif
次に測定結果を出力するための液晶用モジュールを追加する。「Misc Digital」の「LCD」を右クリックして「Select」すればいい。

psoc_3g_05.gif
これで利用するモジュールの選択が終わった。次に配線などの設定をするため「Config」メニューの「Interconnect」を選択する。

psoc_3g_06.gif
まず「Global Resources」を設定する。
「Power Setting」を「5.0V / 6MHz」に、
「VC1=SysClk/N」を「16」に、
「RefMux」を「(Vdd/2)+/-(Vdd/2)」にする。
次に「LCD_1」の「LCDPort」を「Port_2」に設定する。

psoc_3g_07.gif
さらに3つあるアンプの設定をする。まず「PGA_1」を右クリックして「Place」により配置する。

psoc_3g_08.gif
そして「Gain」を「1.000」に、
「Input」を「AnalogColumn_InputMux_0」に、
「Reference」を「VSS」に、
「AnalogBus」を「Disabel」に設定する。

psoc_3g_09.gif
次に「PGA_2」の設定をする。「PGA_1」のときと同様に右クリックして「Place」で配置する。そして左側の設定欄で
「Gain」を「1.000」に、
「Input」を「AnalogColumn_InputSelect_1」に、
「Reference」を「VSS」に、
「AnalogBus」を「Disabel」に設定する。

psoc_3g_10.gif
次に「PGA_3」の設定をする。「PGA_1」や「PGA_2」のときと同様に右クリックして「Place」で配置する。そして左側の設定欄で
「Gain」を「1.000」に、
「Input」を「AnalogColumn_InputSelect_2」に、
「Reference」を「VSS」に、
「AnalogBus」を「Disabel」に設定する。

psoc_3g_11.gif
最後に「TRIADC_1」の設定をする。「TRIADC_1」を右クリックして現れたメニューから「Place」を選択して配置する。そして
「ADC Input1」を「ACB00」に、
「ADC Input2」を「ACB01」に、
「ADC Input3」を「ACB02」に、
「Clock」を「VC1」に(画面では「VC2」になっていますが「VC1」の間違えです)、
「ADCResolution」を「12 Bit」に設定する。

psoc_3g_12.gif
これで設定が終わったので次に配線をする。
「PGA_2」の上の部分をクリックする。

psoc_3g_13.gif
そして「Port_0_2」を選択する。これで「PGA_2」がポート02からの入力で動くようになる。

psoc_3g_14.gif
「PGA_3」の上の部分をクリックする。

psoc_3g_15.gif
そして「Port_0_3」を選択する。これで「PGA_3」がポート03からの入力で動くようになる。

psoc_3g_16.gif
配線まで一通り終わったのでソースコードを書くため画面を切り替える。「View」メニューから「Application Editor」を選択する。

psoc_3g_17.gif
長くなるのでソースコードを作成する過程は省略した。基本的に各モジュールのサンプルコードの切り貼りで作成できる。ただし今回はアンプを3つ利用した。それぞれ「PGA_1」、「PGA_2」、「PGA_3」なので各命令もそれぞれの頭文字から始まるように修正する(例:PGA_2_Start(...);など)。


//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------

#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules

#include "stdlib.h"

void User_Function(int iResult1, int iResult2, int iResult3)
{
char pszData[7];

iResult1 *= (5000/4096);
iResult2 *= (5000/4096);
iResult3 *= (5000/4096);

LCD_1_Position(0,4);
LCD_1_PrCString("X:");
itoa(pszData,iResult1,10);
LCD_1_PrString(pszData);
LCD_1_PrCString(" ");

LCD_1_Position(1,4);
LCD_1_PrCString("Y:");
itoa(pszData,iResult2,10);
LCD_1_PrString(pszData);
LCD_1_PrCString(" ");

LCD_1_Position(2,0);
LCD_1_PrCString("Z:");
itoa(pszData,iResult3,10);
LCD_1_PrString(pszData);
LCD_1_PrCString(" ");
}


void main()
{
int iResult1, iResult2, iResult3;

LCD_1_Start();
PGA_1_Start(PGA_1_MEDPOWER);
PGA_2_Start(PGA_2_MEDPOWER);
PGA_3_Start(PGA_3_MEDPOWER);

M8C_EnableGInt; // Enable global interrupts
TRIADC_1_Start(TRIADC_1_HIGHPOWER); // Turn on Analog section
TRIADC_1_SetResolution(12); // Set resolution to 10 Bits
TRIADC_1_GetSamples(0); // Start ADC to read continuously
for(;;)
{
while(TRIADC_1_fIsDataAvailable() == 0); // Wait for data to be ready
iResult1 = TRIADC_1_iGetData1(); // Get Data from ADC Input1
iResult2 = TRIADC_1_iGetData2(); // Get Data from ADC Input2
iResult3 = TRIADC_1_iGetData3ClearFlag(); // Get Data from ADC Input3
// and clear data ready flag
User_Function(iResult1,iResult2,iResult3); // User function to use
// data
}
}





_DSC9034.JPG
今回はCY8C29466とPSoCEval基板を利用して動作確認を行った。

_DSC9035.JPG
これが利用した加速度センサー「KMX52-1050」。「KXM52 50137」のように書かれたフラットICのセンサー本体が8ピンDIPモジュールに変換されている。この状態で秋月電子で800円程度で販売されている。

1ピンと2ピンをVccに、3ピンと5ピンをGNDに、6ピンをポート01に、7ピンをポート02に、8ピンをポート03に接続する。また、VCCとGNDの間に0.1μF程度のコンデンサを配置する。

_DSC9037.JPG
この加速度センサーはモジュール化されていて便利なのだが...固定がいい加減なことがある。今回利用したセンサーは写真の通り傾きまくっている。もう少し水平に取り付けてもらいたいものだ。

_DSC9039.JPG
センサーを水平にするとXとYが0g、Zが1.000gになるはずなのだが水平を出すのは難しい。適当に置いた状態でZは0.983gとなった。

センサーの出力値は5V電源のとき、2.5Vを中心に1000mV/gだけ変化する。つまり、出力電圧が2.5Vのとき0g、3.5Vのとき1g、1.5Vのとき-1gとなる。


カテゴリー「電子工作」 のエントリー