top of page

Arduino冷知識

在學習Arduino的過程中,有哪些有趣或是實用的冷知識呢~

使用伺服馬達時,最好避開D9以及D10的PWM功能analogWrite(),

如果你用的是Mega版,在超過12個Servo的狀況下,則需避開D11與D12的PWM。


否則,PWM可能不會正常執行,

或是變成只能單純開關的狀況。


這是由於Servo.h與D9、D10的PWM使用同一個Timer,

如果同時使用這兩個指令會互相干擾,

造成PWM不能正常執行。


官方說明如下:

https://www.arduino.cc/en/reference/servo



使用tone()指令時,

也不能使用D3與D11的PWM功能。


ATmega328內部有3個計時計數器,

timer0 控制5、6的PWM訊號,以及delay()、millis()、micros()等指令。

timer1 控制9、10的PWM訊號,以及servo.h。

timer2 控制11、3的PWM訊號,以及tone()指令。


使用servo跟tone時,已經占用2個計時器,

所以同時使用喇叭跟伺服馬達時,

就只剩2顆呼吸燈可以使用了。


另外MEGA板有多達6個計時器,分擔許多PWM訊號,

如果受PWM訊號所苦的朋友,

換一塊大板子可能是個好選擇~


官方說明如下:

https://www.arduino.cc/reference/en/language/functions/advanced-io/tone/



Arduino不能使用tone()指令,

讓多個喇叭發出不同頻率的聲音。


且不能夠設定31hz以下的低頻率,

但可以設定高達65535Hz的高頻率,

而人耳約可聽到約20~20000hz左右的頻率。


官方說明如下:

https://www.arduino.cc/reference/en/language/functions/advanced-io/tone/



想要暫停比delay()還短的時間,

可以使用delayMicroseconds()。


delay()的單位為毫秒(ms)

delayMicroseconds()的單位為微秒(μs)


1秒(s) = 1,000 毫秒(ms) = 1,000,000 微秒(μs)


但使用時要注意以下兩點

1. delayMicroseconds()最大值不能超過16383,

也就是延遲16.383毫秒,所以要延遲超過1000微秒(μs),就直接使用delay()吧。


2. 並且在低於3時會有較大的誤差,

delayMicroseconds(1),實際會延遲1.5微秒(μs)

delayMicroseconds(2),實際會延遲2.125微秒(μs)


官方說明如下:

https://www.arduino.cc/reference/en/language/functions/time/delaymicroseconds/



在支援鍵盤指令的arduino(Leonardo, Esplora, Zero, Due 以及 MKR系列)

使用keyboard.h時,插上USB線,

電腦會自動把Arduino當作USB鍵盤(或是滑鼠)。


所以你可以寫好鍵盤的腳本,

插進朋友的電腦,然後就......


或著你可以自己製作遊戲"硬體"外掛,

因為電腦會判斷你用真正的USB鍵盤滑鼠,

所以遊戲伺服器也不會阻擋。


但官方也特別強調,

在使用keyboard.h的指令時一定要特別小心,

可能會讓你的Arduino瘋狂亂按一些按鈕,

甚至無法重新上傳Arduino的程式碼。


Leonardo板基本上跟UNO價格差不多,

若要自己製作USB鍵盤,下次可以考慮Leonardo,

而且忘記帶連接線時只要拿出手機或是行動電源的線就可以,

不用再拔印表機的方頭USB了~


官方說明如下:

https://www.arduino.cc/reference/en/language/functions/usb/keyboard/



原廠的Arduino板排針母座印有編號,

可讓你不再有插錯針腳的困擾。


其實這不算是冷知識,

但我第一次拿到原廠Arduino板時覺得很貼心。


另外在市面上販售的"副廠"Arduino,

其實不能使用Arduino的商標以及文字,

這些"副廠"Arduino並沒辦法讓Arduino官方獲得收益,

而官方需要這些經費來作為軟體的維護 (這幾天又更新了1.8.7版本)


擷取官方說明:

There are also a lot of products which claim to be “original” Arduino, using our graphics and branding, but provide no contributions back to Arduino for the development of the software and running the website.


