mBlock & Arduino(24)使用 Me 七段显示器模组计分

mBlock & Arduino(24)使用 Me 七段显示器模组计分,第1张

小小云提示:教程作者 caterpillar是来自台湾的programmer,所以在一些专有名词的使用上会和我们这边使用的不太一样啦,不过作者也有标注出英文名称,大家自行转换哟(⁎⁍̴̛ᴗ⁍̴̛⁎)

〈mBlock & Arduino(23)使用 Me 摇杆模组打地鼠〉中的计分显示是透过 Scratch 猫咪来显示,Makeblock 提供七段显示器模组,有四个显示位数,我们试着使用它来作为计分显示:

Me 七段显示器实际上可以透过程式来调整亮度、个别指定数字显示等,不过,这些得在 Arduino IDE 中撰写程式才能控制,在 mBlock 中提供的“设置显示器方块”,只能指定数字显示,若为整数但不足四位,还会自动附上小数点,如果你指定数字 1,那么会显示 1000,如果指定数字 23,那么会显示数字 2300:

没办法指定个别数字的话,在 mBlock 中可发挥的功能就受到些限制,不过,还是可以用程式来作些处理,举例来说,想要制作个时钟的话,可以如下:

简单来说,这个程式会将“小时”与“分钟”处理为小数形式,例如 10 点 20 分的话,就使用小数 1020。

比较麻烦的是小时的部份,如果小时不是两位数的话,例如 9 点 30 分的话,若以小数 930 表示,那七段显示器会显示为 9300,这样子不好看,因此,在这种情况下,我乘上负号,以 -930 表示,显示起来的效果也还不错;为了有读秒的效果,我希望小数点会闪动,这只要乘上 100,也就是将之变为整数就可以了,来看看显示的效果:
接着就来为〈mBlock & Arduino(23)使用 Me 摇杆模组打地鼠〉加上七段显示器,作为计分板之用,在这之前,请将〈mBlock & Arduino(23)使用 Me 摇杆模组打地鼠〉中的摇杆改接至连接埠 7,然后再将七段显示器接至连接埠 6!

为什么?七段显示器不是被标示为蓝色,可以接在连接埠 5 吗?如果你的 mBlock 使用 USB 连接控制板子就不行!

因为连接埠 5 中的脚位是对应 TX、RX,记得〈mBlock & Arduino(21)使用 Me 蓝牙模组〉中的说明吗?预设 TX、RX 是作为 USB 模拟串列埠时使用,因此若使用了 USB 连接板子传送资料,就不能使用这两个脚位,当然,如果使用 Me 蓝芽模组也就不行用连接埠 5 了,连接埠 5 只有在程式烧录至板子,且未使用 Me 蓝芽模组下,才有机会使用了。

这就是为什么我们要将摇杆移至连接埠 7,将连接埠 6 让给七段显示器使用的原因,反正摇杆是标示为灰色,连接埠 7 当然可以使用!

接着只要将〈mBlock & Arduino(23)使用 Me 摇杆模组打地鼠〉的程式中,有“显示”方块的部份,改为七段显示器就可以了,例如“开始前倒数”:
“游戏开始”的部份,改为只显示得分:

其实也可以实作出倒数的部份,方式可彷照上头时钟程式,将得分与倒数处理为小数形式,这个留给你自己试试看啰!

最后,“游戏结束”也改为七段显示器:
接下来,你就可以执行程式了,这就是使用电路模组的好处,对于擅长程式而不擅长电子电路的人来说,可以快速地实现想法,想想看,如果自己接这些线路,会是怎么接呢?有机会也可以试试看,这会是个很好的练习,如果你对电子电路的实现有兴趣的话!

感谢CodeData用户: caterpillar 的贡献 著作权归作者所有
整理:宁波家电物联网云平台,中科极动云

CONTACT US: >小小云提示:教程作者 caterpillar是来自台湾的programmer,所以在一些专有名词的使用上会和我们这边使用的不太一样啦,不过作者也有标注出英文名称,大家自行转换哟(⁎⁍̴̛ᴗ⁍̴̛⁎)

Arduino Uno 板子没有衔接网络模组,是无法进行网络连线的,不过 mBlock 具有网路连接功能,两台电脑分别开启 mBlock,就可以进行网络通信,也就是说,你可以通过网络控制另一头连接的 Arduino,反之亦然。

