【項(xiàng)目3-任務(wù)3-小組8】用電位器實(shí)現(xiàn)調(diào)光LED燈

本篇介紹Arduino模擬輸入功能,通過讀取電位器輸入的電壓值來控制LED燈的亮度。另外補(bǔ)充通過純軟件編程的方式再做同樣的操作,旨在提高讀者對(duì)AnalogRead和AanlogWrite函數(shù)這兩個(gè)函數(shù)的理解,并了解使用電位器調(diào)光的原理。

實(shí)驗(yàn)要求

3.1 Arduino 模數(shù)轉(zhuǎn)換函數(shù) AnalogRead的用法
(在哪些引腳上可用,給出一個(gè)以可變電阻分壓為輸入,從串口輸出模數(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)換器)功能的引腳。它可以將外部輸入的模擬信號(hào)轉(zhuǎn)換為芯片運(yùn)算時(shí)可以識(shí)別的數(shù)字信號(hào),從而實(shí)現(xiàn)讀入模擬值的功能。
  • Arduino 模擬輸入功能有10位精度,即可以將0~5V的電壓信號(hào)轉(zhuǎn)換為0~1023的整數(shù)形式表示。
  • 我們通過使用analogRead() 函數(shù)讀取電位器輸入的電壓值,然后通過analogWrite()函數(shù)來控制LED燈亮度。
  • 最后使用純軟件編程的方法(使用delay函數(shù)控制占空比和時(shí)間)實(shí)現(xiàn)電位器調(diào)光,突破了模擬輸入端口個(gè)數(shù)的限制,走向了更普遍化的引腳。

(一)模數(shù)轉(zhuǎn)換函數(shù) AnalogRead的用法與電位器的工作原理介紹

函數(shù)介紹

  • AnalogRead:模擬引腳( IO口)讀取函數(shù)
    1.說明:用于從Arduino的輸入引腳讀取數(shù)值。Arduino 模擬輸入功能有10位數(shù)模轉(zhuǎn)換通道,意味著可以將0~5V的電壓信號(hào)轉(zhuǎn)換為0~1023的整數(shù)形式表示。
    注意:在模擬輸入引腳沒有任何連接的情況下,用analogRead指令讀取該引腳,這時(shí)獲得的返回值為不固定的數(shù)值。這個(gè)數(shù)值可能受多種因素的影響,如將手靠近引腳也可能會(huì)引起返回值的變化。
    2.語法:AnalogRead(pin)
    3.參數(shù):1個(gè) 。例如AnalogRead(pin),pin表示被讀取的模擬引腳號(hào),也就是A0~A5引腳,因?yàn)槟茌斎肽M信號(hào)的只有這6個(gè)引腳,所以不用指定第二個(gè)參數(shù)。
    4.返回值:0~1023之間的整數(shù)

元器件介紹——電位器

電位器是一個(gè)可調(diào)的電阻,具有三個(gè)引出端、阻值可按某種變化規(guī)律調(diào)節(jié)的電阻元件。電位器通常由電阻體和可移動(dòng)的電刷組成。當(dāng)電刷沿電阻體移動(dòng)時(shí),在輸出端即獲得與位移量成一定關(guān)系的電阻值電壓
電位器既可作三端元件使用也可作二端元件使用。后者可視作一可變電阻器,由于它在電路中的作用是獲得與輸入電壓(外加電壓)成一定關(guān)系的輸出電壓,因此稱之為電位器。

其原理如下圖所示:
電位器原理圖

通過旋轉(zhuǎn)旋鈕改變2號(hào)腳位置,從而改變2號(hào)腳到兩端的阻值。實(shí)驗(yàn)中將1腳和3腳分別接到開發(fā)板的5V和GND,再通過模擬輸入引腳A0(A0~A5都可以)來讀取電位器2號(hào)腳分得的電壓,其范圍在0V和5V之間。

示例程序

在本示例中,我們將電位器的3個(gè)引腳分別接在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.itdecent.cn/p/a102ebeb1f1f里有詳細(xì)的關(guān)于串口監(jiān)視器的介紹。
下面是實(shí)物連接圖:

示例連接圖

由于沒有直接可觀察的輸出,所以我們調(diào)節(jié)電位器并不能知道Arduino內(nèi)部的工作機(jī)制,所以下一步就是通過寫代碼,利用軟件的方式解決我們的疑惑,正所謂軟硬兼施嘛?。ùa可直接復(fù)制使用)


int pin=A0;//定義變量pin,為模擬輸入接口
int val=0;//暫存來自電位器的變量數(shù)值

void setup() {   
  //Arduino串口通訊初始化
  Serial.begin(9600);//設(shè)置波特率為9600
}

