物联网  >   传感器  >  正文

自制传感器教具

  最近几年,创客运动开展的轰轰烈烈。甚至是小学生,都开始利用开源硬件、3D打印和激光切割制作创意作品。

  作为一名实验学科的教师,学习一些简单的硬件和软件知识,利用创客常用的工具制作一些教具,我觉得是新时代教师必备的一项技能。跟着本教程,你可以学会利用开源硬件和传感器模块制作中学物理中常见的一些DIS实验,甚至开发一些有创意的自制教具。(本人是一名高中物理教师,从2008年开始断断续续的学了10年,做了很多作品,获得过连续两次自制教具省一等奖(不出意外今年应该也会是一等奖),连续三次全国青少年科技创新大赛辅导员作品一等奖,写过一本Arduino的入门教程,如下:

  

 

  所有这些所必须的知识我都会总结后写在这个教程里,只望有越来越多的老师加入到这个团队中来)

  点灯

  学习编程时经常用的第一个例子是"Hello World!"在学习硬件的时候的第一个例子,则是点灯!所以我们一起来点亮第一盏灯吧!

  首先来认识一下点灯的工具,Arduino!

  

 

  上图是Arduino UNO,这是开发时常用的一种板,上面有很多插孔,可以用杜邦线连接,如果你需要用到更多的端口,你可以使用Arduino mega 2560 :

  

 

  当然如果你做的东西比较小,也可以选用下图的Arduino Nano:

  

 

  当然还有很多其他型号的Arduino,不过它们除了长相不一样外,使用起来几乎都一样。

  在正式点灯前,我们先来了解一下Arduino上的各个端口以及基本的介绍:

  

 

  l 电源:

  Arduino UNO可以通过3种方式供电,而且能自动选择供电方式

  1、外部直流电源通过电源插座供电。

  2、电池连接电源连接器的GND和VIN引脚。

  3、USB接口直接供电。

  l 电路板引脚说明

  VIN:当外部直流电源接入电源插座时,可以通过VIN向外部供电;也可以通过此引脚向UNO直接供电;VIN有电时将忽略从USB或者其他引脚接入的电源。

  5V:通过稳压器或USB产生的5V电压,为UNO上的5V芯片供电,也可以给外接的元件供电。

  3.3V:通过稳压器产生的3.3V电压,最大驱动电流50mA。

  GND:接地脚,相当于电源的负极。

  TWI接口(SDA A4和SCL A5):通信接口(兼容I2C总线)。

  AREF:模拟输入信号的参考电压。

  Reset:信号为低时重启电路板。

  l 输入输出:

  14路数字输入输出口:工作电压为5V,每一路能输出和接入最大电流为40mA。每一路配置了20-50K欧姆内部上拉电阻(默认不连接)。

  除此之外,有些引脚有特定的功能:

  1、串口信号RX(0号)、TX(1号): 与内部 ATmega8U2USB-to-TTL 芯片相连,提供TTL电压水平的串口接收信号。

  2、外部中断(2号和3号):触发中断引脚,可设成上升沿、下降沿或同时触发。

  3、脉冲宽度调制PWM(3、5、6、9、10 、11):提供6路8位PWM输出。

  4、SPI(10(SS),11(MOSI),12(MISO),13(SCK)):SPI通信接口。

  5、LED(13号):Arduino专门用于测试LED的保留接口,输出为高时点亮LED,反之输出为低时LED熄灭。

  6、6路模拟输入A0到A5:每一路具有10位的分辨率(即输入有1024个不同值),默认输入信号范围为0到5V,可以通过AREF调整输入上限。除此之外,有些引脚有特定功能。

  上述对Arduino端口的描述可能过于专业,不过没有关系,在之后的课程中你会逐渐理解。

  认识了点灯的工具,现在来认识一下灯:

  

 

  电流从Led灯的正极流入,负极流出,Led灯就会发光。

  下面我们用Arduino来点亮一盏Led灯。Arduino板上的“5V”端口可以给外部元件提供5V的电压,所以将Led灯的正极接在Arduino的“5V”端口,Led灯的负极接在Arduino的“GND”端口,理论上讲,这时Led灯就应该会发光了。不过这里建议不要这样做,因为如果这样做了,这个Led灯在亮一下后就再也不会亮了,同时还会伴随着一阵塑料烧焦的臭味。那是因为Led灯上面允许流过的电流有限,一般Led灯上允许流过的最大电流为20mA,当Led灯两端电压为5V时,上面的电流会超过20mA,这时Led灯就会烧毁了。所以这时我们需要给Led灯串联一个电阻,来减小流过Led灯的电流。下图为常用的碳膜电阻,上面的色条表示了这个电阻的阻值(大家大学时应该都学过吧:))。

  

 

  如果直接在5V和GND间接一个250欧姆的电阻,这个电阻上流过的电流为它两端的电压除以电阻阻值等于20mA,由于Led灯本身也有电阻,所以一般给Led灯串联一个220欧姆的电阻再接到5V和GND两端就可以使Led灯正常发光。可是该如何连接Led灯和电阻呢?答案是用面包板!

 

  为了能够方便的接线,可以使用面包板。如上图,面包板上下两的“-”和“+”整排都是连在一起的,中间的每一个竖排5个孔也是连在一起的。如果要连接Led灯和电阻,只需要将Led灯的一端和电阻的一端插在同一个竖排的5个孔中就可以了,所以用Arduino上的“5V”点亮Led灯的电路如下:

  

 

  

 

  现在,你可以用USB线把Arduino和电脑连接起来了。灯亮了!不过,这只是把Arduino当作 了一个电源而已,不是我们想要的点灯方式,下面,我们来用程序来点亮或许是你人生中的第一盏灯吧!(当年,好像是2008年,我从淘宝上买来了Arduino,用程序点亮了第一盏灯时,激动了很久......有点幼稚啊,呵呵)

  下面我们来认识一下用来给Arduino写程序的软件。

  给Arduino写入程序需要使用Arduino ide软件(可以从www.arduino.cc下载),通过类C语言来编写,界面如下:

  

 

  很多老师看到这里估计就会打退堂鼓,C语言,大学时或许学过,不过老早忘记了,记忆中应该是挺难的......不过放心,如果真这么难创客运动也就不会那么红火了!看看小学生都能玩的很溜,你完全可以相信自己!

  随着Arduino的流行,这种直接编写代码的方式使零基础的初学者感到了困难,所以有爱好者还有一些教育机构开发了很多图形化的编程软件。Mixly是北京师范大学教育学部创客教育实验室开发的,是给Arduino写入程序的图形化编程软件,它适合刚接触Arduino和编程的入门学习者。当然,本教程也使用它来给Arduino写程序,Mixly软件可以在Mixly官方网站下载,下载并解压后,可以得到以下一些文件:

  

 

  其中Arduino-1.7-1.0文件夹内的就是Arduino ide软件。双击Mixly.vbs文件打开Mixly软件:

  

 

  Mixly分为5个区域,分别是程序模块区域、图形化编程区域、源代码显示区域(平时缩在右边界,点击箭头会显示出来)、菜单栏和信息显示区域。

  Mixly在正常情况下,只能使用图形化编成区域来编写程序,源代码显示区域是没法修改的。当然,你可以点击图形化编程区域上端的“代码”进入到代码编写模式

  

 

  在代码编写模式下,你可以修改和编写代码,不过这里编写好代码后,图形化编程区域根本不会显示,所以除非你全部想使用代码来编写,不然还是建议不要直接修改代码。

  介绍完了软件,现在得开始安装Arduino 的驱动了。

  将Arduino和电脑用USB线连接,如果你是第一次连接,电脑端会自动搜索驱动,你可以跳过驱动搜索,页面的右下角会显示:

  

 

  接下去右键点击计算机桌面上的“计算机”图标,然后单击“属性”选项,会打开“系统”页面,在页面的左侧单击“设备管理器”

  

 

  这时你会发现在“其他设备”里会有一个“未知设备”,右键单击未知设备,在出现的菜单中选择“更新驱动程序”

  

 

  在之后的页面中选择“浏览计算机以查找驱动程序软件”

  

 

  单击“在以下位置搜索驱动程序软件”下的“浏览”按钮,找到你所下载的mixly文件夹内的arduino-1.7…文件夹内的drivers文件夹,然后单击确定:

  

 

  然后计算机会开始安装Arduino的驱动程序,安装好后,同样进入设备管理器,现在可以在“端口(COM和LPT)”下找到Arduino UNO,记住它的COM端口号,例如图中Arduino UNO的端口号为COM9(你的COM号可不一定是9哦,往往是3或4之类的)。

  

 

  如果你用的是山寨的Arduino,它所用的USB芯片可能不同,那么你自己向厂商所要驱动程序,安装过程和上面相同。不过最后端口里出现的不一定会有Arduino的名字,也可能是我下面这样的(USB-SERIAL...),不过没关系,记住这个端口号。

  

 

  此时Arduino的驱动程序被成功的安装上了。这里需要注意的是:如果你的电脑安装的是精简版的WIN系统,有可能会出现驱动无法安装,这时就需要根据出现的提示,去寻找相应缺少的系统文件并复制到相应位置。

  安装好Arduino的驱动后,打开mixly软件。点击mixly中间菜单栏中的Arduino选择栏,选择你所使用的Arduino板的类型,这里选择Arduino UNO(如果你用的是Nano,就选Arduino Nano(atmega328))。

  

 

  在旁边的COM端口号选择栏中选择刚才你所记住的Arduino的COM端口号,这里选择COM9(你选自己记住的端口号,不要跟我一样)。

  

 

  终于...终于可以开始写程序了,有点累啊......不过先苦后甜,只要装了一次,以后不用再装驱动了!

  现在,终于可以开始用程序来点亮我们的第一盏灯了!

  虽然上面用Arduino点亮了一盏Led灯,但是这里的Arduino仅仅充当了一个电源的作用。下面,开始来写我们的第一段程序吧!

  首先改变一下上面的电路,将原来接到“5V”端的线连接到数字端口13上:

  

 

  

 

  打开mixly,点击“模块”中的“输入输出”,然后在右侧会出现一排程序图标

  

 

  用鼠标左键点住第二个图标,“数字输出 管教......”并把它拖进编程区域,并点击管脚号选择13号管脚,

  

 

  这样,我们的第一个程序就编完了,很简单吧?接下去只要点击菜单栏中的上传按钮,就可以将这个程序烧入Arduino。

  

 

  在烧录时,信息显示区域会提示此刻的进度,直到出现“上传成功!”

  

