Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 手把手教你做藍牙小車(一)

手把手教你做藍牙小車(一)

編輯:關於Android編程

第1節 選擇Arduino開發板

1.1 Arduino是什麼

對Arduino,官方有一堆解釋。
作為一個軟件程序猿,在我眼裡,Arduino是學習“可怕硬件”的一個便捷通道。它把復雜的硬件名稱,屬性給我們隱藏起來,只需要一些簡單的軟件知識,就可以學習硬件開發。

1.2 怎麼選擇Arduino開發板

1.2.1 官方版本還是兼容版本

Arduino是開源項目,硬件結構,軟件設計都開源。
所以不存在盜版的問題。
官方版質量肯定是槓槓的,但價格也貴。
兩者價格數字差不多,一個賣人民幣,一個賣美元。
不差錢就買官方版,否則兼容版也不錯。

1.2.2 Uno還是Mega

Arduino有一系列各種用途的開發板,最常見的有兩種,Uno和Mega。
Uno價格便宜一些,功能簡單。
Mega價格比Uno貴二十多塊,官方版貴二十多美元,兼容版貴二十多人民幣。

大家買Arduino開發板,主要用途就是學習,要求能方便的了解到更多特性。
Uno接口太少,比如做個小車,接了四個馬達後,基本就不能再添加其他模塊了。
如果你要做個藍牙小車,調試時噩夢就來了。因為Uno只有一個串口,藍牙和USB共用。
你的先拔下藍牙模塊的連接線才能上傳程序,上傳完成後,然後再插上藍牙連接線才能開始測試。
如果你不只是學習,而是要研發產品,要考慮產品的成本價。。。
選擇Mega也任然沒有錯,你可以現在Mega上完成開發,最後在Uno上做性能測試。

所以,我的建議是選Mega。

第2節 從HelloWorld開始

我記得從學習C語言開始,都是先寫個HelloWorld程序。
Arduino我們也從這裡開始吧。

2.1 搭建開發環境

官網下載Arduino集成開發環境(以後都簡稱Arduino IDE)。
解壓後,雙擊此目錄下的arduino.exe,啟動Arduino IDE。
我這裡是以Windows平台為例,Mac,Linux界面、操作基本相同,也可以參照本例學習。

2.2 新建工程

啟動Arduino IDE,點擊菜單 文件->新建(快捷鍵Ctrl+N),生成新的工程。

\

點擊菜單 文件->保存(快捷鍵Ctrl+S),保存生成的工程。
文件名這裡我填“HelloWorld”,Arduino IDE會生成一個名稱叫“HelloWorld”的文件夾,並在這個文件夾下生成一個同名的HelloWorld.ino文件。

\

.ino文件是Arduino工程的主文件,Arduino要求ino文件必須置於一個同名文件夾下

2.3 Hello World

新生成的工程自動生成了setup()loop()兩個函數。
我們先改改代碼,輸出“Hello World”,有點切身感受。稍後再來講解代碼結構。

在setup函數裡設置串口波特率

void setup() {

  // put your setup code here, to run once:
  Serial.begin(9600);
}

用串口輸出”Hello world!”

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("Hello world!");
}

點右上角的按鈕打開串口監視器(快捷鍵Ctrl+Shift+m)

\

波特率必須和setup裡設置的相同,本例是9600.

可以看到不斷輸出“Hello world!”

\

2.4 代碼結構

HelloWorld.ino文件就兩個函數

void setup()

void loop()

它們是怎麼運行起來的呢?

看下面這段代碼

void setup(void);
void loop(void);

int main(void) {
  setup();

  while(1) {}
    loop();
  }

  return 0;
}

是不是很清楚了。

main和while這些代碼去哪了呢?Arduino IDE隱藏了,讓我們的代碼結構更清晰。
setup()只執行一次,用來放初始化的函數
loop()不斷循環執行,用來檢查各傳感器狀態,驅動程序運行。

2.5 Serial

Arduino IDE通過串口和PC(或其他設備)通訊。
在Arduino IDE中Serial就是串口的化身。
注意,Serial是系統對象,不是類,所以使用時直接Serial.begin()。

2.5.1 官網詳述

詳細內容可以參看官網的描述:
https://www.arduino.cc/en/Reference/Serial
學習Arduino,官網要隨時訪問。

2.5.2 Serial硬件結構

Uno示例

\

USB接口和0、1引腳都是接Serial

Mega示例

\

USB接口和0、1引腳都是接Serial
18、19引腳是接Serial1
16、17引腳是接Serial2
14、15引腳是接Serial3

第3節 控制LED燈開關

Arduino自帶了很多例子。
Blink是其中為數不多的只要有Arduino開發板就可以開始學習的例子。

菜單 文件->示例->01.Basic->Blink打開今天要講的例子。

3.1 setup函數

void setup() {
  // initialize digital pin 13 as an output.
  pinMode(13, OUTPUT);
}

學習硬件開發,一個很大的門檻是要記住許多復雜的寄存器地址。
Arduino的NB之處就在於她簡化了這許多地址,定義了幾種不同類型的硬件插口,稱為引腳。
編程時只需要對這幾類引腳做操作就可以了。
今天先講最常用的引腳,DigitalPins。
官網解釋如下:
https://www.arduino.cc/en/Tutorial/DigitalPins
簡單說就是一種可以輸入或輸出數字信號0,1的引腳。
某個引腳是用來輸入還是輸出信號,就通過pinMode函數來定義。

  pinMode(13, OUTPUT);

這段代碼的意思是編號為D13的引腳,定義為輸出模式。

3.2 為什麼是D13引腳?

因為D13引腳連接著一個焊接在Arduino開發板上的LED燈。
所以,如果沒有可外接的LED模塊,就用D13引腳來做演示。

