Ameba Arduino: [RTL8710] GPIO – 使用按鈕開關讓LED燈泡閃爍

GPIO介紹

  • GPIO (General Purpose Input/Output),我們可以用來控制一條線的訊號,可分為輸入或輸出。輸入的情況裡,GPIO會根據外面進來的電壓來決定讀到的值是0或是1。
    輸出的情況裡,如果我們設定GPIO為1, 那麼GPIO就會輸出板子的工作電壓,以Ameba為例,會輸出3.3V的電壓。如果我們設定GPIO為0, 那麼會輸出0V的電壓。
材料準備

  • 麵包板 x 1
  • #3 Ameba RTL8710 Board x 1
  • LED燈泡 x 1
  • 1 KΩ 電阻
  • 按鈕
範例說明

在Button這個例子裡, 使用2根GPIO。
其中D2為GPIO輸入,它接在按鈕上面,按鈕另一端接在3V3的地方。
D13則是GPIO輸出,它接到LED燈泡上。當我們按下接在D2的按鈕時,D2的GPIO會讀到1的值,此時我們將D13的輸出設定為1, 並且使接在D13的LED燈泡發亮。
這是Arduino的Button範例說明:
https://www.arduino.cc/en/Tutorial/Button
我們打開Button這個範例,它在 “File” -> “Examples” -> “02.Digital” -> “Button”
1

接著我們將程式碼編譯並上傳至RTL8710。
在接線時,要注意Arduino的工作電壓是5V,所以Arduino的範例說明裡將按鈕接到5V的地方。但是Ameba的工作電壓是3.3V,所以我們將要按鈕接到3V3的地方。
LED燈泡的接線裡,LED比較長的腳為正極,比較短的腳為負極,所以我們要將短腳接到GND的地方(電壓為0),並將長腳接到D13的地方。為了避免LED因為電流太大而燒壞,通常會在正極的前面加上電阻。現在很多LED其實都做的很好,不加電阻也不會燒壞,但保險起見還是加上電阻。


2


執行的情況裡,只要使用者按下按紐,LED燈泡就會亮,放開時則LED燈泡變暗。

程式碼說明

在Setup()裡面,
pinMode決定了GPIO為input或output:
https://www.arduino.cc/en/Reference/PinMode

digitalRead可以從GPIO的輸入裡讀到0或1:
https://www.arduino.cc/en/Reference/DigitalRead
digitalWrite則可以輸出3V3或0到GPIO:
https://www.arduino.cc/en/Reference/DigitalWrite
與Arduion的差異

在這個範例裡,Arduion的官方網站上提到,由於它的GPIO輸入預設是Floating,所以在按鈕按下去之前,它處於 “空接” 的狀態,也就是它什麼都沒接,此時因為什麼都沒接,所以那根GPIO也不會曉得它的輸入是0或者是1,於是它的值會亂飄 (Floating),因此會看到LED燈泡在我們沒按下按鈕,它也有可能會亮。
為了解決這個問題,我們可以根據我們的應用將GPIO輸入設定為下拉(Pull Down)或是上拉(Pull Up),意思是當空接的時候,內部硬體會將GPIO的電壓放在GND或3V3的地方。這種方式稱之為Internal Pull Down/Up。
另一種解決方式,則是加一個很大的電阻(10M)在GPIO上,另一端接到GND或3V3,那麼平時空接的時候,就會有個電壓值供參考。這種方式稱之為Exernal Pull Down/Up
為了避免使用者第一次使用就要檢查這種差異, Ameba在輸入的預設裡是Internal Pull Down。也就是空接的時候,輸入讀到的值是0。