作者:HelloGitHub-Anthony
你是否想過成為一名 Geek,就像「野生鋼鐵俠」稚暉君那樣自己能做出各種新奇有趣的電子裝置,但卻不知道從哪裡入手、如何開始?今天我們不聊嵌入式、電路板、微控制器原理,直接上手開始搞!
我認為對於零基礎的電子愛好者來說,一塊容易上手的開發板至關重要。否則複雜的安裝步驟和偵錯流程就能把最初的熱情消失殆盡,從而還沒看到一個成品就放棄了。所以,今天 HelloGitHub 帶來的 Arduino 就是一個非常容易上手的開源硬體平臺:
該專案包含 開發板(例如 Arduino UNO)和 軟體(Arduino IDE)兩部分,而且它擁有完善的中文社群和大量開源專案的範例,讓你遇到問題很容易就能找到解決辦法,想做專案也有完整的程式碼和專案可以參照。
我當年在 C 語言都不是很熟練的情況下,只花了一天時間就能跟著教學用 Arduino 實現一些比較花哨的功能,由此足以見得 Arduino 真的非常適合作為電子愛好者的第一塊開發板。
下面我將通過:聞道(入門)、見道(上手)、入道三部分,幫助零基礎的電子愛好者快速入門 Arduino,開啟你的「鋼鐵俠」之旅。
Arduino 到目前為止有很多種類的開發板,我這裡推薦大家使用 UNO 作為您的第一塊開發板。原因有以下幾點:
截止目前,市面上常見的 UNO 開發板為 UNO R3 開發板如圖所示:
Arduino UNO R3 使用一根傳輸線連線電腦即可實現 供電、程式設計、通訊 等功能。
硬體詳細引數 | |
---|---|
微控制器 | ATmega328P |
工作電壓 | 5 伏特 |
輸入電壓(推薦) | 7-12 伏特 |
輸入電壓(極限) | 6-20 伏特 |
數位輸入輸出引腳 | 14 個 |
PWM 引腳 | 6 個 |
模擬輸入引腳 | 6 個 |
輸入/輸出引腳直流電流 | 20 毫安 |
3.3V 引腳電流 | 50 毫安 |
Flash Memory(快閃記憶體) | 32 KB (ATmega328P) 其中有 0.5 KB 用於系統引導 |
SRAM(靜態記憶體) | 2 KB (ATmega328P) |
時脈頻率 | 16 MHz |
EEPROM | 1 KB (ATmega328P) |
內建 LED 引腳 | 13 |
長 | 68.6 mm |
寬 | 53.4 mm |
重 | 25 克 |
不要驚訝於開發板相比電腦竟然只有如此有限的資源,對於嵌入式來講這個引數足以適用於絕大多數場合。充足的電壓輸入範圍可以讓裝置使用包括電腦 USB 介面、乾電池、充電寶等多種方式供電而不會被燒燬。
關於購買方式,可以去各大電商平臺通過關鍵字「Arduino UNO R3」就能找出一大堆。
你可以選擇直接買套餐也可以自己買板子和然後根據需求購入的配件,買套餐的話圖個省心,如果是自行搭配能比套餐便宜百八十塊錢。
Arduino 開源專案有自己配套的跨平臺,程式設計環境——Arduino IDE 支援 Windows/Linux/macOS 作業系統。
它整合了 Arduino 開發所需的全部環境和支援庫,只需要選擇開發板然後滑鼠點選幾下即可實現編譯、燒錄、串列埠監控等功能。
此外,Arduino 也在近些年推出了網頁版編輯器以及 Arduino CLI,進一步降低了 Arduino 的開發門檻。
如果你不喜歡 Arduino 或者想使用其它 IDE,也可以選擇安裝 VSCode+Platform IO 外掛進行開發,Platform IO 也提供了開發包括 Arduino 在內大部分嵌入式開發所需環境,同樣可以實現一鍵編譯、下載、偵錯。
注意:本教學後續採用的是 Arduino IDE 進行講解和演示。
網上已經有很多 1.8 版本的使用教學,因為 v1 版本對於程式碼自動補全做得不是很好。
所以,這裡採用 Arduino IDE 2.0 RC 版本,在 Windows 作業系統做的演示。
進入下載網址後,下滑網頁即可看到 Arduino IDE 2.0 RC 的下載入口:
由於伺服器位於國外,下載速度可能不是很快需要耐心等待
下載以後根據提示進行安裝後啟動程式可以看到如下介面:
注:這裡大家的配色可能不同,預設是黑底白字,可以在 File->Preference->Theme 處更改
下面我們點開 「板級支援庫管理」 安裝 「Arduino AVR Boards」 的庫:
警告:由於 Arduino CLI 本身問題,這裡可能會出現諸如 Access is denied 等錯誤,這時需要關閉防毒軟體後才能正常安裝!!!
在此過程中會自動安裝驅動,請在提示中選擇 「是」 進行確認
安裝完成後應該會有如下文字輸出:
驅動安裝完成後插上我們的開發板,然後在 開發板選擇
下拉框進行選擇:
根據大家連線 USB 口的不同,這個不一定都是 COM3,大家需要自行判斷。或者在裝置管理器中檢視串列埠,或者拔插開發板看新增的是哪個 COM 口
下面執行一段點燈的程式碼,類似於「Hello World」,萬物始於點燈!
選擇好後開發板後,複製如下內容到 編輯視窗
:
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
delay(300);
digitalWrite(LED_BUILTIN, HIGH);
delay(300);
digitalWrite(LED_BUILTIN, LOW);
}
目前這段程式碼現在看不懂不要緊,下面會有逐行的講解。
點選 燒錄
按鈕,終端會出現如下提示:
並且開發板上的 LED 開始閃爍:
至此,環境就設定成功啦!
這裡將介紹如何編寫 Arduino 的程式碼。
Arduino 庫是使用 C++ 編寫的,官方將很多功能包裝成了一個個函數,但是對於初學者來講不需要了解這麼多,只要有一點 C 語言基礎即可流暢使用。
Arduino 庫遮蔽了 AVR 微控制器的底層細節,讓我們即使不瞭解模數電或者微控制器相關知識也能輕鬆上手,現在就讓我們先簡單瞭解一下 Arduino 語言相關內容。
一般來講,我們的 C 語言程式都是從一個 main
函數開始的,但是在之前的教學中我們發現 IDE 生成的檔案中只有 setup
和 loop
兩個函數,那麼 Arduino 是如何呼叫它們的呢?
實際上,真正的 main
函數存在於我們的 Arduino 庫檔案中(位於 Arduino->main.cpp),其定義如下:
int main(void)
{
// 進行一些硬體和變數初始化工作
init();
initVariant();
#if defined(USBCON)
USBDevice.attach();
#endif
// 呼叫我們編寫的 setup() 函數
setup();
for (;;) {
// 呼叫我們編寫的 loop() 函數
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
可以看到我們編寫的 setup
和 loop
兩個函數會在 main
中進行呼叫。當然,相關檔案是如何組織和編譯的這就是 Arduino 工具鏈所提供的功能了,這裡我們不做深入瞭解,在初學階段我們只關心如何使用即可。
Arduino 為我們提供了多種函數以供使用,具體細節可以檢視 Arduino API 手冊。
不去記憶相關函數,善用 IDE 的智慧補全和搜尋引擎,便可快速上手
接下來我們通過講解上面的點燈程式碼,簡單介紹幾個常用的函數:
void setup()
:初始化相關引腳和變數
在 Arduino 中程式執行會先呼叫 setup()
函數,用於初始化變數、設定針腳的輸出\輸入型別、設定串列埠、引入類庫檔案等等。每次 Arduino 上電或重啟後,setup 函數只執行一次,例如:
void setup()
{
pinMode(LED_BUILTIN, OUTPUT); // 設定內建 LED 埠為輸出模式
}
之後會執行 loop()
函數,顧名思義該函數在程式執行過程中不斷地迴圈,直到晶片斷電為止。
void loop()
{
delay(300); // 等待 300ms
digitalWrite(LED_BUILTIN, HIGH);// 內建 LED 輸出高電平,點亮燈
delay(300);
digitalWrite(LED_BUILTIN, LOW);// 內建 LED 輸出低電平,熄滅等
}
迴圈中的程式碼每隔 300ms 點亮/熄滅燈,實現燈閃爍的效果。下面是用到的常數和函數詳解:
常數
HIGH | LOW
:表示數位 IO 口的電平,HIGH 表示高電平(1 即輸出電壓「點亮」),LOW 表示低電平(0 即不輸出電壓「熄滅」)INPUT | OUTPUT
:表示數位 IO 口的方向,INPUT 表示輸入(高阻態,即相當於電阻極大可以讀取輸入電壓訊號),OUTPUT 表示(輸出電壓訊號)數位 I/O
pinMode(pin, mode)
:數位 IO 口輸入輸出模式定義函數,引數 mode 可為 INPUT 或 OUTPUTdigitalWrite(pin, value)
:數位 IO 口輸出電平定義函數,引數 value 可為 HIGH 或 LOW,可用來點亮 LEDint digitalRead(pin)
:數位 IO 口讀輸入電平函數,返回值為 HIGH 或 LOW,可以用來讀數位感測器注:引數 pin 值的範圍為 0~13,代指 14 根引腳。
時間函數
delay(ms)
:延時函數(單位 ms)以上為常見函數,不需要記憶有個印象即可,後面經常用就記住了。
在寫程式碼之前,需要先搞清楚什麼是串列埠。
這個問題各種百科已經給出了答案,但是對於初學者來講這些文字難免有些官方。通俗來講,串列埠就是晶片之間通話的渠道。
一般來講我們使用開發板上的 UART 串列埠進行通訊,它使用兩根訊號線進行通訊,一個名為 TX
(訊息傳送端)一個名為 RX
(訊息接收端),他們的職責非常單一。
TX
:只能傳送訊息RX
:只能收聽訊息所以使用的時候應該將 TX
和 RX
交叉連線:
此外,串列埠在使用的時候如果沒有額外的線纜給出同步時鐘訊號則還需要指定串列埠的波特率,這相當於兩晶片之間的約定:我說我一分鐘能輸出 100 個二進位制訊號,那麼平均來講每個訊號的時長就是 1/100 秒,你只需要每 1/100 秒接收一次即可跟上我的腳步。
當然,這裡的比喻存在些許漏洞,實際上的通訊過程會稍微複雜一些以保證通訊的可靠性和正確性。
我們現在開始實踐!由於篇幅關係,具體使用到的函數大家可以參考 API 手冊。
這裡 Arduino 已經為我們準備好了 Serial(串列埠),只需要簡單幾步即可實現訊息的傳送。
這裡使用的是一個 Arduino 官方庫,為我們準備好的 Serial 物件。如果您不瞭解 C++ 物件相關概念也不影響您的使用,類似 Serial.begin()
這種語法相當於函數呼叫(或者更官方的稱呼是「方法」),它只不過是 Serial 特有的函數而已。程式碼如下:
#include <Arduino.h>
void setup()
{
// 設定波特率為 9600,我們的電腦讀取的時候也要保持相同
Serial.begin(9600);
}
void loop()
{
// 串列埠輸出一行文字,會自動加換行符
Serial.println("HelloGitHub");
// 等待一會兒,防止傳送太快卡死
delay(1000);
}
將上面的程式「燒錄」到開發板中,然後點選 「Serial Monitor」(類似瀏覽器的開發者模式)檢視串列埠。
這時就可以在控制檯,看到傳送的訊息了:
上面講完了如何傳送,現在我們來說說如何讓 Arduino 從電腦或者什麼其他地方接收訊息。
下面是一段「回聲」程式碼:
#include <Arduino.h>
int count; // 記錄緩衝區位元組數
char buffer[65]; // 儲存從緩衝區讀出來的字元
void setup()
{
// 做一些初始化工作
Serial.begin(9600);
count = 0;
}
void loop()
{
// 這個 Serial.available() 會返回當前接受了多少字元儲存再快取區
count = Serial.available();
if (count > 0) // 如果快取區存了東西
{
// 讀取 count 個字元到 buffer 中
Serial.readBytes(buffer, count);
// 新增結尾,為了後面傳送
buffer[count] = '\0';
// 傳送
Serial.println(buffer);
}
// 給一點時間多接收一點訊息,不然只能一個字母一個字母的返回
delay(800);
}
燒錄以上程式,按照之前的方法檢視串列埠。需要在這個框框裡輸入要傳送的內容,然後使用快捷鍵 Ctrl+Enter 傳送。
這裡將在控制檯看到訊息是板子接收電腦傳送的訊息後傳送給電腦的,接收到的和傳送的一摸一樣,故稱為「回聲」。
至此,關於串列埠的基本使用就講完了。雖然這裡實現的功能很簡陋,但這是所有大神的必經之路。所有複雜的功能其實都是用這些看似簡陋的基礎功能實現的。
Arduino 擁有非常活躍的中文社群,新手提的問題大都能得到網友的熱心解答。社群裡還有很多人分享自己的作品,即使是零基礎的小白也能在這裡快速地成長。
相信不久的將來的你也可以做出,如此炫酷的電子玩意兒。
以上就是 HelloGitHub 講解開源系列之《Arduino 教學》入門篇的全部內容,如果你對 DIY 電子產品感興趣,不妨關注 HelloGitHub 能夠第一時間收到後續內容的更新。
預告:下一篇將介紹如何用 Arduino 做一個溫溼度顯示器,通過實戰加深對 Arduino 瞭解。
作者:削微寒
掃描左側的二維條碼可以聯絡到我
本作品採用署名-非商業性使用-禁止演繹 4.0 國際 進行許可。