void loop() {
  //讀取引腳A0輸入信號(hào)
  val = analogRead(pin);//讀取傳感器的模擬值并賦值給val,也就是將A0輸入的值轉(zhuǎn)化為0~1023之間的數(shù)值   
  Serial.println(val);//通過串口顯示變量val的值
}

下一步就是在我們的編譯環(huán)境中運(yùn)行代碼,首先確保你的硬件連接已經(jīng)準(zhǔn)確無誤的完成(如示例連接圖),然后點(diǎn)擊上傳。

實(shí)際效果圖

上傳成功后,旋轉(zhuǎn)你的電位器,咦?怎么沒什么變化?因?yàn)槲覀儸F(xiàn)在沒有接任何輸出設(shè)備,當(dāng)然是看不到外在的變化的。不過我們可以通過Arduino IDE的串口監(jiān)視器查看旋轉(zhuǎn)電位器之后究竟發(fā)生了什么。
好了,現(xiàn)在你可以打開你的串口監(jiān)視器了,也就是右上角的搜索放大鏡,打開后旋轉(zhuǎn)電位器你就會(huì)發(fā)現(xiàn)一串從小到大(或從大到?。┑臄?shù)字飛速從你的眼前流過,從0到1023。如下圖:

串口監(jiān)視器

如果你能看到的話,那么恭喜你已經(jīng)成功完成串口輸出模數(shù)轉(zhuǎn)換并掌握了analogRead函數(shù)的用法!

(二)使用AanlogWrite函數(shù)和電位器實(shí)現(xiàn)調(diào)光LED

我們已經(jīng)學(xué)會(huì)了用電位器調(diào)節(jié)輸出0~5V的電壓,下一步就是用LED燈將最終的結(jié)果顯示出來。

實(shí)驗(yàn)材料:

  • Arduino Nano開發(fā)板
  • 配套USB數(shù)據(jù)線
  • 面包板及配套連接線
  • 1個(gè)LED燈
  • 1個(gè)470Ω限流電阻
  • 1個(gè)電位器

搭建電路圖:

Arduino板5v和GND分別用跳線連接到面包板的上下兩排對(duì)應(yīng)的位置。直插LED燈正極連接限流電阻,電阻另一端連接開發(fā)板第10引腳,LED燈負(fù)極接開發(fā)板GND(也就是藍(lán)色排)。電位器1號(hào)腳和3號(hào)腳分別連接開發(fā)板5V(紅排)和GND(藍(lán)排),2號(hào)腳連接開發(fā)板A0(模擬輸入)引腳。

Fritzing繪制連接圖:
電路連接圖
實(shí)物連接圖如下:
使用analogwrite函數(shù)調(diào)光

編寫代碼:

下一步就是通過代碼將程序上傳到你的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,可以省略
//注意:模擬接口自動(dòng)設(shè)置為輸入
}
void loop() {
  val = analogRead(potpin);//讀取傳感器的模擬值并賦值給val   
  Serial.println(val);//顯示變量val的值,可以省略
  analogWrite(ledPin, val/4); //打開LED并設(shè)置亮度(PWM 輸出最大255)
}

(注意:為什么這里定義的端口要用potpin?)

因?yàn)殡娢黄鞯挠⑽拿?strong>Potentiometer,這里取自它的前幾個(gè)字母,以便與其他引腳區(qū)分開。

實(shí)際操作圖:
實(shí)際運(yùn)行圖

實(shí)驗(yàn)現(xiàn)象

通過旋轉(zhuǎn)電位器旋鈕,LED燈亮度改變。如果用串口監(jiān)視的話,就會(huì)在監(jiān)視器顯示相應(yīng)的數(shù)值。

函數(shù)介紹

  • AnalogWrite
    1.說明:將一個(gè)模擬數(shù)值寫進(jìn)Arduino引腳。這個(gè)操作可以用來控制LED的亮度,或者控制電機(jī)的轉(zhuǎn)速。Arduino每一次對(duì)引腳執(zhí)行AnalogWrite命令,都會(huì)給該引腳一個(gè)固定頻率的PWM信號(hào)。
    AnalogWrite()函數(shù)支持以下引腳:3,5,6,9,10,11。
    在調(diào)用AnalogWrite函數(shù)前,您無需使用pinMode()函數(shù)來設(shè)置該引腳。
    2.語法:analogWrite(pin,value)
    3.參數(shù):
    pin:被讀取的模擬引腳號(hào)碼
    value:0到255之間的PWM頻率值,0對(duì)應(yīng)off,255對(duì)應(yīng)on
    4.返回值:

程序分析

