前言
呃呃,為啥寫(xiě)這個(gè)教程呢~俺也不知道!唉,說(shuō)多了都是淚,心酸,卷啊~
以下內(nèi)容是我的個(gè)人理解,專(zhuān)業(yè)名詞解釋可能存在錯(cuò)誤,望廣大讀者指出,萬(wàn)分感謝!
基礎(chǔ)概念
回歸內(nèi)容,今天在這里用一篇博文,帶領(lǐng)大家玩轉(zhuǎn)Arduino、入門(mén)數(shù)電模電、入門(mén)傳感驅(qū)動(dòng)設(shè)計(jì)!
這些是我準(zhǔn)備的東西,一把杜邦線(xiàn)、一些傳感器、一塊板子!
杜邦線(xiàn)就是導(dǎo)線(xiàn),把傳感器模塊和單片機(jī)(Arduino板)連接起來(lái)。這里的Arduino板是我之前在雙臂機(jī)械臂課程用到的板子,其實(shí)也就是一塊Arduino Nano的擴(kuò)展板,將所有的IO口引出(D13引腳除外),D13引腳接到了蜂鳴器上面,同時(shí)有個(gè)LM2596S-5.0的模塊實(shí)現(xiàn)12V轉(zhuǎn)5V 3A(最大3A輸出)的調(diào)壓功能。
玩單片機(jī)呢,大家玩的就是IO口,也就是引腳!這些引腳具備輸入(Input)和輸出(Output)兩種形態(tài),所以被稱(chēng)為IO口。
玩電子的呢,大家經(jīng)常聽(tīng)到的就是數(shù)電模電,而單片機(jī)的引腳呢,也分為數(shù)字(digital)和模擬(analog)兩種。
玩單片機(jī)的話(huà),ADC和DAC兩個(gè)名詞,是跳不掉的!ADC,Analog Digital Change,模擬轉(zhuǎn)數(shù)字,模數(shù)轉(zhuǎn)換,AD模擬量采集。
DAC,Digital Analog Change,數(shù)字轉(zhuǎn)模擬,數(shù)模轉(zhuǎn)換,DA數(shù)字量輸出。
所以,Arduino編程就有了以下四個(gè)函數(shù):
那么什么是數(shù)字,什么是模擬呢?數(shù)電是什么,模電又是什么呢?
我們拿燈來(lái)做一個(gè)栗子。我們通過(guò)開(kāi)關(guān)來(lái)控制燈的亮和滅,我們規(guī)定燈亮為1,燈滅為0,這種符合正常人類(lèi)邏輯的方式,被稱(chēng)為正邏輯;也有規(guī)定燈亮為0,燈滅為1,這種被稱(chēng)為負(fù)邏輯。正邏輯和負(fù)邏輯本質(zhì)上沒(méi)有什么差別,因?yàn)槲覀兞?xí)慣了有就是1,無(wú)就是0這樣的邏輯方式(推薦閱讀《編程珠璣》)。
我們將信號(hào)分為有和無(wú)、或者是當(dāng)前的電壓值是HIGH或低、或者是當(dāng)前的狀態(tài)是0或1,這就是數(shù)字量——只有0和1兩種狀態(tài)的的量。這在我們的單片機(jī)里面,也就對(duì)應(yīng)了IO引腳輸出一個(gè)高電平或者輸出一個(gè)低電平、檢測(cè)當(dāng)該IO引腳是高電平還是低電平!
那么模擬量呢!我們還是拿燈來(lái)做一個(gè)栗子。數(shù)字量可以用來(lái)表示燈開(kāi)了沒(méi)有,那么燈的亮度呢?我們可以控制開(kāi)和關(guān),那么我們能不能控制亮度呢?答案是可以的!這里用來(lái)表示一定程度的量,就是模擬量!我們通過(guò)單片機(jī)的引腳輸出一個(gè)模擬量,可以實(shí)現(xiàn)控制對(duì)“程度(燈的亮度、聲音的響度等等)”的控制,這就是DAC;同理,我們通過(guò)單片機(jī)的引腳獲取傳感器的“程度(溫度、濕度、電壓值)”的數(shù)值,這就是ADC!
那么ADC采集和DAC輸出是怎么實(shí)現(xiàn)的呢!我們這里使用的是Arduino Nano,它有A0~A7共計(jì)8個(gè)ADC模擬量讀取的引腳,這些引腳也可以當(dāng)成普通的IO來(lái)使用,順序?yàn)锳0~A7對(duì)應(yīng)14~21。其中A4、A5引腳復(fù)用為IIC通訊引腳(聽(tīng)不懂沒(méi)關(guān)系,后面會(huì)學(xué)到)
Arduino的ADC采集精度是10位,所以讀取到的數(shù)值為0~1024(210),這里的ADC數(shù)值其實(shí)就是電壓值,Arduino的模擬量基準(zhǔn)電壓(Aref)默認(rèn)是5V,也就是說(shuō),在ADC采集這里,是將0~5V的電壓值,進(jìn)行讀取,轉(zhuǎn)成0~1024的數(shù)值進(jìn)行輸出。
而Arduino Nano的DAC輸出呢,是通過(guò)PWM(脈沖寬度調(diào)制技術(shù))來(lái)實(shí)現(xiàn)的,具備PWM的引腳為D3、D5、D6、D9、D10、D11六個(gè)引腳。
要說(shuō)PWM啊,我們先來(lái)聊兩個(gè)概念——頻率和占空比!
頻率這個(gè)詞大家應(yīng)該都不會(huì)陌生,是指單位時(shí)間內(nèi)完成周期性變化的次數(shù),這個(gè)單位時(shí)間我們大多默認(rèn)的就是1秒鐘。比如說(shuō)我在1秒鐘執(zhí)行了20次,那么我就可以說(shuō)頻率是20Hz,頻率=1/單位時(shí)間。
占空比這個(gè)概念呢,大家可能會(huì)陌生一些。我先做個(gè)假設(shè),假如單片機(jī)的一個(gè)引腳輸出20Hz的頻率,那么產(chǎn)生1Hz的頻率需要的時(shí)間是多久呢?答案是1s/20=0.05s=50ms!
也就是說(shuō),我控制單片機(jī)的引腳每50ms完成一次高低電平的變化,實(shí)現(xiàn)這個(gè)引腳在1s的時(shí)間內(nèi)可以產(chǎn)生20次高低電平的變化,這就是控制單片機(jī)的引腳輸出20Hz的頻率。
我在20ms的時(shí)間內(nèi),保持引腳處于高電平10ms,處于低電平10ms,那么此時(shí)的占空比就是50%;如果我保持引腳處于高電平5ms,處于低電平15ms,那么此時(shí)的占空比就是25%,所以占空比就是在一次周期性的電平變化中,所處于高電平的時(shí)間與周期時(shí)間的比值。
PWM產(chǎn)生的是方波信號(hào)(還正弦波、三角波等等,后續(xù)我們?cè)倭模?,Arduino的PWM精度是8位,所以輸出的PWM值為0~255(28),默認(rèn)的頻率是490Hz(基本認(rèn)為是500Hz),這里給大家一個(gè)參考資料:
https://www.cnblogs.com/lulipro/p/6092264.html
圖太多了,不想畫(huà),人家做的挺好的!
數(shù)字輸入,就是引腳讀取傳感器過(guò)來(lái)的信號(hào),這個(gè)信號(hào)可能是高電平也可能是低電平,比如按鍵模塊。
數(shù)字輸出,通過(guò)引腳對(duì)外輸出一個(gè)高電平或者輸出一個(gè)低電平,比如單片機(jī)引腳點(diǎn)亮一個(gè)LED。模擬輸入,通過(guò)引腳感應(yīng)得到一個(gè)電壓值,將電壓值等比轉(zhuǎn)成一個(gè)數(shù)值,比如讀取一個(gè)溫度傳感器的溫度值。
模擬輸出,通過(guò)引腳輸出一個(gè)電壓值,Arduino的模擬輸出范圍0~255,也就是說(shuō)將0~5V的電壓值分成255分,我們通過(guò)調(diào)控電壓值就可以來(lái)控制引腳輸出的程度(這里理解為功率吧)。
這四個(gè),是單片機(jī)的基本概念。如果你是資深單片機(jī)玩家的話(huà),也會(huì)聽(tīng)說(shuō)過(guò)推挽、開(kāi)漏、浮空、上拉、下拉五個(gè)名詞!這些內(nèi)容我們稍后來(lái)處理。
上面我們聊了,模擬輸出是通過(guò)PWM來(lái)實(shí)現(xiàn)的,而PWM說(shuō)開(kāi)了就是通過(guò)引腳高低電平的快速切換實(shí)現(xiàn)的,那么這個(gè)為什么能控制引腳輸出的程度呢?這個(gè)問(wèn)題留個(gè)大家思考,給大家一個(gè)提示:結(jié)合LED的閃爍來(lái)分析,如果讓LED閃爍的頻率增加會(huì)發(fā)現(xiàn)什么呢?調(diào)整閃爍頻率的占空比又會(huì)發(fā)生什么呢?留給大家思考+嘗試!
基礎(chǔ)概念的補(bǔ)充到這里就結(jié)束了,接下來(lái)開(kāi)始我們實(shí)戰(zhàn)的內(nèi)容!
實(shí)踐
在文章剛開(kāi)始的地方,我就貼出來(lái)一張圖,這些是我現(xiàn)在手頭有的零件,接下來(lái)我會(huì)用這些零件類(lèi)為大家展現(xiàn)Arduino編程!
這段時(shí)間我在古月學(xué)院的兩門(mén)課程——PCB設(shè)計(jì)和CAD設(shè)計(jì),應(yīng)該就是這兩天上線(xiàn)了吧,公開(kāi)課,免費(fèi)的不要錢(qián),課程都是一個(gè)多小時(shí)那種吧!我這里用的板子是自己設(shè)計(jì)的,現(xiàn)在立創(chuàng)打板不要錢(qián),還是挺方便的!
如果你手上沒(méi)有這些東西也沒(méi)關(guān)系,你們可以去這個(gè)網(wǎng)站進(jìn)行仿真,效果是一樣的,記得網(wǎng)絡(luò)環(huán)境好點(diǎn)!Arduino在線(xiàn)仿真:
https://www.tinkercad.com/
我這里使用的是Arduino Nano開(kāi)發(fā)板 + LM2596S-5.0降壓模塊,這里我把Arduino Nano的引腳全部按照Sign Vcc Gnd的順序留出,避免出現(xiàn)Vcc和Gnd引腳不夠用的情況。
同時(shí)使用了一個(gè)DC 5.5-2.1(外徑5.5mm,內(nèi)徑2.1mm)的座子,這個(gè)算是常見(jiàn)的型號(hào),LM2596S-5.0實(shí)現(xiàn)了5~40輸出,5V 3A(Max)輸出的性能,引腳按照SVG的順序留出,可以直插舵機(jī),也就是說(shuō),這塊板子可以直接用來(lái)玩機(jī)械臂!這里插進(jìn)來(lái)一個(gè)我之前的博客《基于Firmata協(xié)議的ROS Moveit六軸機(jī)械臂設(shè)計(jì)》:
https://www.guyuehome.com/bubble/detail/id/39
板子不一樣其他的一樣!博文看不懂的可以去古月學(xué)院購(gòu)買(mǎi)一下我的課程《軟硬結(jié)合帶你玩轉(zhuǎn)ROS機(jī)械臂》、《MoveIt玩轉(zhuǎn)雙臂機(jī)器人》任意一個(gè)都可以上手!板子是這樣的!
哦對(duì)了,D13引腳我沒(méi)有引出,這個(gè)引腳在所有的Arduino板子上面,接有一個(gè)LED燈,在上傳程序或者上電、掉電的時(shí)候會(huì)出現(xiàn)電平的變化。這里我把D13引腳接到蜂鳴器上面,在上傳程序或者上電、掉電的時(shí)候蜂鳴器會(huì)發(fā)出聲音,算是一個(gè)提示音吧!
原理圖十分簡(jiǎn)單,就是引腳留出!蜂鳴器那里的話(huà),用了一個(gè)三極管來(lái)控制。當(dāng)基極處于高電平的時(shí)候,三極管導(dǎo)通,5V過(guò)三極管、過(guò)蜂鳴器,流向GND,蜂鳴器發(fā)出聲音;當(dāng)基極處于低電平的時(shí)候,三極管處于截止?fàn)顟B(tài)造成短路,電流無(wú)法流過(guò)、蜂鳴器無(wú)法發(fā)出聲音!
其他的也就沒(méi)啥了,挺簡(jiǎn)單的!成本的話(huà),Arduino Nano不超過(guò)20塊錢(qián),LM2596S-5.0不超過(guò)5塊錢(qián),30塊錢(qián)以?xún)?nèi)可以搞定,傳感器和杜邦線(xiàn)的話(huà),去學(xué)校實(shí)驗(yàn)室嫖吧!
代碼
硬件聊完了,我們來(lái)聊聊軟件的代碼!Arduino環(huán)境啊、怎么下載程序啊,大家自行百度吧,那玩意寫(xiě)著簡(jiǎn)直要命,不介意的可以等幾天,我這幾天打算做這部分的公開(kāi)課程!
Arduino語(yǔ)法基礎(chǔ)的話(huà),給大家個(gè)傳送門(mén),大家可以去參考一下!Arduino語(yǔ)法教程:
https://www.ncnynl.com/category/arduino-language/
Arduino的語(yǔ)法是C語(yǔ)言和C++都有,我是C語(yǔ)言用的多,畢竟簡(jiǎn)簡(jiǎn)單單的功能分得面向?qū)ο髮?xiě)個(gè)類(lèi),秀操作沒(méi)啥意思,實(shí)用才是正道!當(dāng)然,你要是做類(lèi)庫(kù)的話(huà),建議你還是用C++,不然會(huì)被噴(個(gè)人觀點(diǎn),我可以寫(xiě)屎一樣的代碼,但是你不行。因?yàn)槲乙狢rtl C+Ctrl V你的代碼)。
我們先來(lái)看個(gè)Arduino的實(shí)例程序——閃爍的LED,代碼如下。
//定義LED所在的引腳
#define LED 13
#初始化函數(shù),程序從這里開(kāi)始,setup函數(shù)的內(nèi)容只執(zhí)行一次
void setup()
{
pinMode(LED,OUTPUT); //設(shè)置LED引腳為輸出模式
digitalWrite(LED,LOW); //設(shè)置LED引腳為低電平
}
//在執(zhí)行結(jié)束setup函數(shù)后,循環(huán)執(zhí)行l(wèi)oop函數(shù)的內(nèi)容
void loop()
{
digitalWrite(LED,HIGH); //設(shè)置LED引腳為高電平
delay(1000); //延時(shí)1000ms
digitalWrite(LED,LOW); //設(shè)置LED引腳為低電平
delay(10000); //延時(shí)1000ms
}
這里增加了兩個(gè)新的函數(shù)——pinMode和delay。
pinMode是設(shè)置引腳模式的,我們?cè)谑褂靡_前,需要指定該引腳的模式(模擬輸入無(wú)需指定,因?yàn)槟M輸入口是指定了的)。
pinMode(uint_8 pin,uint_8 mode) //參數(shù)pin為引腳序號(hào),mode為模式,有OUTPUT和INPUT兩個(gè)數(shù)值
delay(unsigned long ms) //參數(shù)ms為延時(shí)的時(shí)間,單位ms
這里的邏輯如果換成C語(yǔ)言的話(huà),如下,大家可以比對(duì)理解一下!
void setup()
{
//執(zhí)行初始化
}
void loop()
{
//執(zhí)行功能主體
}
int main()
{
setup();
while(1)
{
loop();
}
return 0;
}
呃,反正大概就這個(gè)意思吧!
大致Arduino的介紹有了,接下來(lái)就是如何來(lái)玩這些傳感器,等我接下來(lái)的博客吧!
總結(jié)
以上的概念,不僅僅是Arduino,它對(duì)于所有的單片機(jī)和嵌入式都是通用的,在學(xué)習(xí)不同的單片機(jī),大家可以來(lái)比對(duì)一下!
(掃描二維碼查看詳情)
聯(lián)系客服