现在,再回过来观察面包板上的Led灯,是不是已经亮了呢!

 

  为什么会亮呢?下面来看看这句程序:

  

 

  数字管脚13设为高,实现了将Arduino上的数字管脚13设定为输出管脚,并将它设置为高电平(即5V),这样Led灯就接在了5V和GND之间,所以发光了。

  现在再改一下程序,如下(绿色的延时在“控制”栏内):

  

 

  写完程序后,再次烧录到Arduino里,你就会发现LED灯开始闪烁起来了!

  通过上边的教程,相信你已经学会了制作最简单的传感器教具;肯定也发现了原来自己动手做一个传感器教具并完成一个DIS实验也并非难事。那么在下边的内容,我们将给传感器加上一个强大的功能,有了这个功能,或许可以诞生更有创意的DIS实验设计!下面我们一起来给传感器插上无线的翅膀!

  传感器教具的翅膀:串口

  在上边的内容中,Arduino和电脑之间是通过连接他们的数据线进行通信的,他们通信的方式为串口通信。什么是串口通信呢?百度一下:

  串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。串口按位(bit)发送和接收字节。串口可以在使用一根线发送数据的同时用另一根线接收数据。

  ......更多的知识请自行百度,不过可能大多数非专业的老师会看不懂,不过没关系,我们只要知道个大概就可以了,一般情况下,串口有三根线,一根发送数据,一根接受数据,另外一根为地线。为什么要地线呢,因为信号的传输说白了就是电压随时间变化的一个波形,那么一根线怎么传输一个变化的电压呢?电压其实是电势差,也就是要有电压必须要两个点,它们的电势差就是电压,所以要传输信号必须要两根线,发送两根,接受两根,然后共用一个地线,这样串口就需要三根线了!不过如果你要通信的两个设备本身就是共地的话,那么两根线就可以进行串口通信了。其实Arduino和Arduino之间也可以通过串口进行通信的,不过要注意两个Arduino要共地,也就是GND要连接在一起,或者他们由同一个电源供电。

  说了那么多,Arduino上进行串口通信的端口在哪里呢!看图:

  右上角数字输入输出端口的0,1端口旁写着RX,TX。这就是Arduino进行串口通信的端口了,RX为数据接收端口,TX为数据发送端口。

  你可能会问,我们不是通过USB线和电脑连接的么?和这两个串口通信端口什么关系啊?其实对于Arduino UNO或者Arduino Nano来说,只有一个串口通信,当你用USB线和电脑进行串口通信时,RX和TX端口就不可以用了,因为他们是同一个通信口,由于Arduino也是通过USB线来写入程序的,所以当Arduino在写入程序时,RX和TX口不可以被占用哦,不然会导致程序无法写入的!

  无线通信模块

  知道了Arduino和外界通信的方式后(其实还有其他的通信方式,例如SPI等等,只不过串口是比较简单的一种),我们再来了解一下无线通信模块。

  现有的无线通信方式大概有以下几种:蓝牙、Zigbee、WIFI、无线电......

  每种无线通信都有各自的优缺点,例如蓝牙,连接简单,之前的只能1对1,最新的可以多个模块间互联,但是比较麻烦;Zigbee,功耗低,多个模块互联简单......无线电,距离远,但是通信速率低。

  在传感器实验中,传感器与接收器一般距离不会超过10m,所以蓝牙和Zigbee是比较合适的选择。虽然蓝牙无线和zigbee本身不简单,但是现在有很多现成的蓝牙串口模块或者zigbee串口模块,我们可以像使用串口一样使用它们,这样不用修改任何程序就可以实现无线通信了,下面开始进入正式的制作。

  蓝牙串口模块

  这里我选择了蓝牙无线串口模块——HC-05主从一体模块

