• 【ardunio】青少年机器人四级实操代码(2023年9月)


    目录

    一、题目

    (一)试题原题

    (二)试题解读

    1、欢迎区和欢送区范围

    (1)符合习惯

    (2)以门为参考点会有不反应区

    (3)以门为参考点门里门外不反应区不对称

    2、超声波传感器的安装位置

    (1)从安装习惯分析

    (2)从欢迎区欢送区范围分析

    3、机器人反应条件

    二、示意图

    三、流程图

    四、硬件连接

    1、舵机

    2、超声波

    3、LED灯

    五、程序


    一、题目

    (一)试题原题

    • 实操考题(共1题,共100分)

      1. 主题:

      迎宾机器人

    • 器件:Atmega328P主控板1块,舵机1个,超声波传感器1个,LED灯2个(分别为LED_A和LED_B)及相应辅件。以上模块也可使用分立器件结合面包板搭建。

    • 任务要求:

      使用超声波传感器和舵机实现迎宾机器人的眼睛和手的功能。大门位于超声波传感器前方15厘米的位置,在大门内侧设定了欢送区,范围为5-15厘米,在大门外侧设定了欢迎区,范围为15-25厘米。LED_A位于欢送区,LED_B位于欢迎区,舵机则位于大门处,迎宾机器人的主要任务要求如下:

    • (1)当没有客人进出时,舵机位于90度位置,LED_A和LED_B均熄灭;

    • (2)当客人经过欢送区时,舵机在30-90度之间循环转动,挥手示意,同时LED_A闪烁,LED_B均熄灭;

    • (3)当客人经过欢迎区时,舵机在90-150度之间循环转动,挥手示意,同时LED_B闪烁,LED_A均熄灭;

    • (4)控制程序采用Arduino C/C++代码编写;

    • (5)未作规定处可自行处理,无明显与事实违背即可。

    • 说明:请考生在考试结束前,按照如下要求提交相关文件。

    • (1)将程序放在一个文件夹中,压缩为1个“rar或zip”格式文件,并命名为:DJKS4_身份证号,大小5M以下;

    • (2)将程序文件通过“上传附件”按钮进行上传;

    • (3) 程序编写过程中不得打开其它示例程序,不得使用图形化软件生成代码,如发现,实操成绩按照0分处理。

    • 参考资料:舵机类库及常用成员函数如下,供参考。

      舵机类库:

      头文件:Servo.h

      类库对象:Servo

      成员函数:attach(Pin) //指定引脚的关联引脚 

    •                   write(angle) //功能是让舵机转动到指定的角度

    (二)试题解读

    1、欢迎区和欢送区范围

    题目中对于欢迎区和欢送区的描述如下:“大门位于超声波传感器前方15厘米的位置,在大门内侧设定了欢送区,范围为5-15厘米,在大门外侧设定了欢迎区,范围为15-25厘米。”

    仔细阅读题目,发现欢迎区和欢送区的距离范围没有给参考点,是以门为参考点还是以超声波传感器为参考点?经过分析,我觉得是以超声波传感器为参考点比较合理,原因有以下三点:

    (1)符合习惯

    因为超声波传感器,就是用来测距的,题目中涉及的距离应该是跟超声波传感器相关的,而且直接给出距离超声波传感器的距离,就不用再去额外计算了。

    (2)以门为参考点会有不反应区

    如果以门为参考点,那就是门内侧0~5厘米和门外侧0~15厘米是不反应区,设置这个区域似乎没有太大必要。

    (3)以门为参考点门里门外不反应区不对称

    如果以门为参考点,门里的不反应区长度是5厘米,门外是10厘米,两个区域不对称,也不太合理。

    所以,经过以上分析,题目中所说的距离范围应该是指到超声波传感器正前方的距离

    2、超声波传感器的安装位置

    题目中只介绍了大门位于超声波传感器前方15厘米,但没说传感器是安在门里还是门外,我们还需要分析一下。

    (1)从安装习惯分析

    因为普通的超声波传感器模块是没有外壳的,不防水,安在门外,易受潮损坏,而且超声波传感器位置不能太高,安在门里也可以防止人为恶意损坏。

    (2)从欢迎区欢送区范围分析

    如果安在门外,那么门外区域距离传感器更近,也就是5~15厘米的范围在门外,应该属于欢迎区,与题目的要求矛盾。

    所以,经过以上分析,超声波传感器安装位置应该是在门里

    3、机器人反应条件

    题目中要求客人经过欢迎区和欢送区时,机器人分别做出不同反应,反应的条件是“经过”,而“经过”还分进门和出门,题目中没有做区分。如果客人在出门时经过欢迎区,是要离开店铺,机器人做出欢迎的反应显然是不合理的;同样如果客人在进门时经过欢送区,是要进店消费,机器人做出欢送的反应也是不合理的。

    所以,为了使机器人更加合理实用,本文将“经过”做了合理化区分:进门时经过欢迎区,才做出欢迎的反应;出门时经过欢送区,才做出欢送的反应。

    二、示意图

    根据以上的分析,画出相关位置示意图如下所示。

    三、流程图

    对“经过”的合理化区分后的流程图如下所示,注意,灯的闪烁频率是与机器人舵机摆动的频率是一致的,灯的闪烁频率没有单独设置,简化了程序。

    四、硬件连接

    1、舵机

    电源线正极接在VCC上,电源负极接在GND上,信号线接在D12脚。

    2、超声波

    电源线正极接在VCC上,电源负极接在GND上,Trig信号线接在D3脚,Echo信号线接在D2脚。

    3、LED灯

    LED_A灯模块用红色,负极接在GND上,正极接在D6脚。

    LED_B灯模块用绿色,负极接在GND上,正极接在D7脚。

    五、程序

    1. #include
    2. Servo myServo; //声明Servo对象
    3. int distance=0; //声明距离变量,用于存储超声波传感器本次测得障碍物距离
    4. int predistance=0//声明距离变量,用于存储超声波传感器上一次测得障碍物距离
    5. int angle; //声明舵机角度变量
    6. const int servoPin=12; //设置舵机信号引脚
    7. const int TrigPin=3; //设置Trig信号引脚
    8. const int EchoPin=2; //设置Echo信号引脚
    9. const int LED_A=6; //设置LED_A引脚
    10. const int LED_B=7; //设置LED_B引脚
    11. int delaytime=10; //设置舵机转到延时
    12. boolean In_Or_Out=false; //设置判断进门出门布尔变量,true代表进门,false代表出门
    13.        
    14. //初始化函数
    15. void setup() {
    16. pinMode(LED_A,OUTPUT); //设置LED_A引脚为输出模式
    17. pinMode(LED_B,OUTPUT); //设置LED_B引脚为输出模式
    18. pinMode(TrigPin,OUTPUT); //设置TrigPin引脚为输出模式
    19. pinMode(EchoPin,INPUT); //设置EchoPin引脚为输入模式
    20.     myServo.attach(servoPin); //绑定舵机引脚
    21. myServo.write(90); //初始化舵机旋转到90度
    22. digitalWrite(LED_A,LOW); //初始化LED_A熄灭
    23. digitalWrite(LED_B,LOW); //初始化LED_B熄灭
    24.  }
    25. //循环函数
    26. void loop() {
    27. predistance=distance;//存储上一次超声波传感器测得的距离
    28. //以下6行程序作用:读取本次超声波传感器前方障碍物距离
    29. digitalWrite(TrigPin,LOW);
    30. delayMicroseconds(2);
    31. digitalWrite(TrigPin,HIGH);
    32. delayMicroseconds(10);
    33. digitalWrite(TrigPin,LOW);
    34. distance=pulseIn(EchoPin,HIGH)/58.0;
    35.    
    36. if(distance>predistance)
    37. {
    38. In_Or_Out=false;
    39. }
    40. else if(distance
    41. {
    42. In_Or_Out=true;
    43. }
    44. //如果障碍物距离在欢送区内且出门状态
    45. if((distance>=5 && distance<=15) && !In_Or_Out)
    46. {
    47. digitalWrite(LED_B,LOW); //LED_B灯熄灭
    48. digitalWrite(LED_A,HIGH); //LED_A灯点亮
    49. //以下for循环作用:舵机从30度旋转到90度
    50. for(angle=30;angle<=90;angle++)
    51. {
    52.         myServo.write(angle);
    53.         delay(delaytime);
    54.        
    55. }
    56. digitalWrite(LED_A,LOW); //LED_A灯熄灭
    57. //以下for循环作用:舵机从90度旋转到30度
    58. for(angle=90;angle>=30;angle--)
    59. {
    60.         myServo.write(angle);
    61.         delay(delaytime);
    62.        
    63. }
    64.      
    65. }
    66.    
    67. //如果障碍物距离在欢迎区内且进门状态
    68. else if((distance>15 && distance<=25) && In_Or_Out)
    69.     {
    70. digitalWrite(LED_A,LOW); //LED_A灯熄灭
    71. digitalWrite(LED_B,HIGH); //LED_B灯点亮
    72. //以下for循环作用:舵机从90度旋转到150度
    73. for(angle=90;iangle<=150;angle++)
    74. {
    75.         myServo.write(angle);
    76.         delay(delaytime);
    77. }
    78. digitalWrite(LED_B,LOW); //LED_B灯熄灭
    79. //以下for循环作用:舵机从150度旋转到90度
    80. for(angle=150;angle>=90;angle--)
    81. {
    82.         myServo.write(angle);
    83.         delay(delaytime);
    84. }
    85. }
    86. //如果不符合机器人反应条件
    87. else
    88. {
    89. myServo.write(90);
    90. digitalWrite(LED_A,LOW);
    91. digitalWrite(LED_B,LOW);
    92. }
    93. }
  • 相关阅读:
    环境多介质逸度模型与典型案例【代码】应用
    C语言之回调函数(非常重要)附带回调函数版本实现整型的加减乘除四则运算
    【SQL】MySQL中的SQL优化、explain执行计划
    努力前行,平凡的我们也能画出一条星光闪耀的轨迹——人大女王金融硕士项目
    基于retas的动漫动画制作与设计
    Docker技术入门|L1简介及安装
    Github 2024-02-13 开源项目日报 Top9
    十五届蓝桥选拔赛Scratch-2023.08.20STEMA测评试题解析
    SSM整合
    VUE el-select Select 选择器 选项是对象,显示是一个值name ,但是绑定的对象值是id方案
  • 原文地址:https://blog.csdn.net/m0_72963799/article/details/133073144