要使用 mBlock 建立网络连线,两台电脑都必须开启 mBlock,接着在其中一台执行“网络连接/自定义连接”后,输入另一台电脑的 IP:

按下“连接”按钮,如果连线成功的话,两台电脑上的 mBlock 都会呈现“网络连接 已连接”的字样:

记得!一定要按下“连接”按钮,直接按下 Enter 键是不会有反应 … XD

接下来就可以写个简单的通讯啦!例如,在其中一台不断地发送计时器的信息:

而另一台不断接收信息并显示:

按下两个 mBlock 的绿旗,你就会看到另一个 mBlock 接到信息并显示出来:

接下来示范一下,如果通过网络调节 LED 亮度,在两台电脑上分别连接上 Arduino,并记得在 mBlock 上分别指定好“串口连接”,当然,也得记得如上通过网络连线两个 mBlock。

接着,其中一台 Arduino 如下连接一个可变电阻:

另一台 Arduino 如下连接电阻与 LED:

因为要通过 Arduino 调节 LED 亮度,别忘了要接在有 PWM 功能的脚位上,因此在上头我是接在 D11 脚位。

接着,连接着可变电阻的电脑上,在 mBlock 上撰写如下的程式:

这会不断地读取类比脚位的电压值并通过网络送出,而在另一台连接着 LED 的电脑上,在 mBlock 中撰写如下的程式:

别忘了,Arduino 类比脚位的输入值是 0 ~ 1023,而通过有 PWM 功能的脚位模拟类比电压时,可指定的值是 0 ~ 255,因此,必须通过计算作转换,“读取一行数据”并不会阻断程式流程,因此我们必须检查值是否为 0 到 1023。

在上头的程式中,“当收到数据时”方块会在“读取一行数据”方块完成后触发执行,你也可以将“如果”方块的部份,直接放在“不停重复”之中,两种写法都可以!

接下来分别执行程式,并试着转动可变电阻,你会发现另一台 Arduino 上的 LED 会随着可变电阻的转动而有不同的明亮。
感谢CodeData用户: caterpillar 的贡献 著作权归作者所有
整理:宁波家电物联网云平台,中科极动云

CONTACT US: >光敏电阻(Photo-sensitive resistor)的电阻值与光线有关,照射于感光面的光线亮度增加时,电阻值会变小,亮度减少时电阻值会加大,其原理是光线照射于半导体,原本稳定的电子受到激发而成为自由电子,常见的材料为硫化镉(Cds)或硒化镉(CdSe),因而常用 Cds 代表光敏电阻。

由于光敏电阻会因为光照而使得电阻发生改变,若对光敏电阻施以电压,两端的电压就会因为光照发生的电阻值改变,使得压降也跟着变化,我们可以利用这个特性来制作亮度感应器
如上图的电路设计,输出脚位的电压值会是5 R2/(R1 + R2),一般光敏电阻的电阻变化,大概是在 10M Ω(黑暗)到 1K Ω(置于阳光下)左右(如果直接以强光接近照射,电阻值还会更低一些),如果要精确地量测照度与电阻的关系,可以用专用照度计来量得照度与电阻之间的关系。
在这边就简单一点,我在目前室内合适的亮度下,量得的光敏电阻值约为 3K Ω 上下,按照上图的话,输出脚位的电压值会是在 38 V 左右,接到 Ardunio 的类比输入脚位,应当可以量得 800 左右的数值,你可以如下设计电路:

只要设计一个简单的小程式,就是阳春的照度计了 … XD

当然,这边的照度值不是公定的照度单位,只是从类比输入脚位量得的值,仅供亮度的相对参考,试着增强或遮挡至光敏电阻的光线,你就会看到数值会有不同的变化:

如果亮度感应器的敏感度设计的好一些,搭配自走车,就可以做个简单的循迹车了。

如果会实作简单的亮度感应器,那么就可以用多个亮度感应器,来实作简单的光线追踪了,例如,可使用两个亮度感应器,侦测左右两边的亮度差异,如果两边亮度差异在一定范围内,例如 50 以内,两边 LED 就同时亮,表示亮度差不多,若左边比右边的亮度高 50 以上,就亮左边,反之就是亮右边的 LED,你可以如下设计电路:
程式的撰写则可以如下:

因为我手边仅有的两个光敏电阻规格不同,同样的光源下,测出来的值不太一样,左边那颗比右边那颗约少了 150 左右,因此,在程式中我做了些修正 … XD

感谢CodeData用户: caterpillar 的贡献 著作权归作者所有
整理:宁波家电物联网云平台,中科极动云

小小云提示:教程作者 caterpillar是来自台湾的programmer(kinda),所以在一些专有名词的使用上会和我们这边使用的不太一样啦,不过作者也有标注出英文名称,大家自行转换哟(⁎⁍̴̛ᴗ⁍̴̛⁎)

步进电机这东西的学问真不少,就结论而言,控制步进电机最好的方式,就是找到与手边步进电机可以配合的程式库来使用。Arduino IDE 不是有 Stepper 程式库可以使用吗?嗯!它是可以用一些步进电机上,不过,不见得能完全发挥步进电机应有的控制能力,控制某些电机则会有些问题,正巧,我手上这颗 28BYJ-48 5V DC 就是!… XD

在 Arduino 官方网站的 Arduino – Stepper 文件中,谈到了步进电机的两个基本分类:单极步进电机(Unipolar Stepper)与双极步进电机(Bipolar Stepper)。那么就从这两个分类开始认识!
单极步进电机是提供单一方向的电流来驱动电机,例如:
在上图中,可以看到线圈各有一个共同接点,通常接电源,只要改变其他接点的电压讯号,就可以产生电流,而电流都是固定的方向,而由于有四个线圈,这样的电机被称为四相(Phase)电机。

双极步进电机的电流则是双向的,例如:
这类电机在驱动时,需要改变电流的方向来达到不同激磁的效果,而由于有两个线圈,这样的电机被称为二相电机。

电机的相数除了二向、四相之外,还有单相、三相、五相等,这是为了达到不同程度的控制,电机的控制是运用电流通过线圈会产生磁场,并与另一永久磁铁产生作用,来达到转动的效果,以四相步进电机为例:

如果做为定子的线圈激磁后,面对转子一面是 S 极,就会吸引转子的 N 极,只要依顺序对各相线圈激磁,就会产生转动效果,像上面这种一次激磁一个线圈的方式,称为一相激磁,因为每次只激磁一个线圈,电力消耗小,不过缺点是振动大、转距小。

常见的激磁方式是二相激磁,顾名思义,一次激磁两相,由于有两相用以吸引住转子,因此振动小、转距大:

也有一相、二相轮流激磁,称为一/二相激磁,顺序其实就是上面两张图的结合:

可以看出这种激磁方式,每次转动的角度为一相或二相激磁的一半,可以得到更精确的控制。

步进电机需要比较高的电压或电流驱动,在 Arduino 官方网站的 Arduino – Stepper 文件中,有 Unipolar Steppers 及 Bipolar Steppers 两个页面,介绍了如何连接出能驱动步进电机的电路,分别有可以接成两个控制脚位与四个控制脚位的方式。

其中会用到的 IC 是达灵顿阵列(Darlington Array),如先前〈mBlock & Arduino(15)认识晶体管与继电器〉谈到的,若想运用晶体管提供更大的电流来驱动电机,可以使用两个或多个晶体管的组合,达灵顿阵列中有多组达灵顿电路,以 ULN2003APG 来说,里头有七组达灵顿电路。

如果不想那么麻烦地自己接电路,那么可以依使用的步进电机来搭配现成的步进电机驱动模组:

这个步进电机驱动模组,左上四个脚位可以接到 Arduino 的数位输出脚位,下方有 +、- 两个脚位,分别接 Vcc 与 GND,右上白色插槽用来连接我手边这颗五线四相的 28BYJ-48 5V DC,上图步进电机驱动模组中的 ULN2003APG,可搭配 28BYJ-48 5V DC 这个步进电机:

28BYJ-48 5V DC 这个步进电机,其中红线是接 5V 电源,各线的连接是:

如果搭配 ULN2003,要对 28BYJ-48 5V DC 步进电机做激磁,那么 ULN2003 的输入脚位 4、3、2、1,提供电位以进行激磁的顺序为 …

一相激磁:1000-0100-0010-0001
二相激磁:1100-0110-0011-1001

一/二相激磁:1000-1100-0100-0110-0010-0011-0001-1001

