1. 程式人生 > >Arduino的詳細介紹(基於Mega2560)

Arduino的詳細介紹(基於Mega2560)

很早之前入手了一塊Arduino Mega2560,當時只是認為其操作簡單且更加人性化,開源方便,想了解了解。最新搞專案想用Arduino試試控制8路舵機,但網上找的Servo庫大多說只支援9,10介面,很是惱火(資料怎麼寫就怎麼搬,到底是不是隻支援9,10介面有幾個知道?又有幾個知道為什麼?)。

另外本人長期逛各種論壇,發現國內民間創客極客水平還是普遍低下的,Arduino雖說開源但國內確實找不到多少參考資料,這無形之中成了小小的阻礙,於是本人花了點時間為廣大Arduino愛好者整理翻譯此份資料,一是想豐富網上資源,二是以一種更加簡便的方式帶部分人入門。瞭解原理才能談創意,不求甚解只能做個小玩家。

瞭解Arduino的最好平臺當然是官網,我相信官網肯定不會遺漏自己產品最有特色的東西,因此以它為參考絕對沒錯。另外,必要部分輔助以百科,以及各位廣大親愛博友的資料(就不一一列舉了,在此謝過)。本文以Arduino Mega 2560為基礎解釋,其他板子都差不多。

一:概述

Arduino Mega 2560是基於ATmega2560的微控制板,有54路數字輸入/輸出埠(其中15個可以作為PWM輸出),16路模擬輸入埠,4路UART串列埠,16MHz的晶振,USB連線口,電池介面,ICSP頭和復位按鈕。簡單地用USB連線電腦或者用交直流變壓器就能使用。

Mega 2560 是Arduino Mega系列的升級版。Mega 2560與之前的板子(最大)不同在於:它沒用FTDI USB-to-serial驅動晶片,而是用ATmega16U2程式設計作為USB-to-serial傳輸器(V1版本使用8U2)。

總結如下:

控制器 ATmega2560
工作電壓 5V
輸入電壓(推薦) 7-12V
輸入電壓(限制) 6-20V
數字I/0口 54 (含15路PWM輸出)
模擬輸入口 16
每個I/0口直流電流 40 mA
3.3v口直流電流 50 mA
快閃記憶體(Flash Memory) 256 KB(其中8 KB用作bootloader)
靜態儲存器(SRAM) 8 KB
EEPROM 4 KB
時鐘 16 MHz


二:電源

這部分就不說了,涉及3.3v和5v供電。



三:儲存器
ATmega2560有256k的快閃記憶體可儲存程式(其中8kb用作bootloader),有8kb的SRAM和4kb的EEPROM(可使用進行讀寫)。

(1)RAM

隨機存取儲存器(英文:random access memory,RAM)又稱作“隨機儲存器”,是與CPU直接交換資料的內部儲存器,也叫主存(記憶體)。它可以隨時讀寫,而且速度很快,通常作為作業系統或其他正在執行中的程式的臨時資料儲存媒介。儲存單元的內容可按需隨意取出或存入,且存取的速度與儲存單元的位置無關的儲存器。這種儲存器在斷電時將丟失其儲存內容,故主要用於儲存短時間使用的程式。 按照儲存資訊的不同,隨機儲存器又分為靜態隨機儲存器(英文:Static RAM,SRAM)和動態隨機儲存器(英文Dynamic RAM,DRAM)。

SRAM不需要重新整理電路即能儲存它內部儲存的資料。而DRAM(Dynamic Random Access Memory)每隔一段時間,要重新整理充電一次,否則內部的資料即會消失,因此SRAM具有較高的效能,但是SRAM也有它的缺點,即它的整合度較低,相同容量的DRAM記憶體可以設計為較小的體積,但是SRAM卻需要很大的體積,且功耗較大。所以在主機板上SRAM儲存器要佔用一部分面積。SRAM的速度快但昂貴,一般用小容量的SRAM作為更高速CPU和較低速DRAM 之間的快取(cache)。

(2)EEPROM

帶電可擦可程式設計只讀儲存器--一種掉電後資料不丟失的儲存晶片。 EEPROM 可以在電腦上或專用裝置上擦除已有資訊,重新程式設計。一般用在即插即用。EEPROM的擦除不需要藉助於其它裝置,它是以電子訊號來修改其內容的,而且是以Byte為最小修改單位,不必將資料全部洗掉才能寫入,徹底擺脫了EPROM Eraser和程式設計器的束縛。

(3)快閃記憶體(Flash Memory),EEPROM的變種:

