機器人綜合項目實踐教程 課件 第3、4章 ArduinoC語言編程開發環境;Arduino平臺機器人實戰_第1頁
機器人綜合項目實踐教程 課件 第3、4章 ArduinoC語言編程開發環境;Arduino平臺機器人實戰_第2頁
機器人綜合項目實踐教程 課件 第3、4章 ArduinoC語言編程開發環境;Arduino平臺機器人實戰_第3頁
機器人綜合項目實踐教程 課件 第3、4章 ArduinoC語言編程開發環境;Arduino平臺機器人實戰_第4頁
機器人綜合項目實踐教程 課件 第3、4章 ArduinoC語言編程開發環境;Arduino平臺機器人實戰_第5頁
已閱讀5頁,還剩129頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第三章Arduino/C語言編程開發環境3.1

Arduino/C語言基礎3.2Arduino平臺體系結構3.3

Arduino/C語言的特點3.4

Arduino基礎應用實戰

3.1

Arduino/C語言基礎

3.1.1

Arduino/C語言概述

Arduino平臺是一個能夠用來感應和控制現實物理世界的計算平臺,由一個基于單片機、開放源碼的硬件平臺和開發環境組成。圖3.1所示為北京信息科技大學舉辦的Arduino平臺輪式機器人競速競賽中學生備賽場景的照片。圖3.1

Arduino機器人競速競賽學生備賽場景

在C語言編程中,為了定義變量、表達語句功能和對一些文件進行預處理,還必須用到一些具有特殊意義的字符,這就是關鍵字。關鍵字已被編譯系統本身使用,所以用戶編寫程序時不能夠使用這些關鍵字來作為標識符。Arduino平臺語言是建立在C/C++基礎上的,其關鍵字和主要符號有以下幾類:

(1)?類型說明符類。

(2)?語句定義符類。

(3)?預處理命令符類。

(4)?其他符號類。

3.1.2

ArduinoIDE

Arduino集成開發環境(ArduinoIDE)由工具欄、狀態窗口以及串口監視器窗口共三部分組成,包含了一個用于寫代碼的文本編輯器、一個消息區、一個文本控制臺以及一個帶有常用功能按鈕和文本菜單的工具欄。以Windows為例,其他操作系統上的軟件安裝都是如此,Arduino開源的IDE可以免費下載得到,其driver目錄內有控制板usb芯片驅動程序。

安裝ArduinoIDE的基本步驟如下:

第一步:打開Arduino官網地址arudino.cc,點擊圖中畫圈的地方;

第二步:在右側藍色方框內選擇與自己電腦操作系統對應的安裝包,Arduino軟件(IDE)1.0版本之后保存文件的擴展名是.ino。

3.2

Arduino平臺體系結構

Arduino機器人套件是一套由近百個基本“積木”單元組合而成的套件包;這些“積木”包括傳感器單元、執行器單元、控制器單元、通用機構零件等。Arduino平臺體系結構主要包含兩部分:硬件部分是可以用來做電路連接的Arduino電路板,可以搭載其他外部組件,如電機、燈泡、攝像頭、蜂鳴器等配件完成硬件機器的組裝;另外一部分則是ArduinoIDE,是計算機中的程序開發環境,采用該IDE進行程序編寫進而實現控制Arduino硬件部分。如圖3.2所示為四種類型應用較廣泛的Arduino平臺控制板。

如圖3.2(a)中的ArduinoYUN是以ArduinoLeonardo(ATmega32U4)為基礎、內嵌獨立的AtherosAR9331晶片無線路由處理器,組成了一個具有Wifi功能的微控制器,也是Arduino家族中首個WiFi系的成員,將嵌入式Linux裝置、Arduino和WiFi傳輸器以及其他拓展板全部整合到一個開發板上。而圖3.2(b)中ArduinoDUE采用32bitCortex-M3架構,時鐘頻率為84?MHz,替代了之前的8?bit16?MHz的ATmega328微控處理器,同時涵蓋了一個USB2.0接口,能夠連接鼠標、鍵盤、攝像頭等USB產品。

如圖3.2(c)是ArduinoMEGA,是基于ATmega2560的Arduino開發板。它有54個數字輸入/輸出引腳(其中15個可用于PWM輸出)、16個模擬輸入引腳,4個UART接口,一個16MHz的晶體振蕩器,一個USB接口,一個DC接口,一個ICSP接口,一個復位按鈕。它包含了微控制器所需的一切,用戶只用簡單地把它連接到計算機的USB接口,或者使用AC-DC適配器,或者用電池,就可以驅動它。圖3.2(d)是ArduinoUNO,相較于ArduinoMEGA它提供了更少的I/O口。圖3.2四種常用型號Arduino開發板

圖3.2(d)所示為ArduinoUNO開發板,采用了標準的兩排插槽設計,上排插槽有16個端口,16個端口功能描述如表3.1所示。在編寫的測試程序里,需將訪問的數字信號端口進行定義。為了訪問這些端口,可以直接將連接線插入對應的插槽。更方便的方式是使用跳線,這樣實驗完成后拆除起來也很容易。如表3.1中AREF端口是Referencevoltagefortheanaloginputs,模擬輸入的基準電壓,使用analogReference()命令調用。

