Arduino 內(nèi)置示例——基本原理示例

之前我們簡單介紹了Arduino 內(nèi)置示例結(jié)構(gòu)及其簡單框架,這里我們繼續(xù)介紹其基本原理中的基本示例。

基本原理

image.png
  • 模擬讀取串口:讀取一個電位計,打印它的狀態(tài)到Arduino串口監(jiān)視器。
  • 最簡框架:開始一段新程序的最簡框架
  • 閃爍:不停打開關(guān)閉一個LED燈。
  • 數(shù)字讀取串口:讀取一個開關(guān),打印它的狀態(tài)到Arduino串口監(jiān)視器。
  • 漸變:使用模擬輸出口來使一個LED燈的亮度變淡。
  • 讀取模擬電壓:讀取一個模擬輸入,然后打印其電壓值到串口監(jiān)視器。
1、模擬讀取串口
image.png

這個例子展示怎樣通過電位計從物理世界里讀取模擬輸入。電位計是一個簡單的物理設(shè)備,在它的軸轉(zhuǎn)動時可以提供一系列的阻值。流過的電壓通過電位計和進入開發(fā)板的模擬輸入口,可以測量由電位計產(chǎn)生的大量電阻,作為一個模擬值。我們可以通過該例子監(jiān)視電位計的狀態(tài)。電位計也可以叫做電平值。

連接從電位計到你的開發(fā)板的3條線。第一根線從電位計的一個輸出引腳到地。第二根從電位計的另一個輸出引腳到5V。第三根從電位計中間的引腳到模擬引腳A0。

硬件連接:


image.png

注意:

  1. 通過旋轉(zhuǎn)電位計的軸,你在刮器任意一個方向改變電阻的值(刮器連接到電位計中心引腳)。這個可以改變中間引腳的電壓。當(dāng)中心引腳和5v的電阻約為0時(中心引腳到地的電阻約為10kΩ),中心引腳的電壓約為5V。當(dāng)電阻被翻轉(zhuǎn)時,中心引腳電壓約為0,即是地。這個電壓是你在讀取輸入引腳的模擬電壓。

  2. Arduino開發(fā)板有一個內(nèi)置電路叫模擬到數(shù)字轉(zhuǎn)換器(ADC),這個可以讀取變化的電壓,并轉(zhuǎn)換成0到1023之間的數(shù)值。另外,analogRead()函數(shù)可以按比例轉(zhuǎn)換一個0到1023之間的數(shù)字成為這個引腳上的電壓。

樣例代碼:

// 當(dāng)程序啟動或者復(fù)位后,setup只運行一次
void setup() {
  // 通過串口初始化其波特率為9600
  Serial.begin(9600);
}

// 板子會自動調(diào)用loop使其程序會以循環(huán)模式運行
void loop() {
  //需要創(chuàng)建一個變量來保存來自你的電位計的電阻值(這個數(shù)值在0到1023之間,最好用int)
  int sensorValue = analogRead(A0);
  // 需要打印這個信息到你的串口監(jiān)視器窗口。你可以在代碼的最后一行增加Serial.println()來打印
  Serial.println(sensorValue);
  //每次循環(huán)延時1ms
  delay(1);       
}

現(xiàn)在,當(dāng)你打開你在Arduino IDE軟件上的串口監(jiān)視器(可以通過鍵盤快捷鍵Ctrl+Shift+M打開),你應(yīng)該看到和罐子位置相關(guān)的一個穩(wěn)定的從0到1023的數(shù)據(jù)流。隨著你轉(zhuǎn)動電位計,這些數(shù)字會即時響應(yīng)。

運行效果:


image.png
image.png

2、閃爍

通過io,控制led的不停閃爍。需要使用LED燈,220 ohm 電阻。

硬件連接:


image.png

注意:

  1. 先連接電阻的一端到Arduino的PIN2引腳。再連接LED燈的短引腳(負腳,也叫負極)到電阻的另一端。最后連接LED燈的長引腳(正腳,也叫陽極)到Arduino的V5引腳。
  2. 串聯(lián)LED燈的電阻值可以在220 ohm之間;LED燈點亮?xí)r,其阻值直達1k ohm。