蓝牙无线串口模块

  可以看到蓝牙串口模块总共由六个端口,+5V、GND是供电端口,TX、RX就是串口了,还有STATE是状态显示端口,可以输出蓝牙连接状态;EN端为使能端口,在设置蓝牙模块使使用。

  在使用蓝牙模块之前,必须要使用电脑对蓝牙模块进行设置,这时我们还需要一个USB转串口模块:

USB转串口模块

  下面开始连接USB转串口模块和蓝牙串口模块,只需要连接4个端口,5V连5V,GND连GND;不过请注意,RX和TX要交换着连,既USB转串口模块的RX连蓝牙串口模块的TX,USB转串口模块的TX连蓝牙串口模块的RX。

  连接好后先别忙着插入电脑,在蓝牙串口模块上有一个黑色的小按钮,在插入电脑前先按住这个按钮,然后再将USB转串口模块的USB头插入电脑,之后再松开按钮,这样蓝牙串口模块就会进入设置模式。下面来学习一下蓝牙串口模块的设置。不过首先得安装上USB转串口模块的驱动,驱动可以在百度里自行搜索,也可以用我提供的:

  https://pan.baidu.com/s/1RR-WcF4g5YgY4TJdahC6Zw 密码:nq7n

  不过有很多不同的USB转串口模块,他们的驱动也不同,具体需要根据你购买的模块来安装。

  驱动安装好后,同样你可以在设备管理器的“端口”里找到它,并请记住它对应的COM口号。下面打开Mixly软件,然后选择USB转串口模块对应的COM号,打开串口监视器,将波特率设为“38400”,然后输入“at”并发送,如果看到接收到了“OK”说明可以开始进行蓝牙模块的设置了。

  首先来设置蓝牙的“主从”,如果要进行蓝牙无线连接,必须要一对蓝牙模块,一个设置为主模块,另一个设置为从模块。

  输入:“at+role?" 如果收到1说明是主模块,0是从模块。

  输入:”at+role=1“ 将模块设置为主模块,”at+role=0"设置为从模块。

  接下去来设置蓝牙模块的密码,如果两块蓝牙模块密码相同,通电后它们就会自己连接上。

  输入:“at+pswd?”会收到此时蓝牙模块的密码。

  输入:“at+pswd=1111" 会将蓝牙模块的密码设置为”1111“。

  注意一对蓝牙模块要设置成相同的密码,而且这个密码要与别的蓝牙模块密码不同(如果还有其他蓝牙模块同时使用的话)。

  下面还可以设置波特率,不过一般初始化的波特率都为”9600“,这里可以保持不变,不用设置了。

  如果要设置,波特率的设置方式为

  输入”at+uart?”查询此时的波特率

  输入“at+uart=9600,0,0"设置波特率9600,1位停止位,无校验。

  根据上述操作,设置好两块一样密码的蓝牙串口模块,一块主一块从。然后一块仍旧连接USB转串口模块插在电脑上,另外一块连接到Arduino上,连接方式与连接USB串口模块时相同,蓝牙串口模块的5V连接Arduino的5V,GND连接GND,TX和RX要交换接。

  蓝牙无线传感器

