想做鋼鐵俠?聽說很多大佬都是用它入門的
作者:HelloGitHub-Anthony
你是否想過成為一名 Geek,就像「野生鋼鐵俠」稚暉君那樣自己能做出各種新奇有趣的電子設備,但卻不知道從哪裡入手、如何開始?今天我們不聊嵌入式、電路板、單片機原理,直接上手開始搞!
我認為對於零基礎的電子愛好者來說,一塊容易上手的開發板至關重要。否則複雜的安裝步驟和調試流程就能把最初的熱情消失殆盡,從而還沒看到一個成品就放棄了。所以,今天 HelloGitHub 帶來的 Arduino 就是一個非常容易上手的開源硬體平台:
該項目包含 開發板(例如 Arduino UNO)和 軟體(Arduino IDE)兩部分,而且它擁有完善的中文社區和大量開源項目的示例,讓你遇到問題很容易就能找到解決辦法,想做項目也有完整的程式碼和項目可以參照。
我當年在 C 語言都不是很熟練的情況下,只花了一天時間就能跟著教程用 Arduino 實現一些比較花哨的功能,由此足以見得 Arduino 真的非常適合作為電子愛好者的第一塊開發板。
下面我將通過:聞道(入門)、見道(上手)、入道三部分,幫助零基礎的電子愛好者快速入門 Arduino,開啟你的「鋼鐵俠」之旅。
一、聞道(介紹)
1.1 推薦型號
Arduino 到目前為止有很多種類的開發板,我這裡推薦大家使用 UNO 作為您的第一塊開發板。原因有以下幾點:
- 普及:玩 UNO 的人很多,網上有很多 UNO 的教程
- 便宜:相比較其他類型開發板 UNO 真的非常便宜了
- 可拆卸:板子用的時間長了難免出現各種問題,可拆卸支援僅替換有問題的零部件
1.2 UNO R3 開發板
截止目前,市面上常見的 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」就能找出一大堆。
你可以選擇直接買套餐也可以自己買板子和然後根據需求購入的配件,買套餐的話圖個省心,如果是自行搭配能比套餐便宜百八十塊錢。
1.3 開發環境
Arduino 開源項目有自己配套的跨平台,編程環境——Arduino IDE 支援 Windows/Linux/macOS 作業系統。
它集成了 Arduino 開發所需的全部環境和支援庫,只需要選擇開發板然後滑鼠點擊幾下即可實現編譯、燒錄、串口監控等功能。
此外,Arduino 也在近些年推出了網頁版編輯器以及 Arduino CLI,進一步降低了 Arduino 的開發門檻。
如果你不喜歡 Arduino 或者想使用其它 IDE,也可以選擇安裝 VSCode+Platform IO 插件進行開發,Platform IO 也提供了開發包括 Arduino 在內大部分嵌入式開發所需環境,同樣可以實現一鍵編譯、下載、調試。
注意:本教程後續採用的是 Arduino IDE 進行講解和演示。
1.4 配置環境
網上已經有很多 1.8 版本的使用教程,因為 v1 版本對於程式碼自動補全做得不是很好。
所以,這裡採用 Arduino IDE 2.0 RC 版本,在 Windows 作業系統做的演示。
官方下載地址://www.arduino.cc/en/software
進入下載網址後,下滑網頁即可看到 Arduino IDE 2.0 RC 的下載入口:
由於伺服器位於國外,下載速度可能不是很快需要耐心等待
下載以後根據提示進行安裝後啟動程式可以看到如下介面:
註:這裡大家的配色可能不同,默認是黑底白字,可以在 File->Preference->Theme 處更改
下面我們點開 「板級支援庫管理」 安裝 「Arduino AVR Boards」 的庫:
警告:由於 Arduino CLI 本身問題,這裡可能會出現諸如 Access is denied 等錯誤,這時需要關閉殺毒軟體後才能正常安裝!!!
在此過程中會自動安裝驅動,請在提示中選擇 「是」 進行確認
安裝完成後應該會有如下文字輸出:
驅動安裝完成後插上我們的開發板,然後在 開發板選擇
下拉框進行選擇:
根據大家連接 USB 口的不同,這個不一定都是 COM3,大家需要自行判斷。或者在設備管理器中查看串口,或者拔插開發板看新增的是哪個 COM 口
1.5 運行段程式碼
下面運行一段點燈的程式碼,類似於「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 語言相關內容。
2.1 啟動流程
一般來講,我們的 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 工具鏈所提供的功能了,這裡我們不做深入了解,在初學階段我們只關心如何使用即可。
2.2 常用的函數
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)
以上為常見函數,不需要記憶有個印象即可,後面經常用就記住了。
2.3 什麼是串口
在寫程式碼之前,需要先搞清楚什麼是串口。
這個問題各種百科已經給出了答案,但是對於初學者來講這些文字難免有些官方。通俗來講,串口就是晶片之間通話的渠道。
一般來講我們使用開發板上的 UART 串口進行通訊,它使用兩根訊號線進行通訊,一個名為 TX
(消息發送端)一個名為 RX
(消息接收端),他們的職責非常單一。
TX
:只能發送消息RX
:只能收聽消息
所以使用的時候應該將 TX
和 RX
交叉連接:
此外,串口在使用的時候如果沒有額外的線纜給出同步時鐘訊號則還需要指定串口的波特率,這相當於兩晶片之間的約定:我說我一分鐘能輸出 100 個二進位訊號,那麼平均來講每個訊號的時長就是 1/100 秒,你只需要每 1/100 秒接收一次即可跟上我的腳步。
當然,這裡的比喻存在些許漏洞,實際上的通訊過程會稍微複雜一些以保證通訊的可靠性和正確性。
我們現在開始實踐!由於篇幅關係,具體使用到的函數大家可以參考 API 手冊。
2.4 發送 HelloGitHub
這裡 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」(類似瀏覽器的開發者模式)查看串口。
這時就可以在控制台,看到發送的消息了:
2.5 接收消息
上面講完了如何發送,現在我們來說說如何讓 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 發送。
這裡將在控制台看到消息是板子接收電腦發送的消息後發送給電腦的,接收到的和發送的一摸一樣,故稱為「回聲」。
至此,關於串口的基本使用就講完了。雖然這裡實現的功能很簡陋,但這是所有大神的必經之路。所有複雜的功能其實都是用這些看似簡陋的基礎功能實現的。
三、入道
3.1 社區
Arduino 擁有非常活躍的中文社區,新手提的問題大都能得到網友的熱心解答。社區里還有很多人分享自己的作品,即使是零基礎的小白也能在這裡快速地成長。
3.2 作品展示
相信不久的將來的你也可以做出,如此炫酷的電子玩意兒。
四、最後
以上就是 HelloGitHub 講解開源系列之《Arduino 教程》入門篇的全部內容,如果你對 DIY 電子產品感興趣,不妨關注 HelloGitHub 能夠第一時間收到後續內容的更新。
預告:下一篇將介紹如何用 Arduino 做一個溫濕度顯示器,通過實戰加深對 Arduino 了解。