圖3.2(d)的ArduinoUNO控制板的下排插槽有13個端口,13個端口功能描述如表3.2所示,其中Vin端口是inputvoltage的縮寫,表示有外部電源時的輸入端口。

3.3

Arduino/C語言的特點3.3.1

Arduino/C語言的結構、函數

Arduino/C語言編寫代碼時可以調用Arduino開發環境的函數、框架、語句、變量、判斷以及高級函數、硬件庫等簡單、直觀的模塊,實現快速架構生成一個解決特定問題的辦法的過程。當然,Arduino/C語言要遵守一些語法和結構規則,這些規則繼承了C語言和其他編程語言的規則并被簡化,以便初學者使用。C語言是一種從頂部到底部執行的結構化編程語言,意思是代碼從頂部語句開始逐行執行語句,直到執行到底部的語句后結束執行。

1.?基本函數

語句是編寫程序時最基本的單位,函數就是一組這種基本單位的集合體。Arduino/C語言中的函數由返回值、函數名、參數和函數體組成。

如程序3.1給出了標準Arduino函數的代碼架構,其調用相關函數體的語句的組成是,第一行調用庫函數或變量賦值語句,第二行調用通信函數或子函數語句,或調用函數體內語句,第三行調用Arduino主函數。至此,完成了標準Arduino函數的代碼編寫。其內部調用延時函數delay(1000)代表延時1000毫秒。程序3.1為標準Arduino程序函數調用架構代碼,實現已連接端口器件LED燈的亮度延時變化。

1)?loop函數

loop()函數是能夠將一組編程指令程序代碼進行重復運行的主體功能函數。一般地,loop()函數是在setup()函數初始化后進行調用的,即每一個ArduinoC程序都在初始化環節調用setup()函數完成之后,就可以自動調用loop()函數進入第二個環節,即輸入環節。

2)?setup函數

程序3.1代碼是在程序開始時調用setup()函數,用setup()函數配置每個引腳的輸入、輸出狀態,以及其他只需執行一次的動作,這樣當Arduino開始創建setup()時,每次上電或者被重置時調用運行一次setup()函數,用它來設置引腳運行模式、初始化變量、啟動庫文件等一些初始化操作。另外補充說明一下,這里void是無類型聲明,是Arduino數據類型的一種,通常用來代表一個事件;如果控制過程比較簡單,void一般無需定義,可直接使用,代表事件的開始與事件的循環;如果控制過程比較復雜,一般就要設置多個子事件,把復雜的過程進行分解,每一個子事件定義為一個void數據。

3)?pinMode()函數

Arduino常用函數有數字IO口輸入輸出模式定義函數pinMode(pin,mode),程序3.1中調用了pinMode()函數,指定引腳輸出控制信號HIGH或LOW。pinMode(pin,mode)為數字IO口輸入輸出模式定義函數,其中pin表示0~13;mode表示INPUT或OUTPUT,為引腳的工作狀態。一個簡單的for循環語句如for(inti=0;i<14;i++)pinMode(i,OUTPUT),能夠完成設置全部14個數字引腳為輸出模式的功能。與IO口輸入輸出定義相關的還有digitalWrite(pin,value)函數。

digitalWrite(pin,value)為數字IO口輸出電平定義函數,其中pin表示0~13,value表示HIGH或LOW,比如可以使用該函數定義HIGH可以驅動LED。intdigitalRead(pin,value)為數字IO口讀輸入電平函數,其中pin表示0~13,value表示HIGH或LOW,可以直接讀取數字傳感器。

4)數字量輸入輸出函數

可以使用Arduino開發板上的20個輸入和輸出(I/O)引腳,較容易地從開關或傳感器中讀取信息。每一個引腳都可以有不同的輸入輸出功能,這些模式可以在軟件中設置,包括輸入、輸出、模擬量轉數字量(ADC)和模擬量輸出模式。可以將這些Arduino常用的只有開和關兩種狀態的數字輸入輸出函數簡稱為數字量函數。

例如,如果一個數字引腳配置為INPUT,則可以用數字量函數digitalRead(pin)讀取這個引腳的狀態,其調用語法的語句示例為:

if(digitalRead(pin)==HIGH)digitalWrite(pin,state);

如果讀取引腳等于HIGH狀態,那么執行這一行中的其余代碼。

5)模擬量輸入輸出函數

為了接收模擬輸入,Arduino開發板上的I/O引腳上需要連接模擬轉換器,通常叫作A/D轉換器或ADC,這樣硬件輸出引腳在板上標為A0~A5。Arduino的ADC有10位精度,意思是它可以返回一個對應0~5V,表示0~1023的線性整數值,這就是說讀取精度為:5V/1023個單位,約等于每個單位0.049?V(4.9?mV)。然而,這里的模擬信號是一個連續信號,則ADC轉換的數值只能是函數調用讀信號時的那一瞬間的電壓值。因為Arduino是數字元件,實際上不能提供真正的模擬輸出,所以Arduino只能通過非常快地開關一個引腳來大概地輸出一個模擬信號,這個過程叫作脈寬調制(PWM)。

如在程序3.2的模擬輸入引腳讀取功能程序代碼中,改變模擬值(PWM波)并輸出到管腳,可用于根據不同的光線亮度調節發光二極管亮度或以不同的速度驅動發動機。調用函數analogWrite()之后,該引腳將產生一個指定占空比的穩定方波,直到下一次調用analogWrite()(或在同一引腳調用digitalRead()或digitalWrite())。

為了去讀取更精確的數并增加模擬量讀數的精度,調用函數analogReference(type),該函數執行結果是選擇傳感器的最高操作電壓,能有效地增加輸入模擬數值的精度,其函數參數type指的是要使用的參考電壓形式。type參數的選項是:DEFAULT選項為默認參考值(5?V或3.3?V),INTERNAL選項是內置參考值(1.1?V或2.56?V),EXTERNAL選項是在AREF引腳加的電壓(0或5?V)。為了從傳感器中得到精確讀數,需要在編寫程序代碼開頭使用一次以下語句:

analogReference(EXTERNAL);//從傳感器得到精確讀數,選擇外部連在AREF引腳上的電壓為參考電壓EXTERNAL

之后,需要使用一根跳線連接AREF引腳到標記3.3?V的輸出引腳。這樣就可以使用ArduinoUno第二個電壓調節器提供一個精確的外部模擬3.3?V參考電壓了。在analogRead()之前調用analogReference()是很重要的,否則有可能降低內部或外部電壓,這樣也許會損壞微控制器。最后,記住不要連接AREF引腳到一個高于+5?V的電壓上,因為錯誤的連接也可能損壞微控制器。

2.?使用變量

為了便于記憶和理解,可以用更好的寫代碼的方法,即在寫代碼時使用變量(聲明變量)。

在設置一個新變量時,我們需要至少給出兩部分信息:變量的數據類型和它的名稱。這個過程為變量聲明,變量聲明的實質是在Arduino存儲區內開辟一個空間來存儲信息。聲明變量的方法只是在指定變量的數據類型之后給變量一個獨一無二的名稱。例如程序3.2的

前三行為進行變量聲明和賦值。

變量名稱通常的命名慣例是方便編寫大程序時保證代碼的易讀性和簡潔性,有一些基本規則需要了解:首先,函數名和變量名都只能包含字母、下劃線、數字和貨幣符號,而空格和不常用符號不允許在變量名中使用,并且變量名的第一個字符不能是數字和不顯示的字符。其次,與Arduino開發者在Arduino庫中內建函數的命名采用的形式一樣。如常量一般全部采用大寫字母,并在多個詞之間用下畫線。最后,Arduino語言是大小寫敏感的,必須準確使用大小寫形式,包括調用Arduino/C中任何預定義變量或函數名。

聲明變量的數據類型一般有如表3.3所示的幾種數據類型。

3.3.2

Arduino/C語言的高級函數

1.中斷函數

也許有大量代碼在主函數中等待條件發生時進行中斷服務,這時將通過中斷請求線輸入信號來請求處理機進行中斷服務,這種中斷稱之為硬件中斷;而軟件中斷是處理機內部識別并進行處理的中斷過程。硬件中斷一般是由中斷控制器提供中斷類型碼,處理機自動轉向中斷處理程序;軟件中斷完全由處理機內部形成中斷處理程序的入口地址并轉向中斷處理程序,不需要外部提供信息。

2.?數學函數

表3.4列出了常用的Arduino平臺支持的數學函數。

表3.3中大部分函數都在C語言中用過。其中map()和constrain()函數通常較少在數據庫中看到,它們經常與傳感器配合使用,可以用來保持傳感器返回的數值在程序能夠處理的特定范圍內。

3.?庫函數

Arduino庫由兩個獨立文件組成,這兩個文件分別稱為頭文件和代碼文件,頭文件必須使用.h作為文件擴展名,用庫的名字作為文件名,頭文件定義了庫里所有函數的原型,是函數所需參數和返回值數據類型的模板,而庫中的代碼文件包含函數的實現代碼。在Arduino安裝目錄下,可以看到名為libraries的目錄,其中包含一些標準的庫文件。表3.5列出了在1.0.5版本的ArduinoIDE下能找到的庫文件。

為了在程序中使用庫,只需要在菜單欄中單擊Sketch菜單即可,選擇ImportLibraries,然后從列表中選擇要用的庫。在程序中包含庫的頭文件后,就可以引用庫中的所有函數了。Arduino開發者已經為所有標準庫和函數都編寫了出色的文檔。

3.4

Arduino基礎應用實戰3.4.1

LED燈點亮

Arduino可以用來開發交互產品,比如它可以讀取大量的開關和傳感器信號,并且可以控制各式各樣的電燈、電機和其他物理設備。在學習Arduino/C語言的程序語句后,我們可以著手點亮LED燈,實現Arduino基礎應用實戰的安裝、連接、上傳、測試的工作流程,通過讓LED燈閃爍起來并知道是我們讓它亮起來的,從而將我們學習Arduino編程的基礎知識、閱讀的程序代碼轉變為自己寫出、完成的工程任務代碼。

1.點亮一個LED

(1)?任務設定:點亮一個LED。

(2)?任務要求:任意延長點亮時間。

