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を求めらると思うのだけど、まだプログラムを作ってないから未確認なり?。