Arduino基本元器件
# 电学基础
# 电学单位
电压(V) :电压是电路中两点之间的电势差,单位为伏特(V)。它表示推动电流流动的力量,类似于水压。
串联电路电源电压等于各部分用电器两端的电压之和。
并联电路电压相等,因为各支路相当于都直接与电源相连,没有电势差。
电流(I):电流是电荷在导体中的流动,单位为安培(A)。电流的大小取决于电压和电阻。
串联电路的电流处处相等。
并联电路中,各支路的电阻不同其电流也会不同,干路中电流等于各支路的电流之和。
电阻(R) :电阻是材料对电流流动的阻碍作用,单位为欧姆(Ω)。电阻的大小取决于材料的性质、长度和横截面积。
# 电路状态
通路:指电路是连通的。
断路:指电路是断开不连通的。
短路:指电路中形成的接近零电阻的连接。
电流会优先选择阻抗低的电路流动,当某条电路的电阻为零时,电流就会大量流向这条路径,最终导致短路发生。
另外短路的发生不仅取决于电阻是否绝对为零,还与电阻的相对大小有关,只要某条支路的电阻显著低于其他路径,也会形成短路。
根据欧姆定律,当某条路径的电阻R接近零时,电压U也会接近于零,电流I会异常增大,其他电路路径只会有非常微量的电流经过。
# 欧姆定律
欧姆定律描述了电压、电流和电阻之间的关系。
公式为:I=V/R
或 R=V/I
或 V=I*R
# 面包板
# 介绍
面包板是一种专为电子电路的无焊接实验设计制造的工具,面包板上面有很多小孔,这些小孔允许电子元器件根据需要随意插入或拔出,免去了焊接,节省了电路的组装时间,而且元件可以重复使用,非常适合电子电路的组装、调试和训练。
面包板名称的来历可以追溯到真空管电路的年代,当时人们通常通过螺丝和钉子将电路元器件固定在一块切面包用的木板上进行连接,后来随着技术发展,无需焊接的插接板变得普及,面包板就成了这种便捷电路原型实验产品的统称。
# 使用
面包板插孔的内部是根据横向或竖向,使用金属板连通的。
面包板的两侧部分叫窄条,用于横向相连,纵向则不相通。
面包板的中间部分叫宽条,用于纵向相连,横向则不相通。
中间宽条纵向每五个孔为一组,使用同一金属板相通,例如:A1到E1是相连的。
两侧窄条横向每五组孔(25个孔)为一组使用同一金属板相通,例如:+0到+25是相通的。
注意:电源正负极接同一组,也就是同一金属板,会直接导致短路。大部分电流会直接通过金属条流动,导致LED因为未形成有效回路而无法点亮。


# 电阻器
电阻器用于用于给电路增加电阻,以控制电路中的电流和电压。
# 限流电阻
在一条电路中我们除了连接电子元件外,还应该连接用于限流的电阻。如果我们不通过电阻对电路进行限流,那么通电后整条电路的电流就会非常大,最终可能导致电子元器件或者电源被烧坏。
例如LED灯应用限流电阻:

引脚电压为5V,LED电流为20mA,LED压降为2V。
因此电阻的电压降为:5V - 2V = 3V。
根据欧姆定律得出需要的电阻为:R = V/I = 3/0.02 = 150Ω。
电阻器的电阻值可以通过环色判断。
# 上拉电阻
上拉电阻是根据电阻在电路中的作用划分的,用于将引脚上拉到高电平状态的电阻就是上拉电阻。
我们一般使用10k欧姆的电阻作为下拉电阻。
# 下拉电阻
下拉电阻和上拉电阻正好相反,用于将引脚下拉到高电平状态的电阻就是上拉电阻。
# 引脚悬空
如果引脚设为INPUT以后没有外接任何电路,会处于引脚悬空的状态,此时我们读到的该引脚的高低电平状态将会非常随机。
# LED
# 介绍
LED是发光二极管(Light Emitting Diode)的简称,他一共有正负两级。我们可以通过LED灯的引脚长短来判断正负极,长的是正极,短的是负极。

# 电流特性
LED的电流是有方向的,只允许电流从正极流向负极,当电流足够时,LED灯就会被点亮。
电流从正极流向负极时,LED的电阻约等于0。电流从负极流向正极时,LED的电阻会十分巨大。
LED的图标可以看出,正极向负极的方向是有箭头的表示允许,负极向正极的方向是有墙挡住的表示拒绝。
但在非正常情况下,比如在负极电流非常大的情况下,电阻也是会被击穿的,LED也会被点亮。反之正极电流如果十分微弱,LED也可能无法被点亮。

