2013/09/06

Arduino:Leonardo與Uno的差異比較

這一篇記錄Leonardo與Uno不同的地方,零零碎碎,雜七雜八。

跟Uno比起來,Leonardo比較新、硬體規格比較強、價格比較便宜,但Uno資格較久,許多書籍、文件、網路上的分享心得、以及眾多程式庫,幾乎都 以Uno為基準,雖說兩者幾乎一樣,但仍有一些小差異,這些小麻煩對老鳥來說自然不會產生大問題,但對新手來說仍算是不低的障礙。所以第一次玩微控制器板或Arduino的朋友,我建議購買Uno。









Uno的微控制器是ATmega328P,有DIP也有SMD,另有一顆ATmega8U2(R1與R2)/ATmega16U2(R3),作為USB橋接功能;Leonardo的微控制器是ATmega32U4,只有SMD,32U4已包含USB功能。

Uno的USB插座是一般B型,Leonardo的USB插座則為Micro B型。

都有一個2.1mm/2.5mm的DC電源插座,都有重置按鈕,運作時脈都是16MHz,Flash memory都是32KB,Uno的bootloader約0.5 KB,Leonardo的bootloader約4 KB,
EEPROM都是1KB,SRAM(Uno 2KB,Leonardo 2.5KB)。

Uno與Leonardo板子的尺寸大小、排母數目與位置,都一樣,但功能有所不同。

數位腳位,Uno在板子上方有14個(標示為0~13),其中6個可PWM,以「~」額外標示,3、5、6、9、10、11,解析度8位元。Leonardo相同,PWM多了一個13。

類比輸入腳位,Uno在板子下方有6個(標示為A0~A5),解析度10位元。Leonardo多了6個,A6~A11(位於數位腳位4、6、8、9、10、12)。

I2C/TWI介面,Uno:SDA(A4、SDA)與SCL(A5、SCL)。Leonardo:SDA(2、SDA)與SCL(3、SCL)。

SPI介面,Uno:SS(10)、MOSI(11)、MISO(12)、SCK(13)。Leonardo跟Uno不同,SPI不在數位腳位,MOSI、MISO、SCK都在ICSP上,SS則位於板子左邊與RX LED相連。

外部中斷,Uno:2(int.0)、3(int.1)。Leonardo:3(int.0)、2(int.1)、0(int.2)、1(int.3)、7(int.4)。

Serial(序列介面),Uno:RX(0)與TX(1)連接8U2/16U2(USB轉TTL Serial的晶片),在程式裡以Serial物件存取。Leonardo:在程式裡Serial物件代表USB CDC(Connected Device Class),而Serial1物件才是RX(0)與TX(1)。Leonardo事實上擁有兩個序列埠,一個模擬而成的虛擬序列埠(不管是在電腦端還是在微控制器端),連接USB連線,另一個則是微控制器本身原本擁有的UART硬體。

因Leonardo使用內建USB功能的ATmega32U4,擁有非常強大的bootloader,除了可作為虛擬序列埠(COM port),也可模擬成USB鍵盤與滑鼠(標準的HID裝置,無需驅動程式)。連接Leonardo與電腦時,系統就會出現三個新硬體裝置:虛擬序列埠、USB鍵盤、USB滑鼠。其實Uno也可以模擬USB鍵盤與滑鼠,但必須透過DFU模式修改8U2/16U2的韌體。

自動軟體重置,Uno:8U2/16U2的DTR連接到Atmega328P的重置線路。Leonardo:當以1200鮑率開啟虛擬序列埠並關閉時就重置。

Uno因有一顆獨立晶片負責USB轉TTL Serial,所以當主晶片重置時,該連線並不會斷掉,但Leonardo會,原本若開啟電腦端的序列埠監控視窗,Uno就會重置,但Leonardo不會,以至於在setup()從序列埠傳出的資料,可能不會出現在電腦端,所以通常會加上while (!Serial);等待開啟序列埠。

因為Leonardo重置時虛擬序列埠會消失,所以在上傳(燒錄)時,Arduino IDE會等待,直到出現新的虛擬序列埠,然後再進行上傳動作。