蓝牙无线传感器

  如果你使用我设计的外壳的话,可以向上图那样连接安装,将传感器变成了无线传感器后,还需要给传感器加一个电池,并安装一个开关。

  安装好后打开传感器的电源,同时另一个蓝牙串口模块连接USB串口模块并插在电脑上,当两个蓝牙串口模块都通电后,可以看到蓝牙模块上的指示灯会由快速的闪烁变成了慢闪,说明它们自动连接上了。这时Arduino通过串口发送的数据会经过蓝牙串口模块无线的发送出去,并由连接在电脑上的蓝牙串口模块接收。关于数据的查看仍旧在Mixly的串口监视器(COM口要设置成USB串口模块的COM号)内查看(注意设置好蓝牙模块后要把串口监视器的波特率重新设回9600哦),所有的操作和上一篇一样,只是我们的传感器没有了数据线的约束!

  无线DIS实验

  有了无线超声波测距仪,我们就可以设计一些有线的传感器所无法做的实验了,例如我用它来进行简谐运动的位移时间图像绘制:

无线DIS实验

  让无线传感器作为弹簧振子进行振动,由于超声波测距头对着平整的地面,所以测得的距离其实就是传感器离地的位移,和上一篇一样采集到数据并处理,下图是我所得到的数据和图像:

  这一篇到这里终于快可以画上句号了,经过本篇你应该能感觉到将传感器变成无线传感器其实并没有那么复杂,无非就是连接两个蓝牙串口模块,这两个蓝牙串口模块好比一根无线的数据线,连接着Arduino和电脑。这种方式的优点是非常方便,只要配对好的两个蓝牙模块一通电,它们就会自动连接上,缺点也很明显,那就是它只能是1对1的(新的蓝牙4.0模块可以实现多对1的方式,后续的教程中会学习多对多的zigbee无线通信)。

      本文转载自微信公众号:MakeMaker_DIS

上一篇:传感器的分类介绍

下一篇:测量土壤湿度传感器的模拟值