如果Arduino有幫助到你,下次可以購買一片正版Arduino來支持,

或是你也可以到官方的捐款連結斗內。


官方捐款連結:

https://www.arduino.cc/en/Main/Contribute

I2C是個超級好用的傳輸介面,

許多模組也會使用I2C作為模組與Arduino溝通的橋樑,這種傳輸方式僅需SDA SCL兩個腳位,就可以讓一片Arduino與多個模組溝通。


但在台灣購買的I2C模組,部分店家不會附上I2C位址的資訊,網路找的Library與自己手上的模組位址可能也不同,常常造成空有模組但卻無法使用的窘境。


Arduino的官方提供了一個方便的解決方案,只要在Arduino上傳下方連結的程式碼,就可以讓Arduino自動搜尋I2C位址,快點拿出I2C模組試試看吧~~


官方說明:

https://playground.arduino.cc/Main/I2cScanner


早期的Arduino只能控制2個伺服馬達,

現在可以控制最多12個伺服馬達。


由於Servo的訊號需要約0.5~2.4毫秒的訊號脈衝,Arduino要輸出這種訊號需要使用IC內部的計時計數器,所以早期的Arduino輸出Servo指令是使用PWM訊號的腳位(只能使用在D9、D10),從0017版本(2009年發布)之後,才能像現在控制多達12顆伺服馬達。


但也因此,一片Arduino Uno就算多達20個I/O,但最多只能送12組Servo的脈衝訊號,而Mega板則可最多控制48組伺服馬達。


官方說明如下:

https://www.arduino.cc/en/Reference/ServoAttach

https://www.arduino.cc/en/reference/servo


Arduino Pro Mini 是最小、最輕、最便宜的Arduino開發板,

但是官網已經不賣了...


Pro Mini板減少了許多不必要的元件,

也沒有燒錄晶片與USB接孔,

需要利用FTDI或是其他Arduino板才能燒錄程式,

沒有排針母座,一切連接電路都需要焊接,

但也因此,這塊Pro Mini是功能最齊全且最輕、最小、最便宜的開發板。


如果你在Arduino UNO製作很棒的專題,

並且需要複製這個專題或是大量生產,

Pro Mini是我推薦的解決方案,

這個專題就是使用Pro Mini開發板:

https://youtu.be/ywzJtXSb5QU


但是Pro Mini官網已經不再販售,

網路上可以找到許多副廠且價格不一的Pro Mini,

請慎選廠商,不然就會跟我有一樣的下場:

https://www.facebook.com/DavidHuangsLab/photos/a.499902077130157/535573096896388/


官方說明如下:

https://store.arduino.cc/usa/arduino-pro-mini


在Arduino 1.0.1之前的版本沒有pinMode(pin, INPUT_PULLUP);

必須設定pinMode為INPUT,再將digitalWrite設定為HIGH來達成內部上拉電阻。


INPUT_PULLUP功能是使用AVR晶片內部的20K~150K上拉電阻,來達成偵測開關訊號的功能,這樣就可以直接將開關連接Dpin與GND,不需在外部配置額外的電路,大大降低電路的複雜程度。


在早期的Arduino版本,並沒有INPUT_PULLUP功能,必須這樣寫:

pinMode(pin, INPUT);

digitalWrite(pin, HIGH);


不過Arduino在未設定的預設狀態,會將所有pinMode設定為INPUT,也就是說你可以直接省去pinMode(pin, INPUT); 這行指令。


所以最偷懶的做法,就是直接在Setup寫上:

digitalWrite(pin, HIGH);

要打的字比

pinMode(pin, INPUT_PULLUP);

還要少喔~~

(但真的不推薦這樣寫啦)


官方說明如下:

https://www.arduino.cc/en/Tutorial/DigitalPins


一片Arduino最多只能控制1顆RGB LED燈,

如果控制兩顆,另一顆可能會有詭異的閃爍。


在Arduino UNO裡面有3個timer,一個timer分別控制2個pin腳的PWM訊號,但其中的timer0因為要同時處理millis()與delay(),所以輸出的頻率會跟其他兩個timer不同。也就是說,6個PWM當中有4個頻率是490hz,2個是976hz。


