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

与Arduino的差异

在这个范例里,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。