這一篇記錄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會等待,直到出現新的虛擬序列埠,然後再進行上傳動作。
參考資料:
- Adafruit Learning System的Adafruit Arduino Selection Guide,板子這麼多,怎麼選呢,第一次買嗎?想升級嗎?各板子的硬體規格呢?請看這篇。裡頭提到的板子,除了Arduino官方出品之外,都是Adafruit公司設計生產的板子與產品,沒有提到其他的可行選項,不過這也無可厚非。
- Arduino官方文件Arduino Uno、Arduino Leonardo、Guide to the Arduino Leonardo and Micro、Serial、attachInterrupt()。官方文件總是最好的資訊來源。
- Dr. Monk's DIY Electronics Blog的Arduino Leonardo vs. Arduino Uno。
- 網昱多媒體swf.com.tw的Arduino Leonardo控制板的數位14~17腳、類比A6~A11腳以及SPI腳位介紹。
- PighiXXX Website的Arduino腳位功能圖,色彩鮮豔,非常清楚。
站長你好:
ReplyDelete近來想要自行DIY UNO SMD 的板子, 但是組裝完成後一直無法成功燒錄Driver到DIY的板子上,請問有哪篇文章或哪個論壇有詳細敘述和下載各個Driver軟件,目前手頭上有一塊UNO R3(插件式) 的原裝版, 可以當作母版燒錄DIY的SMD板子嗎?,是否兩塊板子使用不同的晶片,所以無法燒錄?
無法成功燒錄Driver到DIY的板子上?
Delete不懂你說的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板。
謝謝你的回覆,
ReplyDelete是的, 我是DIY一塊Uno SMD 板子, 目前參照你的文章以及所有網路可以看到的文章, 都無法解決問題, bootloader 就是無法燒錄進去, 我想可能需要買AVR ISP 燒錄器來試看看, 請問台灣哪裡有賣??
想要燒錄bootloader的話,不能使用一般的Arduino燒錄方式,因為那需要bootloader(雞蛋問題)。
Delete可以參考:
將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燒錄器,但我沒買過。
非常感謝所有的文章及開箱文, ATMega328P SMD已經用 AVR ISP 板子燒錄 Bootloader 成功.
ReplyDeleteDIY 一塊 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年級生來玩?
燒錄bootloader的確有難度,我某位朋友最近也在此處碰到障礙。
Delete1. 可以。
一般的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年級?咳咳,您自己判斷吧。
感謝回覆, 目前已經可以將Sketch燒錄到ATMega328P SMD裡, 並且正常工作.
ReplyDelete我在想所有程序都只是要在ATM328P裡執行Skech所要的動作, 所以如果ATMega16U2沒有正常工作, 在目前的狀況下並不會影響最後的結果, 所以, 有沒有ATMega16U2並不重要, 那只是一個傳輸介面, 而這個傳輸介面的敘述文檔似乎有需要更清楚的說明白, 讓有需要的門外漢, 照圖說故事, 一步一步的安裝完成所有需要的程式碼, 當然的, 也必須留下去哪裡下載的路徑.譬如在下我看了這麼多的文章與論壇, 結果也是會者恆會, 不會者恆不會, 所以.......
所以直接買一塊Arduino板子最快。
Delete在Uno板子裡,ATmega16U2負責的是「USB轉序列埠」的功能,如果你需要此功能,那就要自己加裝這顆晶片,自己下載並燒錄適當的韌體;Arduino Uno板使用的韌體也已包含在Arduino軟體裡了。
因為有需要的門外漢很少,所以沒有這方面的詳細文件。
既然您弄懂了,不如挺身而出寫一份教學文件出來造福大家。
韓大哥的blog有詳細比較
ReplyDelete「Arduino開發版各型號差異比較」http://hanmajor.blogspot.tw/2013/10/arduino.html
ok, thanks.
Delete老師您好:
ReplyDelete上次問到SD初始失敗,後來把3.3V換接5V,就讀取成功了....
另外想請教您,我SD卡裡有64個TXT檔,每個檔有256個值,如果值都不超過1024,為什麼每次讀檔都只能讀到第一個檔的值,讀不到第二個檔值,就又跳回 Serial.print("Initializing SD card...");能否請您幫我看一下?感謝您!
你記憶體是不是用太兇了?Uno只有2k而已。
Deletechar ch[256];
int allNumber[256];
以上就用掉0.75k。
你在loop裡有
char n[32] = {};
你確定32夠嗎?
如果if (buf != 32 && buf !='\n')一直為真,就會超出32吧?
出錯的地方應該是
i++;
這一行,
等到讀第二支檔,i會是256,已經超過allNumber允許的索引值上限。
那能請問老師,那可以怎麼改,在關檔前,讓i歸零嗎?!
Delete老師您好:
Delete經過您的提點,我在關檔後,讓 i=0; 就能讀到64個檔案的值了,真的謝謝老師指點啊!!
Congratulations.
Delete感謝葉難大許多精闢的教學文~
ReplyDelete現在已經可以使用arduino leonardo讀取旋轉編碼器的輸出 來移動電腦的滑鼠
也可以讓電腦辨識arduino leonardo的藍芽連接
請問一下那我是否能再進一步將arduino leonardo模擬為一個藍芽滑鼠呢?
> 使用arduino leonardo讀取旋轉編碼器的輸出 來移動電腦的滑鼠
Delete這是使用leonardo的Mouse程式庫吧,因為它幫你實作USB HID驅動程式了,所以才行。
電腦連接你的藍牙模組後,若要傳送滑鼠的訊號,該模組必須支援HID模式。
如果的模組是HC-05、HC-06,恐怕很難。
可參考https://flashandrc.wordpress.com/2014/10/04/hid-firmware-on-hc-06-bluetooth-modules/
看完了 感謝您的資訊 恩..我似乎是沒辦法做到XD
Delete用Flip改Hex檔的做法我也實作過了
這方面會比較有可能做成藍芽滑鼠嗎?
什麼?請說清楚一點。
Delete請教葉難大一下
ReplyDeletearduino uno的動態記憶體(Flash memory)因為只有32KB,故在執行較大規模的程式運作時,無法執行成功,想請問動態記憶體有辦法擴充嗎?
簡答:沒辦法。
DeleteFlash memory通常是叫做快閃記憶體,動態記憶體是dynamic memory,
uno的flash有32kb,sram有2kb。
> 較大規模的程式運作時,無法執行成功
程式太大的話,根本無法燒錄吧。更別提執行了。
或許可以想辦法把資料部分放進eeprom,但也只有1kb。
學習Arduino API下一層的AVR程式設計,把某些Arduino的臃腫函式換掉,可縮減程式佔用的空間。
學習程式大小的各種最佳化技巧,縮減佔用空間。
如果程式有很多資料,或許可試著移到SD記憶卡。
最快的方式是改用Mega 2560,flash有256kb,sram有8kb。或其他更強的板子。
葉老師你好,請問一下如果動態記憶體不足的話,可以用兩台arduino在使用I2C連接嗎?
ReplyDelete兩台arduino可透過I2C連接。
Delete但用這種方式解決 動態記憶體不足,太麻煩太困難了吧。
1. 換板子,換記憶體更大的。
2. 改寫程式。
打算用兩個com分別傳程式了!謝謝回復
Delete葉難大大,不好意思,請教一下。
ReplyDelete請問我用程式以modbus抓取電表的值之後
回傳給arduino後顯示在監控視窗中的值
一般來說,他會記憶上一次的值嗎?
如果他有記憶的話,我該如何讓這記憶的東西全部reset呢?
arduino上的reset鍵只是重新開機跟程式是不是沒有關係?
> 他會記憶上一次的值嗎?
Delete誰?
程式裡的變數,當然會持續存著上次的值,直到你再次寫入。
> arduino上的reset鍵
重新開機,就跟你電腦重新開機是一樣的意思。
當然跟程式有關,重新開機,就重新執行程式。
Arduino會把重電表接收到的值存在自己的暫存器里?
ReplyDelete如果我要在中途將值清除,能夠用以下指令去清除嗎?上網查了一下說要搭配init();這個指令,實在不清楚如何去使用下面這個指令。
void setup() {
reset;
}
看不懂你的問題,資訊不夠。
Deletecode?
我找到方式,我用看門狗計時器完成了。
Delete但是我又有新的問題了....不好意思
請問如果我要在arduino監控視窗中print出數字1之後println出數字2
按照順序這樣子顯示,要怎麼寫。
用於紀錄我到底出現了幾行在監控視窗中。
用全域變數,如unsigned long idx = 1;
Delete有印出、就加一。
怎麼用MBOT搭配擴充版功能??
ReplyDelete請大大指教
沒用過mbot耶,orz。
Delete請問有遇過用UNO測試板使用訊號就正常發送,但換成麵包板就不行的形情嗎?
ReplyDelete老師我想請問我使用ld3320語音辨識模組接leonardo板程式寫好上傳完畢但com視窗始終沒有因為語音辨識模組輸入而有反應,想問問老師我如果換uno板會可行嗎?
ReplyDelete爬了一下社團好像leonardo板好像有這樣的問題?:附臉書網址 https://www.facebook.com/groups/webduino/posts/2024568714278854/
老師您好~
ReplyDelete請問 Leonardo 可以同時做為 UID 跟 COM port 嗎?
我想接著電腦,電腦這邊負責做一些判斷,COM port 當做 arduino 的 input,arduino 也同時當做 UID,output 是鍵盤操作。
如果不行的話,我可能會再買一個 usb-to-TTL,用 Tx,Rx 當做電腦和 arduino 溝通的橋梁,arduino 就當作純 UID,應該是可行的吧?
謝謝老師!