3.3 loop函數

void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);              // wait for a second
}

loop函數總共4行代碼

digitalWrite(13, HIGH);

將D13置高,也就是通電。
切記,只有之前將引腳設置為OUTPUT,digitalWrite才能生效。

delay(1000);

延時1秒,在這1秒鐘,LED燈狀態不變,即點亮狀態。

digitalWrite(13, LOW);

將D13置低,也就是斷電。

delay(1000);

延時1秒,在這1秒鐘,LED燈狀態不變,即熄滅狀態。
之後loop函數被再次執行,我們看到的現象就是LED燈一秒亮、一秒暗的不停閃爍。

3.4 D13控制的LED燈在哪個位置?

不同的開發板,D13控制的LED燈位置,顏色都略有不同。
相信大多數看官我在下一樣,都是搞軟件出身的。根本分不清LED燈長啥樣:P
開發板連接到上電源(USB線接電腦也算)後,如果只有一個LED燈亮著,這個LED燈旁邊肯定有一個“On”標記,這個是表示電源接通的LED燈。
上傳本例到開發板後,閃爍的那個就是我們要找到D13 LED燈了。可以在這個LED燈旁看到個‘L’標記。

\

第4節 控制LED燈的亮度

LED燈是最常見的Arduino模塊,上一節我們講了控制Arduino開發板自帶的LED燈。
這一節還講LED燈,講外接、可控亮度的LED燈。

4.1 PWM

先介紹個概念,Pulse Width Modulation簡稱PWM。
數字接口只能輸出0或1兩種狀態,PWM通過在0、1兩種狀態間快速切換,生成一個介於0、1之間的值。
比如1000ms中,平均400ms處於1(高),平均600ms處於0(低),兩種狀態均勻分布,就輸出了一個0.4的值。

詳細內容參加官網:
https://www.arduino.cc/en/Tutorial/PWM

4.2 LED模塊

你的LED模塊可能是這樣子

\

也可能是這樣子

\

不管長什麼樣,只要單色可調光LED,都是三根線。
標注字符IN的是控制線、VCC是電源線、GND是地線。

4.3 連接模塊

Mega開發板,2-13引腳都支持PWM,隨便選一個都可以。

\

Uno開發板,3,5,6,9,10,11引腳支持PWM,可以在開發板上看到引腳數字邊上有個’~’。

\

LED燈IN連接到Mega D2引腳;VCC接到Mega 5V引腳;GND接到Mega GND引腳。

\

早期的開發板,為了防止電壓不穩定擊穿電子器件,需要連接個電阻。
現在的開發板,只在接馬達時才需要增加電阻,慣常的做法是增加一塊擴展板。

4.4 修改代碼

4.4.1 修改引腳

因為這次我們使用了D2引腳,所以需要修改此處的13為2

  pinMode(13, OUTPUT);

還要修改此處的13為2

void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);              // wait for a second
}

點擊菜單 項目->上傳,上傳代碼到開發板。
可以看到這個外接的LED燈也像內置的LED燈一樣閃爍了。

4.4.2 優化代碼

剛才我們因為更換引腳,修改了3處代碼。
在arduoni開發中,更換引腳是很經常發生的事,常見的做法是在setup函數之前增加宏定義

define LED_PIN 2

void setup() {
...

將代碼中的D2相關代碼都用LED_PIN替換,以後再更換引腳就很方便了。

4.5 調節LED亮度

4.5.1 調整為固定值

用analogWrite函數控制PWM引腳,第一個參數是引腳序號,第二個是輸出到這個引腳的值,范圍0~255.
analogWrite(LED_PIN, 10)這行代碼使LED燈發出微弱的光。

void loop() {
  analogWrite(LED_PIN, 10);
}

4.5.2 動態調整亮度

我們通過串口輸入一個介於0-255的數字來調整LED燈亮度。

本例我們將演示四個Serial對象函數的使用方法。

4.5.1.1 初始化

使用begin()函數在setup函數裡設置串口波特率。

void setup() {
  Serial.begin(9600);
  pinMode(LED_PIN, OUTPUT);
}

4.5.1.2 檢測串口是否有數據輸入

Serial.available()返回true表示串口有數據待讀取

void loop() {
  while (Serial.available()) {
  ...

4.5.1.3 從串口讀入一個long型數字

Serial.parseInt()讀取串口中輸入的字符串。如果輸入的是非數字,會被解析為0.

void loop() {
  while (Serial.available()) {
    Serial.parseInt();

4.5.1.4 改變LED燈亮度

analogWrite()函數用來給模擬接口寫入數據。
第一個參數指定引腳序號,第二個參數指定寫入引腳的值。

long ledLevel = 10;

void loop() {
  while (Serial.available()) {
    ledLevel = Serial.parseInt();
  }

  analogWrite(LED_PIN, ledLevel);
}

因為analogWrite接受的值在0-255之間,所以代碼可以做些優化。
用uint8_t代替long型。

uint8_t ledLevel = 10;

void loop() {
  while (Serial.available()) {
    ledLevel = Serial.parseInt();
  }

  analogWrite(LED_PIN, ledLevel);
}

4.5.1.5 輸出Debug信息

print在串口輸出參數信息。
println在串口輸出參數信息,並回車。

uint8_t ledLevel = 10;
void loop() {
  while (Serial.available()) {
    ledLevel = Serial.parseInt();
    Serial.print("ledLevel=");
    Serial.println(ledLevel);
  }

  analogWrite(LED_PIN, ledLevel);
}

4.5.1.6 串口模擬器設置修改

串口模擬器稍作修改,右下角這裡改成“沒有結束符”。
否則parseInt會把結束符解析成0,導致LED燈錯誤熄滅。

\

4.6 測試

\
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved