在數位電路中開關(switch)是一種基本的輸入形式,它的作用是保持電路的連接或者斷開。
Arduino從數位I/O pin接腳上只能讀出高電平(5V)或者低電平(0V),因此我們首先面臨到的一個問題就是如何將開關的開/斷狀態轉變成Arduino能夠讀取的高/低電平。解決的辦法是通過上/下拉電阻,按照電路的不同通常又可以分為正邏輯(Positive Logic)和負邏輯(Inverted Logic)兩種。
在正邏輯電路中,開關一端接電源,另一端則通過一個10K的下拉電阻接地,輸入信號從開關和電阻間引出。當開關斷開的時候,輸入信號被電阻“拉”向地,形成低電平(0V);當開關接通的時候,輸入信號直接與電源相連,形成高電平。對於經常用到的按壓式開關來講,就是按下為高,抬起為低。
在負邏輯電路中,開關一端接地,另一端則通過一個10K的上拉電阻接電源,輸入信號同樣也是從開關和電阻間引出。當開關斷開時,輸入信號被電阻“拉”向電源,形成高電平(5V);當開關接通的時候,輸入信號直接與地相連,形成低電平。對於經常用到的按壓式開關來講,就是按下為低,抬起為高。
為了驗證Arduino數位I/O的輸入功能,我們可以將開關接在Arduino的任意一個數字I/O接上(13除外),並通過讀取它的接通或者斷開狀態,來控制其它數位I/O接腳的高低。
本實驗採用的原理圖如下所示,其中開關接在數位I/O的12號接腳上,被控的發光二極管接腳在數位I/O的7到14號接腳上:
// I/O Pin12 = High 8 LED Flashing (all on , all off)
// I/O Pin12 = LOW 8 LED Alternately flashing 1 by 1
int BASE = 2;
int NUM = 8;
int index = 0;
int inpin=12;
int val;
void setup()
{
for (int i = BASE; i < BASE + NUM; i ++) {
pinMode(i, OUTPUT);
}
pinMode(inpin,INPUT);
}
void loop()
{
val=digitalRead(inpin);
if(val==LOW)
{ for (int i = BASE; i < BASE + NUM; i ++) {
digitalWrite(i, LOW);
}
digitalWrite(BASE + index, HIGH);
index = (index + 1) % NUM;
delay(100);
}
else
{
for (int i = BASE; i < BASE + NUM; i ++) {
digitalWrite(i, HIGH);
}
delay(100);
for (int i = BASE; i < BASE + NUM; i ++) {
digitalWrite(i, LOW);
}
delay(100);
}
}
沒有留言:
張貼留言