在斷電情況下仍能保持所儲存的資料資訊分為NOR型NAND型快閃記憶體(NAND型更為普遍常見,一般說的是NAND型):

記憶體和NOR型快閃記憶體的基本儲存單元是bit,使用者可以隨機訪問任何一個bit的資訊。

而NAND型快閃記憶體的基本儲存單元是頁(Page)。每一頁的有效容量是512位元組的倍數。 NAND型快閃記憶體以塊為單位進行擦除操作(一塊一塊地擦)。快閃記憶體的寫入操作必須在空白區域進行,如果目標區域已經有資料,必須先擦除後寫入,因此擦除操作是快閃記憶體的基本操作。一般每個塊包含32個512位元組的頁,容量16KB;而大容量快閃記憶體採用2KB頁時,則每個塊包含64個頁,容量128KB。 

簡言之,RAM資料斷電不可儲存,因而常用於CPU與外設之間做快取用;EEPROM掉電資料不丟失,用於程式設計讀寫使用;有時由於需要改寫的資料量比較大,因而在EEPROM基礎上出現了Flash Memory(NAND型)。我們編寫好程式之後就是在bootloader引導下下載到Flash Memory裡面的(因為每次程式下載都有重新重新整理一個區域塊來儲存下載的程式,因而使用Flash Memory)。我相信新手對各種儲存器都會有一定了解了。

四:輸入輸出
54路介面都可作為輸入輸出,並使用pinMode(), digitalWrite()digitalRead()(點選看詳細介紹)功能。5v電壓操作,每個介面的電流最大40mA並且介面有內建20-50千歐的上拉電阻。另外,有的介面有特殊功能。
Serial(串列埠):
Serial 0:0 (RX) and 1 (TX); 
Serial 1: 19 (RX) and 18 (TX);
Serial 2: 17 (RX) and 16 (TX); 
Serial 3: 15 (RX) and 14 (TX).
一共四組串列埠。其中Serial0也被連線到Tmega16U2 USB-to-TTL Serial晶片(上文有介紹,我們USB連線電腦用的就是這個串列埠)。RX接收資料,TX傳輸資料。
External Interrupts(外部中斷):
2 (interrupt 0), 
3 (interrupt 1),
18 (interrupt 5), 
19 (interrupt 4), 
20 (interrupt 3), 
21 (interrupt 2)。
每個引腳都可配置成低電平觸發,或者上升、下降沿觸發。詳見功能。
PWM(脈衝調製):
2~13口;
44~ 46口。
提供8位PWM輸出。由 功能實現。

SPI(序列外設介面):

50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS)。使用庫實現。

SPI,是一種高速的,全雙工同步的通訊匯流排,並且在晶片的管腳上只佔用四根線,節約了晶片的管腳,同時為PCB的佈局上節省空間,提供方便,正是出於這種簡單易用的特性,如今越來越多的晶片集成了這種通訊協議。
SPI匯流排系統是一種同步序列外設介面,它可以使MCU與各種外圍裝置以序列方式進行通訊以交換資訊。外圍設定FLASHRAM、網路控制器、LCD顯示驅動器、A/D轉換器和MCU等。SPI匯流排系統可直接與各個廠家生產的多種標準外圍器件直接介面,該介面一般使用4條線:序列時鐘線(SCLK)主機輸入/從機輸出資料線MISO主機輸出/從機輸入資料線MOSI低電平有效的從機選擇線CS(有的SPI介面晶片帶有中斷訊號線INT、有的SPI介面晶片沒有主機輸出/從機輸入資料線MOSI)。
SPI的通訊原理很簡單,它以主從方式工作,這種模式通常有一個主裝置和一個或多個從裝置,需要至少4根線,事實上3根也可以(用於單向傳輸時,也就是半雙工方式)。也是所有基於SPI的裝置共有的,它們是SDI(資料輸入)、SDO(資料輸出)、SCLK(時鐘)、CS(片選)。
(1)MOSI– SPI匯流排主機輸出/ 從機輸入(SPI Bus Master Output/Slave Input);
(2)MISO– SPI匯流排主機輸入/ 從機輸出(SPI Bus Master Input/Slave Output);
(3)SCLK –時鐘訊號,由主裝置產生;
(4)CS – 從裝置使能訊號,由主裝置控制(Chip select),有的IC此pin腳叫SS。

