---
# System prepended metadata

title: Arduino
tags: [DIT 新生教學文件, DIT 12th 教學 -- 新生教學]

---

---
tags : DIT 12th 教學 -- 新生教學
---
<!-- {%hackmd @HungPin/Dark %} -->

# Arduino

![Arduino MEGA](https://i.imgur.com/8Uf2yER.png)

## <font color="FFC300">什麼是 Arduino？</font>
Arduino 是一塊基於開放原始代碼的 Simple i/o 平台，並且具有開放語言和開放環境都很簡單、易理解的特點，配合上一些電子元件使用，例如 LED 燈、蜂鳴器、按鍵、感測器、制動器等等，就可以讓我們快速地做出有趣的專案。Arduino 基於開放原始碼的原則，可以免費下載使用，減少開發的成本，令開發者可以創造出更多令人驚奇的互動作品。有興趣的可以到 [Arduino 官方網站](http://www.arduino.cc/) 進一步了解 Arduino 的美好之處。

## <font color="FFC300">性能 </font>
Arduino 有很多種開發版，像是 Arduino UNO、Arduino Mini 等等，每一種開發版都有自己的特色。

在這裡我們以 Arduino Mega 為例 : 

- **Digital I/O** : 輸入/輸出共 54 個，==其中有 15 個可以 PWM 輸出==
- **Analog I/O** : 輸入 15 個，==無類比訊號輸出==。
- **通訊** : 支援 UART、I2C、SPI 等等的通訊方式。
- **內部時鐘頻率** : 16 MHz
- **快閃記憶體** : 256 KB (這樣其實就很夠平常使用)
- **工作電壓** : 5V

## <font color="FFC300">開發環境 </font>
那要如何開發 Arduino 板呢? 我們可以利用程式碼，經過編譯並燒錄進 Arduino 後，就可以隨心所欲的控制 Arduino 了！要同時滿足這些需求，一個最普遍的方法就是使用 [Arduiono IDE](https://www.arduino.cc/en/software)，現在已經出到第二代。它提供編輯、解讀程式碼、檢查語法錯誤、燒錄程式碼等等的功能，讓你的開發流程便利不少。

## <font color="FFC300">通訊</font>
一台 Arduino 看起來功能非常齊全，似乎可以完成很多事，為什麼我們需要通訊? 它是拿做什麼的? 

有不同原因會需要使用到通訊，有可能是因為一台設備的記憶體不足，需要兩台設備的記憶體才能應付所需。但更常見的原因是為了讓**多台 Arduino 能夠互相溝通**。例如一個機器人有多個部件，而不同部件使用一個單獨的 Arduino 來控制，此時就會需要使用通訊來將他們串接起來，連接到一個控制中心，負責指揮各個部件現在該做些什麼。

### <font color="FFC300">UART 通訊</font>
其中一種通訊方式便是 UART，它的全名是 Universal Asynchronous Receiver / Transmitter。其中它的兩個腳位分別叫 Receiver, Transmitter，簡稱RX, TX。從名字來看，一個腳位負責接收，一個腳位負責傳送。也因此，兩台機器在使用 UART 通訊時，必須 ==RX-TX 交錯連接==，訊號才能正確傳遞。

## <font color="FFC300">[PWM](https://en.wikipedia.org/wiki/Pulse-width_modulation) 介紹</font>
一般來說訊號分為 **數位**、**類比** 兩種訊號。
- **數位訊號** （Digital） :==由 1、0 組成==，在 Arduino 當中就是高電位 （5V / 3.3V），還有低電位 (0V)。
- **類比訊號** （Analog） : 與只有 1、0 的數位訊號不同，類比訊號可以為==連續值==，而且可能會有非整數出現，但是 在 Arduino mega 中並沒有類比輸出 ( Analog output  ) 的功能。

![](https://i.imgur.com/z48wNzz.png)

Pulse Width Modulation （脈衝寬度調變） 是一種利用數位訊號模擬類比訊號的方式。以極快的速度在 1 與 0 之間做開關切換，藉由這種數位訊號高頻率的切換，並調整開關的時間比例，就可以模擬出我們需要的類比訊號。

這個開與關的比例有個專有名詞來描述它：==**工作週期( Duty Cycle )**==。其計算方式為**高電位持續時長/週期時長**。舉例來說，下面那張圖的 Duty Cycle 為  3/4 = 75%

<img src="https://hackmd.io/_uploads/S1KR8BE6n.png" alt="drawing" width="300"/>