龙空技术网

机器人3级:智能红绿灯编程(Mixly)与搭建

迎着星空长大 696

前言:

现时姐妹们对“交通灯单片机c语言”可能比较珍视,你们都需要分析一些“交通灯单片机c语言”的相关知识。那么小编在网络上汇集了一些关于“交通灯单片机c语言””的相关资讯,希望大家能喜欢,咱们一起来了解一下吧!

人行道自助红绿灯在很多城市的街头都是比较常见的,常态下主路一直绿灯,人行道红灯。如果有行人要通过,动手按下红绿灯杆上的按键后,稍微等待一会,主路交通灯变黄再变红,人行道交通灯变绿闪烁,同时会有“嘟嘟”的声音提示行人通过。

今年9月份机器人三级考试的实操搭建题目“智能红绿灯”,其实就是人行道自助红绿灯,不过考题中还有一些细节,比如可以通过电位器调整行人通过时长,最后4秒人行道绿灯闪烁变快等。

大纲

————————————————

一、准备所需的电子模块

二、准备交通灯杆

三、导线连接

四、电子模块安装

五、编程与调试

六、运行效果

正文

————————————————

一、准备所需的电子模块

1、电位器(下图上排左一),用来调节人行道通过时长。

2、蜂鸣器(下图上排左二),发出嘟嘟的声音提示行人通过。

3、按键(下图上排左三),行人按键后人行道亮绿灯。

4、红黄绿交通灯(下图上排左四),机动车道交通灯。

5、独立小绿灯、红灯(下图上排右一、二),人行道交通灯。

6、导线,连接电子模块和控制器。

7、Arduino UNO控制器,由单片机(微控制器)、扩展引脚、电源接口三部分组成。

(1)下图Arduino UNO控制器中央黑色正方形模块是单片机,正面印有型号“MEGA328P”的字样,MEGA328P单片机主频为16MHz(16兆赫兹),闪存32K、主存2K、可擦写可编程的存储芯片(EEPROM)1K。

(2)控制器上侧一排黄色的引脚是数字引脚,编号为0~13,可以输出、输入数字信号。下侧一排蓝色的引脚为模拟引脚,编号为A0~A5,可以输入模拟信号。

搭建自助红绿灯所需的电子模块以及Arduino控制器

二、准备交通灯杆

做了两根交通灯杆,一根准备装主路交通灯,一根准备装人行道红绿灯、蜂鸣器、行人按键。

交通灯杆

三、导线连接

为了使用方便,Arduino UNO控制器为每个数字和模拟引脚独立配置了红色的5V(电源)引脚,黑色的GND(接地)引脚,这样电源(V)、接地(G)、信号(S)三个引脚一组,和导线接口完美对应。

导线引脚与GVS引脚组相对应

1、黄色的数字引脚0~13,用来连接按键、红绿灯、蜂鸣器等电子模块。下图按键连接在了数字引脚3上。

按键连接在数字引脚3

2、交通灯有三个数字信号接口:G、Y、R,这三个都是数字信号接口,各自独立连接到三个数字引脚即可,GND随机连其中一个接地引脚。

交通灯的接口

3、蓝色的模拟引脚A0~A5,可以用来连接电位器模块,我们把电位器连接在了A4引脚上。

电位器连接在A4模拟引脚上

四、电子模块安装

导线连接好后,把所有的电子模块安装到交通灯杆上。一侧是人行道灯杆,上面集成了蜂鸣器、按键、红灯、绿灯;另一侧是主路交通灯杆,集成了交通灯(红黄绿)。

安装好的人行道交通灯与主路交通灯

把主路交通灯、人行道交通灯、按键、蜂鸣器、电位器连接的引脚都记下来,编程的时候使用。

各个电子模块对应的引脚

五、Mixly编程与调试

之前我写过一篇非常合适小白入手硬件编程的文章,从安装驱动和Mixly开发工具开始,到Mixly编程、编译、上传,直至调试完成,非常简洁的讲解了完整流程。所以这里就不再讲解了,需要阅读的话点击这个链接:机器人三级Ardunino硬件编程小白入门:灯光控制程序的开发与调试

1、声明引脚

(1)声明driverWayR、G、Y为主路红、绿、黄灯,对应数字引脚8、7、9。

(2)声明footWayR、G为人行道红、绿灯,对应数字引脚13、12。

(3)声明key、buzzer、peten为按键、蜂鸣器、电位器,分别对应数字引脚3、11和模拟引脚A4。

声明引脚

2、声明变量keyVal

keyVal用来接收按键模块输入的数字信号值(0、1),如果用户按下键,则接收到1,否则一直是0。

keyVal用来接收按键模块输入的数字信号值

编译、上传验证一下是否可以接收到按键的信号。不按键,串口监视器打印0,把按键按下,串口监视器打印1(下图),说明控制器正确接收了按键模块的数字信号。

按键后串口监视器打印了1

3、添加对keyVal的判断逻辑

