本篇介紹Arduino模擬輸入功能盗蟆,通過讀取電位器輸入的電壓值來控制LED燈的亮度。另外補(bǔ)充通過純軟件編程的方式再做同樣的操作庇楞,旨在提高讀者對AnalogRead和AanlogWrite函數(shù)這兩個函數(shù)的理解堕虹,并了解使用電位器調(diào)光的原理猪落。
實(shí)驗(yàn)要求
3.1 Arduino 模數(shù)轉(zhuǎn)換函數(shù) AnalogRead的用法
(在哪些引腳上可用,給出一個以可變電阻分壓為輸入,從串口輸出模數(shù)轉(zhuǎn)換數(shù)值的例程)
3.2 用電位器實(shí)現(xiàn)調(diào)光LED燈(使用AanlogWrite函數(shù)瓢捉,即項(xiàng)目2中的2.2方式)
(Fritzing繪制的電路圖频丘、工作原理的說明,包含完整注釋的源代碼)
3.3 用電位器實(shí)現(xiàn)調(diào)光LED燈(使用軟件編程的方法泡态,即項(xiàng)目2中的2.1方式)
(工作原理的說明搂漠,包含完整注釋的源代碼,與2.1代碼的比較)
實(shí)驗(yàn)的基本原理
- 模擬輸入引腳是帶有ADC(Analog-to-Digital Converter某弦,模數(shù)轉(zhuǎn)換器)功能的引腳桐汤。它可以將外部輸入的模擬信號轉(zhuǎn)換為芯片運(yùn)算時可以識別的數(shù)字信號,從而實(shí)現(xiàn)讀入模擬值的功能靶壮。
- Arduino 模擬輸入功能有10位精度怔毛,即可以將0~5V的電壓信號轉(zhuǎn)換為0~1023的整數(shù)形式表示。
- 我們通過使用analogRead() 函數(shù)讀取電位器輸入的電壓值腾降,然后通過analogWrite()函數(shù)來控制LED燈亮度拣度。
- 最后使用純軟件編程的方法(使用delay函數(shù)控制占空比和時間)實(shí)現(xiàn)電位器調(diào)光,突破了模擬輸入端口個數(shù)的限制蜂莉,走向了更普遍化的引腳蜡娶。
(一)模數(shù)轉(zhuǎn)換函數(shù) AnalogRead的用法與電位器的工作原理介紹
函數(shù)介紹
-
AnalogRead:模擬引腳( IO口)讀取函數(shù)
1.說明:用于從Arduino的輸入引腳讀取數(shù)值混卵。Arduino 模擬輸入功能有10位數(shù)模轉(zhuǎn)換通道映穗,意味著可以將0~5V的電壓信號轉(zhuǎn)換為0~1023的整數(shù)形式表示。
注意:在模擬輸入引腳沒有任何連接的情況下幕随,用analogRead指令讀取該引腳蚁滋,這時獲得的返回值為不固定的數(shù)值。這個數(shù)值可能受多種因素的影響赘淮,如將手靠近引腳也可能會引起返回值的變化辕录。
2.語法:AnalogRead(pin)
3.參數(shù):1個 。例如AnalogRead(pin)梢卸,pin表示被讀取的模擬引腳號走诞,也就是A0~A5引腳,因?yàn)槟茌斎肽M信號的只有這6個引腳蛤高,所以不用指定第二個參數(shù)蚣旱。
4.返回值:0~1023之間的整數(shù)
元器件介紹——電位器
電位器是一個可調(diào)的電阻,具有三個引出端戴陡、阻值可按某種變化規(guī)律調(diào)節(jié)的電阻元件塞绿。電位器通常由電阻體和可移動的電刷組成。當(dāng)電刷沿電阻體移動時恤批,在輸出端即獲得與位移量成一定關(guān)系的電阻值或電壓异吻。
電位器既可作三端元件使用也可作二端元件使用。后者可視作一可變電阻器喜庞,由于它在電路中的作用是獲得與輸入電壓(外加電壓)成一定關(guān)系的輸出電壓诀浪,因此稱之為電位器棋返。
其原理如下圖所示:
通過旋轉(zhuǎn)旋鈕改變2號腳位置,從而改變2號腳到兩端的阻值雷猪。實(shí)驗(yàn)中將1腳和3腳分別接到開發(fā)板的5V和GND懊昨,再通過模擬輸入引腳A0(A0~A5都可以)來讀取電位器2號腳分得的電壓,其范圍在0V和5V之間春宣。
示例程序
在本示例中酵颁,我們將電位器的3個引腳分別接在5V、A0引腳和GND月帝,通過調(diào)節(jié)電位器躏惋,A0模擬引腳的輸入電壓在0-5V之間,在Arduino內(nèi)置的模擬數(shù)字功能轉(zhuǎn)化下嚷辅,將該輸入電壓映射到數(shù)值0~1023簿姨。這一數(shù)值將通過串口監(jiān)視器顯示。至于串口監(jiān)視器簸搞,你現(xiàn)在只需要知道它是Arduino板與其他設(shè)備相互通信的方式就可以了扁位,如果你感興趣的話,http://www.reibang.com/p/a102ebeb1f1f里有詳細(xì)的關(guān)于串口監(jiān)視器的介紹趁俊。
下面是實(shí)物連接圖:
由于沒有直接可觀察的輸出域仇,所以我們調(diào)節(jié)電位器并不能知道Arduino內(nèi)部的工作機(jī)制,所以下一步就是通過寫代碼寺擂,利用軟件的方式解決我們的疑惑暇务,正所謂軟硬兼施嘛!(代碼可直接復(fù)制使用)
int pin=A0;//定義變量pin,為模擬輸入接口
int val=0;//暫存來自電位器的變量數(shù)值
void setup() {
//Arduino串口通訊初始化
Serial.begin(9600);//設(shè)置波特率為9600
}
void loop() {
//讀取引腳A0輸入信號
val = analogRead(pin);//讀取傳感器的模擬值并賦值給val怔软,也就是將A0輸入的值轉(zhuǎn)化為0~1023之間的數(shù)值
Serial.println(val);//通過串口顯示變量val的值
}
下一步就是在我們的編譯環(huán)境中運(yùn)行代碼垦细,首先確保你的硬件連接已經(jīng)準(zhǔn)確無誤的完成(如示例連接圖),然后點(diǎn)擊上傳挡逼。
上傳成功后括改,旋轉(zhuǎn)你的電位器,咦家坎?怎么沒什么變化嘱能?因?yàn)槲覀儸F(xiàn)在沒有接任何輸出設(shè)備,當(dāng)然是看不到外在的變化的乘盖。不過我們可以通過Arduino IDE的串口監(jiān)視器查看旋轉(zhuǎn)電位器之后究竟發(fā)生了什么焰檩。
好了,現(xiàn)在你可以打開你的串口監(jiān)視器了订框,也就是右上角的搜索放大鏡析苫,打開后旋轉(zhuǎn)電位器你就會發(fā)現(xiàn)一串從小到大(或從大到小)的數(shù)字飛速從你的眼前流過,從0到1023衩侥。如下圖:
如果你能看到的話国旷,那么恭喜你已經(jīng)成功完成串口輸出模數(shù)轉(zhuǎn)換并掌握了analogRead函數(shù)的用法!
(二)使用AanlogWrite函數(shù)和電位器實(shí)現(xiàn)調(diào)光LED
我們已經(jīng)學(xué)會了用電位器調(diào)節(jié)輸出0~5V的電壓茫死,下一步就是用LED燈將最終的結(jié)果顯示出來跪但。
實(shí)驗(yàn)材料:
- Arduino Nano開發(fā)板
- 配套USB數(shù)據(jù)線
- 面包板及配套連接線
- 1個LED燈
- 1個470Ω限流電阻
- 1個電位器
搭建電路圖:
Arduino板5v和GND分別用跳線連接到面包板的上下兩排對應(yīng)的位置。直插LED燈正極連接限流電阻峦萎,電阻另一端連接開發(fā)板第10引腳屡久,LED燈負(fù)極接開發(fā)板GND(也就是藍(lán)色排)。電位器1號腳和3號腳分別連接開發(fā)板5V(紅排)和GND(藍(lán)排)爱榔,2號腳連接開發(fā)板A0(模擬輸入)引腳被环。
Fritzing繪制連接圖:
實(shí)物連接圖如下:
編寫代碼:
下一步就是通過代碼將程序上傳到你的Arduino開發(fā)板上,你可以復(fù)制下面的代碼到IDE中详幽,連接你的開發(fā)板筛欢,選擇好端口,保存并上傳唇聘。
int potpin = 0; //定義模擬輸入接口0
int ledPin = 10;//定義數(shù)字輸出接口10
int val = 0; //暫存來自電位器的變量數(shù)值
void setup() {
pinMode(ledPin, OUTPUT);//定義數(shù)字接口10為輸出
Serial.begin(9600);//設(shè)置波特率為9600版姑,可以省略
//注意:模擬接口自動設(shè)置為輸入
}
void loop() {
val = analogRead(potpin);//讀取傳感器的模擬值并賦值給val
Serial.println(val);//顯示變量val的值,可以省略
analogWrite(ledPin, val/4); //打開LED并設(shè)置亮度(PWM 輸出最大255)
}
(注意:為什么這里定義的端口要用potpin?)
因?yàn)殡娢黄鞯挠⑽拿?strong>Potentiometer迟郎,這里取自它的前幾個字母剥险,以便與其他引腳區(qū)分開。
實(shí)際操作圖:
實(shí)驗(yàn)現(xiàn)象
通過旋轉(zhuǎn)電位器旋鈕谎亩,LED燈亮度改變炒嘲。如果用串口監(jiān)視的話宇姚,就會在監(jiān)視器顯示相應(yīng)的數(shù)值匈庭。
函數(shù)介紹
-
AnalogWrite
1.說明:將一個模擬數(shù)值寫進(jìn)Arduino引腳。這個操作可以用來控制LED的亮度浑劳,或者控制電機(jī)的轉(zhuǎn)速阱持。Arduino每一次對引腳執(zhí)行AnalogWrite命令,都會給該引腳一個固定頻率的PWM信號魔熏。
AnalogWrite()函數(shù)支持以下引腳:3,5,6,9,10,11衷咽。
在調(diào)用AnalogWrite函數(shù)前,您無需使用pinMode()函數(shù)來設(shè)置該引腳蒜绽。
2.語法:analogWrite(pin,value)
3.參數(shù):
pin:被讀取的模擬引腳號碼
value:0到255之間的PWM頻率值镶骗,0對應(yīng)off,255對應(yīng)on
4.返回值:無
程序分析
程序中通過analogRead()函數(shù)來讀取模擬輸入值躲雅,這個輸入值的范圍是0到1023之間鼎姊,然后通過analogWrite()函數(shù)來改變LED燈占空比,范圍是0到255之間,從而改變亮度相寇。
*占空比
所謂占空比就是調(diào)整led通過電流和不通過電流的時間比來控制的慰于,由于人眼有視覺暫留特性,所以只要頻率比較高是看不出來閃爍的唤衫,當(dāng)然通過電流比不通過電流的時間比例越大婆赠,led做的功就越多,這樣也就越亮佳励,需要注意的是led芯片的溫升和最大電流值不要超標(biāo)休里,不然會影響其壽命。
低占空比意味著輸出的能量低赃承,因?yàn)樵谝粋€周期內(nèi)大部分時間信號處于關(guān)閉狀態(tài),如果pwm控制的負(fù)載為led,則具體表現(xiàn)例如led燈很暗份帐。
高占空比意味著輸出的能量高,在一個周期內(nèi),大部分時間信號處于on狀態(tài),具體表現(xiàn)為Led比較亮楣导。
當(dāng)占空比為100%時废境,表示 fully on,也就是在一個周期內(nèi)筒繁,信號都處于on狀態(tài),具體表現(xiàn)為led亮度到達(dá)100%噩凹。
為0%時則表示 totally off,在一個周期內(nèi)毡咏,一直處于off狀態(tài)驮宴,具體表現(xiàn)為led熄滅。
現(xiàn)在一切都已明了:脈沖寬度調(diào)制呕缭,這個寬堵泽,不是物體的寬度,而是高電平信號在一個調(diào)制周期中持續(xù)時間長短恢总,它可以用占空比去衡量迎罗,占空比越大,脈沖寬度越寬片仿。
(三)使用純軟件編程和電位器實(shí)現(xiàn)調(diào)光LED(不使用analogwrite函數(shù)纹安,引腳更通用)
基本原理
通過調(diào)整PWM的占空比,來調(diào)節(jié)通過LED燈的電流時間長度砂豌,改變LED燈的做功大小厢岂,從而實(shí)現(xiàn)調(diào)光LED燈的亮度。
在此代碼中阳距,手動設(shè)置一個PWM信號塔粒,其信號中高低電壓的時間長短是根據(jù)輸入端口的值 val 來改變的。val的值是運(yùn)用analogRead()函數(shù)讀取的模擬輸入端口的值筐摘,范圍為0~1023卒茬,當(dāng)我們調(diào)節(jié)電位器時映跟,val就會發(fā)生改變,這時LED燈的亮度就會隨val的值變化扬虚。
電路連接
電路圖與3.2相同努隙,只將輸出端口改為13號。由于我們使用的是13號引腳辜昵,在arduino開發(fā)板上直接連接者一個LED燈荸镊,所以我們可以單獨(dú)使用一個LED燈,也可以直接用開發(fā)板上的堪置。具體如圖所示:
使用單獨(dú)的LED燈:
不使用單獨(dú)的LED燈:
Fritzing繪制連接圖:
編寫代碼
int ledpin = 13; //定義端口13
int potpin=0; //定義端口0
int val=0; //定義變量val躬存,初始值為0
void setup() {
pinMode(ledpin, OUTPUT); //定義端口13為輸出
Serial.begin(9600); //設(shè)置波特率為9600
}
void loop(){
val=analogRead(potpin); //讀取傳感器的模擬值并賦值給val
Serial.println(val); //顯示變量val的值
digitalWrite(ledpin, HIGH); //設(shè)置輸出端口輸入高電壓
delayMicroseconds(val); //延遲val長度的時間
digitalWrite(ledpin, LOW); //設(shè)置輸出端口為低電壓
delayMicroseconds(1000 - val); //延遲1000-val長度的時間
}
所用函數(shù)
analogRead () 函數(shù)
1.說明:從指定的模擬引腳讀取值。
2.語法:?analogRead(pin)
3.參數(shù):
pin:要讀取的模擬輸入引腳的名稱(大多數(shù)板上的A0到A5舀锨,
Mini和Nano上的A0到A7)岭洲。
4.返回值:? 引腳上的模擬讀數(shù)(int)。
digitalWrite () 函數(shù)
1.說明:將數(shù)字HIGH或LOW值寫入數(shù)字引腳坎匿。
2.句法:
digitalWrite(pin, value)
3.參數(shù):
pin:引腳號
value:HIGH或LOW
4.返回值:無
delayMicroseconds () 函數(shù)
1.說明:暫停程序指定為參數(shù)的時間量(以微秒為單位)盾剩。
2句法:
delayMicroseconds(us)
3.參數(shù):
us:暫停的微秒數(shù)(unsigned int)
4.返回值:無
(四)比較兩種方式的區(qū)別與聯(lián)系
(五)實(shí)踐過程中遇到的問題
1. 找不到哪個是電位器?
由于剛剛接觸arduino替蔬,所以很多小零件都沒見過告私,就只認(rèn)識個LED燈和Nano開發(fā)板,而且很多部件都標(biāo)著英文承桥,也看不懂驻粟。所以對于這個陌生的名詞,只好猜吧凶异,看看憑感覺哪個像蜀撑,亦或者問問老師。
但是這種方法是行不通的剩彬,既耗時又耗力酷麦,還不利于個人自主學(xué)習(xí)與探究。經(jīng)過反思襟衰,后來我們的解決辦法是:先到網(wǎng)上搜集有關(guān)電位器的信息贴铜,從百度百科上看到電位器的圖片和基本介紹,對照著信息瀑晒,我們終于在一堆亂七八糟的零件中找到了它!
2. 不知道純軟件編程的含義是啥徘意?
聽起來覺得可能很高大上苔悦,讓人難懂,但是說得通俗點(diǎn)就是不使用analogwrite函數(shù)椎咧,而是使用更通用的方式(digitalwrite與delay函數(shù)結(jié)合)玖详,使得引腳更通用更靈活的一種方法把介。通過手動控制占空比,利用電位器可以使LED燈實(shí)現(xiàn)調(diào)光蟋座。
經(jīng)過在網(wǎng)上搜集資料并研究拗踢,我們終于還是實(shí)現(xiàn)了手動調(diào)光,并且比較了二者的區(qū)別與聯(lián)系向臀。
3.編譯時出現(xiàn)錯誤
在進(jìn)行純軟件編程的時候巢墅,在代碼編譯時出現(xiàn)了錯誤,提示缺少定義輸出端口的代碼:
我們翻譯了一下錯誤消息券膀,然后找到紅色提示的一行君纫,發(fā)現(xiàn)缺少定義的變量,往上找代碼芹彬,原因是在復(fù)制代碼的時候漏了一行蓄髓,導(dǎo)致在編譯時找不到ledpin這個變量。所以在以后一定要注意仔細(xì)檢查代碼是否完整舒帮,學(xué)會看各種提示錯誤会喝,不斷積累經(jīng)驗(yàn)。
4.恍然大悟——手動調(diào)光原來還可以這樣
在使用純軟件編程的時候玩郊,我們只是單純地將引腳由10號改成13號好乐,然后旋轉(zhuǎn)電位器調(diào)光。但是細(xì)心的小園同學(xué)發(fā)現(xiàn)arduino開發(fā)板上的另一個紅燈亮了瓦宜,之前是不亮的蔚万。所以我們恍然大悟,原來13號引腳就直接連著一個LED燈临庇,我們可以不用再外接一個LED燈了(但是電阻還是要接的)反璃。不過有追求完美可觀的同學(xué)可以外接一個,更容易觀察假夺。
5.還有一個未解之疑:手動調(diào)光LED燈為什么不能完全熄滅淮蜈?
我們在進(jìn)行純軟件編程的時候,發(fā)現(xiàn)無論如何旋轉(zhuǎn)電位器已卷,都不能使LED燈完全熄滅梧田,總是會帶有一點(diǎn)紅光:
截至目前為止,我們已經(jīng)使用了很多方法侧蘸,比如修改代碼(delay函數(shù)的參數(shù))裁眯、檢查電路、更換電阻等等讳癌。但是由于知識有限穿稳,還不能解決這一問題,哪位大佬可以幫忙解答一下啊~
(六)總結(jié)與體會
經(jīng)過本次有關(guān)Arduino項(xiàng)目的實(shí)踐晌坤,我們對Arduino開發(fā)板逢艘、各種元件以及函數(shù)的使用又有了更深刻的認(rèn)識旦袋,使得知識不僅僅停留在書面上,更多是表現(xiàn)在外面的技能以及思維的活躍方面它改。
主要包括:1.Arduino軟件安裝以及與電腦連通方式疤孕;2.程序編譯、上傳等基本方式央拖;3.面包板的使用方式祭阀,F(xiàn)ritzing的使用;4.學(xué)會了控制LED的亮滅爬泥;5.區(qū)分?jǐn)?shù)字端口中的模擬端口并學(xué)會使用柬讨;6.完成電位器調(diào)光LED燈等等。在后續(xù)的學(xué)習(xí)中也在不斷積累有關(guān)Arduino更深入的知識袍啡,不斷提高能力踩官。
通過小組的合作學(xué)習(xí),使得我們在學(xué)習(xí)上總會產(chǎn)生思維的碰撞境输,大家相互爭論蔗牡,相互幫助,共同完成項(xiàng)目嗅剖。盡管在完成的過程中遇到了各種問題辩越,當(dāng)時確實(shí)是很頭疼,但是通過各種途徑解決之后信粮,再回過頭來看就發(fā)現(xiàn)每個人真的成長了很多黔攒。
只有想不到的,沒有做不到的强缘。創(chuàng)意的思維總是千奇百怪督惰,各有不同,因此也就顯得特別珍貴旅掂,所以對于每個人的創(chuàng)新思維赏胚,都值得我們?nèi)ケWo(hù)。未來的人工智能領(lǐng)域是如此商虐,教育亦是如此觉阅,創(chuàng)新和實(shí)踐總是貫穿其中,總讓人不由自主的接近和了解它秘车。
現(xiàn)在典勇,讓我們積極思維與實(shí)踐,一起打開Arduino世界的大門鲫尊!