2013年1月26日 星期六

智慧生活系統設計課程"Final"




"揮動手控制音量耳罩式耳機"

原本是打算用伺服馬達來轉可變電阻達到音量調整,後來覺得這方法機構真的很大,而且感覺是個蠢方法........,所以在網路上找了些資料,有些 IC 似乎是可以拿來試試,但沒有時間試了 (一大堆事情......) ,後來找元件的時候突然看到了 "光耦合 IC " ,就這麼突然靈光乍現,想把光敏電阻和 LED 燈結合作成一個元件,上網查查國外有相關的元件可以買,台灣的網站找了很久都沒有人賣,只好自己土炮了!
圖一、光敏電阻和 LED 結合成的原件
元件都決定好了來畫電路圖、接麵包板、洗電路板..........!
圖二、電路圖
圖三、成品圖
Conclusion:

  1. 元件可以再使用 SMD 可以在更小化。
  2. 目前是使用 PWM 來控制 LED 測試的時候會有雜音,最後是加上100uF的電容來達到濾波的效果,雜音是不見了 ( 因該是不懂音樂的我聽不出來 ),如果要更完美就要再找方法或試試音量控制 IC 。
  3. 這次用 Arduino 來做事有點大將砍小兵,可以換用類似8051之類的單晶片來做。
  4. BOSS說:未來可以改進以上幾點和其他 ( 如:可以改變手勢,更直覺式的手勢 ),查查中華明國專利,若沒有相關專利,可以試試寫專利,趕在9月多的發明展。(第一次被這樣肯定,好怪,不過這很累人啊!)

程式碼:
int brightness=167;                  //led亮度
int i=4;                             //初始音量
int level[9]={127,140,147,157,167,177,187,217,255};    //音量分為9個層級
//腳位定名
const int ir1_signal = 22;
const int ir2_signal = 24;
const int led1 = 26;
const int led2 = 28;
int control_led = 9;

int ir1_state ;                       //ir1狀態
int ir2_state ;                       //ir2狀態
int r=0;                              //判斷條件重置
int step1_ir1,step2_ir1,step1_ir2,step2_ir2;    //判斷條件

void setup()
{
  //IR為輸入
  pinMode(ir1_signal,INPUT);
  pinMode(ir2_signal,INPUT);
  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(control_led,OUTPUT);
}

void loop()
{
  //ir1和ir2的狀態讀取
  ir1_state = digitalRead(ir1_signal);  
  ir2_state = digitalRead(ir2_signal);

  //led目前亮度
  brightness=level[i];
  analogWrite(control_led, brightness);

  //設定時間  重置判斷條件
  if(r>=19999){
    step1_ir1=0;
    step2_ir1=0;
    step1_ir2=0;
    step2_ir2=0;
    r=0;
  }else{
    r++;
  }

  /*判斷ir1或ir2哪個先遮斷
    如果ir1被遮斷 step1_ir1=1
    如果ir2被遮斷 step1_ir2=1*/
  if(ir1_state == LOW && ir2_state == HIGH){
    step1_ir1=1;
  }else if(ir2_state == LOW && ir1_state == HIGH){
    step1_ir2=1;
  }

  /*判斷遮斷物是否已經過ir1或ir2
    如果已經過 step2_ir1=1
    如果已經過 step2_ir2=1*/
  if(ir1_state == HIGH && step1_ir1==1 ){
    step2_ir1=1;
    step2_ir2=0;
  }else if(ir2_state == HIGH && step1_ir2==1){
    step2_ir2=1;
    step2_ir1=0;
  }

  /*判斷第2個是否被遮斷
    如果有再加上step1和step2條件都成立 則執行音量增減動作*/
  if(ir2_state == LOW && step1_ir1==1 && step2_ir1==1){

    digitalWrite(led1,HIGH);      //測試燈亮
 
    //音量增加控制
   if(i<=7){
      i++;
    }else{
      i=8;
    }
 
    //判斷條件歸零
    step1_ir1=0; step2_ir1=0; step1_ir2=0; step2_ir2=0; r=0;
    delay(500);
 
  }else if(ir1_state == LOW && step1_ir2==1 && step2_ir2==1){
 
    digitalWrite(led2,HIGH);      //測試燈亮
 
    //音量減少控制
    if(i>=1){
      i--;
    }else{
      i=0;
    }
 
    //判斷條件歸零
    step1_ir1=0; step2_ir1=0; step1_ir2=0; step2_ir2=0; r=0;
    delay(500);
 
  }else{
    digitalWrite(led2,LOW);
    digitalWrite(led1,LOW);
  }

}