- Arduino項目案例:游戲開發
- 李永華 王冬宇
- 3280字
- 2020-06-10 12:52:35
1.4 Arduino編程語言
Arduino編程語言是建立在C/C++語言基礎上的,即以C/C++為語言基礎,把AVR單片機(微控制器)相關的一些寄存器參數設置等進行函數化,以利于開發者更加快速地使用,其主要使用的函數包括:數字I/O引腳操作函數、模擬I/O引腳操作函數、高級I/O引腳操作函數、時間函數、中斷函數、通信函數和數學函數等。
1.4.1 Arduino編程基礎
關鍵字:if,if...else,for,switch,case,while,do...while,break,continue,return,goto。
語法符號:每條語句以分號“;”結尾,每段程序以花括號“{}”括起來。
數據類型:boolean,char,int,unsigned int,long,unsigned long,float,double,string,array,void。
常量:HIGH或者LOW,表示數字I/O引腳的電平,HIGH表示高電平(1),LOW表示低電平(0)。INPUT或者OUTPUT,表示數字I/O引腳的方向,INPUT表示輸入(高阻態),OUTPUT表示輸出(AVR能提供5V電壓40mA電流)。TRUE或者FALSE,TRUE表示真(1),FALSE表示假(0)。
程序結構:主要包括兩部分,void setup()和void loop()。其中,void setup()是聲明變量及引腳名稱(如:int val;int ledPin=13;),在程序開始時使用,初始化變量和引腳模式,調用庫函數如pinMode(ledPin,OUTPUT)。而void loop()用在setup()函數之后,不斷地循環執行,是Arduino的主體。
1.4.2 數字I/O引腳的操作函數
1.pinMode(pin,mode)
pinMode函數用于配置引腳以及設置輸出或輸入模式,是一個無返回值函數。該函數有兩個參數,pin和mode。pin參數表示要配置的引腳,mode參數表示設置該引腳的模式為INPUT(輸入)或OUTPUT(輸出)。
INPUT參數用于讀取信號,OUTPUT用于輸出控制信號。Pin的范圍是數字引腳0~13,也可以把模擬引腳(A0~A5)作為數字引腳使用,此時引腳14對應模擬引腳0,引腳19對應模擬引腳5。該函數一般會放在setup()里,先設置再使用。
2.digitalWrite(pin,value)
該函數的作用是設置引腳的輸出電壓為高電平或低電平,也是一個無返回值的函數。
pin參數表示所要設置的引腳,value參數表示輸出的電壓HIGH(高電平)或LOW(低電平)。
注意:使用前必須先用pinMode設置。
3.digitalRead(pin)
該函數在引腳設置為輸入的情況下,可以獲取引腳的電壓情況HIGH(高電平)或者LOW(低電平)。
數字I/O引腳操作函數使用例程如下:

1.4.3 模擬I/O引腳的操作函數
1.analogReference(type)
該函數用于配置模擬引腳的參考電壓。它有三種類型,DEFAULT是默認值,參考電壓是5V;INTERNAL是低電壓模式,使用片內基準電壓源2.56V;EXTERNAL是擴展模式,通過AREF引腳獲取參考電壓。
注意:若不使用本函數,默認參考電壓是5V。若使用AREF作為參考電壓,需接一個5kΩ的上拉電阻。
2.analogRead(pin)
用于讀取引腳的模擬量電壓值,每讀取一次需要花100μs的時間。參數pin表示所要獲取模擬量電壓值的引腳,返回為int型。它的精度為10位,返回值為0~1023。
注意:函數參數pin的取值范圍是0~5,對應開發板上的模擬引腳A0~A5。
3.analogWrite(pin,value)
該函數是通過PWM(Pulse-Width Modulation,脈沖寬度調制)的方式在引腳上輸出一個模擬量,圖1-23所示為PWM輸出的一般形式,也就是在一個脈沖的周期內高電平所占的比例。它主要用于LED亮度控制,直流電機轉速控制等方面。

圖1-23 占空比的定義
Arduino中的PWM的頻率大約為490Hz,Arduino UNO開發板支持以下數字引腳(不是模擬輸入引腳)作為PWM模擬輸出:3、5、6、9、10、11。開發板上帶PWM輸出的都有“~”號。
注意:PWM輸出位數為8位,即0~255。
模擬I/O引腳的操作函數使用例程如下:

1.4.4 高級I/O引腳的操作函數
Pulseln(pin,state,timeout)函數用于讀取引腳脈沖的時間長度,脈沖可以是HIGH或者LOW。如果是HIGH,該函數將先等引腳變為高電平,然后開始計時,一直等到變為低電平停止計時。返回脈沖持續的時間,單位為ms,如果超時沒有讀到時間,則返回0。
例程說明:做一個按鈕脈沖計時器,測量按鈕的持續時間,看誰的反應最快,即誰按按鈕時間最短,按鈕接在引腳3,程序如下:

1.4.5 時間函數
1.delay()
該函數是延時函數,參數是延時的時長,單位是ms。延時函數的典型例程是跑馬燈的應用,使用Arduino開發板控制四個LED依次點亮,程序如下:

2.delayMicroseconds()
delayMicroseconds()也是延時函數,單位是μs,1ms=1000μs,該函數可以產生更短的延時。
3.millis()
millis()為計時函數,應用該函數可以獲取單片機通電到現在運行的時間長度,單位是ms。系統最長的記錄時間為9h22min,超出則從0開始。返回值是unsigned long型。
該函數適合作為定時器使用,不影響單片機的其他工作(而使用delay函數期間無法進行其他工作)。計時時間函數使用示例,延時10s后自動點亮LED,程序如下:

4.micros()
micros()也是計時函數,該函數返回開機到現在運行的時間長度,單位為μs。返回值是unsigned long型,70min溢出。程序如下:

1.4.6 中斷函數
什么是中斷?在日常生活中,中斷非常常見,如圖1-24所示。

圖1-24 中斷的概念
你在看書,電話鈴響,于是在書上做個記號,去接電話,與對方通話;門鈴響了,有人敲門,你讓打電話的對方稍等一下,去開門,并在門旁與來訪者交談,談話結束,關好門;回到電話機旁,繼續通話,接完電話后再回來從做記號的地方接著看書。
同樣的道理,在單片機中也存在中斷概念,如圖1-25所示。在計算機或者單片機中中斷是由于某個隨機事件的發生,計算機暫停主程序的運行,轉去執行另一程序(隨機事件),處理完畢后又自動返回主程序繼續運行的過程。也就是說高優先級的任務中斷了低優先級的任務。在計算機中中斷包括如下幾部分:

圖1-25 單片機中的中斷
中斷源——引起中斷的原因,或能發生中斷申請的來源。
主程序——計算機現行運行的程序。
中斷服務子程序——處理突發事件的程序。
1.attachInterrupt(interrput,function,mode)
該函數用于設置中斷,有3個參數,分別表示中斷源、中斷處理函數和觸發模式。中斷源可選0或者1,對應數字引腳2或者3號;中斷處理函數是一段子程序,當中斷發生時執行該子程序部分;觸發模式有4種類型,LOW(低電平觸發)、CHANGE(變化時觸發)、RISING(低電平變為高電平觸發)、FALLING(高電平變為低電平觸發)。例程功能如下:
引腳2接按鈕開關,引腳4接LED1(紅色),引腳5接LED2(綠色)。在例程中,LED3為板載的LED,每秒閃爍一次。使用中斷0控制LED1,中斷1控制LED2。按下按鈕,馬上響應中斷,由于中斷響應速度快,LED3不受影響,繼續閃爍。使用不同的4個參數,例程1試驗LOW和CHANGE參數,例程2試驗RISING和FALLING參數。
例程1:

例程2:

2.detachInterrupt(interrput)
該函數用于取消中斷,參數interrupt表示所要取消的中斷源。
1.4.7 串口通信函數
串行通信接口(Serial Interface)使數據一位一位地順序傳送,其特點是通信線路簡單,只要一對傳輸線就可以實現雙向通信的接口,如圖1-26所示。

圖1-26 串行通信接口
串行通信接口出現在1980年前后,數據傳輸率是115~230kb/s。串行通信接口出現的初期是為了實現計算機外設的通信,初期串口一般用來連接鼠標和外置Modem/老式攝像頭和寫字板等設備。
由于串行通信接口(COM)不支持熱插拔及傳輸速率較低,因此目前部分新主板和大部分便攜計算機已開始取消該接口,串口多用于工控和測量設備以及部分通信設備中。包括各種傳感器采集裝置、GPS信號采集裝置、多個單片機通信系統、門禁刷卡系統的數據傳輸、機械手控制和操縱面板控制直流電機等,特別是廣泛應用于低速數據傳輸的工程應用,主要函數如下:
1.Serial.begin()
該函數用于設置串口的波特率,即數據的傳輸速率,每秒鐘傳輸的符號個數。一般的波特率有9600、19200、57600、115200等。
例如:Serial.begin(57600);
2.Serial.available()
該函數用來判斷串口是否收到數據,函數的返回值為int型,不帶參數。
3.Serial.read();
該函數不帶參數,只將串口數據讀入。返回值為串口數據,int型。
4.Serial.print()
該函數向串口發數據。可以發送變量,也可以發送字符串。
例1:Serial.print(“today is good”);
例2:Serial.print(x,DEC);以10進制發送變量x
例3:Serial.print(x,HEX);以16進制發送變量x
5.Serial.println()
該函數與Serial.print()類似,只是多了換行功能。
串口通信函數使用例程:

1.4.8 Arduino的庫函數
與C語言和C++一樣,Arduino平臺也有相關的庫函數,提供給開發者使用,這些庫函數的使用,與C語言的頭文件使用類似,需要#include語句,將函數庫加入Arduino的IDE編輯環境中,如#include“Arduino.h”語句。
在Arduino開發中主要庫函數的類別如下:數學庫主要包括數學計算;EEPROM庫函數用于向EEPROM中讀寫數據;Ethernet庫函數用于以太網的通信;LiquidCrystal庫函數用于液晶屏幕的顯示操作;Firmata庫函數實現Arduino與PC串口之間的編程協議;SD庫函數用于讀寫SD卡;Servo庫函數用于舵機的控制;Stepper庫函數用于步進電機控制;WiFi庫函數用于WiFi的控制和使用等。諸如此類的庫函數非常多,還包括一些Arduino愛好者自己開發的庫函數。例如下列數學庫中的函數:

例如:
數學庫函數random(small,big),返回值為long。
long x; x=random(0,100);可以生成從0~100的整數
- Learning Cocos2d-x Game Development
- 顯卡維修知識精解
- 數字道路技術架構與建設指南
- 計算機應用與維護基礎教程
- Getting Started with Qt 5
- Unity 5.x Game Development Blueprints
- 平衡掌控者:游戲數值經濟設計
- AMD FPGA設計優化寶典:面向Vivado/SystemVerilog
- 從零開始學51單片機C語言
- Internet of Things Projects with ESP32
- Intel Edison智能硬件開發指南:基于Yocto Project
- IP網絡視頻傳輸:技術、標準和應用
- USB應用開發寶典
- Learning Less.js
- 多媒體應用技術(第2版)