F1風G Force Meter模索・・・
久しぶりに脳みそ使った気がした?
F1で使用されているG Forceメーターを作るには・・・
3軸加速度センサーから重力方向、最大重力を求める必要がある?。
3軸加速度センサーのX方向は左右、Y方向は前後、Z方向は上下の重力として取り扱う(校正機能を入れない場合センサー設置位置は非常に重要)?。
まず3軸加速度センサーからX、Y、Z方向の重力を求めるにはデータシート通りにプログラムを作れば簡単に求められる?。
シンプルに秋月さんのarduino用のサンプルCコードを使えば楽にX, Y, ZのG Force値を取り出せるよ~?。
/* -------------------------------------------------- *
/ G Force Meter Program *
* -------------------------------------------------- *
* CPU: Arduino UNO CPU Board *
* C Compiler: *
* File Name: Akitsuki Sample Code *
* Author: March *
* Created: 2018/07/03 *
* URL: http://ak12-march.is-best.net/ *
/ --------------------------------------------------- */
#include <Wire.h>
/* ----------------------------------------- */
/* Define */
/* ----------------------------------------- */
#define MMA8452_ADRS 0x1D
#define MMA8452_OUT_X_MSB 0x01
#define MMA8452_XYZ_DATA_CFG 0x0E
#define MMA8452_CTRL_REG1 0x2A
#define MMA8452_CTRL_REG1_ACTV_BIT 0x01
#define MMA8452_G_SCALE 2
/* ----------------------------------------- */
/* Variabal */
/* ----------------------------------------- */
/* ------------------------------------------------------ */
/* Program Codes */
/* ------------------------------------------------------ */
/* ----------------------------------------- */
/* MMA8452 Data Read Byte Program */
/* ----------------------------------------- */
byte MMA8452_ReadByte( byte adrs )
{
Wire.beginTransmission( MMA8452_ADRS );
Wire.write( adrs );
Wire.endTransmission( false );
Wire.requestFrom( MMA8452_ADRS, 1 );
while( !Wire.available( ) );
return ( Wire.read( ) );
}
/* ----------------------------------------- */
/* MMA8452 Data Read Byte Array Program */
/* ----------------------------------------- */
void MMA8452_ReadByteArray( byte adrs, int datlen, byte *dest )
{
Wire.beginTransmission( MMA8452_ADRS );
Wire.write( adrs );
Wire.endTransmission( false );
Wire.requestFrom( MMA8452_ADRS, datlen );
while( Wire.available( ) < datlen );
for( int x = 0; x < datlen; x++ ) { dest[ x ] = Wire.read( ); } } /* ----------------------------------------- */ /* MMA8452 Data Read Write Program */ /* ----------------------------------------- */ void MMA8452_WriteByte( byte adrs, byte dat ) { Wire.beginTransmission( MMA8452_ADRS ); Wire.write( adrs ); Wire.write( dat ); Wire.endTransmission( false ); } /* ----------------------------------------- */ /* Cpu Init Program */ /* ----------------------------------------- */ void setup() { byte tmp; // I2C初期化 Wire.begin( ); // 3軸加速度センサー初期化 tmp = MMA8452_ReadByte( MMA8452_CTRL_REG1 ); MMA8452_WriteByte( MMA8452_CTRL_REG1, tmp & ~(MMA8452_CTRL_REG1_ACTV_BIT) ); MMA8452_WriteByte( MMA8452_XYZ_DATA_CFG, (MMA8452_G_SCALE >> 2) );
tmp = MMA8452_ReadByte( MMA8452_CTRL_REG1 );
MMA8452_WriteByte( MMA8452_CTRL_REG1, tmp | MMA8452_CTRL_REG1_ACTV_BIT );
}
/* ----------------------------------------- */
/* Main Loop Program 14340us */
/* ----------------------------------------- */
void loop()
{
byte buf[ 6 ];
float g_Force[ 3 ];
MMA8452_ReadByteArray( MMA8452_OUT_X_MSB, 6, buf );
// G Force X:g_Force[0] | Y:g_Force[1] | Z:g_Force[3]
g_Force[ 0 ] = ( float( ( int( buf[ 0 ] << 8) | buf[ 1 ] ) >> 4 ) / ( ( 1 << 11 ) / MMA8452_G_SCALE ) );
g_Force[ 1 ] = ( float( ( int( buf[ 2 ] << 8) | buf[ 3 ] ) >> 4 ) / ( ( 1 << 11 ) / MMA8452_G_SCALE ) );
g_Force[ 2 ] = ( float( ( int( buf[ 4 ] << 8) | buf[ 5 ] ) >> 4 ) / ( ( 1 << 11 ) / MMA8452_G_SCALE ) );
}
上記コードの浮動小数点変数のg_Force[ 0 ]、g_Force[ 1 ]、g_Force[ 2 ]に重力G force値が入ってます??。
ここからF1風なゲージのようにどの方向(角度)に最大重力が発生しているか求めるのは以下でいけるかな?!?。
X方向、Y方向、Z方向の重力G値がわかっているので、底辺X、高さYの値としてtan θ=(X / Y)を求める?。
そして逆三角関数のアークタンジェントなatan( tanθ )にてラジアン値radに変換し、rad*(180/3.1415926535897932384626433832795)で角度に変換すれば、重力方向(角度)が求められるはず?。
そして最大重力値のX値、Y値が負の場合は正の値として変換してから √( X^2 + Y^2 ) すれば、Max G Forceを求めらると思うのだけど、まだプログラムを作ってないから未確認なり?。
ディスカッション
コメント一覧
まだ、コメントがありません