1. 程式人生 > >Arduino基礎入門四:數字IO口作為輸入

Arduino基礎入門四:數字IO口作為輸入

一、器件介紹

   按鍵常用在電子控制線路中作為輸入,有自鎖式(按下按鈕,開關狀態發生改變,並保持改變後的狀態,直到下次按鈕按下才再次開關改變)和非自鎖按鈕(按下按鈕時,改變開關狀態,鬆開回到原狀態)兩類。
   本課程採取四腳輕觸開關,屬於非自鎖按鈕。四腳輕觸開關由常開觸點、常閉觸點組合而成,在四腳輕觸開關中,常開觸點的作用,就是當壓力向常開觸點施壓時,這個電路就呈現接通狀態;當撤銷這種壓力的時候,就恢復到了原始的常閉觸點,也就是所謂的斷開。這個施壓的力,就是用我們的手去開按鈕、關按鈕的動作。

    

二、硬體介紹

1、典型電路:      按鍵作為輸入,需要將按鍵狀態的改變轉化為電訊號的變化,才能被Arduino識別。典型電路如圖所示。
   
   當Arduino數字IO口作為輸入,其輸入阻抗為高阻狀態,可以認為輸入對地電阻無窮大。    所以,當S開關斷開時,根據歐姆定律Vout≈Vcc=1。當S合上時,Gnd和Vout短接,此時點位相通,Vout=Gnd=0。綜上可以把開關狀態轉變為Arduino識別的高低電平,電阻R稱為上拉電阻,用於保護S閉合時,Vcc和Gnd短路。 2、按鍵消抖:

   由於按鍵為機械式彈簧開關,當機械觸點斷開、閉合時,由於機械觸點的彈性作用,導致觸點不會馬上穩定的接通,所以在使用彈簧時,一般需要消抖,去除彈性作用照成的外部干擾。抖動時間由按鍵的機械特性所決定,一般為5ms~10ms。所以我們在做按鍵檢測時都要加一個消抖的過程。

    

按鍵消抖方式:分為軟體消抖和硬體消抖。
     軟體消抖:利用抖動時間,降低取樣頻率,錯開抖動時的不穩定狀態。缺點:程式效率低下,因為程式需要等待 按鍵穩定,照成CPU資源浪費;優點:硬體簡單。
   硬體消抖:a、在按鍵訊號輸出端並上電容,電容作為儲能元件,具有電容兩端的電壓不能突變的特性,選取合適容值的電容,通過電容的充放電時間消除抖動照成的不穩定。

   
   b、在有三端常開常閉觸點的按鍵中,可以採用RS觸發器進行消抖。參考:  

         c、外接專用的按鍵消抖晶片(比如MAX16054),在對按鍵抖動要求高的場合使用,但是成本會大大加大。

3、例程電路:


三、軟體介紹

   本例程中採取軟體消抖,按鍵每按下一次,LED亮滅狀態發生一次翻轉。
#define LED_PIN 13     //巨集定義LED引腳
#define KEY_PIN 12     //巨集定義按鍵引腳
char ledMode=0;        //定義LED亮滅的模式
void setup() 
{
 pinMode(LED_PIN,OUTPUT);         //LED初始化
 pinMode(KEY_PIN,INPUT);          //按鍵初始化
}

void loop() 
{
  if(digitalRead(KEY_PIN)==0)                //當按鍵按下,進入檢測
   {
      ledMode=ledMode^1;                     //按鍵按下,讓ledMode和1進行異或運算,使ledMode進行取反。
      digitalWrite(LED_PIN,ledMode);         //將取反的ledMode變數送入LED燈引腳狀態中
      delay(25);                             //按鍵按下延時消抖25ms
      while(!(digitalRead(KEY_PIN)));        //一直迴圈,直到按鍵釋放,跳出死迴圈
      delay(25);                             //按鍵鬆開延時消抖25ms
    }
}
語言知識點簡要:自行搜尋相關資料 1、變數型別     char(字元)、int(整型)、float(浮點型)、double(雙精度)。 2、修飾符     char和int又分為有符號signed(有正負,首位為正負位)和無符號unsigned(全≥0),預設為有符號。     int又分為長整型(long)和短整型(short)。 3、變數範圍及在記憶體中的表示。 4、邏輯運算:與、或、非、異或。 5、if語句:判斷語句 6、while語句:條件迴圈語句
、思考以下情況    1、當把初始化函式改為以下程式碼,可以將以上典型電路進行如何優化?
void setup() 
{
 pinMode(LED_PIN,OUTPUT);         //LED初始化
 pinMode(KEY_PIN,INPUT_PULLUP);   //按鍵初始化
}

         2、試著用其他方式的思維,更改程式碼,實現例程相同效果。