【2303】CIE机器人四级实操

总分:100分 题数:1

一、填空题。(共1题,共100分)

  1. 一、实操考题(共1题,共100分)
  2. 主题:抢答器(4级) 器件:Atmega328P主控板1块,按键模块2个(A键和B键)、LED模块2个(LED_A和LED_B ),舵机1个及相应辅件。以上模块也可使用分立器件结合面包板搭建。 任务要求:抢答器由A、B双方组成,分别位于左右两侧,A方包含1个按键模块(A键)和1个LED模块(LED_A),B方包含1个按键模块(B键)和1个LED模块(LED_B ),舵机位于双方的中间位置,用于指向抢答获胜选手。 具体任务说明及要求如下: (1)初始状态:当A键和B键没有按下时,LED_A和LED_B均处于熄灭状态,舵机舵盘指向90度位置; (2)抢答开始后,率先按下按键一方的LED灯闪烁,另一方LED灯保持熄灭状态。舵机舵盘指向抢答获胜一方; (3)当A键和B键再次释放时,LED灯和舵机回到初始状态; (4)控制程序采用Arduino C/C++代码编写,不得使用图形化软件编写; (5)未作规定处可自行处理,无明显与事实违背即可。 说明:请考生在考试结束前,按照如下要求提交相关文件。 (1)将程序放在一个文件夹中,压缩为1个“rar或zip”格式文件,并命名为:DJKS4_身份证号,大小5M以下; (2)将程序文件通过“上传附件”按钮进行上传; (3)程序编写过程中不得打开其它示例程序,如发现,实操成绩按照0分处理。

参考资料:舵机类库及常用成员函数如下,供参考。舵机类库: 头文件:Servo.h类库对象:Servo 成员函数:attach(Pin) //指定引脚的关联引脚write(angle) //功能是让舵机转动到指定的角度 (1)DJKS4_610113201405102657.rar

一、电路搭设(共1题,共20分)

  1. 电路搭设 元器件: (1)装置中包含2个LED灯模块或LED灯;(4分) (2)装置中包含2个按键模块或按键开关;(4分) (3)装置中包含舵机;(2分) (4)LED灯模块或LED灯与主控板正确连接;(4分) (5)按键模块或按键开关与主控板正确连接;(4分) (6)舵机和主控板正确连接。(2分)

二、功能实现(共1题,共80分)

  1. 功能呈现 (1)当A键和B键没有按下时,LED_A和LED_B处于熄灭状态;(5分) (2)当A键和B键没有按下时,舵机处于90度位置;(5分) 以下功能请测评老师通知考生将抢答动作分解为先后两个动作进行评测。 (3)当先按下A键时,LED_A闪烁,LED_B熄灭;(10分) (4)当先按下A键时,舵机指向A键方向;(5分) (5)当先按下A键后,再按下B键,LED和舵机均保持不变(LED_A一直保持闪烁,LED_B保持熄灭,舵机指向A键方向);(15分) (6)当A键和B键均释放时,LED_A和LED_B均熄灭,舵机指向90度位置;(10分) (7)当先按下B键时,LED_B闪烁,LED_A熄灭;(10分) (8)当先按下B键时,舵机指向B键方向;(5分) (9)当先按下B键后,再按下A键,LED和舵机均保持不变(LED_B一直保持闪烁,LED_A保持熄灭,舵机指向B键方向)。(15分) (100分)
#include <Servo.h>
Servo myservo; 
const int ledPinA = 4;//按键引脚
const int ledPinB = 5;//按键引脚
const int keyPinA = 2;//按键引脚
const int keyPinB = 3;//按键引脚
const int SERVO_PIN = 9;  // 舵机信号连接的数字引脚
void chuShi(){
  digitalWrite(ledPinA,LOW);
  digitalWrite(ledPinB,LOW);
  myservo.write(90);
}
void AAA(){
  digitalWrite(ledPinA,(millis()%400) > 200);//闪烁频率200ms
  digitalWrite(ledPinB,LOW);
  myservo.write(0);//指向0度我们就假设指向A
}
void BBB(){
  digitalWrite(ledPinB,(millis()%400) > 200);//闪烁频率200ms
  digitalWrite(ledPinA,LOW);
  myservo.write(180);//指向180度我们就假设指向B
}
void setup() {
  pinMode(ledPinA,OUTPUT);//设置引脚模式
  pinMode(ledPinB,OUTPUT);//设置引脚模式
  Serial.begin(9600);//创建一个串口监视器
  Serial.println("hello");
  pinMode(keyPinA,INPUT);//设置引脚模式
  pinMode(keyPinB,INPUT);//设置引脚模式
  myservo.attach(SERVO_PIN); 
  chuShi();
}
int keyValueA;//按键A的读取数值
int keyValueB;//按键B的读取数值
void loop() {
  keyValueA = digitalRead(keyPinA);//数字输入语句
  keyValueB = digitalRead(keyPinB);//数字输入语句
  if(keyValueA == HIGH){
    AAA();
  }else if(keyValueB == HIGH){
    BBB();
  }else{
    chuShi();
  }
}