如果想要体验一下步进电机转动,那么可以简单地如下实作,脚位 D8 到 D11 分别对应至澄、黄、粉、蓝,例如一相激磁:
执行程式之后,你可以见到步进电机缓慢的转动,将顺序改为 S4 到 S1,就会看到电机缓慢的逆转,这边没有设任何的工作时间延迟,这是因为 mBlock 执行速度的关系,直接使用 Arduino 积木方块,只能是这个速度了。

类似地,以下是二相激磁:
以下是一/二相激磁:

如果想更进一步试试步进电机控制,可以使用 Arduino IDE 中的 Stepper 范例,它们使用到 Arduino 的 Stepper 程式库,不过,如果你手边是 28BYJ-48 5V DC 步进电机,就要注意一下了,以 stepper_oneRevolution 范例为例:

直接执行的话,你的电机只会有一个方向的转动,无法逆转,这是因为 28BYJ-48 5V DC 的接线顺序,与 Stepper 程式库预期的不同,如果你的 28BYJ-48 5V DC 的接线顺序由澄、黄、粉、蓝分别是接至 D8 到 D11,那么有两个方式可以解决,一个方式是在 Arduino 上将 D9 与 D10 接线对调,另一个方式是在建立Stepper时,9与10对调:

再来是stepsPerRevolution必须设定为你的电机实际上一圈会有多少步,如果是 28BYJ-48 5V DC 的话,查询到的规格上写着,步进角为5625 / 64,因此这电机转一圈需要的步数是360 / (5625 / 64),也就是4096步,不过,这是一/二相激磁才会有的步数,如果你查看 Stepper 程式库原始码,会发现,它是采二相激磁的实作方式,因此,使用这个 Stepper 程式库,你实际上要设的stepsPerRevolution必须是2048步。

不过,如果你改了脚位也将stepsPerRevolution设为2048,步进电机还是不会动,这是因为 Stepper 程式库中setSpeed函式的关系:

这是以毫秒为单位来设置step_delay,如果你设为2048步,那number_of_steps就是2048,那么step_delay就会是29296875 / whatSpeed,如果whatSpeed设为60,那结果就会是048828125,然而step_delay是unsigned long,也就是实际上结果只会储存0,那么step函式中millis() - this->last_step_time >= this->step_delay该行,就会一直是成立的,也就是完全没给工作时间,这么一来电机就不会动了。

因此,如果你直接使用 Stepper 程式库,设为 2048 步之后,那么速度就不能设太高,例如以下就可以正常正反转了:

如果你会使用 Arduino 官方语言的话,改写 Stepper 应该不是难事,可以试着实作一/二相激磁,并令其能支援 28BYJ-48 5V DC 的4096步与高转速,懒的话,网路上是也有人已经实作或改写好的版本,不过,想要精确控制的话,重点还是在于,认识你的步进电机与程式库!

感谢CodeData用户: caterpillar 的贡献 著作权归作者所有

整理:宁波家电物联网云平台,中科极动云

全国中小学信息技术创新与实践活动简称编程大赛童创和原创项目有:
1、童创项目:要求参赛选手使用Scratch、MBlock等编程软件创作作品,作品形式多样,如小游戏、动画、交互式故事等。
2、原创项目:要求参赛选手使用Python、Java、C++等编程语言开发应用程序或设计硬件系统,作品涉及领域广泛,如人工智能、物联网、数字媒体等。

小小云提示:教程作者 caterpillar是来自台湾的programmer,所以在一些专有名词的使用上会和我们这边使用的不太一样啦,不过作者也有标注出英文名称,大家自行转换哟(⁎⁍̴̛ᴗ⁍̴̛⁎)

在〈mBlock & Arduino(14)使用人体动作感应器〉中谈过 PIR 动作感应器,Makeblock 提供有 PIR 动作感应器模组,以及光线感应器模组,结合这两个,你就可以轻易地作出一个小夜灯。

Me PIR 动作感应器可以侦测到周围六公尺左右的人体移动,范围可以借由 PIR 上方的可变电阻器来调整,这个动作感应器在 D3 有个 LED,当侦测到人体红外线时,LED 会亮起:

这个动作感应器也可以设定是否可重复触发,仔细看看感应器上可外接的脚位,或者是 RJ25 端口旁的脚位标示,可以发现有个 Mode 脚位,当你给这个 Mode 脚位高电位时,就是可重复触发模式,也就是当感测到红外线变化,在延迟时间内若持续感测到红外线变化,那么“人体红外线感应器方块”就会持续传回 1,直到不再感测到红外线变化后一段延迟时间,才会传回 0,这通常用于判断,人体是否有持续动作(或太久没动静)的场合。