如果行人按下键,keyVal接收到1,执行切换人行道绿灯通行指令,否则是主路正常通行指令。为了程序简洁,我添加了两个函数diverPass(主路通行)、footPass(人行道通行)

在主程序里写一个判断逻辑,如果keyVal=1,则执行footPass(人行道通行)函数,否则执行diverPass(主路通行)函数。这样程序的主框架就完成了,剩下就是把两个函数填充完成。

主程序框架

4、diverPass(主路通行)函数

这个函数很简单,主路通行时,主路绿灯亮、人行道红灯亮,其它灯均灭。

数字引脚给灯模块输出高点平(1)灯亮;数字引脚给灯模块输出低电平(0)灯灭。

diverPass(主路通行)函数

5、footPass(人行道通行)函数

这个函数比较复杂,我们逐步去实现。

(1)主路信号灯变红

行人按键后延时2秒,主路绿灯灭,黄灯亮;黄灯亮2秒后,黄灯灭,红灯亮。

主路信号灯变红

2)人行道红灯灭,绿灯亮

根据考试(2021年9月份3级实操)要求,人行道的绿灯不是长亮的,而是500ms的间隔闪烁;并且最后4秒以250ms的间隔快速闪烁。

我们用两个循环来实现考试要求。

第一个循环,从1~8,步长1,即循环8次,每次循环内绿灯一亮一灭各延时500ms,即每个循环的时长为1秒,循环8次,总时长8秒。

第二个循环,从1~8,步长1,即循环8次,每次循环内绿灯一亮一灭各延时250ms,即每个循环的时长为0.5秒,循环8次,总时长4秒。

绿灯总计闪烁12秒,即通行时长为12秒。

绿灯总计闪烁12秒

(3)让蜂鸣器响起来提醒行人

根据考试(2021年9月份3级实操)要求,蜂鸣器在最后4秒以250ms的间隔提醒路人。所以直接在最后4秒的循环里添加蜂鸣器(buzzer)数字输出。

这样蜂鸣器在最后4秒会以250ms的间隔鸣响。

添加蜂鸣器(buzzer)数字输出

6、好像还差点什么?

对了,考试(2021年9月份3级实操)还有一个特别的要求,用电位器控制行人通行时长在8~12秒之间。这个怎么实现呢?

(1)对电位器输入数值passTime的处理

电位器是一个模拟输入模块,之前已经声明为peten(应该是poten,英文错了,抱歉),接入的是A4引脚。现在需要再声明一个变量passTime接收电位器输入的数值。

电位器和按键都是输入模块,但按键是数字输入,输入的值为0或1;位器是模拟输入,输入的值为1~1023。也就是说电位器旋转到开始位置,那么passTime接收的值为1,旋转到底部,passTime接收的值为1023。

那么如何转换为8~12呢?

我们可以做一个映射,把1~1023映射为8~12。

最终的结果是:

电位器旋转到开始位置,那么passTime接收的值为1,映射后的值为8;

电位器旋转到底部位置,那么passTime接收的值为1023,映射后的值为12;

电位器旋转到其他位置,映射后的值可能为9、10、11。

映射

(2)使用电位器输入数值passTime控制人行道通过时长

第一个绿灯闪烁循环里,把原来的1到8,改为1到passTime-4,为什么要减去4?

因为最后还有一个4秒的快速闪烁循环,而通过总时长是两个循环的累加,所以第一个循环时长要减去第二个循环的4秒。

比如电位器旋转到一个位置后,映射的时长为10秒,那么第一个循环的次数为10-4=6次,每个循环1秒,共计6秒,再加上第二个循环的总时长4秒,刚好是10秒,完成考试要求。

添加passTime控制时长

7、总览一下全部程序

(1)左侧是主程序,实现了声明变量、输入信号接收、按键判断。

(2)右侧是两个函数diverPass(主路通行)、footPass(人行道通行),实现交通灯的切换控制。

我在工作中有个习惯,就是先把主程序的框架做好,然后再一步步去补充细节,这个积木式编程虽然看起来简单,但是开发思路却是通用的。

自助红绿灯程序

六、运行效果

怎么和Ardunino控制器连接上传程序,以及串口如何配置,之前文章详细讲过了,这里不再重复了,复习点击这里机器人三级Ardunino硬件编程小白入门:灯光控制程序的开发与调试

下面是运行效果视频:

视频加载中...

后记

————————————————

北京刚结束这场2021年的首场大雪。早上开车去医院,小区门口的路因为施工有些坑洼,上面是不停飘落的厚厚的积雪,下面是冰冻的路面,一个陡坡没上去陷进了冰窝里,方向不受控制,只好缓缓倒下来,眼看着一辆4驱SUV咆哮着在坡上画了一个S型艰难的上去,然后消失在漫天的雪花中。我默默叹口气,返回小区,进到地库停好车,发现车窗外面还有一层硬硬的雪帘。

于是回家歇着吧,然后就有了今天这篇文章。

太美丽

昨晚的扫雪车

努力工作的快递小哥,点个赞

标签: #交通灯单片机c语言