Hello!大家好!相信大家在学习过之前的几个试验后呢,对Stduino的工作方式有了基本认识:接收来自外部的信息,我们称作输入;或者向外部发出信息,我们称作输出。而这些都是通过设置管脚的模式来完成的。 我们仔细观察可以发现,这些信号(不管是输入的还是输出的)都是以电压的形式表现。信号有两种状态,LOW表示低电压(也可以用0代替),HIGH表示高电压(也可以用1代替)。利用0和1就可以组合成非常复杂的信息,像这样的信息我们称它为数字(digital)信号。 但是新的问题来啦。自然状态并不总是0和1,可能有0.5、0.6、0.7,也可能有0.1666666等等,等等。总之,自然的信息可能是连续变化的,那么我们的Stduino UNO该怎么去处理这些连续变化的信号呢? 在这之前,我们先介绍一种可以提供连续变化信号的电子元件——电位器。
我们先来看看一个电位器长什么模样: 就像你现在看到的一样,一个电位器有三个引脚。同时上面还有一个可以转动的转轴,通过转动转轴就可以输出变化的电压信号了,我们来看看原理是怎么样的。
这是电位器的内部原理图。它上下两个引脚中间其实接了一个弧形的电阻: 中间的引脚与旋轴连接在一起,而旋轴本身带有一个金属,搭在弧形电阻上。那么,当旋转旋轴的时候,金属也跟着旋转。 接下来,让我们看看这些引脚怎么和Stduino UNO连接。 首先,我们需要把上下两部分分别接上Stduino UNO的5V和GND引脚。之前已经分析过,GND到电阻一端的电路都是同样的电位,即0V。同时5V到电阻一端的电路都是同样的电位,即5V。电位在经过电阻的时候由5V降到0V。 其实,电阻上一段的电压也不是从5V突然跳转到0V,电位是均匀的降低的,因此,电阻上的电位是这样分布的: 我们来看看与中间引脚连接的金属。当旋轴旋转的时候,那么金属与弧形电阻不同的位置相接触,这也意味着,中间的引脚会捕获到不同的电压信号。其实,中间引脚就相当于一个电压检测器,用来获得不同的电压值。我们把中间的引脚接上Stduino UNO,就可以捕捉到此时电位器的电压了。 那么我们该与Stduino UNO上的哪一个管脚相连呢? 之前我们利用编号D开头的管脚检测电压,只能检测高低电平两种状态。实际上D对应的单词就是digital——数字,这些管脚只能检测数字信号。对于连续变化的电压信号,需要用A开头的管脚。A对应的单词为Analog——模拟。这些管脚能够检测连续变化的电压信号。因此,我们这些模拟量管脚来充当电位器中间引脚的检测装置。(这里我们以A1作为检测管脚) 接下里,我们利用串口通信来打印我们接收到的信息吧。 首先第一步,我们需要读取A1管脚,获得来自电位器引脚的电压信号,第二步把这个值利用串口打印出来。 在之前的教程中,我们都是利用digitalRead(pin)这个方法来获取管脚的信号。但是这个方法只能读取数字信号。因此,为了获得模拟信号,我们利用analogRead(pin)方法来获取。 代码如下: - #include <Arduino.h>
- int sensor=A1;//电位器接入A1管脚
- int value=0;//储存读取到的模拟信号
- void setup(){
- pinMode(sensor,INPUT);//将电压检测管脚设置为输入模式
- Serial.begin(9600);
- }
- void loop()
- {
- value=analogRead(sensor);//读取电压检测管脚值,并储存到value变量中
- Serial.print("当前读取值为: ");
- Serial.println(value);
- delay(100);
- }
复制代码
将代码下载到Stduino UNO,我们现在打开串口监视器,看看输出了什么? 你会发现,当我们旋转电位器旋轴的时候,串口监视器打印的数字也跟着发生变化,有没有?现在你就学会了捕捉模拟信号了。 电压信号应该是在0~5V之间,但是,如果你再看看,你会发现这些值并不是0到5,最小是0,但是最大却到了一千多!我们看看,最大其实可以到1023。实际上呢,电压信号0到5V被装换成了0~1023以共1024个数。 如果你学过比例的算法,我们可以很容易的得到: 0V:0 1.25V:256 2.5V:512 3.75V:768 5V:1023 …… 如果你想直接得到管脚检测到的实际电压值呢,我们只需要自己计算就可以: - float volt=0.00;
- volt= (float)value/1024.00*5.00;
复制代码我们想要得到电压值,最好可以保留到小数点后两位,因此我们需要一个float类型的变量。如果利用整数进行除法,那么得到的结果会舍去小数部分。例如 - int x = 3;
- int y = 5;
- int z = x / y;//结果为0.6,但z是整数型变量,只保留小数点前的整数
-
- int x = 3;
- int y = 5;
- float z =(float) x / 2.0;//结果为0.6
复制代码这样,我们就学会了捕获模拟信号。同样,我们也可以输出模拟信号。
如果有一个LED灯,我们只要把电位器传进来的电压值传给这个LED,就可以利用电位器去控制LED两端的电压,从而控制LED的亮度了!这个被输出的电压信号,同样是连续变化的值,因此我们需要利用特定的引脚来输出这种模拟信号。
我们已经介绍过A和D开头的管脚,同学们如果注意观察,你会发现Stduino UNO上面有的管脚编号带有波浪线——“~”。只有这些带有波浪线的管脚才能够输出连续变化的电压值。例如,我们选择D3,利用D3来输出模拟信号。 那我们很容易的就能把LED接进电路: 但是我们现在还不可以把接收到电位器传来的值直接通过D3输出,这是因为A1把0到5V划分成了1024份(0~1023共1024个阶级),而D3把输出的0到5V划分成了256份(即0~255共256个阶级)。 我们可以利用一个映射方法来转换数据 - newData = map( value, 0, 1023, 0, 255);
复制代码
利用map方法,可以把一个0~1023范围内的整数转化成为0~255范围内的整数。这样,我们就把从电位器读到的模拟量(0~1023)转换为了输出给LED的模拟量(0~255)。
那么我们最后的代码就是这样的: - #include <Arduino.h>
- int sensor=A1;//电位器接入A1管脚
- int LED = D3;//LED灯接入D3
- int value=0;//读取电位器的模拟信号
- int newData=0;//输出给LED的模拟信号
- void setup(){
- pinMode(sensor,INPUT);//将电压检测管脚设置为输入模式
- pinMode(LED,OUTPUT);//将LED连接的管脚设置为输出模式
- Serial.begin(9600);
- }
- void loop()
- {
- value=analogRead(sensor);//读取电压检测管脚值,并储存到value变量中
- //float volt=0.00;
- //volt= (float)value/1024.00*5.00;
- Serial.print("当前读取值为: ");
- Serial.println(value);
-
- newData = map(value,0,1023,0,255);//转换
- analogWrite(LED,newData);//输出给LED
- delay(100);
- }
复制代码
下载到Stduino UNO上,看看,是不是现在你可以通过电位器来调整LED的亮度了? 我们用5节实验课的时间,就把Stduino的最关键的内容讲完了。随后的内容即使再复杂,也不过是对这些内容的加强版。 上完这几节课,我们其实可以发现,Stduino UNO其实就是一个处理器,接收外部的模拟信号或者数字信号,并对信号做出一定的处理;或者对信号做出一定处理,并将这些模拟信号或者数字信号传输出去。 学过这些课程,你虽然只接触到控制LED或者电位器、按键等等,可能你觉得Stduino 好像有点过于简单。但是那些显得高级的传感器或者电子元件,也不过是利用Stduino UNO的信号输入输出加以控制与处理。 那么在接下来的课程中,我们将利用Stduino UNO的输入输出功能做更多有趣的事情,不如接着看看,我们可以用这些东西做什么好玩的?
|