插好電路板,連上電腦之后,打開Arduino IDE軟件,從菜單里載入。
File/Examples/01.Basics/Blink 。你最先要做的事是,作為一個輸出引腳初始化pin2:


image.png

示例源碼:

//在該代碼首位置,需要定義我們需要輸出的IO,例如
#define LED_BUILTIN 2 //定義數(shù)字IO 2的名字為led

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // 寫入pin2為高電平
  delay(1000);                       // 延時1s
  digitalWrite(LED_BUILTIN, LOW);    // 寫入pin2為低電平
  delay(1000);                       // 延時1s
}

運行效果:


閃爍.gif

3、數(shù)字讀取串口

這個例子展示怎樣通過創(chuàng)建開發(fā)板和電腦的串口通訊監(jiān)視開關(guān)狀態(tài)

image.png

注意:

  1. 連接兩根線到開發(fā)板。GND腳接一個開關(guān)的一腳,開關(guān)對角線的腳接pin2。
    2、開關(guān)連接電路的兩點。按鈕是斷開的(未按),默認(rèn)讀取到的是高定平1,當(dāng)按鍵按下開關(guān)變?yōu)檫B通狀態(tài),由于接GND,pin2電平被拉低為0.
  2. 如果你沒有連接到數(shù)字I/O口到任何地方,TX的LED燈可能會不規(guī)則閃爍。這是因為輸入引腳處于懸浮狀態(tài)——它沒有固定連接到電源或者地,并且它會隨機在高電平和低電平之間切換。這是你需要下拉或者上拉電阻的原因。(延時縮小,就能看到數(shù)據(jù)在0、1反復(fù)切換)

IO懸空狀態(tài)輸出:


IO懸空

正常狀態(tài):


image.png
// digital pin 2 has a pushbutton attached to it. Give it a name:
int pushButton = 2;

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  // make the pushbutton's pin an input:
  pinMode(pushButton, INPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  // 讀取pin2腳電平狀態(tài)
  int buttonState = digitalRead(pushButton);
  // 輸出電平的狀態(tài)值
  Serial.println(buttonState);
  delay(1000);        // 原例程延時1ms,建議加大延時,效果可能會明顯一些
}
image.png

ps:如果為了顯示效果較好,可以引入按鍵防抖處理
防抖原理:

  1. 按鍵檢測原理:將Arduino的數(shù)字IO設(shè)置為輸入狀態(tài)來監(jiān)控按鍵是否按下,當(dāng)按鍵未按下時候因為有上拉電阻存在,讀到的電平是高電平,當(dāng)按鍵按下時,因為按鍵引腳接地,讀取得電平為低電平,由此判斷按鍵是否按下。
  2. 按鍵去抖原理:因為人手的機械動作使按鍵按下時會產(chǎn)生大概20ms左右的按鍵抖動效果,如果在這期間檢測IO電平很可能會出現(xiàn)不穩(wěn)定信號,因此檢測到電平后需要延時20ms
  3. 松手檢測原理:程序無限循環(huán)等待按鍵松開,其實就是不斷地去檢測IO狀態(tài),如果恢復(fù)了高電平就可以跳出循環(huán)。

4、漸變

例子示范怎么使用 analogWrite() 函數(shù)來使LED燈逐漸變亮和變暗。
模擬寫入是使用調(diào)幅脈沖(PWM),快速切換數(shù)字引腳的開關(guān)狀態(tài)來達到漸明漸暗的效果。


image.png

把LED燈的陽極(較長,正極的引腳)通過一個220 ohm的電阻連接到開發(fā)板上的數(shù)字輸出引腳pin9。陰極(較短,負極的引腳)連接到地。

樣例代碼:

/*
  Fade

  This example shows how to fade an LED on pin 9 using the analogWrite()
  function.

  The analogWrite() function uses PWM, so if you want to change the pin you're
  using, be sure to use another PWM capable pin. On most Arduino, the PWM pins
  are identified with a "~" sign, like ~3, ~5, ~6, ~9, ~10 and ~11.

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/Fade
*/

int led = 9;           // the PWM pin the LED is attached to
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by

