LineTracer

Created Date: 2014-12-16/ updated date: 2018-03-13
    Owner & Collaborators
    License
    LineTracer by risaHiyama is licensed under the Creative Commons - Attribution license.
    Summary
    線を辿りながら、色を感知して音を出す、ミニカーを作っています。

    Memo

    Color Senserを使ってピエゾを鳴らしてみた。

    posted by risaHiyama on December 16, 2014
    #define RANGE 8 // 8番ピンをRange端子に設定
    #define GATE  9 // 9番ピンをGate端子に設定
    #define CK   10 //10番ピンをCK端子に設定
    #define DOUT 11 //11番ピンをDout端子に設定

    #define BEAT 300   // 音の長さを指定
    #define PINNO 12   // 圧電スピーカを接続したピン番号

    int red,green,blue;//RGB三色の変数を用意

    void setup(){
      //Range,Gate,CK端子をデジタル出力に設定
      pinMode(RANGE,OUTPUT);
      pinMode(GATE,OUTPUT);
      pinMode(CK,OUTPUT);
      //Dout端子をデジタル入力に設定
      pinMode(DOUT,INPUT);
      //シリアル通信設定
      Serial.begin(9600);
    }

    void loop(){
      //測光時間用の可変抵抗器の読み込み(アナログ入力:0番ピン)
      int val=analogRead(0);

      //Gate,CK端子をLowに設定
      digitalWrite(GATE,LOW);
      digitalWrite(CK,LOW);
      delayMicroseconds(2000);//2000マイクロ秒待機

      //感度設定(HIGH:高感度に設定)  
      digitalWrite(RANGE,HIGH);

      //測光開始(光量の積算を開始) 
      digitalWrite(GATE,HIGH);
      //測光時間(valを代入し可変的に設定)
      delay(val+1);
      
      //測光終了(光量の積算を終了) 
      digitalWrite(GATE,LOW);
      delayMicroseconds(4);//4マイクロ秒待機
      
      red=shiftIn();//赤の処理
      green=shiftIn();//緑の処理
      blue=shiftIn();//青の処理

      //Gate端子をHighに戻す  
      digitalWrite(GATE,HIGH);
      
      //ピエゾを鳴らす
      if(red>3000){
         tone(PINNO,red/10,BEAT) ;  
      }

      //シリアル通信でProcessingへ三色の値を文字列で送信  
      if(Serial.available()>0){
        Serial.print(red,DEC);
        Serial.print(",");
        Serial.print(green,DEC);
        Serial.print(",");
        Serial.println(blue,DEC);
        Serial.read();
        
      }
    }

    //12ビット分のパルス送信と読み込み処理
    int shiftIn(){
      int result=0;//検出結果用の変数を用意(0:初期化)
      for(int i=0;i<12;i++){//12ビット分の繰り返し処理
        digitalWrite(CK,HIGH);//1ビット分のクロックパルス出力(HIGH)
        delayMicroseconds(1);//1マイクロ秒待機
        if(digitalRead(DOUT)==HIGH){//Dout端子からの出力がHighの場合
          result+=(1<<i);//12ビットのi桁目に1を代入(i桁分だけ左にシフト)
        }
        digitalWrite(CK,LOW);//1ビット分のクロックパルス出力(LOW)
        delayMicroseconds(1);//1マイクロ秒待機
      }
      delayMicroseconds(3);//3マイクロ秒待機
      return result;//結果を出力
    }

    Comments