在網路常看到一個梗圖,主要是一個鍵盤只有三個按鍵:
然後反諷的說,這是一個電腦高手使用的鍵盤,或者說,這是一個寫論文報告的鍵盤等等。
我們學習語言也是一樣的,我們一開始大都重覆從大人那邊聽到的東西,然後反覆不自覺的練習,最後變成能自由的以自己的意志或方式輸出,那這語言就算學成了。我們以學英文爲例,從小學、國中、高中、大學,您花了多少時間在上英文課,起碼數千小時以上了,成果呢?就我幾十年接觸的人們,我可以肯定的說至少有七八成的人,英文是學不好的!
程式語言其實也是語言的一種,是與電腦溝通的語言,規則比自然語言更加固定簡單,其實應該更好學才是。但是一樣的,我們發現能學成的也並不多,更不要說是學好!學習程式語言並不是一定要成爲程式設計師(或碼農!),就像我們學音樂學美術主要是陶冶心性爲主,若自己有天份的話,或許因此可以成爲音樂家畫家。我們主要學習程式語言的目的,反而是學習其中如何解決問題的思維,這就是目前一窩蜂在談的 “運算思維” (computational thinking, CT),但是到了我們這裡以填鴨式教學爲主的教育環境,好像又增加了學生背誦的題材!周而復始,好像學生要不斷背新的東西,我真的懷疑能學好嗎?
前面廢話這麼多?主要就是要帶入一個觀念,不要萬事都在等待別人告訴您一個程式庫或是套件模組,我們把它 import 進來應用就好了!您要知道,或者說要有能力評估您 import 進來的是啥東西,能做什麼,不能做什麼。不能盲目的套用,就像中文,我們學到了“罄竹難書”,我們不能隨便套用在偉大的功績上面!在程式設計或是學其它學科也是一樣的,要多問問題,甚至培養提問能力也是非常重要的一環,以免提問了不該提問的問題,造成社群運作上的困擾!
一樣的,別人告訴您的方法或訊息也不能盡信,包含您現在在看我的文章也是一樣的,都要抱持懷疑的態度,只有自己不斷的實驗了,並驗證確實有效,才能相信。
所以我們在這裡並沒有告訴您 Python 的 import 如何用、以及 Micropython 的 machine 相關模組、或者一些驅動等等如何用的細節,但都有指出方向,您可以從這些線索獲得答案,並且透過不斷的質疑、提問與實驗,最後內化成爲自己的東西,慢慢的,您就學會了,而且更不怕變化或是改版等等,因爲您已經懂了!
言歸正傳,昨天我們提到用 Timer 來做 1000 Hz, 我們發現無法在 period 上用延時 0.5 ms, 所以我們必須去看看官方文件,然後瞭解到還有一個 KW 參數,freq,可以用來指定頻率,頻率與週期互爲倒數,因此週期 0.5 ms 是頻率 2000 Hz
程式改寫如下:
from machine import Pin,Timer
LED = Pin(1, Pin.OUT)
tim = Timer(0)
tim.init(freq = 2000, mode = Timer.PERIODIC, callback = lambda t: LED.value(not LED.value()))
我們用電錶量測,竟然是 1000 Hz 幾乎不動,只有非常少部分時間跳到 999 Hz,但很快就又跳回 1000 Hz 了,這現象說明了這程式產生的頻率非常的接近 1000 Hz,明顯的比用 sleep 延時的方法好!
我們再用 Pulesview 看一下結果:
可以看出就是 1000 Hz 整,不多也不少,真的非常的準 !
接着我們再做以下的實驗:
from machine import Pin,Timer
LED1 = Pin(1, Pin.OUT)
LED2 = Pin(2, Pin.OUT)
LED3 = Pin(42, Pin.OUT)
LED4 = Pin(41, Pin.OUT)
LED5 = Pin(40, Pin.OUT)
tim1 = Timer(0)
tim2 = Timer(1)
tim3 = Timer(2)
tim4 = Timer(3)
tim5 = Timer(4)
tim1.init(freq = 1000, mode = Timer.PERIODIC, callback = lambda t: LED1.value(not LED1.value()))
tim2.init(freq = 2000, mode = Timer.PERIODIC, callback = lambda t: LED2.value(not LED2.value()))
tim3.init(freq = 3000, mode = Timer.PERIODIC, callback = lambda t: LED3.value(not LED3.value()))
tim4.init(freq = 4000, mode = Timer.PERIODIC, callback = lambda t: LED4.value(not LED4.value()))
tim5.init(freq = 5000, mode = Timer.PERIODIC, callback = lambda t: LED5.value(not LED5.value()))
我們用了 5 個 Timer, 實驗結果, tim1 失效了,也就是說只有四個 Timer 有用,而且 id 不見得是 0 ~ 3
如果我們再深入一點,在 這裡 可以得到答案。