目录
一、题目
二、示意图
三、流程图
四、硬件连接
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、舵机
电源线正极接在VCC上,电源负极接在GND上,信号线接在D12脚。
2、超声波
电源线正极接在VCC上,电源负极接在GND上,Trig信号线接在D3脚,Echo信号线接在D2脚。
3、LED灯
LED_A灯模块用红色,负极接在GND上,正极接在D6脚。
LED_B灯模块用绿色,负极接在GND上,正极接在D7脚。
五、程序
#include <Servo.h>
Servo myServo; //声明Servo对象
int distance; //声明距离变量,用于存储超声波测得障碍物距离
int angle; //声明舵机角度变量
const int servoPin=12; //设置舵机信号引脚
const int TrigPin=3; //设置Trig信号引脚
const int EchoPin=2; //设置Echo信号引脚
const int LED_A=6; //设置LED_A引脚
const int LED_B=7; //设置LED_B引脚
int delaytime=10; //设置舵机转到延时
//初始化函数
void setup() {
pinMode(LED_A,OUTPUT); //设置LED_A引脚为输出模式
pinMode(LED_B,OUTPUT); //设置LED_B引脚为输出模式
pinMode(TrigPin,OUTPUT); //设置TrigPin引脚为输出模式
pinMode(EchoPin,INPUT); //设置EchoPin引脚为输入模式
myServo.attach(servoPin); //绑定舵机引脚
myServo.write(90); //初始化舵机旋转到90度
digitalWrite(LED_A,LOW); //初始化LED_A熄灭
digitalWrite(LED_B,LOW); //初始化LED_B熄灭
}
//循环函数
void loop() {
//以下6行程序作用:读取超声波传感器前方障碍物距离
digitalWrite(TrigPin,LOW);
delayMicroseconds(2);
digitalWrite(TrigPin,HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin,LOW);
distance=pulseIn(EchoPin,HIGH)/58.0;
//如果障碍物距离在欢送区内
if(distance>=5 && distance<=15)
{
digitalWrite(LED_B,LOW); //LED_B灯熄灭
digitalWrite(LED_A,HIGH); //LED_A灯点亮
//以下for循环作用:舵机从30度旋转到90度
for(angle=30;angle=90;angle++)
{
myServo.write(angle);
delay(time);
}
digitalWrite(LED_A,LOW); //LED_A灯熄灭
//以下for循环作用:舵机从90度旋转到30度
for(angle=90;angle>=30;angle--)
{
myServo.write(angle);
delay(time);
}
}
//如果障碍物距离在欢迎区内
else if(distance>15 && distance<=25)
{
digitalWrite(LED_A,LOW); //LED_A灯熄灭
digitalWrite(LED_B,HIGH); //LED_B灯点亮
//以下for循环作用:舵机从90度旋转到150度
for(angle=90;iangle=150;angle++)
{
myServo.write(angle);
delay(time);
}
digitalWrite(LED_B,LOW); //LED_B灯熄灭
//以下for循环作用:舵机从150度旋转到90度
for(angle=150;angle>=90;angle--)
{
myServo.write(angle);
delay(time);
}
}
//如果障碍物距离不在欢迎区和欢送区内
else
{
myServo.write(90);
digitalWrite(LED_A,LOW);
digitalWrite(LED_B,LOW);
}
}