2015年9月16日水曜日

アナログ ライントレースセンサー サンプルスケッチ


【概要】
センサー:QTR-8A フォトリフレクタアレイ
センサーモジュールには8つのフォトリフレクタが付いているが、UNO互換ボードのアナログポートの8つのうちKEY用に1つ使っているため、7つのフォトリフレクタを使用。






 
//****************************************
//7ポート分のアナログ入力値をシリアルポートとLCDに一定時間毎に出力
//シリアルには0から1023までの数字が半角スペースを伴って7つ出力される。
//例)  556 755 100 234 567 890 1023
//LCDには2桁に圧縮された値が表示される
//
//****************************************

//地面とセンサーの距離により値がかなり変わる
//左右端のセンサー値はそれ以外より大きな値になる。
//地面に平行でない場合、左右で値が変わる(角度センサーに使えそう)
//個々のセンサー値に個体差があるようだ
//
//


#include <MsTimer2.h>   // timer interrupt
#include <LiquidCrystal.h>
LiquidCrystal lcd(8,9,4,5,6,7); //lcdタイプの変数を定義

//初期設定*********************************
void setup() {
  
  MsTimer2::set(100, AnalogIn);   //タイマー100ms period
  MsTimer2::start();               //タイマースタート
  //アナログピンは自動的に入力となるので、設定不要。
  Serial.begin(115200);            //Serial Portを設定
  lcd.begin(16, 2);                  // LCD 行と列を設定
}

//メインループ******************************
void loop() {                      
  
}

//タイマー割り込み処理***********************
void AnalogIn() {
   int i;
   long val[8];
   String strVal[8];
   
   //1からまで7のアナログポートを読む
   for (i=1;i<=7;i++) {          
    val[i] = analogRead(i);           
   }
   
   //AD値をシリアルポートに出力
   for(i=1;i<=7;i++){
    Serial.print(" "+String(val[i]));
   }
   Serial.println();   //7つのポート出力をしたら、改行コードを出力

   //AD値をLCDに表示

   //数値を文字列2桁にする
   for(i=1;i<=7;i++){
    val[i]= val[i]*100/1024;   //0-99の値にする
    strVal[i]=String(val[i]);  //文字にする
    if (strVal[i].length()==1) {  //一桁なら前にスペースをつける
      strVal[i]=" " + strVal[i];
    }
   }
   //1行目 (AD1,AD3,AD5,AD7)  
   lcd.home();            
   for(i=1;i<=7;i+=2){
    lcd.print(strVal[i] + "  ");
   }
   //2行目 (AD2,AD4,AD6)
   lcd.setCursor(2,1);
   for(i=2;i<=6;i+=2){
    lcd.print(strVal[i] + "  ");
   }


}

0 件のコメント:

コメントを投稿