# Arduino
## 6.1 極客的玩具
Arduino,是一個開放源代碼的單芯片微電腦,它使用了Atmel AVR單片機,采用了基于開放源代碼的軟硬件平臺,構建于開放源代碼 simple I/O 接口板,并且具有使用類似Java,C 語言的Processing/Wiring開發環境。
Arduino開發板封裝了常用的庫到開發環境中,可以讓用戶在開發產品時,將主要注意力放置于所需要實現的功能上,而不是開發的過程中。在為Arduino寫串口程序時,我們只需要用Serial.begin(9600)以9600的速率初始化串口,而在往串口發送數據時,可以用Serial.write('1')的方式向串口發送字串'1'。
Arduino的出現很大程度上降低了電子制作的難度,初學者甚至不懂編程也可以上手Arduino,這也是它的魅力所在。
## 6.2 硬件熟悉
為了滿足各種需求,Arduino團隊設計了很多款開發板,如UNO、Pro mini、Mega2560、Due、Leonardo、Yún、Pro、Fio、Nano等十幾種 開發板和擴展板。最適合初學者的一款是Arduino UNO 。下圖是Arduino UNO 的外觀圖:

注:后面的程序也是基于Arduino UNO開發板來講解。
## 6.3 開發環境

開發環境如上圖,十分簡潔,編寫代碼需要知道兩個基本的函數:
~~~
void setup(){
}
void loop(){
}
~~~
`setup()`函數用于初始化(如GPIO初始化,串口初始化,定時器初始化等)特點是只執行一次;`loop()`函數是一個死循環,可以看做C語言的`while(1)`函數。
## 6.4 點亮一個LED
對初學者來說,點亮led已成為入門必修課,使用Arduino控制led十分簡單,并且很容易理解。 使用到的函數:
* pinMode(pin,mode)
* digitalWrite(pin,value)
上一段代碼分析:
~~~
int led=13;
void setup()
{
pinMode(led,OUTPUT);
}
void loop()
{
digitalWrite(led,HIGH);
delay(1000);
digitalWrite(led,LOW);
delay(1000);
}
~~~
該程序實現Arduino單片機13號引腳以1S時間電平翻轉,如果外接一個led,就可以看到led以1S的間隔閃爍;函數`pinMode()`有兩個參數pin、value,pin參數用來指定引腳號,本程序中設置為13號引腳,mode用于設置引腳模式,有三個值:
* `INPUT`
* `OUTPUT`
* `INPUT_PULLUP`
表示讓某一個IO引腳作輸入,反之,
* `OUTPUT`則使一個IO引腳做輸出
* `INPUT_PULLUP`則配置一個IO引腳具有上拉輸入功能(上拉電阻的目的是為了保證在無信號輸入時輸入端的電平為高電平),從英文意思也能很直觀的看出來。
理解了`pinMode()`函數,`digitalWrite()`就很容易理解啦,value的取值有兩個`HIGH`、`LOW`,`HIGH`表示讓某一個引腳輸出高電平,反之,`LOW`則使某一個引腳輸出低電平。 程序中還是用到`delay(ms)`函數,它表示延時多少毫秒,例如延時500 ms ,直接調用`delay(500);`就可以了。
如果你仔細查看我的描述,你會發現我沒有講13號引腳怎么來的,是這樣的:Arduino團隊為了簡化對引腳描述,對每個引腳都進行了編號,以UNO開發板為例,可以發現開發板排座的附近有對應的白顏色的數字,那便是所有的引腳編號,A0~A5是6路ADC輸入引腳,0-13表示13路基本IO,數字前面的`~`表示該引腳具有PWM功能。如果要使用某一引腳,只需要知道引腳編號就可編寫相應代碼進行操作。
例如`digitalWrite(2,LOW)`表示向2號引腳輸出低電平。其他操作類似,是不是so easy ^-^ !
## 6.5 串口通信
使用到的基本函數:
* Serial.begin()
* Serial.write()
* Serial.read()
* Serial.available()
在此項目中需要使用串口,Arduino串口初始化使用`Serial.begin(9600);`,其傳輸波特率為9600,其他波特率也行,函數位于`setup()`中,之后可以使用`Serial.read()`、`Serial.write()`讀入一個字符,輸出一個字符,使用`Serial.print()`輸出字符串.代碼如下:
~~~
char ch='1';
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.write(ch);
while(1)
{
if(Serial.available())
{
ch = Serial.read();
Serial.print(ch);
}
}
}
~~~
以上程序實現字符的輸出(Serial.write(),Serial.print())和讀入(Serial.read())。如果需要了解更多,可以參考:[Arduino官網](http://www.ituring.com.cn/tupubarticle/www.arduino.cc)
### 6.5.1 關于Arduino Setup()
如果你對Arduino的Setup很疑惑的話,可以看看這里。下面Arduino源碼目錄中的main函數:
~~~
#include <Arduino.h>
int main(void)
{
init();
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
~~~
