WFU

2018年7月18日 星期三

微電腦基礎點亮LED之一:原理講解


作者:林明忠

最近為了暑期微電腦課程舉辦了幾場說明會。過程中,發現「害怕學不會」與「擔心學微電腦很困難」是多數家長或小朋友的反應。如果提早五到十年,這樣的學習確實是一種障礙。

不過,因著科技的進步,現在我們只要掌握簡單的原理與觀念,要寫出指令控制微電腦並非難事。



說穿了,微電腦控制最基本的概念是「設定微電腦的Pin(接)腳,讓它在某一個時間點,執行程式設定的狀態(1或0)」。 也就是只需要掌握時間、位置、與動作三種資訊。





舉例:

我們若用微電腦Pin 腳(39)點亮一顆紅色LED,我們要做下列規劃:

硬體規劃

我們要把LED LED 限流電阻接到微電腦Pin 腳(39) 上。

程式規劃

當Pin 腳(39)的狀態為’1 ’(HIGH)時LED點亮(注意LED 短腳接在電源負極)。

當Pin 腳(39)的狀態為’0 ’(LOW)時LED熄滅。

這種情況我們稱為高準位動作(active high)。

由以上可知,若要用微電腦控制接在Pin 腳(39)的LED燈時,我們要做以下動作:

  1. 我們將Pin 腳(39)設定為輸出模式,輸出模式可以讓Pin 腳推動LED。 
  2. Pin 腳(39)的輸出狀態設定為低電位狀態(LOW),可讓LED 熄滅。 
  3. 當需要點亮LED 時(如下圖的t1 ~ t3),則將Pin 腳(39)的輸出狀態設定為高電位狀態(HIGH)。 
  4. 當需要熄滅LED 時(如下圖的t3 ~ t4),則將Pin 腳(39)的輸出狀態設定為低電位狀態(LOW)。





上面 1~4 項我們稱為演算法,若是用圖表來表示則稱為流程圖。另外,用來表示Pin 腳狀態的圖表我們稱為時序圖

下面用我家小妹妹(12歲)做為例子,讓我們看她是如何開啟這扇大門。


想要快速進入微電腦的世界有幾個步驟


步驟1:挑選微電腦

在眾多微電腦,我們需要挑出一款入門容易,資源豐富的微電腦。這裡我們挑選ATMEG328P這個微電腦。ATMEG328P具有入門容易,程式資源豐富的優點。除了原廠資源可以使用之外,還可以搭配Arduino的資源來使用。






步驟2:挑選程式語言與程式編譯器


程式語言我們使用C/C++語法,不使用拉線式拼圖式的程式語言。理由是直接學最基礎的C/C++語法,以後跨平台學習將會容易許多,而且對初學者來說,能直接學習最重要的基礎語言,才是王道。

另外,ATMEG328P可以使用的編譯器有三種

(a) Atmel Studio (原廠提供)

(b) Visual Studio 

(c) Arduino IDE

三種編譯器各有特色,都可以使用C/C++語法,我們不在這裡爭論它們的優劣長短,因為它們只是一種讓我們使用的工具,我們只要針對自身條件,挑選適合的編譯器即可。

為了降低初學者的障礙,我們先採用Arduino IDE 這個編譯器。它有快速上手的優點。可以將初學者的學習障礙降到最低,而且有豐富的程式庫與外接硬體。讓初學者可以在短時間內打造出自己的裝置。但是,當學習到一定程度時(程式變複雜),Arduino IDE 的缺點會浮現出來,例如除錯困難…等等。到時候再更換編譯器即可。

當編譯器與微電腦主控板選定後,我們需要將相關軟體安裝到個人電腦上。





步驟3:加強電子零件基礎知識與除錯技巧

這次實驗需要用到開關導線電阻發光二極體麵包板。實驗前先對小妹妹講解這些零件使用方法。讓小妹妹自己將這些電子零件插到麵包板上。動作完成後,幫她檢查是否有接線錯誤的情形,發現接線錯誤時,將錯誤原因點出來,讓她自己修正過來。









步驟4:上機練習寫程式


初次使用與設定微電腦,通常要一邊參考微電腦的資料手冊和原廠提供的程式庫才能快速上手。小妹妹年紀太小,現在就做這些動作,恐怕讓她覺得枯躁無味。所以我們挑選Arduino IDE 這個編譯器,因為Arduino已經將這些設定包裝成副程式,我們只要按照使用規則,呼叫這些副程式即可,等到小妹妹熟悉後,在回頭講解基礎設定,如此,就可讓初學者在做中學、學中做,容易入門。

這次實驗我們會用到的副程式,分述如下:

pinMode(pin,mode)
pin:填入Pin腳編號

mode:填入Pin腳工作模式。工作模式有OUTPUT 、INPUT 與INPUT_PULLUP三種選擇

例如:

pinMode(10, OUTPUT); //將Pin 腳 10 設定成 輸出模式,也就是會將信號送出來的Pin腳。

pinMode(10, INPUT); //將Pin 腳 10 設定成 輸入模式,也就是接收外部信號的Pin腳。

pinMode(10, INPUT_PULLUP); //將Pin 腳 10 設定成 輸入模式+內部提升電阻。


digitalWrite(pin,value)

pin:填入Pin腳編號

value:填入想要的狀態HIGH or LOW


例如:

digitalWrite(10, HIGH); //將Pin 腳 10 設定成 HIGH 準位,也就是狀態1。

digitalWrite(10, LOW); //將Pin 腳 10 設定成 LOW 準位,也就是狀態0。


digitalRead(pin)

pin:填入Pin腳編號

例如:

digitalRead(10); //讀取Pin 腳 10 狀態(HIGH 或LOW 準位)。


delay(ms)

ms:延遲時間數目,資料型態為長整數(unsigned long),長度為32 bits 。

例如:

delay(1000); //延遲1秒。

跟小妹妹講解副程式使用規則後,我們訂下這次實驗題目

『點亮一顆LED 燈,並讓LED閃爍』