其中CS是控制晶片是否被選中的,也就是說只有片選訊號為預先規定的使能訊號時(高電位或低電位),對此晶片的操作才有效。這就允許在同一總線上連線多個SPI裝置成為可能。
接下來就負責通訊的3根線了。通訊是通過資料交換完成的,這裡先要知道SPI是序列通訊協議,也就是說資料是一位一位的傳輸的。這就是SCLK時鐘線存在的原因,由SCK提供時鐘脈衝,SDI,SDO則基於此脈衝完成資料傳輸。資料輸出通過 SDO線,資料在時鐘上升沿或下降沿時改變,在緊接著的下降沿或上升沿被讀取。完成一位資料傳輸,輸入也使用同樣原理。這樣,在至少8次時鐘訊號的改變(上沿和下沿為一次),就可以完成8位資料的傳輸。在點對點的通訊中,SPI介面不需要進行定址操作,且為全雙工通訊,顯得簡單高效。在多個從裝置的系統中,每個從裝置需要獨立的使能訊號,硬體上比I2C系統要稍微複雜一些。
:現有1,2號裝置支援SPI介面,則可以都掛到主控的SPI線上,之後如果要控制1號裝置,則由主控傳送CS=1號,選中1號裝置,那麼1號裝置就可以通過MOSI,MISO兩根線在SCLK時鐘控制下和主機進行通訊了。
LED:
13引腳。這是板上自帶的LED燈,高電平亮,低電平滅。

TWI:

20 (SDA) 和21 (SCL)。使用Wire library(點選檢視詳細介紹)實現功能。

TWI(Two—wire Serial Interface)介面是對I^2C匯流排介面的繼承和發展,完全相容I^2C匯流排,具有硬體實現簡單、軟體設計方便、執行可靠和成本低廉的優點。TWI由一根時鐘線和一根傳輸資料線組成,以位元組為單位進行傳輸。TWI_SCL\TWI_SDA是TWI匯流排的訊號線。 SDA是雙向資料線,SCL是時鐘線SCL。在TWI總線上傳送資料,首先送最高位,由主機發出啟動訊號,SDA在SCL 高電平期間由高電平跳變為低電平,然後由主機發送一個位元組的資料。資料傳送完畢,由主機發出停止訊號,SDA在SCL 高電平期間由低電平跳變為高電平。

模擬輸入:

Mega2560有16個模擬輸入,每個提供10位的解析度(即2^10=1024個不同的值)。預設情況下他們測量0到5v值。可以通過改變AREF引腳analogReference() 功能改變他們變化範圍的上界。

AREF:是AD轉換的參考電壓輸入端(模擬口輸入的電壓是與此處的參考電壓比較的)。使用完成功能。
例:
參考電壓是5V,AD精度是10位的,
在模擬輸入端輸入2.5V,AD轉換結果就是512(1024×(5/2.5))
Reset:低電平有效,不用多說了吧。

五:通訊
Arduino Mega2560提供4路UARTs通訊,即Serial通訊。資料通過ATmega8U2/ATmega16U2時候指示燈會閃爍(除了0和1口)。
使用可以使用Mega2560的任意數字介面通訊。Mega2560同樣支援TWI和SPI通訊。

六:程式設計

Mega2560使用Arduino IDE環境程式設計(這個相信再新的新手也知道)。事先在快閃記憶體(Flash Memory)裡燒入bootloader載入程式(上文介紹有8kb),這樣我們就可以每次下載程式了。它使用的是原始的STK500通訊協議。(bootloader一般使用C語言或者彙編編寫,考慮部分人的興趣,這裡也提供些資料:)

你也可以繞過bootloader利用通過ICSP (In-Circuit Serial Programming)header來程式設計(這是採用額外程式設計器的方式,這種方式當然不贊成,很麻煩)。

The ATmega16U2(上面說的串列埠程式設計晶片,Mega2560的特色)韌體原始碼可以從獲得。ATmega16U2/8U2使用DFU bootloader下載,可以用以下方式啟用:
1.V1版本的板子:連線板子後面的跳線(靠近義大利的地圖),之後重置ATmega8U2(1版本為這個晶片)。
2.V2及之後的版本:有個將8U2/16U2 HWB線連到地的電阻,它使板子很容易進入DFU模式,你之後可以使用 (Windows) 或者 (Mac OS X and Linux) 下載新的韌體。或者你可以使用額外的程式設計器通過ISP下載(跟上面跳過bootloader下載程式時的方法一樣,此方法高階啊)。具體參考:Seethis user-contributed tutorial for more information.

七:自動(軟體)復位:

不說了。

八:USB過流保護:

不說了,好的硬體設計應該這麼做。


九:物理特性和相容:也不說了,都是繼承和發展。