// the setup routine runs once when you press reset:
void setup() {
  // declare pin 9 to be an output:
  pinMode(led, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  // set the brightness of pin 9:
  analogWrite(led, brightness);

  // change the brightness for next time through the loop:
  brightness = brightness + fadeAmount;

  // reverse the direction of the fading at the ends of the fade:
  if (brightness <= 0 || brightness >= 255) {
    fadeAmount = -fadeAmount;
  }
  // wait for 30 milliseconds to see the dimming effect
  delay(30);
}
  1. 聲明pin9作為LED的引腳后,不用在setup()函數(shù)里加入其他語句。
  2. 你要在主循環(huán)里用analogWrite()函數(shù)來提供兩個參數(shù):一個調(diào)用這個引腳寫入的函數(shù),一個寫入PWM的值。
  3. 為了使LED燈漸明和漸暗,從0到255逐漸增加PWM值,然后回到0,重復(fù)循環(huán)。在下面程序里,這個PWM值是用一個brightness的變量來控制。每次循環(huán),它都跟隨變量fadeAmount的值增加而增加。
  4. 如果brightness在它的值的極端(0或者255),那么fadeAmount變?yōu)樨摌O。換句話,如果fadeAmount是5,那么它被設(shè)為-5。如果它是-5,那么它被設(shè)為5。循環(huán)的下一次,這個變化同樣會引起brightness改變方向。
  5. analogWrite() 可以很快地改變PWM值,所以程序后面的延遲控制漸變的速度。試下改變延時的時間,然后看它怎么影響LED燈漸變。

運行效果:


漸變.gif

5、讀取模擬電壓

例子展示怎樣讀取一個在模擬引腳PIN 0上的模擬輸入,把analogRead()的值轉(zhuǎn)換成電壓,然后打印到Arduino IDE的串口監(jiān)視器里。

image.png
  1. 連接從電位計到你的開發(fā)板的3條線。第一根線從電位計的一個輸出引腳到地。第二根從電位計的另一個輸出引腳到5V。第三根從電位計中間的引腳到模擬引腳A0.
  2. 通過旋轉(zhuǎn)電位計的軸,你在刮器任意一個方向改變電阻的值(刮器連接到電位計中心引腳)。這個可以改變中間引腳的電壓。當(dāng)中心引腳和5v的電阻約為0時(中心引腳到地的電阻約為10kΩ),中心引腳的電壓約為5V。當(dāng)電阻被翻轉(zhuǎn)時,中心引腳電壓約為0,即是地。這個電壓是你在讀取輸入引腳的模擬電壓
  3. Arduino和Genuino開發(fā)板有一個內(nèi)置電路叫模擬到數(shù)字轉(zhuǎn)換器,或者叫ADC,這個可以讀取變化的電壓,并轉(zhuǎn)換成0到1023之間的數(shù)值。另外,analogRead()函數(shù)可以按比例轉(zhuǎn)換一個0到1023之間的數(shù)字成為這個引腳上的電壓。

樣例代碼:

/*
  ReadAnalogVoltage

  Reads an analog input on pin 0, converts it to voltage, and prints the result to the Serial Monitor.
  Graphical representation is available using Serial Plotter (Tools > Serial Plotter menu).
  Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/ReadAnalogVoltage
*/

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
}

// the loop routine runs over and over again forever:
void loop() {
  // 變量sensorValue來保存來自你的電位計的電阻值(這個數(shù)值在0到1023之間,最好用int)
  int sensorValue = analogRead(A0);
  // 為了使從0-1023的值對應(yīng)到讀取到的電壓值,你需要創(chuàng)建另外一個浮點類型的變量,然后做一些運算:
  float voltage = sensorValue * (5.0 / 1023.0);
  // print out the value you read:
  Serial.println(voltage);
}

運行效果:
當(dāng)你打開你在Arduino IDE軟件上的串口監(jiān)視器(可以通過鍵盤快捷鍵Ctrl+Shift+M打開),你應(yīng)該看到一個范圍從0.0-5.0的穩(wěn)定的數(shù)據(jù)流。隨著你轉(zhuǎn)動那個旋鈕,這個輸入到A0引腳的電壓值會隨之變化。

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

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

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