# Lesson 2:GPIO、電阻、UART [TOC] ## GPIO * **GPIO**( General-Purpose Input/Output) 可以用來連接周邊的電子零件或設備,並由使用者由程式控制作為 input, output, analog 等等 ![](https://i.imgur.com/xcoFIcc.png) * **函式介紹** * `pinMode(pin, mode)` : 設定 'pin' 腳的運作模式 `pinMode(pin, INPUT/OUTPUT); //設定 'pin' 腳為輸入或輸出` * `digitalRead(pin)` : 讀取 'pin' 腳輸入數值 `value = digitalRead(pin); //設定 'value' 為 'pin' 腳輸入的數位訊號` * `digitalWrite(pin, value)` : 設定 'pin' 腳輸出電壓 `digitalWrite(pin, HIGH/LOW); //設定 'pin'腳輸出高/低電壓` * **內建常數** * `INPUT/OUTPUT` : 用於`pinMode()`定義pin腳為輸入/輸出 * `HIGH/LOW` : pin腳輸出高(5V)/低(0V)電壓 * `LED_BUILTIN` : 內建 LED 燈(P7) ### Digital output **實作**:撰寫 blink 程式去控制內建 LED 開關 > pinMode(), digitalWrite(), delay() ```c++ void setup() { pinMode(LED_BUILTIN, OUTPUT); //設定 'P7' 為輸出 } void loop() { digitalWrite(LED_BUILTIN, HIGH); //打開LED燈 delay(1000); //暫停1秒 digitalWrite(LED_BUILTIN, LOW); //關閉LED燈 delay(1000); } ``` **實作**:撰寫 blink 程式去控制其他腳位的外接 LED(需 LED、220Ω 電阻) > pinMode(), digitalWrite(), delay() ```c++ int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); //設定 'ledPin' 為輸出 } void loop() { digitalWrite(ledPin, HIGH); //打開LED燈 delay(1000); //暫停1秒 digitalWrite(ledPin, LOW); //關閉LED燈 delay(1000); } ``` * **Delay** * `delay(ms)` : 暫停 'ms' 毫秒 * `delayMicroseconds(us)` : 暫停 'us' 微秒 * **發光二極體** ( Light-Emitting Diode, LED) * LED具有極性,長腳為陽極(Anode)、短腳為陰極(Cathod)。 * 陽極需接電源端($+$)、陰極需接接地端($-$)。 ![](http://electronicsforu.com/wp-contents/uploads/2016/12/IR-LED.jpg =250x) * **如何判讀電阻的歐姆數** * 四色電阻 : $(第一色*10+第二色)*第三色(倍數)$ * EX : 電阻色碼為:[紅、紅、棕、金],則電阻值為: $(2*10+2)*10^1 = 220Ω$ 誤差$5$% * 五色電阻 : $(第一色*100+第二色 *10+第三色)*第四色(倍數)$ ![](https://3.bp.blogspot.com/-3w1xqMIU4r0/VssCMbgNcEI/AAAAAAAHBms/UZe3Fh2HGIo/s0/phpwWQrjG =500x) * **麵包板** ( BreadBoard) * 上下兩排橫向導通 ; 中間直向導通 ![](https://i1.kknews.cc/large/119b000627d617805ff0 =700x) * **接線圖** ![](https://scontent-tpe1-1.xx.fbcdn.net/v/t34.0-12/22091530_1861551267195626_387595322_n.png?oh=091fcf0d6b4ae539b1b29bd4b610e8e6&oe=59CDD3F7 =400x) ### Digital input * **實作**:用按鈕去控制 LED 的明暗(需按鈕、LED燈、10KΩ 電阻、220Ω 電阻) > pinMode(), digitalRead() ```c++ int ledPin = 13; int buttonPin = 2; void setup() { pinMode(ledPin, OUTPUT); //設定 'ledPin' 為輸出 pinMode(buttonPin, INPUT); //設定 'buttonPin' 為輸入 } void loop() { if (digitalRead(buttonPin) == HIGH) //讀取 'buttonPin'是否輸入HIGH(5V) { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); } } ``` * **Switch** * 開關可使電路形成開路(Open),電路不導通 ; 也可使電路形成閉路(Close),電路導通 * 兩支兩支互通,按下後四支互通 ![](http://example.oxxostudio.tw/it2016/it2016-day10-04.jpg =300x) * **電阻在按鈕電路中的作用**(pull-down/pull-up resistor) * 希望腳位讀取的值能維持在穩定的電壓值(1 or 0),pull-down/pull-up resistor就是用來維持基準電壓的 * 上拉電阻(pull-up) : 將不穩定的信號拉至高電位,電阻連接在 + 或 VCC端 * 下拉電阻(pull-down) : 將不穩定的信號拉至低電位,電阻連接在 - 或 GND端 * 電阻值 : 官方建議在10K ohm ![](http://www.christec.co.nz/wp-content/uploads/2007/07/pullup-configurations.PNG =700x) * **接線圖** ![](https://scontent-tpe1-1.xx.fbcdn.net/v/t34.0-12/22052688_1861551270528959_1377348061_n.png?oh=3170f581be5cd92163776fd853bd0727&oe=59CDE42D =700x) * 進階:用按鈕去切換多個 LED 的狀態(跑馬燈等) ## UART * (Universal Asynchronous Receiver/Transmitter)非同步收發傳輸器 * USB-to-UART ![](https://i.imgur.com/6DsmOhM.png) ![](https://i.imgur.com/OdtmM1H.png) * Baud rate是單位時間內傳輸資訊的個數,單位bits/sec。非同步傳輸裡,傳送端與接收端必需選擇相同的傳輸速率(1200, 2400, 4800, 9600等等) ### Serial library * 7697要跟電腦通訊的時候,使用 Serial 指令 * Serial port 使用 TX (pin 1) 跟 RX (pin 0) 這兩個腳位來傳送與接收資料。 * 實作 : 接收PC的輸入 ```C++ char receive_num; void setup() { Serial.begin(9600); //設定baud rate Serial.println("Send number"); } void loop() { if(Serial.available() > 0){ //有收到數值時,會回傳>0的值 receive_num=Serial.read(); //讀取接收到資料的第一個位元組 Serial.print("recive:"); Serial.println(receive_num); } } ``` 點開序列埠監控視窗 ![](https://i.imgur.com/HYj3bMH.png) ![](https://i.imgur.com/8h5P3fT.png)