SSブログ

加速度センサー [Arduino]

下記プログラムは、キャリブレーション機能が動作しません。
プログラムのおかしなところをご教授願いたくコメント頂けないでしょうか?
お願い致します。m(__)m



/*
----------<2017.12.03>---------------------------------------------
・File name: _07_LCD_kasokudo.ino
・3軸加速度センサモジュール LIS3DHを用いLCDに傾斜角度を表示する
・PCのシリアルモニタには、ADC値、傾斜角度を表示する。
----------<2017.12.17>-------------------------------------------
・Cal機能追加
-----------------------------------------------------------------
*/
/*
----------------------------------------------------------
LiquidCrystal(rs, enable, d4, d5, d6, d7) 
LiquidCrystal(rs, rw, enable, d4, d5, d6, d7) 

rs(レジスタ選択):  LCDのRSピンに接続するArduino側のピン番号♯12 
rw(読み書き):  LCDのRWピンに接続するArduino側のピン番号♯11 
enable(動作起動信号):  LCDのenableピンに接続するArduino側のピン番号♯10 
d0~d7(データ):  LCDのdataピンに接続するArduino側のピン番号 
d0~d3はオプションで、省略すると4本のデータライン(d4~d7)だけで制御します
-------------------------------------------------------------------------
*/

#include   //LCDシリアル通信
LiquidCrystal lcd(12,11,10, 5, 4, 3, 2);  //LCD、アルディーノ接続

const int analogInPinX = A0;    // X軸アナログ入力ピン(定数)
const int analogInPinY = A1;    // Y軸アナログ入力ピン(定数)
const int analogInPinZ = A2;    // Z軸アナログ入力ピン(定数)

static int cal_x=0,cal_y=0,cal_z=0; //cal値

void setup()
{
  lcd.begin(16,2);         //LCDの行と桁数の設定
  Serial.begin(9600);      // シリアルモニタを開始

  pinMode(6,INPUT); 
}

void loop()
{
  int i;
  long x = 0, y = 0, z = 0;    // AD値
  for (i=0; i < 50; i++) {     // 値を50回取得し、平均化する
    x += analogRead(analogInPinX) ; // X軸
    y += analogRead(analogInPinY) ; // Y軸
    z += analogRead(analogInPinZ) ; // Z軸
  }
  x /=  50 ;
  y /=  50 ;
  z /=  50 ;

  int rotateX = (x-277)/2.48 - 90 + cal_x ; //角度を求める式
  int rotateY = (y-277)/2.48 - 90 + cal_y  ;
  int rotateZ = (z-277)/2.48 - 90 + cal_z  ;


  //cal  
  while (digitalRead(6) == LOW) {
  int cal_x = -rotateX ; 
  int cal_y = -rotateY ;
  int cal_z = -rotateZ ;

  int rotateX = rotateX + cal_x ; 
  int rotateY = rotateY + cal_y ;
  int rotateZ = rotateZ + cal_z ; 
  
  }


// PCシリアルモニタ表示 ------------------------------
  Serial.print("X:") ;  
  Serial.print(x) ;
  Serial.print(", ") ;
  Serial.print(rotateX) ;
  Serial.print((char) 223); 
  Serial.print("    Y:") ;
  Serial.print(y) ;
  Serial.print(", ") ;
  Serial.print(rotateY) ;
  Serial.print((char) 223);
  Serial.print("    Z:") ;
  Serial.print(z) ;
  Serial.print(", ") ;
  Serial.print(rotateZ) ;
  Serial.print((char) 223); 
  Serial.println() ;
  delay(500) ;

// LCD表示 --------------------------------------------
  lcd.clear();
  lcd.setCursor(1, 0); //カーソルを1桁、0行目にセット
  lcd.print("X:");     //X傾斜角
//lcd.print(x) ;
//lcd.print(", ") ;
  lcd.print(rotateX) ;
  lcd.print((char) 223); //°表示

  lcd.setCursor(9, 0); //カーソルを7桁、0行目にセット
  lcd.print("Y:") ;    //Y傾斜角
//lcd.print(y) ;
//lcd.print(", ") ;
  lcd.print(rotateY) ;
  lcd.print((char) 223); //°表示

  lcd.setCursor(1, 1); //カーソルを1桁、1行目にセット
  lcd.print("Z:") ;    //Z傾斜角
//lcd.print(z) ;
//lcd.print(", ") ;
  lcd.print(rotateZ) ;
  lcd.print((char) 223); //°表示
  delay(500);

}


nice!(0)  コメント(0) 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。