(3)?電路硬件配置:對于我們將用到的LED,從網上查找資料可知,其工作電壓一般為1.5~6.0?V,工作電流一般為10~60?mA,反向擊穿電壓為5?V。控制板邏輯電路供電電壓為5?V。根據以上參數假設LED工作電壓選用1.7?V,工作電流選用15?mA,因為限流電阻=(總電壓-LED電壓)/電流,所以限流電阻選擇(5-1.7)/0.015=220(Ω)。

(4)任務解析:在點亮LED的實驗中,需要通過軟件編寫程序完成在數字電路中基本的輸入形式開關(switch)的程序控制工作,它的作用是保持電路的連接或者斷開。Arduino從數字I/O管腳上只能讀出高電平(5V)或者低電平(0V),因此我們首先面臨的一個問題就是如何將開關的開/斷狀態,轉變成Arduino能夠讀取的高/低電平。解決的辦法是通過上/下拉電阻來實現,一般電阻值在100?Ω~10000?Ω范圍都可以,但是不同數值的電阻連接到LED引腳上后對應LED點亮的亮度不同。

通常在一個開關控制邏輯門電路中,用“1”表示開關接通狀態,用“0”表示開關斷開狀態,如圖3.3(a)所示,開關一端接地,另一端則通過一個10?kΩ的上拉電阻接5?V電源,輸入信號是從開關和電阻間引出。當開關斷開時,輸入信號被電阻“拉”向電源,形成高電平(5V);當開關接通的時候,輸入信號直接與地相連,形成低電平;這樣開關斷開/接通狀態分別對應邏輯控制的高電平/低電平,簡單地稱之為負邏輯電路;反之,將圖3.3(a)中所示電阻和開關器件位置進行對調,則開關控制邏輯就是當開關斷開的時候,輸入信號被電阻“拉”向地,形成低電平(0V);當開關接通的時候,輸入信號直接與電源相連,形成高電平。

這樣開關斷開/接通狀態分別對應邏輯控制的低電平/高電平,簡單地稱之為正邏輯電路,所以對于同一個門電路,可以采用正邏輯,也可以采用負邏輯。如圖3.3(b)中所示為負邏輯開關控制電路實際效果圖。如圖3.3所示邏輯開關控制電路被控的發光LED燈接在數字I/O的D13號管腳上,為了驗證Arduino數字I/O的輸入功能,可以將開關接在Arduino的任意一個數字I/O管腳上(D13除外),并通過讀取它的接通或者斷開狀態,來控制其他數字I/O管腳的高低,如圖3.3所示為電路開關接在數字I/O的D7號管腳上。圖3.3邏輯電路控制軟件的相應代碼實現如程序3.4所示。圖3.3

LED燈開關邏輯電路

在程序3.4中,由于采用的是負邏輯電路,開關按下時用digitalRead()函數讀取到的值為LOW,此時再用digitalWrite()函數將發光LED燈的管腳置為高電平,點亮LED。同理,當開關抬起時,LED將被熄滅,這樣我們就實現了用開關來控制LED的功能。

(5)?問題討論:請大家思考按照圖3.3所示LED開關邏輯控制電路,圖中LED開關還能更換成哪些數字I/O引腳接口嗎?

(6)?實踐提示:可以先把程序3.4所示代碼復制進去,進行0~13管腳連接測試。程序寫好以后點擊編譯按鈕;編譯完成后會顯示出編譯后的文件大小,本次編譯的程序大小約為1066字節。然后把編譯好的程序下載到Arduino控制板上(點擊下載按鈕)。下載完成后會有提示。如程序3.4所示的代碼和電路控制最后會呈現閃爍著光芒的LED實驗效果。在"intledPin=13"語句中;設置了LED的數字IO引腳,ledPin僅僅是13號數字端口自定義出來的名字,變成其他名字也都可以。對于多腳IO操作的程序,為每一個引腳定義名字是有必要的,程序復雜時通過引腳名字可以方便功能識別。

2.點亮六個LED

(1)?任務設定:六個LED閃爍。

(2)?任務要求:任意延長閃爍時間。

通過上一節的學習,我們知道了怎樣讓一個LED進行閃爍,下面進行六個LED的控制,編譯調試如附錄1.1、附錄1.2、附錄1.3所示程序代碼。實驗中先看硬件連接圖。按照上面圖3.3硬件連接方法接好后,再來測試LED燈閃爍控制程序。

(3)?任務解析:修改其中一段代碼下載測試,使得第一段程序是使LED燈1~6個逐個點亮,然后使6~1個燈再逐個熄滅,如此循環。第二段程序是使6個燈同時亮,然后再使6~1個燈逐個熄滅,如此循環。

(4)?問題討論:有幾種修改方案?

(5)?實踐提示:下面這段代碼是for語句循環,可以實現j個燈點亮,然后再延遲600?ms,然后再循環,形成的整體效果就是6個燈相隔600?ms逐步被點亮。

然而下面這段代碼其實是不規范的寫法,for命令表達要求一定要有{}循環,如果沒有標出{},編譯時就會自動對下一句加上{}。如果代碼量很大,出問題時查找起來會非常辛苦。

最后,正確的寫法應該是下面的形式。這樣規范的for命令能夠實現6個燈逐個被點亮,然后再延時600?ms進入下一句,6個燈逐個點亮的速度非常快。

