查看: 3379|回复: 0

Stduino零基础入门课程(七)实验五:模拟信号输入输出

[复制链接]

53

主题

55

帖子

431

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
431
发表于 2020-9-1 21:19:50 | 显示全部楼层 |阅读模式
Hello!大家好!相信大家在学习过之前的几个试验后呢,对Stduino的工作方式有了基本认识:接收来自外部的信息,我们称作输入;或者向外部发出信息,我们称作输出。而这些都是通过设置管脚的模式来完成的。
零基础课-07-01.png
我们仔细观察可以发现,这些信号(不管是输入的还是输出的)都是以电压的形式表现。信号有两种状态,LOW表示低电压(也可以用0代替),HIGH表示高电压(也可以用1代替)。利用01就可以组合成非常复杂的信息,像这样的信息我们称它为数字(digital)信号。
但是新的问题来啦。自然状态并不总是01,可能有0.50.60.7,也可能有0.1666666等等,等等。总之,自然的信息可能是连续变化的,那么我们的Stduino UNO该怎么去处理这些连续变化的信号呢?
在这之前,我们先介绍一种可以提供连续变化信号的电子元件——电位器。

我们先来看看一个电位器长什么模样:
零基础课程07-08.jpg
就像你现在看到的一样,一个电位器有三个引脚。同时上面还有一个可以转动的转轴,通过转动转轴就可以输出变化的电压信号了,我们来看看原理是怎么样的。

这是电位器的内部原理图。它上下两个引脚中间其实接了一个弧形的电阻:
零基础课-07-02.png
中间的引脚与旋轴连接在一起,而旋轴本身带有一个金属,搭在弧形电阻上。那么,当旋转旋轴的时候,金属也跟着旋转。
零基础课-07-03.png
接下来,让我们看看这些引脚怎么和Stduino UNO连接。
首先,我们需要把上下两部分分别接上Stduino UNO5VGND引脚。之前已经分析过,GND到电阻一端的电路都是同样的电位,即0V。同时5V到电阻一端的电路都是同样的电位,即5V。电位在经过电阻的时候由5V降到0V
零基础课-07-04.png
其实,电阻上一段的电压也不是从5V突然跳转到0V,电位是均匀的降低的,因此,电阻上的电位是这样分布的:
零基础课-07-05.png
我们来看看与中间引脚连接的金属。当旋轴旋转的时候,那么金属与弧形电阻不同的位置相接触,这也意味着,中间的引脚会捕获到不同的电压信号。其实,中间引脚就相当于一个电压检测器,用来获得不同的电压值。我们把中间的引脚接上Stduino UNO,就可以捕捉到此时电位器的电压了。
那么我们该与Stduino UNO上的哪一个管脚相连呢?
之前我们利用编号D开头的管脚检测电压,只能检测高低电平两种状态。实际上D对应的单词就是digital——数字,这些管脚只能检测数字信号。对于连续变化的电压信号,需要用A开头的管脚。A对应的单词为Analog——模拟。这些管脚能够检测连续变化的电压信号。因此,我们这些模拟量管脚来充当电位器中间引脚的检测装置。(这里我们以A1作为检测管脚)
零基础课-07-06.png
接下里,我们利用串口通信来打印我们接收到的信息吧。
首先第一步,我们需要读取A1管脚,获得来自电位器引脚的电压信号,第二步把这个值利用串口打印出来。
在之前的教程中,我们都是利用digitalRead(pin)这个方法来获取管脚的信号。但是这个方法只能读取数字信号。因此,为了获得模拟信号,我们利用analogRead(pin)方法来获取。
代码如下:
  1. #include <Arduino.h>
  2. int sensor=A1;//电位器接入A1管脚
  3. int value=0;//储存读取到的模拟信号

  4. void setup(){
  5.     pinMode(sensor,INPUT);//将电压检测管脚设置为输入模式
  6.     Serial.begin(9600);
  7. }

  8. void loop()
  9. {
  10.     value=analogRead(sensor);//读取电压检测管脚值,并储存到value变量中
  11.     Serial.print("当前读取值为: ");
  12.     Serial.println(value);
  13.     delay(100);
  14. }
复制代码

将代码下载到Stduino UNO,我们现在打开串口监视器,看看输出了什么?
你会发现,当我们旋转电位器旋轴的时候,串口监视器打印的数字也跟着发生变化,有没有?现在你就学会了捕捉模拟信号了。
电压信号应该是在0~5V之间,但是,如果你再看看,你会发现这些值并不是05,最小是0,但是最大却到了一千多!我们看看,最大其实可以到1023。实际上呢,电压信号05V被装换成了0~1023以共1024个数。
如果你学过比例的算法,我们可以很容易的得到:
0V0
1.25V256
2.5V512
3.75V768
5V1023
……
如果你想直接得到管脚检测到的实际电压值呢,我们只需要自己计算就可以:
  1. float volt=0.00;
  2. volt= (float)value/1024.00*5.00;
复制代码
我们想要得到电压值,最好可以保留到小数点后两位,因此我们需要一个float类型的变量。如果利用整数进行除法,那么得到的结果会舍去小数部分。例如
  1. int x = 3;
  2. int y = 5;
  3. int z = x / y;//结果为0.6,但z是整数型变量,只保留小数点前的整数

  4. int x = 3;
  5. int y = 5;
  6. float z =(float) x / 2.0;//结果为0.6