程序中通過analogRead()函數(shù)來讀取模擬輸入值,這個(gè)輸入值的范圍是0到1023之間,然后通過analogWrite()函數(shù)來改變LED燈占空比,范圍是0到255之間,從而改變亮度。

*占空比
所謂占空比就是調(diào)整led通過電流和不通過電流的時(shí)間比來控制的,由于人眼視覺暫留特性,所以只要頻率比較高是看不出來閃爍的,當(dāng)然通過電流比不通過電流的時(shí)間比例越大,led做的功就越多,這樣也就越亮,需要注意的是led芯片的溫升和最大電流值不要超標(biāo),不然會(huì)影響其壽命。

低占空比意味著輸出的能量低,因?yàn)樵谝粋€(gè)周期內(nèi)大部分時(shí)間信號(hào)處于關(guān)閉狀態(tài),如果pwm控制的負(fù)載為led,則具體表現(xiàn)例如led燈很暗。
高占空比意味著輸出的能量高,在一個(gè)周期內(nèi),大部分時(shí)間信號(hào)處于on狀態(tài),具體表現(xiàn)為Led比較亮。
當(dāng)占空比為100%時(shí),表示 fully on,也就是在一個(gè)周期內(nèi),信號(hào)都處于on狀態(tài),具體表現(xiàn)為led亮度到達(dá)100%。
為0%時(shí)則表示 totally off,在一個(gè)周期內(nèi),一直處于off狀態(tài),具體表現(xiàn)為led熄滅。
現(xiàn)在一切都已明了:脈沖寬度調(diào)制,這個(gè)寬,不是物體的寬度,而是高電平信號(hào)在一個(gè)調(diào)制周期中持續(xù)時(shí)間長短,它可以用占空比去衡量,占空比越大,脈沖寬度越寬。

(三)使用純軟件編程和電位器實(shí)現(xiàn)調(diào)光LED(不使用analogwrite函數(shù),引腳更通用)

基本原理

通過調(diào)整PWM的占空比,來調(diào)節(jié)通過LED燈的電流時(shí)間長度,改變LED燈的做功大小,從而實(shí)現(xiàn)調(diào)光LED燈的亮度。
在此代碼中,手動(dòng)設(shè)置一個(gè)PWM信號(hào),其信號(hào)中高低電壓的時(shí)間長短是根據(jù)輸入端口的值 val 來改變的。val的值是運(yùn)用analogRead()函數(shù)讀取的模擬輸入端口的值,范圍為0~1023,當(dāng)我們調(diào)節(jié)電位器時(shí),val就會(huì)發(fā)生改變,這時(shí)LED燈的亮度就會(huì)隨val的值變化。

電路連接

電路圖與3.2相同,只將輸出端口改為13號(hào)。由于我們使用的是13號(hào)引腳,在arduino開發(fā)板上直接連接者一個(gè)LED燈,所以我們可以單獨(dú)使用一個(gè)LED燈,也可以直接用開發(fā)板上的。具體如圖所示:

使用單獨(dú)的LED燈:
純軟件調(diào)光(使用單獨(dú)的LED燈)
不使用單獨(dú)的LED燈:
純軟件調(diào)光(不使用單獨(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長度的時(shí)間 
   digitalWrite(ledpin, LOW);      //設(shè)置輸出端口為低電壓
   delayMicroseconds(1000 - val);   //延遲1000-val長度的時(shí)間
}

所用函數(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:引腳號(hào)
value:HIGH或LOW
4.返回值:

delayMicroseconds () 函數(shù)
1.說明:暫停程序指定為參數(shù)的時(shí)間量(以微秒為單位)。
2句法:
delayMicroseconds(us)
3.參數(shù):
us:暫停的微秒數(shù)(unsigned int)
4.返回值:

(四)比較兩種方式的區(qū)別與聯(lián)系

兩種方法的比較

(五)實(shí)踐過程中遇到的問題

1. 找不到哪個(gè)是電位器?
由于剛剛接觸arduino,所以很多小零件都沒見過,就只認(rèn)識(shí)個(gè)LED燈和Nano開發(fā)板,而且很多部件都標(biāo)著英文,也看不懂。所以對(duì)于這個(gè)陌生的名詞,只好猜吧,看看憑感覺哪個(gè)像,亦或者問問老師。

右為電位器

但是這種方法是行不通的,既耗時(shí)又耗力,還不利于個(gè)人自主學(xué)習(xí)與探究。經(jīng)過反思,后來我們的解決辦法是:先到網(wǎng)上搜集有關(guān)電位器的信息,從百度百科上看到電位器的圖片和基本介紹,對(duì)照著信息,我們終于在一堆亂七八糟的零件中找到了它!

2. 不知道純軟件編程的含義是啥?
聽起來覺得可能很高大上,讓人難懂,但是說得通俗點(diǎn)就是不使用analogwrite函數(shù),而是使用更通用的方式(digitalwrite與delay函數(shù)結(jié)合),使得引腳更通用更靈活的一種方法。通過手動(dòng)控制占空比,利用電位器可以使LED燈實(shí)現(xiàn)調(diào)光。
經(jīng)過在網(wǎng)上搜集資料并研究,我們終于還是實(shí)現(xiàn)了手動(dòng)調(diào)光,并且比較了二者的區(qū)別與聯(lián)系。

3.編譯時(shí)出現(xiàn)錯(cuò)誤
在進(jìn)行純軟件編程的時(shí)候,在代碼編譯時(shí)出現(xiàn)了錯(cuò)誤,提示缺少定義輸出端口的代碼:

編譯錯(cuò)誤

我們翻譯了一下錯(cuò)誤消息,然后找到紅色提示的一行,發(fā)現(xiàn)缺少定義的變量,往上找代碼,原因是在復(fù)制代碼的時(shí)候漏了一行,導(dǎo)致在編譯時(shí)找不到ledpin這個(gè)變量。所以在以后一定要注意仔細(xì)檢查代碼是否完整,學(xué)會(huì)看各種提示錯(cuò)誤,不斷積累經(jīng)驗(yàn)。

4.恍然大悟——手動(dòng)調(diào)光原來還可以這樣
在使用純軟件編程的時(shí)候,我們只是單純地將引腳由10號(hào)改成13號(hào),然后旋轉(zhuǎn)電位器調(diào)光。但是細(xì)心的小園同學(xué)發(fā)現(xiàn)arduino開發(fā)板上的另一個(gè)紅燈亮了,之前是不亮的。所以我們恍然大悟,原來13號(hào)引腳就直接連著一個(gè)LED燈,我們可以不用再外接一個(gè)LED燈了(但是電阻還是要接的)。不過有追求完美可觀的同學(xué)可以外接一個(gè),更容易觀察。

5.還有一個(gè)未解之疑:手動(dòng)調(diào)光LED燈為什么不能完全熄滅?
我們?cè)谶M(jìn)行純軟件編程的時(shí)候,發(fā)現(xiàn)無論如何旋轉(zhuǎn)電位器,都不能使LED燈完全熄滅,總是會(huì)帶有一點(diǎn)紅光:

LED燈不能完全熄滅

截至目前為止,我們已經(jīng)使用了很多方法,比如修改代碼(delay函數(shù)的參數(shù))、檢查電路、更換電阻等等。但是由于知識(shí)有限,還不能解決這一問題,哪位大佬可以幫忙解答一下啊~

(六)總結(jié)與體會(huì)

經(jīng)過本次有關(guān)Arduino項(xiàng)目的實(shí)踐,我們對(duì)Arduino開發(fā)板、各種元件以及函數(shù)的使用又有了更深刻的認(rèn)識(shí),使得知識(shí)不僅僅停留在書面上,更多是表現(xiàn)在外面的技能以及思維的活躍方面。
主要包括:1.Arduino軟件安裝以及與電腦連通方式;2.程序編譯、上傳等基本方式;3.面包板的使用方式,F(xiàn)ritzing的使用;4.學(xué)會(huì)了控制LED的亮滅;5.區(qū)分?jǐn)?shù)字端口中的模擬端口并學(xué)會(huì)使用;6.完成電位器調(diào)光LED燈等等。在后續(xù)的學(xué)習(xí)中也在不斷積累有關(guān)Arduino更深入的知識(shí),不斷提高能力。
通過小組的合作學(xué)習(xí),使得我們?cè)趯W(xué)習(xí)上總會(huì)產(chǎn)生思維的碰撞,大家相互爭論,相互幫助,共同完成項(xiàng)目。盡管在完成的過程中遇到了各種問題,當(dāng)時(shí)確實(shí)是很頭疼,但是通過各種途徑解決之后,再回過頭來看就發(fā)現(xiàn)每個(gè)人真的成長了很多。

只有想不到的,沒有做不到的。創(chuàng)意的思維總是千奇百怪,各有不同,因此也就顯得特別珍貴,所以對(duì)于每個(gè)人的創(chuàng)新思維,都值得我們?nèi)ケWo(hù)。未來的人工智能領(lǐng)域是如此,教育亦是如此,創(chuàng)新和實(shí)踐總是貫穿其中,總讓人不由自主的接近和了解它。
現(xiàn)在,讓我們積極思維與實(shí)踐,一起打開Arduino世界的大門!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容