如果用PWM控制單顆LED燈還好,但控制RGB LED混色時,3種顏色中有使用到不同頻率的PWM,顏色就會互相疊加,產生詭異的閃爍頻率。由於UNO只有4個相同頻率的PWM,Leonardo只有5個,所以最多就只能完美控制1顆RGB LED了。


要記住UNO板跟Leonardo板的timer0控制的PWM腳位不同,所以連接RGB LED時要確認PWM腳位的頻率是否相同喔~


參考資料:

https://www.arduino.cn/thread-12906-1-1.html


官方說明如下:

https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/

https://www.arduino.cc/en/Tutorial/SecretsOfArduinoPWM


UNO消失的A6與A7在哪裡?

副廠的UNO板可以找到喔!


有使用過MINI或是MICRO板的朋友,應該有發現明明都是ATmega328晶片,但是UNO的A6與A7卻神秘的消失了。

這是由於晶片從TQFP32封裝改為DIP28封裝,晶片腳位硬生生少了4個,而可憐的A6與A7就被封印在裡面了。


如果購買的是TQFP32封裝的UNO,除了可以確定你買到的不是原廠之外,也可以找到晶片上的A6與A7,手動將這兩個被消失的腳位焊接出來用喔~


參考資料:

http://aguegu.net/?p=718



Arduino UNO控制LED燈時

不要讓超過10顆同時發亮


如果使用的LED是透明高亮度LED,通常會消耗約20mA。一個Dpin可以提供最多40mA,所以連接高亮度LED當然沒什麼問題。

但UNO板上所有的腳位加起來卻不能超過200mA,也就是說如果讓10顆高亮度LED同時發亮,可能會將你的Arduino搞壞。


但你可以用一些技巧性的方式操控更多的LED,比如說輪流閃爍,或是超快速切換閃爍,讓LED看起來都像是點亮一樣,記住只要別讓耗電量在瞬間超過200mA即可。


在製作Arduino聖誕樹時,要特別注意別讓燒壞的Arduino變成你的聖誕驚喜喔~


官方說明如下:

https://playground.arduino.cc/Main/ArduinoPinCurrentLimitations



更新: catalina 10.15.2可以使用


macOS catalina 10.15 系統(2019.10發布)

會導致Leonardo、micro...等,使用ATmega32u4 晶片的開發板無法成功上傳程式碼。(注:也有部分非Arduino開發板使用ATmega32u4晶片)


這個錯誤是由於Mac系統安全性更新,導致ATmega32u4在連接Mac產生的識別問題。

這部分的問題目前沒辦法從ArduinoIDE的更新解決,可能要等到Mac系統端,或是等待別的解法。

但ArduinoUNO等其他開發板,僅需更新ArduinoIDE 1.8.10以上即可順利運作。


詳細討論串:

https://github.com/arduino/Arduino/issues/9290?fbclid=IwAR3ec1T_q0Rk2rvsuSB6KWX6jr48AGmR7TeRUB_LS2AakYBVvUzuEVBmwL8


目前的解法如下:

1.使用ArduinoUNO燒錄Leonardo,可參考以下連結

https://www.instructables.com/id/Overview-the-Arduino-sketch-uploading-process-and-/

2.使用virtualbox灌虛擬系統(Mac舊版本或是Windows系統皆可)


macOS catalina 10.15.2 系統

可以成功使用Leonardo開發板了!


macOS新的10.15.2版本更新重新開放了ATmega32u4等,原本因為安全性更新所封鎖的硬體,未來macOS是否會再次封鎖也很難說,但至少現階段大家可以放心更新系統了!


詳細討論串:

https://github.com/arduino/Arduino/issues/9290?fbclid=IwAR3ec1T_q0Rk2rvsuSB6KWX6jr48AGmR7TeRUB_LS2AakYBVvUzuEVBmwL8







4,951 次查看0 則留言

最新文章

查看全部

Comments


%E5%BB%A3%E5%91%8A_edited.jpg
bottom of page