如果只是想要有一個小小gadget,幾個IO而已,相較於用一整個Arduino Uno,可以用ATtiny85就好。
在我的計畫裡,我是要用ATtiny85以一個固定的頻率來開關一個馬達,而開關的頻率是80 Hz。80 Hz = 一秒發生80次,所以在一個循環內,所花的時間為1/80=0.0125秒,而一個循環內包含一半時間的開與一半時間的關,所以各花了0.0125/2=0.00625秒=6.25毫秒(millisecond)。
所以我原本在ATtiny85上寫上的程式碼即為:
digitalWrite(sol, HIGH);
delay(6.25);
digitalWrite(sol, LOW);
delay(6.25);
結果經過其他方式去驗證這個馬達頻率,結果卻是83.3左右Hz。本來以為只是我的驗證方法有錯誤,但是後來去Arduino官網上查看"delay"這個功能的介紹時,卻發現:
delay()
Description
Pauses the program for the amount of time (in miliseconds) specified as parameter. (There are 1000 milliseconds in a second.)
所以delay這個功能的數值所代表的意義是以"毫秒(millisecond)"為單位的,另外在底下的See also裡,可以看到另外一個"delayMicroseconds()"的功能。這時候才發現delay裡面填寫的直不可有小數點,如果要更精細數值的delay請用"delayMicroseconds()(微秒)"。所以將程式碼改成:
digitalWrite(solenoid, HIGH);
delayMicroseconds(6250);
digitalWrite(solenoid, LOW);
delayMicroseconds(6250);
現在一個問題解決,又遇到另一個問題。ATtiny85在出廠的時候,一開始內建的時脈是1 MHz,但是delayMicroseconds這個功能不可以用在時脈太低的晶片上(1 MHz就不行 ...),所以解決辦法就是更改Attiny85的時脈。而目前就我所知,Attiny85可以用的時脈有1 MHz, 8 MHz, 16 MHz, 20 MHz這幾種選擇。要用20 MHz似乎要用一顆external oscillator,對我來說有點太複雜了。而使用16 MHz時脈則是有中文版的教學(修改 ATtiny85 的時脈 (clock speed)),但是使用文中的使用方法需要用到avrdude,而且我有點無法裡面作者的文法,所以對我來說還是太複雜了。
再經過一些搜尋後,找到了最簡單的方式,如果你已經照著上面的影片的步驟做過了,只需要多一個步驟就可以用8 MHz的時脈了(對我來說只要夠用到delayMicroseconds即可)。
方法:
1. 如同影片中將你的Attiny85接上,打開Arduino IDE,選擇Tools,選擇Board,選擇"ATTiny85 (internal 8MHzclock)",而不是影片中說的1 MHz。
avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85
avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85
4. 接著就可以按IDE左上角的箭號,把你的程式Upload到Attiny85裡面了。
沒有留言:
張貼留言