經過以上分析,對比附錄1.1、附錄1.2、附錄1.3中這三種不同樣式點亮6個LED燈的程序代碼,分別進行程序編譯并下載到硬件上,觀察產生的不同實驗效果。

3.4.2設備通信

1.串行通信

Arduino硬件的串行通信有標準的串口、SPI、I2C三種類型,ArduinoIDE提供了使用這三種通信方式的庫。Arduino開發板與其他設備之間通信的基本模式是串口通信,為了方便起見,Arduino開發者使用了串口轉USB芯片,這里串行通信協議也就包括USB協議;可按3.1.2小節介紹的方法使用串口通信上傳源代碼到Arduino開發板,也可以打開使用的Arduino編程環境中的串口監視器去實際地“看看”模數轉換器讀到的值。

Arduino的串口使用兩根數字接口引腳。默認情況下,所有的Arduino型號使用數字接口引腳0和1作為主串口,其中引腳0用于接收(RX),引腳1用于發送(TX)。如圖3.4所示為Arduino串口端口點亮LED的測試電路原理示意圖,這樣一旦Arduino在通過串口向PC發送數據時,相應的發光LED就會閃爍,實際應用中這是一個非常方便實用的測試電路。根據Arduino的原理圖我們不難看出,ATmega的RX和TX引腳一方面直接接到了數字I/O端口的0號和1號管腳,另一方面又通過電平轉換電路接到了串口的母頭上。因此,當我們需要用Arduino與PC機通信時,可以用串口線將兩者連接起來;當我們需要用Arduino與微控制器(如另一塊Arduino)通信時,則可以用數字I/O端口的0號和1號管腳。圖3.4

Arduino串口端口點亮LED燈的測試電路原理示意圖

串口在Arduino軟件中被稱為Serial,這也是程序中通過串口發送和接收數據對象的名稱(例如serial.print函數)。表3.6所示為Arduino平臺的Serial庫函數介紹。

2.?串口通信測試任務

(1)?任務設定:通過串口讀取數據。

(2)?任務要求:調用表3.5中Arduino平臺Serial庫函數進行串口通信測試。

(3)?系統配置:可以實現系統功能的語句如程序3.5所示。

(4)?問題討論:請思考波特率能更改嗎?

(5)?實踐提示:串行通信是實現在PC與微控制器之間進行交互的最簡單辦法,很多場合中都要求Arduino能夠通過串口接收來自PC的命令,并完成相應的功能,而這可以通過Arduino語言中提供的Serial.read()函數來實現。

串行通信的難點在于參數的設置,如波特率、數據位、停止位等,在Arduino語言中可以使用Serial.begin()函數來簡化這一任務。在本實驗中沒有額外的電路,僅需要用串口線將Arduino和PC連起來就可以了,通過把程序3.5所示工程代碼下載到Arduino模塊中,在Arduino集成開發環境中打開串口監視器并將波特率設置為9600,然后向Arduino模塊發送字符H即可實現。

Arduino語言的參考手冊中沒有對serial.read()函數做過多的說明,這里存在一個疑問,就是如果PC一次發送的數據太多,Arduino是否可提供相應的串口緩存功能來保證數據不會丟失呢?在從串口讀數據之前,Arduino語言中提供的能夠知道在串口內是否有數據的另外一個函數為serial.available(),這個函數沒有參數,直接返回在串口緩沖區中的可用的字節數,如果在串口緩沖區中沒有數據,則這個函數會返回0,即相當于false;如果有數據可用,則這個函數會返回一個不是0的值,這相當于true。程序3.5所示代碼為調用serial.available()發送字符的程序代碼,圖3.5為程序代碼的編譯界面。

圖3.5程序代碼的編譯界面

將程序3.5所示工程代碼編譯下載到Arduino模塊后即可看到圖3.6所示Arduino串口端口13的測試燈點亮了。在Arduino集成開發環境的工具欄中單擊“SerialMonitor”控制,打開串口監視器;一般將波特率設置為9600?b/s,即保持與工程中的設置相一致。通常這種情況下我們就可以在Arduino集成開發環境的串口監視器Console窗口中看到串口上輸出的數據了。為了檢查串口上是否有數據發送,一個比較簡單的辦法是在數字I/O端口的D1號管腳(TX)和5V電源之間接一個發光LED以及串聯1?kΩ限流電阻。如圖3.6所示為Arduino串口端口測試效果,圖3.6(a)為Arduino點亮LED的串口通信測試效果,圖3.6(b)圖3.6

Arduino串口端口測試效果與樣板

3.?無線通信模塊

如圖3.7所示為一款基于STM32的藍牙通信協議研制的NRF24L01型號無線模塊,能夠實現在空曠無遮擋的情況下20~30?m的近距離無線傳輸功能。如圖3.7所示,硬件部分設計為Arduinounor3作為控制器,電源直接連接Arduino電源口供電,無線模塊可以選用低功耗、傳輸效率高的NRF24L01模塊,按照NRF24L01模塊手冊進行硬件管腳對應連線連接測試,其中圖3.7(a)為Arduino開發板與NRF24L01模塊連接的無線發送端模塊,圖3.7(b)為Arduino開發板與NRF24L01模塊連接的無線接收端模塊。(a)?Arduino開發板與NRF24L01模塊連接的無線發送端模塊圖3.7無線模塊與Arduino的連接

