2023年元旦新篇章——我的Arduino C 硬件編程入門,獻(xiàn)給家長(zhǎng)朋友們(arduino編程指南75個(gè)硬件pdf)
—— 本文獻(xiàn)給2023新年里想和孩子一起學(xué)習(xí)、成長(zhǎng)的家長(zhǎng)朋友們!
一、Arduino C是什么?
很多人把Arduino編程語(yǔ)言稱為Arduino C,大概是因?yàn)樗恼Z(yǔ)言是基于C/C 的。Arduino C封裝了Arduino各種硬件的API接口,不需要學(xué)習(xí)底層知識(shí)就可以控制Arduino硬件,這樣對(duì)孩子和硬件入門者都是非常友好的。
經(jīng)過(guò)多年的開源,Arduino C有非常多實(shí)用的開源庫(kù),可以直接使用,用來(lái)方便的控制各類傳感器,比如舵機(jī)、超聲波、紅外等,當(dāng)然你也可以自己編寫好用、實(shí)用的庫(kù),開源給別人使用,這也是Arduino的精神。
二、Arduino C的開發(fā)工具是什么?
我是使用官方的Arduino IDE工具開發(fā)和調(diào)試Arduino程序的,我在頭條發(fā)過(guò)幾期短視頻《2分鐘硬件編程系列》,里面就是使用的Arduino IDE。雖然相對(duì)于我工作中經(jīng)常使用的VS和Eclipse,Arduino IDE的功能過(guò)于簡(jiǎn)單,不夠智能化,但對(duì)于簡(jiǎn)單的硬件接口編程來(lái)說(shuō),已經(jīng)夠用了。
我目前使用的Arduino IDE工具版本是1.8.9,不過(guò)arduino.cc已經(jīng)推出了最新的穩(wěn)定版本2.0.3,社區(qū)反饋不錯(cuò),我比較看重的是增加了自動(dòng)糾錯(cuò)和自動(dòng)補(bǔ)充功能,可以有效減少代碼錯(cuò)誤并提高效率,等我試用過(guò)后,下期單獨(dú)寫一篇文章詳細(xì)介紹給大家。
IDE工具怎么得到:Arduino IDE官方 https://www.arduino.cc/en/software
我的Arduino IDE1.8.9主界面
三、Arduino C的程序結(jié)構(gòu)
我在《2分鐘硬件編程系列》中,每個(gè)短視頻都詳細(xì)介紹了每一句代碼,和我們大學(xué)時(shí)代學(xué)習(xí)的C語(yǔ)言相比,Arduino C非常簡(jiǎn)單,很容易入門,包括10歲左右的孩子。
一個(gè)簡(jiǎn)單而完整的Arduino C程序,只需編寫setup和loop函數(shù)就可以了。Setup函數(shù)里做初始化工作,而loop函數(shù)里則是主程序,所以一個(gè)完整的Arduino C程序結(jié)構(gòu)就是這樣簡(jiǎn)單:
- 結(jié)構(gòu)第1部分:引入第三方庫(kù),定義引腳。
- 結(jié)構(gòu)第2部分:setup()初始化代碼,只運(yùn)行一次。
- 結(jié)構(gòu)第3部分:loop()主程序代碼,可反復(fù)執(zhí)行。
四、Arduino C 源碼例子詳解——超聲波避障小車
下面看一段《2分鐘硬件編程系列》中超聲波小車的源代碼,這段代碼實(shí)現(xiàn)的功能很簡(jiǎn)單,就是超聲波探測(cè)到小車前方有障礙物體時(shí),完成自動(dòng)停車。
源碼:
//結(jié)構(gòu)第1部分:
const int leftPin1=5;// 左側(cè)電機(jī)引腳
const int leftPin2=6; // 左側(cè)電機(jī)引腳
const int rightPin1=11; // 右側(cè)電機(jī)引腳
const int rightPin2=3; // 右側(cè)電機(jī)引腳
const int trigPin=7; // 超聲波trig引腳
const int echoPin=8; // 超聲波echo引腳
int disVal=0;//超聲波探測(cè)距離變量
//問(wèn)題(1):為什么定義引腳需要const修飾,而定義disVal不需要const修飾呢?我在后面再講。
//結(jié)構(gòu)第2部分:
void setup() {
//初始化代碼,這里只運(yùn)行一次:
pinMode(leftPin1,OUTPUT);//電機(jī)引腳設(shè)置為輸出模式
pinMode(leftPin2,OUTPUT); //電機(jī)引腳設(shè)置為輸出模式
pinMode(rightPin1,OUTPUT); //電機(jī)引腳設(shè)置為輸出模式
pinMode(rightPin2,OUTPUT); //電機(jī)引腳設(shè)置為輸出模式
pinMode(trigPin,OUTPUT); //超聲波trig引腳設(shè)置為輸出模式
pinMode(echoPin,INPUT); //超聲波echo引腳設(shè)置為輸入模式
}
//結(jié)構(gòu)第3部分:
void loop() {
//主程序代碼,會(huì)反復(fù)運(yùn)行:
digitalWrite(trigPin,LOW); //超聲波trig引腳輸出低電平初始化,以便得到干凈的高電平。
delayMicroseconds(2); //延時(shí)2微秒。
digitalWrite(trigPin,HIGH); //超聲波trig引腳輸出高電平,觸發(fā)超聲波發(fā)射8個(gè)40KHz的方波。
delayMicroseconds(10); //延時(shí)10微秒。
digitalWrite(trigPin,LOW); //超聲波trig引腳輸出低電平結(jié)束本次觸發(fā)動(dòng)作。
disVal = pulseIn(echoPin,HIGH)/58.0;
//問(wèn)題(2):這里通過(guò)一個(gè)通用的公式得到超聲波探測(cè)前方障礙物的距離(單位cm),那么,這個(gè)公式原理是什么呢?這個(gè)問(wèn)題也放在后面講。
//判斷前方障礙物的距離
if(disVal >10){
//如果前方障礙物的距離超過(guò)10厘米,則執(zhí)行如下前進(jìn)操作:
analogWrite(leftPin1,0);
analogWrite(leftPin2,130);//啟動(dòng)左側(cè)電機(jī)(帶動(dòng)小車左輪)
analogWrite(rightPin1,0);
analogWrite(rightPin2,130); //啟動(dòng)右側(cè)電機(jī)(帶動(dòng)小車右輪)
}else{
//如果前方障礙物的距離不超過(guò)10厘米,則執(zhí)行如下停止操作:
analogWrite(leftPin1,0);
analogWrite(leftPin2,0);//停止
analogWrite(rightPin1,0);
analogWrite(rightPin2,0); //停止
}
}
這樣就是一個(gè)完整的程序了,Arduino IDE編譯完成后,通過(guò)串口上傳至Arduino主控板即可調(diào)試。運(yùn)行效果:2分鐘硬件編程(3):超聲波主動(dòng)避障
我搭建的超聲波小車
在前面還留了兩個(gè)問(wèn)題:
(1) 為什么定義引腳需要const修飾,而定義disVal不需要const修飾呢?
const作為C語(yǔ)言中的常變量修飾符,一個(gè)變量使用const修飾之后,其值將不允許再次被改變,否則編程會(huì)出現(xiàn)錯(cuò)誤。
比如用const修飾int變量leftPin1(電機(jī)引腳):const int leftPin1=5;
這時(shí)leftPin1成為了常變量,其引腳值不能在程序中動(dòng)態(tài)修改。
而超聲波探測(cè)距離是實(shí)時(shí)在改變著的,所以變量disVal也是需要不停改變的,所以不能用const修飾,直接這樣定義即可:int disVal=0;
(2) pulseIn(echoPin,HIGH)/58.0這個(gè)公式原理是什么呢?
超聲波發(fā)射8個(gè)40KHz的方波完成探測(cè)后,echo引腳會(huì)持續(xù)輸出高電平,持續(xù)時(shí)間就是方波發(fā)射到返回的時(shí)間,pulseIn()函數(shù)可以得到這個(gè)時(shí)間(微秒單位)。
那么我們?nèi)绻堰@個(gè)時(shí)間(微秒)轉(zhuǎn)換成距離(厘米)呢?
方波的速度(也就是聲速)是340 米/秒,可以換算為0.034cm/微秒,速度乘以時(shí)間就是距離,所以0.034*pulseIn()得到的是方波往返的距離,然后需要除2,才是真正到前方障礙物的距離,因此完整的公式是:
0.034*pulseIn()/2
這個(gè)公式可以進(jìn)一步簡(jiǎn)化為:
pulseIn()/58
五、Arduino C 近期一些源碼例子推薦
2分鐘硬件編程(4):一起動(dòng)手制作Arduino C紅外遙控超聲波小車
2分鐘硬件編程(5):隨動(dòng)小車出現(xiàn)車身抖動(dòng)現(xiàn)象,看如何完美解決?
2分鐘硬件編程(6):自己動(dòng)手做一輛追著光飛馳的小車(Arduino C)
我的紅外超聲波小車
再有10分鐘就是新年了!
2022年注定是所有人刻骨銘心的一年,很多人永遠(yuǎn)地離開了,包括自己的一些親人。但我們依舊希望這個(gè)世界一年比一年好。
雖然會(huì)很難,但”希望“永遠(yuǎn)是人類存在的價(jià)值,我們相信希望,我們帶著美好的希望在新的2023年里繼續(xù)努力,希望可以激發(fā)學(xué)習(xí)和生活的動(dòng)力,希望可以激發(fā)創(chuàng)造的力量,希望可以讓文明更進(jìn)步。
借用《基督山伯爵》的結(jié)尾,人生的智慧都集中在兩個(gè)詞,希望與等待。
所有人,2023,新年好!