參考資料:

35 comments:

  1. 站長你好:
    近來想要自行DIY UNO SMD 的板子, 但是組裝完成後一直無法成功燒錄Driver到DIY的板子上,請問有哪篇文章或哪個論壇有詳細敘述和下載各個Driver軟件,目前手頭上有一塊UNO R3(插件式) 的原裝版, 可以當作母版燒錄DIY的SMD板子嗎?,是否兩塊板子使用不同的晶片,所以無法燒錄?

    ReplyDelete
    Replies
    1. 無法成功燒錄Driver到DIY的板子上?
      不懂你說的Driver是什麼東西?是指bootloader嗎?

      若要燒錄bootloader,可參考我其他文章http://yehnan.blogspot.tw/2012/02/arduino_21.html

      將Arduino Uno當做一台ISP線上燒錄器,燒錄bootloader或sketch到麵包板上的ATmega328P-PU晶片、在麵包板上建構Arduino、自製並列埠燒錄線、開箱文:AVR ISP燒錄器Adafruit USBtinyISP


      只要使用ATmega328P微控制器晶片,不管是插件式還是SMD,都可算相容於Uno板。

      Delete
  2. 謝謝你的回覆,
    是的, 我是DIY一塊Uno SMD 板子, 目前參照你的文章以及所有網路可以看到的文章, 都無法解決問題, bootloader 就是無法燒錄進去, 我想可能需要買AVR ISP 燒錄器來試看看, 請問台灣哪裡有賣??

    ReplyDelete
    Replies
    1. 想要燒錄bootloader的話,不能使用一般的Arduino燒錄方式,因為那需要bootloader(雞蛋問題)。

      可以參考:
      將Arduino Uno當做一台ISP線上燒錄器,燒錄bootloader或sketch到麵包板上的ATmega328P-PU晶片
      http://yehnan.blogspot.tw/2013/02/arduino-unoispbootloadersketchatmega328.html

      我買的燒錄器是外國的,開箱文:AVR ISP燒錄器Adafruit USBtinyISP,
      http://yehnan.blogspot.tw/2013/09/avr-ispadafruit-usbtinyisp.html。

      各大拍賣網站都有賣AVR燒錄器,但我沒買過。

      Delete
  3. 非常感謝所有的文章及開箱文, ATMega328P SMD已經用 AVR ISP 板子燒錄 Bootloader 成功.
    DIY 一塊 Arduino UNO SMD 還真困難, 不像網站寫的那麼容易, 除了焊接零件, 燒錄控制程式才是重頭戲.
    我買的 AVR ISP 板子是出產自: www.robotbase.cn 的 USBtinyISP v3.0 Arduino Bootloader Programmer RB-03T012
    目前想請教的是:
    1. 可以用這 AVR ISP 燒錄 Sketch 到 ATMega328P SMD 嗎? 需要如何接線? ( 由於 AVR ISP 板子並沒有任何說明文件, 所以不知道還有哪些功能 )
    2. 需要哪些程式或 Driver 來驅動嗎? 哪裡可以下載?
    3. 是否可以用此 AVR ISP 來燒錄 ATMega16U (USB to TTL )所需要的操控程式? ( 要用在 Arduino UNO SMD rev.3 的 USB 介面)
    4. 以上這些適不適合3,4年級生來玩?

    ReplyDelete
    Replies
    1. 燒錄bootloader的確有難度,我某位朋友最近也在此處碰到障礙。

      1. 可以。
      一般的Uno板都有拉出給燒錄器用的排針「2x3」,你的AVR ISP 板子也有,以線材連接兩者。
      所以你自己DIY的Arduino UNO SMD板子,也必須拉出那些「2x3」排針。

      2. 呃,你都已經燒錄 Bootloader 成功了,那不就代表已經安裝好了AVR ISP 板子的驅動程式。

      3. 可以,網路上找得到別人關於燒錄atmega16u2的分享文章。
      但我沒試過,我是直接使用16u2的DFU bootloader來進行燒錄(http://yehnan.blogspot.tw/2013/08/arduino-unousb.html)。

      4. 小學3年級?咳咳,您自己判斷吧。

      Delete
  4. 感謝回覆, 目前已經可以將Sketch燒錄到ATMega328P SMD裡, 並且正常工作.
    我在想所有程序都只是要在ATM328P裡執行Skech所要的動作, 所以如果ATMega16U2沒有正常工作, 在目前的狀況下並不會影響最後的結果, 所以, 有沒有ATMega16U2並不重要, 那只是一個傳輸介面, 而這個傳輸介面的敘述文檔似乎有需要更清楚的說明白, 讓有需要的門外漢, 照圖說故事, 一步一步的安裝完成所有需要的程式碼, 當然的, 也必須留下去哪裡下載的路徑.譬如在下我看了這麼多的文章與論壇, 結果也是會者恆會, 不會者恆不會, 所以.......

    ReplyDelete
    Replies
    1. 所以直接買一塊Arduino板子最快。

      在Uno板子裡,ATmega16U2負責的是「USB轉序列埠」的功能,如果你需要此功能,那就要自己加裝這顆晶片,自己下載並燒錄適當的韌體;Arduino Uno板使用的韌體也已包含在Arduino軟體裡了。

      因為有需要的門外漢很少,所以沒有這方面的詳細文件。

      既然您弄懂了,不如挺身而出寫一份教學文件出來造福大家。

      Delete
  5. 韓大哥的blog有詳細比較
    「Arduino開發版各型號差異比較」http://hanmajor.blogspot.tw/2013/10/arduino.html

    ReplyDelete
  6. 老師您好:

    上次問到SD初始失敗,後來把3.3V換接5V,就讀取成功了....

    另外想請教您,我SD卡裡有64個TXT檔,每個檔有256個值,如果值都不超過1024,為什麼每次讀檔都只能讀到第一個檔的值,讀不到第二個檔值,就又跳回 Serial.print("Initializing SD card...");能否請您幫我看一下?感謝您!

    ReplyDelete
    Replies
    1. 你記憶體是不是用太兇了?Uno只有2k而已。
      char ch[256];
      int allNumber[256];
      以上就用掉0.75k。

      你在loop裡有
      char n[32] = {};
      你確定32夠嗎?
      如果if (buf != 32 && buf !='\n')一直為真,就會超出32吧?
      出錯的地方應該是
      i++;
      這一行,
      等到讀第二支檔,i會是256,已經超過allNumber允許的索引值上限。


      Delete
    2. 那能請問老師,那可以怎麼改,在關檔前,讓i歸零嗎?!

      Delete
    3. 老師您好:

      經過您的提點,我在關檔後,讓 i=0; 就能讀到64個檔案的值了,真的謝謝老師指點啊!!

      Delete
  7. 感謝葉難大許多精闢的教學文~
    現在已經可以使用arduino leonardo讀取旋轉編碼器的輸出 來移動電腦的滑鼠

    也可以讓電腦辨識arduino leonardo的藍芽連接

    請問一下那我是否能再進一步將arduino leonardo模擬為一個藍芽滑鼠呢?

    ReplyDelete
    Replies
    1. > 使用arduino leonardo讀取旋轉編碼器的輸出 來移動電腦的滑鼠
      這是使用leonardo的Mouse程式庫吧,因為它幫你實作USB HID驅動程式了,所以才行。

      電腦連接你的藍牙模組後,若要傳送滑鼠的訊號,該模組必須支援HID模式。
      如果的模組是HC-05、HC-06,恐怕很難。
      可參考https://flashandrc.wordpress.com/2014/10/04/hid-firmware-on-hc-06-bluetooth-modules/

      Delete
    2. 看完了 感謝您的資訊 恩..我似乎是沒辦法做到XD
      用Flip改Hex檔的做法我也實作過了
      這方面會比較有可能做成藍芽滑鼠嗎?

      Delete
    3. 什麼?請說清楚一點。

      Delete
  8. 請教葉難大一下
    arduino uno的動態記憶體(Flash memory)因為只有32KB,故在執行較大規模的程式運作時,無法執行成功,想請問動態記憶體有辦法擴充嗎?

    ReplyDelete
    Replies
    1. 簡答:沒辦法。

      Flash memory通常是叫做快閃記憶體,動態記憶體是dynamic memory,
      uno的flash有32kb,sram有2kb。

      > 較大規模的程式運作時,無法執行成功
      程式太大的話,根本無法燒錄吧。更別提執行了。

      或許可以想辦法把資料部分放進eeprom,但也只有1kb。
      學習Arduino API下一層的AVR程式設計,把某些Arduino的臃腫函式換掉,可縮減程式佔用的空間。
      學習程式大小的各種最佳化技巧,縮減佔用空間。
      如果程式有很多資料,或許可試著移到SD記憶卡。

      最快的方式是改用Mega 2560,flash有256kb,sram有8kb。或其他更強的板子。

      Delete
  9. Anonymous24/9/16 16:37

    葉老師你好,請問一下如果動態記憶體不足的話,可以用兩台arduino在使用I2C連接嗎?

    ReplyDelete
    Replies
    1. 兩台arduino可透過I2C連接。
      但用這種方式解決 動態記憶體不足,太麻煩太困難了吧。

      1. 換板子,換記憶體更大的。
      2. 改寫程式。

      Delete
    2. Anonymous25/9/16 01:46

      打算用兩個com分別傳程式了!謝謝回復

      Delete
  10. 葉難大大,不好意思,請教一下。
    請問我用程式以modbus抓取電表的值之後
    回傳給arduino後顯示在監控視窗中的值
    一般來說,他會記憶上一次的值嗎?
    如果他有記憶的話,我該如何讓這記憶的東西全部reset呢?
    arduino上的reset鍵只是重新開機跟程式是不是沒有關係?

    ReplyDelete
    Replies
    1. > 他會記憶上一次的值嗎?
      誰?
      程式裡的變數,當然會持續存著上次的值,直到你再次寫入。

      > arduino上的reset鍵
      重新開機,就跟你電腦重新開機是一樣的意思。
      當然跟程式有關,重新開機,就重新執行程式。

      Delete
  11. Arduino會把重電表接收到的值存在自己的暫存器里?
    如果我要在中途將值清除,能夠用以下指令去清除嗎?上網查了一下說要搭配init();這個指令,實在不清楚如何去使用下面這個指令。
    void setup() {
    reset;
    }

    ReplyDelete
    Replies
    1. 看不懂你的問題,資訊不夠。

      code?

      Delete
    2. 我找到方式,我用看門狗計時器完成了。
      但是我又有新的問題了....不好意思
      請問如果我要在arduino監控視窗中print出數字1之後println出數字2
      按照順序這樣子顯示,要怎麼寫。
      用於紀錄我到底出現了幾行在監控視窗中。

      Delete
    3. 用全域變數,如unsigned long idx = 1;
      有印出、就加一。

      Delete
  12. 怎麼用MBOT搭配擴充版功能??
    請大大指教

    ReplyDelete
  13. 請問有遇過用UNO測試板使用訊號就正常發送,但換成麵包板就不行的形情嗎?

    ReplyDelete
  14. Anonymous26/1/23 22:12

    老師我想請問我使用ld3320語音辨識模組接leonardo板程式寫好上傳完畢但com視窗始終沒有因為語音辨識模組輸入而有反應,想問問老師我如果換uno板會可行嗎?
    爬了一下社團好像leonardo板好像有這樣的問題?:附臉書網址 https://www.facebook.com/groups/webduino/posts/2024568714278854/

    ReplyDelete
  15. Anonymous12/2/23 12:17

    老師您好~
    請問 Leonardo 可以同時做為 UID 跟 COM port 嗎?
    我想接著電腦,電腦這邊負責做一些判斷,COM port 當做 arduino 的 input,arduino 也同時當做 UID,output 是鍵盤操作。
    如果不行的話,我可能會再買一個 usb-to-TTL,用 Tx,Rx 當做電腦和 arduino 溝通的橋梁,arduino 就當作純 UID,應該是可行的吧?
    謝謝老師!

    ReplyDelete