LED灯的典型工作电流为20mA(0.02A),具体要看LED的基础参数。
# 电压特性
工作时,LED两端的电压会产生电压降,LED灯不同则产生的电压降也不同。一般红色LED灯为2伏特左右,表示需要2伏特左右的电压红色LED灯才能正常工作。

# LED例子
int LEDPin = 5;
int sleepTime = 1000;
void setup() {
pinMode(LEDPin, OUTPUT);
}
void loop() {
digitalWrite(LEDPin, HIGH);
delay(1000);
digitalWrite(LEDPin, LOW);
delay(1000);
}
2
3
4
5
6
7
8
9
10
11
12
13
# 按键开关
# 介绍
按键开关是一种功能性的电子开关,按下开关按钮时会使开关接通,松开时会使开关断开。
# 内部结构
按键开关有四个引脚,松开情况下,不同侧的引脚始终相连,同侧是不相连的,只有在我们按下开关时,同侧的引脚才会相连。
# 开关信号
我们按下或松开开关,电路就会连通或者断开。而Arduino又可以将高低电平,转换成计算机可以读懂的数字信号。所以开关信号也可以说成是数字信号。
我们将Arduino引脚设为INPUT模式时,程序就可以通过该引脚识别开关的数字信号,即HIGH(高电平)、LOW(低电平)两种状态。
# 开关例子
示例选项卡→Basics→DigitalReadSerial,单击创建示例项目即可。
/*
示例:读取引脚2的数字输入,将结果显示在串口监视器中。
*/
// 引脚2用于按键开关,给他取名pushButton。
int pushButton = 2;
void setup() {
// 开始串口通信,每秒传输9600字节数。和串口监视器的波特率相对应,一般9600比较常用。
Serial.begin(9600);
// 设置按键引脚为输入。
pinMode(pushButton, INPUT);
}
void loop() {
// 读取按键引脚状态。
int buttonState = digitalRead(pushButton);
// 发送信息到串口监视器上。
Serial.println(buttonState);
// 延迟1毫秒,以保证程序稳定。
delay(1);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
开关处于松开状态时,引脚2是高电平,5V和引脚2的电路相通,电流的路线是5V -> 电阻 -> 按钮(不同侧相连) -> 引脚2。
开关处于按下状态时,引脚2是低电平,5V和引脚2的电路不相通,电流的路线是5V -> 电阻 -> 按钮(同侧相连) -> 导线 -> GND。
因为引脚2被设置为INPUT模式后,会处于高抗阻状态,此时我们按下按钮后所以电流都从导线走到GND了。


# 数码管
# 介绍
数码管是供我们显示数字使用的,此处我们以1位8段共阴极LED数码管为例进行介绍。
在1位8段共阴极LED数码管中,数码管的意思是显示数字,1位的意思是该数码管能显示1位数字,8段的意思是数码管的数字由8段组成,LED的意思是数字是通过点亮各段中的LED来显示的。


# 共阴极
共阴极的意思是所有LED的负极都公用同一个引脚。
也就是图中所示,数码管中间的两个cc引脚,我们在使用时只需要将其中一个cc负极引脚接到电路即可。
电阻使用200欧姆~500欧姆即可。

# 应用
在使用1位数码管时,最简单的方法就是将数码管的每个引脚接到开发板的数字引脚中去,然后通过输出高低电平来点亮或熄灭LED,以显示数字。
int pushButton = 2;
int oldButtonState = HIGH;
// 定义数码管用到的针脚 a=7,b=8,c=9,d=4,e=3,f=6,g=5
int ledPin[7] = { 7, 8, 9, 4, 3, 6, 5 };
// 定义想要显示的数码需要的组合段编号。
char* ledCombo[16][7] = {
{'0', "789436"},
{'1', "89"},
{'2', "78435"},
{'3', "78945"},
{'4', "8965"},
{'5', "79465"},
{'6', "794365"},
{'7', "7896"},
{'8', "7894365"},
{'9', "789465"},
{'A', "789365"},
{'B', "94365"},
{'C', "435"},
{'D', "89435"},
{'E', "74365"},
{'F', "7365"}
};
// 所有LED针脚设为LOW。
void ledTubeClear() {
for (int i = 0; i < sizeof(ledPin)/sizeof(ledPin[0]); i++) {
digitalWrite(int(ledPin[i]), LOW);
}
}
void ledSetDigital(char digital) {
ledTubeClear();
for (int i = 0; i < sizeof(ledCombo)/sizeof(ledCombo[0]); i++) {
if (ledCombo[i][0] == digital) {
for (int n = 0; ledCombo[i][1][n] != '\0'; n++) {
digitalWrite(ledCombo[i][1][n] - '0', HIGH);
}
break;
}
}
}
void circleAnimation(int times = 1, int delayTime = 150, int mode = 0) {
int circleOrder[10];
if (mode == 0) {
// 圈圈
circleOrder[0] = 7;
circleOrder[1] = 8;
circleOrder[2] = 9;
circleOrder[3] = 4;
circleOrder[4] = 3;
circleOrder[5] = 6;
circleOrder[6] = 255;
} else if (mode == 8) {
// 八字
circleOrder[0] = 7;
circleOrder[1] = 8;
circleOrder[2] = 5;
circleOrder[3] = 3;
circleOrder[4] = 4;
circleOrder[5] = 9;
circleOrder[6] = 5;
circleOrder[7] = 6;
circleOrder[8] = 255;
}
// 转圈顺序由数组的顺序决定,255作为结束标识。
for (int i = times; i > 0; i--) {
for (int n = 0; circleOrder[n] != 255; n++) {
ledTubeClear();
digitalWrite(circleOrder[n], HIGH);
delay(delayTime);
}
ledTubeClear();
}
}
void setup() {
Serial.begin(9600);
// 所有LED针脚设为OUTPUT模式。
for (int i = 0; i < sizeof(ledPin)/sizeof(ledPin[0]); i++) {
pinMode(int(ledPin[i]), OUTPUT);
}
// 按钮针脚设为INPUT_PULLUP模式。
pinMode(pushButton, INPUT_PULLUP);
// 读取引脚A0悬空的随机数作为种子。
randomSeed(analogRead(A0));
circleAnimation(3, 200, 8);
}
void loop() {
int buttonState = digitalRead(pushButton);
// 按下未松开时转圈。
if (!oldButtonState && !buttonState) {
circleAnimation(1, 30);
// 松开按键更新数码管随机数字。
} else if (!oldButtonState && buttonState) {
int randIndex = random(0, sizeof(ledCombo)/sizeof(ledCombo[0]));
ledSetDigital(ledCombo[randIndex][0]);
}
oldButtonState = buttonState;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104

# 电位器
# 介绍
电位器一般作为模拟输入元器件使用,电位器实质上就是滑动变阻器,其核心功能是通过滑动触点改变接入电路的电阻丝长度,从而调整电阻值。
电位器广泛应用于音箱音量开关、功率调节等场景,其功能与滑动变阻器一致,主要用于分压或控制电流。

# 旋钮变阻
电位器可以看做两个串联在一起的电阻, 左边的电阻是1、2引脚之间的电阻。右边的电阻是2、3引脚之间的电阻。
而电位机上标注的电阻值指的是两个电阻之和,即总电阻。

在我们旋转引脚时,R1-2电阻和R2-3电阻会同时发生改变,旋钮向哪变转,哪变的电阻就会减少,但两个电阻之和不会大于标记的电阻值。
例如1000Ω的电位器,在旋钮置于中间位置时,R1-2和R2-3都会是500Ω。我们向左旋转时,R1-2的电阻会减少,R2-3的电阻会增大,扭到顶时,R1-2的阻值会为0Ω,R2-3的阻值会为1000Ω。方向反之也是一样。
在我们改变左右电阻的阻值时,引脚2的电压也会随着我们旋转旋钮而发生变化。
例如我们电源是5V,旋钮处于中间位置,因为是串联电路电流处处相等,所以欧姆定律要计算总电阻,根据欧姆定律I=V/R,得出电流为5V/1000Ω=0.002A。然后我们根据V=I*R,计算出引脚2号位置的电压为0.002A*500Ω=2.5V。
# 应用

通过电位机控制LED的亮度。
void setup() {
Serial.begin(9600);
}
void loop() {
int analogInputVal = analogRead(A0);
// 等比映射函数,会将analogInputVal的值,以0~1023范围等比映射到0~255范围。
int brightness = map(analogInputVal, 0, 1023, 0, 255);
Serial.print(analogInputVal);
Serial.print(" = ");
Serial.println(brightness);
analogWrite(3, brightness);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16