1 条评论

  • @ 2025-5-26 19:42:49
    #include <Servo.h>
    // 创建一个Servo对象,用于控制舵机
    Servo myservo; 
    // 定义LED_A连接的引脚为4
    const int ledPinA = 4; 
    // 定义LED_B连接的引脚为5
    const int ledPinB = 5; 
    // 定义按键A连接的引脚为2
    const int keyPinA = 2; 
    // 定义按键B连接的引脚为3
    const int keyPinB = 3; 
    // 定义舵机信号连接的数字引脚为9
    const int SERVO_PIN = 9;  
    
    // 初始化函数,设置初始状态
    void chuShi() {
        // 将LED_A引脚设置为低电平,即熄灭LED_A
        digitalWrite(ledPinA,LOW); 
        // 将LED_B引脚设置为低电平,即熄灭LED_B
        digitalWrite(ledPinB,LOW); 
        // 让舵机转动到90度位置
        myservo.write(90); 
    }
    
    // 当A键按下时执行的函数
    void AAA() {
        // 利用millis()函数实现LED_A以200ms的频率闪烁
        digitalWrite(ledPinA,(millis()%400) > 200); 
        // 将LED_B引脚设置为低电平,即熄灭LED_B
        digitalWrite(ledPinB,LOW); 
        // 让舵机转动到0度位置,假设指向A方
        myservo.write(0); 
    }
    
    // 当B键按下时执行的函数
    void BBB() {
        // 利用millis()函数实现LED_B以200ms的频率闪烁
        digitalWrite(ledPinB,(millis()%400) > 200); 
        // 将LED_A引脚设置为低电平,即熄灭LED_A
        digitalWrite(ledPinA,LOW); 
        // 让舵机转动到180度位置,假设指向B方
        myservo.write(180); 
    }
    
    void setup() {
        // 将ledPinA引脚设置为输出模式,用于控制LED_A
        pinMode(ledPinA,OUTPUT); 
        // 将ledPinB引脚设置为输出模式,用于控制LED_B
        pinMode(ledPinB,OUTPUT); 
        // 初始化串口通信,波特率为9600
        Serial.begin(9600); 
        // 通过串口发送"hello"
        Serial.println("hello"); 
        // 将keyPinA引脚设置为输入模式,用于读取按键A的状态
        pinMode(keyPinA,INPUT); 
        // 将keyPinB引脚设置为输入模式,用于读取按键B的状态
        pinMode(keyPinB,INPUT); 
        // 将舵机与指定引脚SERVO_PIN关联
        myservo.attach(SERVO_PIN); 
        // 调用初始化函数,设置抢答器初始状态
        chuShi(); 
    }
    
    // 用于存储按键A读取数值的变量
    int keyValueA; 
    // 用于存储按键B读取数值的变量
    int keyValueB; 
    
    void loop() {
        // 读取按键A引脚的电平状态,存储到keyValueA中
        keyValueA = digitalRead(keyPinA); 
        // 读取按键B引脚的电平状态,存储到keyValueB中
        keyValueB = digitalRead(keyPinB); 
        // 如果按键A被按下(高电平表示按下,这里可能与实际硬件连接情况有关,若硬件是下拉电阻接法则相反 )
        if(keyValueA == HIGH){ 
            // 执行A键按下时的操作
            AAA(); 
        // 如果按键B被按下
        }else if(keyValueB == HIGH){ 
            // 执行B键按下时的操作
            BBB(); 
        // 如果两个按键都未按下
        }else{ 
            // 恢复到初始状态
            chuShi(); 
        }
    }
    

    程序整体说明

    这段程序是基于Arduino编写的抢答器控制程序,用于实现一个由A、B双方进行抢答的抢答器功能。程序通过读取按键A和按键B的状态,来控制对应的LED灯闪烁以及舵机的指向,以指示抢答获胜方。不过目前程序存在一些问题,比如在按键检测部分没有考虑消抖处理,可能会导致按键误判;在按键释放后舵机和LED恢复初始状态的逻辑处理得不够完善,没有准确检测按键释放动作并正确恢复状态等。

    • 1