复制代码
这样,我们就学会了捕获模拟信号。同样,我们也可以输出模拟信号。

如果有一个LED灯,我们只要把电位器传进来的电压值传给这个LED,就可以利用电位器去控制LED两端的电压,从而控制LED的亮度了!这个被输出的电压信号,同样是连续变化的值,因此我们需要利用特定的引脚来输出这种模拟信号。

我们已经介绍过AD开头的管脚,同学们如果注意观察,你会发现Stduino UNO上面有的管脚编号带有波浪线——“~”。只有这些带有波浪线的管脚才能够输出连续变化的电压值。例如,我们选择D3,利用D3来输出模拟信号。
  1. analogWrite(D3,value);
复制代码
那我们很容易的就能把LED接进电路:
零基础课-07-07.png
但是我们现在还不可以把接收到电位器传来的值直接通过D3输出,这是因为A105V划分成了1024份(0~10231024个阶级),而D3把输出的05V划分成了256份(即0~255256个阶级)。
我们可以利用一个映射方法来转换数据
  1. newData = map( value, 0, 1023, 0, 255);
复制代码

利用map方法,可以把一个0~1023范围内的整数转化成为0~255范围内的整数。这样,我们就把从电位器读到的模拟量(0~1023)转换为了输出给LED的模拟量(0~255)。

那么我们最后的代码就是这样的:
  1. #include <Arduino.h>
  2. int sensor=A1;//电位器接入A1管脚
  3. int LED = D3;//LED灯接入D3
  4. int value=0;//读取电位器的模拟信号
  5. int newData=0;//输出给LED的模拟信号

  6. void setup(){
  7.     pinMode(sensor,INPUT);//将电压检测管脚设置为输入模式
  8.     pinMode(LED,OUTPUT);//将LED连接的管脚设置为输出模式
  9.     Serial.begin(9600);
  10. }

  11. void loop()
  12. {
  13.     value=analogRead(sensor);//读取电压检测管脚值,并储存到value变量中
  14.     //float volt=0.00;
  15.     //volt= (float)value/1024.00*5.00;
  16.     Serial.print("当前读取值为: ");
  17.     Serial.println(value);
  18.    
  19.     newData = map(value,0,1023,0,255);//转换
  20.     analogWrite(LED,newData);//输出给LED
  21.     delay(100);
  22. }
复制代码


下载到Stduino UNO上,看看,是不是现在你可以通过电位器来调整LED的亮度了?
我们用5节实验课的时间,就把Stduino的最关键的内容讲完了。随后的内容即使再复杂,也不过是对这些内容的加强版。
上完这几节课,我们其实可以发现,Stduino UNO其实就是一个处理器,接收外部的模拟信号或者数字信号,并对信号做出一定的处理;或者对信号做出一定处理,并将这些模拟信号或者数字信号传输出去。
零基础课-07-08.png
学过这些课程,你虽然只接触到控制LED或者电位器、按键等等,可能你觉得Stduino 好像有点过于简单。但是那些显得高级的传感器或者电子元件,也不过是利用Stduino UNO的信号输入输出加以控制与处理。
那么在接下来的课程中,我们将利用Stduino UNO的输入输出功能做更多有趣的事情,不如接着看看,我们可以用这些东西做什么好玩的?



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

Stduino 零基础入门课程系列(五) 实验三:按键输入
Stduino 零基础入门课程系
Hello!各位同学大家好~上节课我们利用管脚输出高低电平信号,控制LED的亮灭,那么我
Stduino小白练习第六弹--按键控制串口通信
Stduino小白练习第六弹--
2020/01/08 星期三 作者:Astilbe 问题:我们如何通过按下按键来传输固定的信息给PC呢
37种传感器(二十九)MPU6050陀螺仪模块+Stduino Nano&UNO
37种传感器(二十九)MPU6
StduinoUno /纳米37种传感器(二十九)六轴 MPU陀螺仪模块关键词: 51 ; stm32 ; ar
stm32 最小系统 小蓝板 LED闪烁灯(三),无需刷Bootloader
stm32 最小系统 小蓝板 LE
关键词:stm32 小蓝板 STM32F103C8T6 Stduino IDE Stduino Nano LED闪烁灯 通过Stduin
Stduino IDE软件下载专区
Stduino IDE软件下载专区
Stduino IDE软件下载专区 Windows版:7月29号发布1.01, 现可
今天在文涛老大的帮助下我的stm32zet6终于把simlpefoc库跑起...
今天在文涛老大的帮助下我
[md]首先本身是刚刚从MDK转到arduino过来的新人,只因为要完开源的simplefoc,期间由
连接ADS1292模拟前端芯片,使用SPI库,导致串口不输出数据
连接ADS1292模拟前端芯片
[md]连接ADS1292模拟前端芯片,使用SPI库,导致串口不输出数据 ![QSJSBEZF83I8C907%$
©2001-2018  Stduino官网  Powered by©Discuz!   ( 皖ICP备17011998号 )
快速回复 返回顶部 返回列表