按照程序3.6所示的Arduino控制程序發送端的程序代碼及程序3.7所示Arduino控制程序接受端的程序代碼的基本語句,實現兩個無線模塊之間的連接通信,互相無線收發字節。

3.4.3使用傳感器

1)?數字傳感器

如圖3.8所示為Arduino平臺的數字輸入溫度計,以DHT11數字溫濕度傳感器為例,它是一款含有已校準數字信號輸出的溫濕度復合傳感器,包括一個電阻式濕度元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。DHT11數字溫濕度傳感器模塊為3針PH6.0封裝,其供電電壓為3~5.5V,連接到Arduino平臺電源5V及GND端口;DHT11傳感器數據輸出連接到Arduino平臺PWM管腳2,溫度范圍為0℃~50℃,誤差為±6℃;濕度范圍為60%~90%RH,誤差為±5%RH。圖3.8

Arduino平臺的數字輸入溫度計

2)?模擬傳感器

如圖3.9所示為Arduino平臺的模擬輸入溫度計,以NS公司生產的集成電路溫度傳感器LM35為例,它是一款輸出電壓與攝氏溫度成線性比例精度很高的模擬信號傳感器。首先,打開軟件Proteus,按照查表法進行溫度計仿真系統的設計,連接連線電子器件有電子電源、溫度采集傳感器LM35、ArduinoUNO開發板、顯示屏LCD、放大器、導線若干等。其次,用ArduinoUno單片機模擬數據輸入端口進行采集,通過A4端口輸入溫度采集電路電壓數據,并由Arduino編程進行處理,把電壓值轉換為溫度值,控制溫度值輸出給顯示屏LCD進行顯示。圖3.9

Arduino平臺的模擬輸入溫度計

系統軟件功能可以實現的代碼如附錄2中Arduino平臺溫度控制模塊的程序所示,編譯代碼后下載到Arduino中,按照Arduino查表法進行溫度計中控制器hex的設置,具體操作步驟包括:

(1)?在ArduinoIDE的File(文件)>preferences(首選項)中找到preferences.txt文件。

(2)?用記事本打開preferences.txt,選擇hex文件并確定存放路徑,在最后一行加入:build.path=d:\arduino\MyHexDir(存放在d盤/arduino/MyHexDir文件夾下,也可以存放在其他盤上。)

(3)?關閉ArduinoIDE。

(4)?關閉preferences.txt,關閉時對話框顯示是否保存,選擇保存。(注意:以上操作時不要連接Arduino開發板。)

(5)?編譯生成兩個hex,一個包含Arduino引導程序,另一個不包含Arduino引導程序。

(6)?在Protues中導入hex文件,雙擊ArduinoUNO單片機元件,調整合適的頻率,從programfile中選取已經建好的hex文件即可導入。第四章Arduino平臺機器人實戰4.1

Arduino機器人的硬件庫4.2

Arduino平臺循跡功能機器人實戰4.3

Arduino平臺視覺機器人實戰4.4

Arduino平臺人臉面部表情識別模仿機器人

4.1

Arduino機器人的硬件庫

4.1.1使用庫要在Arduino框架中使用庫,則需要告訴編譯器要用哪個庫和函數,采用的方法是可以在框架開始處使用#include預處理指令去指定庫文件的名字。注意預處理指令語句不是用分號結束的。如程序4.1所示代碼為使用庫程序的語句代碼。

4.1.2舵機庫

前面介紹了硬件庫的調用能實現在LCD顯示屏上呈現文本。現在介紹如何讓物體動起來。用Arduino移動一個物體最好的辦法就是使用舵機/電機。Arduino平臺有一個專門驅動典型舵機/電機的庫,簡稱之為舵機庫。

舵機庫可以在ArduinoUNO平臺上的任何數字引腳上最多控制12個舵機,但是這個功能不可用數字引腳9和10上的PWM。舵機端口部分有三根不同顏色的輸出線。其中,紅色為電源線,其連接供電電壓范圍是+4.8?V~6?V;黑色線材是電源地線,為公共地接地線;黃色線材為舵機的控制端(也就是信號線),其邏輯信號電壓保持范圍為+3?V~5?V,而信號線與單片機信號輸出端口相連。如圖4.1所示為一個或多個舵機與Arduino單片機硬件連線示意圖,每個舵機都可以使用PWM控制波形,實現舵機位置的目標控制。圖4.1一個或多個舵機與Arduino單片機硬件連線示意圖圖4.1一個或多個舵機與Arduino單片機硬件連線示意圖

設計舵機組合控制方式時,應當考慮到控制多個舵機可能需要超過100?mA的電流,以及Arduino單片機與各種硬件器件或電路連接軟件的連接配置。Arduino有多種方式可以產生PWM控制舵機,有通過Arduino的普通數字傳感器接口產生占空比不同的方波,模擬產生PWM信號進行舵機定位,如圖4.2(a)所示;還有直接利用Arduino自帶的Servo函數進行舵機控制的,如圖4.2(b)所示。在舵機的連接部分直接使用黏合劑固定并連接需要連接的舵機,因為SG90舵機的扭力相對較小,所以不會對連接部分產生非常大的扭力,不會影響舵機的運動。圖4.2舵機組合控制場景照片

具體實現舵機控制例程代碼的方法有以下三種:

1)?第一種方法

第一種方法是用analogWrite(pin,val)命令,其中函數參數pin是引腳的編號,測試只能用3、5、6、9、10、11這幾條;val指的是0~655的整數值,對應電壓從0到+5V。例如ArduinoMega168就支持0~13共14個PWM輸出。(注意:幾個引腳的編號指的是pin編號,Arduino板子會用這幾個管腳支持PWM輸出。)?程序4.2為Arduino調用analogWrite(pin,val)命令輸出脈沖寬度調制信號程序代碼。

2)第二種方法

第二種方法是手動設置實現Arduino平臺輸出脈沖寬度調制信號的代碼。如程序4.3所示為Arduino手動實現輸出脈沖寬度調制信號的程序代碼。

3)?第三種方法

第三種方法是直接利用Arduino自帶的Servo函數進行舵機的控制,如程序4.4為Arduino調用庫函數servo.h的程序代碼,代碼中展示了調用庫函數servo.h后,采用不同舵機的調用函數設置。

程序4.4中主函數loop函數體內部調用write()函數,用來實現控制舵機的運動。該函數參數是用角度數為單位簡單指定一個角度,舵機就會以默認速度運動到這個角度,并在每個運動之間延時;這里考慮舵機只以一個固定的速度運動,當需要減慢舵機角度變化的速度時,我們需要把大的位置變化分成一些小的運動,并在每個運動之間延時;程序4.4中的標準for循環讓舵機開始時在0°位置,每10?ms增加1°,直到舵機達到90°位置。

以上說明的Arduino平臺舵機組合控制實驗中,調試過程中需要注意解決以下三個易出故障的問題。

1)?舵機回到中間的初始化問題

2)?供電問題

3)?線材長度問題

綜上所述,舵機是一種簡單的旋轉運動電機,即一種位置(角度)伺服驅動器,適用于那些需要角度不斷變化并可以保持的系統。對于有些項目需用到同樣的運動位置精確控制的其他硬件,可以結合具體硬件器件數據文件,生成一個新的硬件庫實例,進行相應函數參數設置控制。

4.2

Arduino平臺循跡功能機器人實戰

基于Arduino控制器平臺設計的循跡功能機器人,能沿著地面上黑色軌跡實現循跡功能,也能檢測跑道兩側的擋板,沿擋板行駛實現避障功能。Arduino循跡避障機器人基本功能是:當前方沒有障礙物的時候,兩邊紅外傳感器燈不亮,表示前方無障礙,機器人前行沿著地面黑白線的黑線循跡前進。

在機器人的制作中,在循跡模塊上,由于黑白線地板對光線的反射系數不同,因此傳感器依據接收到的反射光強弱來判斷機器人小車前進方向。本節采用TCRT5000紅外對管檢測黑線,實現機器人識別并能沿著地面測試區域的黑白線中黑線行走;在避障模塊設計上,采用中間一個超聲波探頭HC-SR04超聲波傳感器發射和接收超聲波,實現障礙物距離的測量。整個機器人組成部分有主控電路模塊、電源、紅外檢測模塊、電機及驅動模塊等。若設計為兩個或三個紅外傳感器,則其邏輯布局可參考表4.1所示的紅外傳感器控制策略組合表。

采用差速換向控制機器人左右輪,實現機器人的左右轉、前進后退等電機控制動作,實現輪式機器人循跡和避障效果。圖4.3為機器人小車循跡的程序流程設計圖,其中圖4.3(a)為兩路傳感器循跡的流程圖,圖4.3(b)為三路傳感器循跡的流程圖。圖4.3機器人小車循跡的程序流程設計圖

在實驗室搭建的循跡和避障機器人,用基于Arduino控制器開發的機器人小車能夠實現發現并避開障礙物的功能,能夠完成在封閉橢圓形曲線或“8”字形曲線上的黑線循跡,如圖4.4所示為黑線循跡的機器人小車運行場景。圖4.4機器人小車循跡黑線路徑的運行場景

4.3

Arduino平臺視覺機器人實戰

1.圖像處理基本軟件方案

1)?Python

Python是一種面向對象、解釋型程序語言,在1989年發明并且1991年發行第一個公開發行版。Python是純粹的自由軟件、源代碼和解釋器,Python遵循GPL(GeneralPublicLicense)協議。Python語法簡潔清晰,特色之一是強制用空白符(WhiteSpace)作為語句縮進。Python具有豐富和強大的庫。Python常被稱為“膠水”語言,能夠把用其他語言制作的各種模塊(尤其是C/C++)很輕松地聯結在一起。

2)?PIL(PythonImageLibrary)

PythonImagingLibrary(PIL)是PythonWare公司提供的免費的圖像處理工具包,是Python下的圖像處理模塊,支持多種格式,并提供強大的圖形與圖像處理功能。雖然在這個軟件包上要實現類似Matlab中的復雜的圖像處理算法并不太適合,但是Python的快速開發能力以及面向對象等諸多特點使得它非常適合用來進行原型開發。對于簡單的圖像處理或者大批量的簡單圖像處理任務,Python+PIL是很好的選擇。PIL庫僅適用于簡單的圖像處理,因為圖像處理要涉及Canny邊緣檢測、霍夫變換等較為復雜的圖像處理算法,而這是PIL庫所不具備的,所以我們考慮配合使用OpenCVforPython。

3)?OpenCV

OpenCV的全稱是OpenSourceComputerVisionLibrary。OpenCV是一個基于BSD許

可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows和MacOS操作系統上。它輕量級而且高效,即由一系列C函數和少量C++類構成,同時提供了與Python、Ruby、Matlab等的接口,實現了圖像處理和計算機視覺方面的很多通用算法。

2.圖像信息處理

1)?圖像信息傳輸的通信連接模塊

在Arduino平臺視覺機器人實戰中,首先需要設計將攝像頭采集到的圖像信息進行處理后再進行傳輸的通信連接模塊,這里介紹兩種方法,一種是采用藍牙無線模塊進行連接實現,另一種是采用按鍵精靈中間件通信連接模塊進行連接實現。

(1)?使用藍牙無線通信模塊,具體連接測試過程是:

首先安裝Python的Pyserial庫;再使用HC-06模塊,引出接口包括VCC、GND、TXD、RXD,預留LED狀態輸出腳的狀態值,判斷藍牙是否已經連接到單片機上。

②LED指示藍牙連接狀態,閃爍表示沒有藍牙連接,常亮表示藍牙已連接并打開了端口。

測量輸入電壓范圍為3.6~6V,未配對時電流約為30?mA,配對后電流約為10?mA,輸入電壓禁止超過7?V。可以直接連接各種5?V供電單片機(51、AVR、PIC、ARM、MSP430等)。

在未建立藍牙連接時,支持通過AT指令設置波特率、名稱、配對密碼,設置的參數可以掉電保存。當藍牙連接以后,從機能與各種帶藍牙功能的電腦、藍牙主機、大部分帶藍牙的手機、Android、PDA、PSP等智能終端配對,從機之間不能配對。

(2)?使用按鍵精靈中間件通信模塊,具體連接測試過程是:通過第三方程序——按鍵精靈腳本,將Python與OpenCV處理得到的結果從txt文本中傳輸到ArduinoIDE的串口監視器中,需要保證txt文本數據與第三方程序、腳本在同一個文件里面。程序4.5為按鍵精靈腳本程序代碼。

2)?圖像信息傳輸通信過程

下面介紹視覺機器人圖像處理配置硬件上位機環境,例如基于VS2013的OpenCV視覺庫以及Arduino單片機結合來實現舵機組合控制。有以下兩種解決方案。

第一種解決方案:安裝好軟件VS2013與函數庫OpenCV相匹配的版本,在VS2013界面選擇工具選項卡,選擇擴展和更新選項,彈出一個窗口,在左側選擇聯機,在網上搜索VS2013官方提供的可用插件,然后在右側選擇ArduinoIDEforVisualStudio下載安裝即可。安裝后運行VisualStudio,會提示指定Arduino安裝地址(如“E:\Arduino-1.8.2”);待后面常規選項設置完成以后會收到Toolchainupdatecomplete的提示,這樣配置就生效了。

第二種解決方案:利用USB-TTL轉換插頭以及Arduino單片機的端口讀取功能實現,將USB-TTL模塊連接在電腦上,用杜邦線分別連接單片機到模塊上的電源口、輸入端RX、輸出端TX以及地線。安裝驅動利用USB串口調試器調試完畢后直接將返回值輸出到TTL模塊并經過杜邦傳輸到單片機上。在VS上同樣有USB-TTL插件,下載好后,調用命令通過轉換模塊將返回值發送出去,通過單片機的模擬端口讀取功能在Arduino中讀取對應端口返回值;使用條件判斷語句判斷偏移方向設置函數以改變舵機角度,實現攝像頭的動態跟蹤功能。

以Arduino單片機為例的攝像頭機器人小車循跡系統主要部分的運行過程如下:首先,攝像頭的數據端口通過無線連接計算機上位機,并將攝像頭實物安裝在Arduino平臺機器人上;在計算機里面打開整個系統的上位機,在上面運行攝像頭,讀取循跡圖片,進行二值化,像素點提取計算讀值,并以txt文件形式輸出;然后,依托計算機強大的計算能力完成圖像處理數據決策,并生成決策編碼數據指令;最后,利用USB-TTL模塊連接到藍牙通信模塊,將發送的編碼數據指令傳輸到下位機藍牙模塊接收解碼。圖4.5所示為Arduino單片機、藍牙模塊間的通信連接,從而實現運行舵機、電機控制程序。圖4.5

Arduino單片機、藍牙模塊間的通信連接

3)?圖像像素閾值處理過程

圖像處理是計算機視覺處理最關鍵的步驟,用以去除圖像中的無關信息及噪聲,突出所需要的信息,如綜合用到的二值化,包括像素點提取、計算、讀值。一般地,一幅圖像包括目標物體、背景及噪聲。

3.?圖像像素點矩陣化

利用Python中numpy庫和scipy庫,可以進行圖像像素點矩陣化的數據操作和科學計算。這里首先需要導入基于Python、PIL、OpenCVforPython等一系列的頭文件和具體圖像處理程序實

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論