不可重复触发,是当感测到红外线变化而“人体红外感应器方块”传回 1,无论延迟时间内有无感测到红外线变化,时间一到就会先传回 0。

因此,根据你将 RJ25 连接至哪个端口,查出 Mode 脚位是对应至哪个数位脚位,给予高或低电压,就可以设定为可重复触发或不可重复触发模式。

Me 光线感应器可以侦测光线强弱,由于是借由类比脚位得到数值,因此光线强弱变化值由 0 到 1023:
从上面的照片中可以看到,这个感应器还可以侦测灰阶变化,这其实是利用反射光的强弱来达成,为了要能侦测灰阶变化,你必须点亮照片中标示为 D3 的 LED,然后让光线感应器很接近被侦测的平面,但不是接触该平面,由于黑色会吸收光线,因此,越黑的平面,反射光进入光线感应器就会越少,侦侧得到数值就会越低。

侦测灰阶变化的应用,常见于循迹车,在平面上画条黑线,车子上的光线感应器靠近黑线的一侧:
如果黑线是在感应器的右方,当车子越往左偏离黑线,反射光会越大,在大于某个值时可使其偏右接近黑线,如果车子越偏右进入黑线,为避免它整个往右超出黑线,可在反射光小至某个值时,让车子偏左,像这样始终让感应的反射光维持在某个范围内,保持黑线在感应器的右方,就可让车子延着划下的轨道前进。

当然,这样的方式只适合不交叉的黑线,如果轨道有交叉,就要使用两个感应器夹住黑线,如此在两个感应器反射光都小于某个值时,就表示目前处于交叉点。

那么,该怎么点亮标示为 D3 的 LED 呢?这个 LED 是借由标示为 DI 的脚位控制,当高电位时就会点亮 LED,不过光线感应器只能使用于连接埠 6、7、8,查看这些连接埠对应的脚位,都是类比输入脚位,怎么输出高电压?

其实类比脚位也可以用来作为扩充的数位脚位,以 Arduino Uno 为例,A0 到 A5,也可以当作 D14 到 D19 数位脚位来使用,因此,查看你的连接埠,就可以知道要令哪个号码的数位脚位为高电位了,例如,若连接在连接埠 6,其脚位为 A2,那么就是设置数位脚位 15 为高电位,就可以点亮 LED。

如果有兴趣,你也可以使用光线感应器实作个扫瞄器喔!可以参考〈 EV3 Tutorial(7)使用颜色感应器实作扫描器 〉,道理是相同的!

接下来就实作个小夜灯吧!需求是,这个小夜灯只在够暗的时候,才会感应是否有人接近而启用,小夜灯的部份,我们就直接使用光线感应器上的 LED,为了方便调节什么样的光线明亮程度才会感应是否有人接近,我们使用 Me 可变电阻器,并将调整好的数值显示于七段显示器上。

我将 PIR 动作感应器连至端口 3,七段显示器连至端口 4,光线感应器连至端口 6,而可变电阻器连至端口 7。

首先处理侦测人体移动的部份,当侦测到人体靠近时,LED 会点亮:

由于光线感应器连至端口 6,为了控制 LED 明亮,必须使用脚位 A2 充当数位脚位 D16,你可以调整 PIR 动作感应器上的可变电阻,设定好你想要感应的距离范围。

接下来,利用程式设定 PIR 动作感应器为可重复触发模式且先关闭光线应器上的 LED:

程式会每一秒钟将可变电阻器的输入值,设定给七段显示器显示,并作为判断光线门槛值的依据,你可以测试看看小夜灯是否如预期运作。

当然,我们不能老是开着电脑,使用 mBlock 来控制小夜灯,以上测试没有问题的话,可以在“Arduino mode”中,将程式上传至板子上:

记得,上传前要改用“Arduino 主程式”方块,并将自订方块的名称部份改成英文,上传完毕之后,你就可以将小夜灯装在想要的地方,将板子连接上外部电源,板子上的电源开关,就是你要不要启用小夜灯的开关了!

感谢CodeData用户: caterpillar 的贡献 著作权归作者所有

整理:宁波家电物联网云平台,中科极动云

CONTACT US: >

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/12831217.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-28
下一篇 2023-05-28

发表评论

登录后才能评论

评论列表(0条)

保存