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


官方說明如下: