【2209】CIE机器人四级实操

总分:100分题数:1

一、填空题。 (共1题,共100分) 1.主题:红外遥控舵机 器件:ATmega328控制板1个,舵机1个,红外遥控器(或发射装置)1个,红外遥控接收模块1个,电位器1个,结构件若干(也可使用普通电子元器件结合面包板搭建)。

任务要求: (1) 本项目由舵机、红外遥控器、红外接收模块、电位器组成;

(2) 控制板上电后,舵机初始化角度为90°;

(3) 使用红外遥控器控制舵机到0°,如按下0号键舵机转到0°;

(4) 使用红外遥控器控制舵机到90°,如按下1号键舵机转到90°;

(5) 使用红外遥控器控制舵机到180°,如按下2号键舵机转到180°;

(6) 使用红外遥控器允许通过电位器控制舵机角度,如按下3号键后,扭动电位器旋钮,舵机角度跟随发生变化;

(7) 使用红外遥控器控制舵机自动转动,如按下4号键后,舵机在0°~180°之间往复转动;

(8) 使用红外遥控器停止舵机的往复转动,如按下5号键,舵机停止转动;

(9) 可使用任意结构件搭;

(10) 未作规定处可自行处理,无显与事实违背即可;

(11) 红外线的有关程序提供参考代码,见下图,其他程序需自行完成。

说明:请考生在考试结束前,按照如下要求提交相关文件: (1)将程序放在一个文件夹中,并将文件夹命名为:DJKS4_身份证号;

(2)将程序文件夹压缩为1个“rar或zip”格式文件,大小5M以下;

(3)将程序文件通过“上传附件”按钮进行上传。

(100分)

4 条评论

  • @ 2025-6-16 19:55:18
    #include <IRremote.h>  // 引入红外遥控库
    #include <Servo.h>  // 引入舵机控制库
    const int RECV_PIN = 11;  // 定义红外接收引脚
    IRrecv irrecv(RECV_PIN);  // 创建红外接收对象
    decode_results results;   // 用于存储解码结果的对象
    Servo myServo;      // 创建舵机对象
    const int servoPin = 9;  // 定义信号引脚
    int angle = 0;      // 当前角度值
    // 电位器代码
    const int POT_PIN = A0;  // 定义电位器连接的引脚(A0)
    
    void setup() {
      Serial.begin(9600);     // 初始化串口通信
      irrecv.enableIRIn();    // 启用红外接收
      //irrecv.blink13(true);   // 启用LED指示(可选)
      Serial.println("等待红外信号...");
      myServo.attach(servoPin);  // 初始化舵机连接
      myServo.write(90);
      //Serial.begin(9600);    // 初始化串口通信,波特率9600
      pinMode(POT_PIN, INPUT);  // 将A0设置为输入模式
    }
    boolean f1 = false;
    //boolean f2 = false;
    void loop() {
      if (irrecv.decode(&results)) {  // 尝试解码接收到的信号
        Serial.println(results.value, HEX);  // 以十六进制打印按键值
        irrecv.resume();  // 继续接收下一个信号
        if (results.value == 0XFF6897) {
          myServo.write(0);
        } else if (results.value == 0XFF30CF) {
          myServo.write(90);
        } else if (results.value == 0XFF18E7) {
          myServo.write(180);
        } else if (results.value == 0XFF7A85) {//3
          //f1 = true;
          f1 = !f1;
        } else if (results.value == 0XFF10EF) {//4
          //f1 = true;
          //f2 = true;
          boolean f2 = false;
          while (1) {
            if (f2 == true) {
              break;
            }
            for (int i = 0; i <= 180; i++) {
              if (f2 == true) {
                break;
              }
              myServo.write(i);
              delay(10);
              if (irrecv.decode(&results)) {  // 尝试解码接收到的信号
                Serial.println(results.value, HEX);  // 以十六进制打印按键值
                irrecv.resume();  // 继续接收下一个信号
                if (results.value == 0XFF38C7) {//5
                  //f1 = true;
                  f2 = true;
                  break;
                }
              }
            }
    
            for (int i = 180; i >= 0; i--) {
              if (f2 == true) {
                break;
              }
              myServo.write(i);
              delay(10);
              if (irrecv.decode(&results)) {  // 尝试解码接收到的信号
                Serial.println(results.value, HEX);  // 以十六进制打印按键值
                irrecv.resume();  // 继续接收下一个信号
                if (results.value == 0XFF38C7) {//5
                  //f1 = true;
                  f2 = true;
                  break;
                }
              }
            }
          }
    
        }
      } else {
      }
    
      if (f1 == true) {
        int value = map(analogRead(POT_PIN), 0, 1023, 0, 180);
        myServo.write(value);
      }
    
      delay(20);  // 短暂延时
    
      // 读取电位器的值(范围0-1023)
      //int potValue = analogRead(POT_PIN);
      // 将模拟值转换为百分比(0-100%)
      //int percentage = map(potValue, 0, 1023, 0, 100);
      //myServo.write(angle);
    }
    
    
    
    • @ 2025-6-16 19:42:10
      #include <IRremote.h>  // 引入红外遥控库
      #include <Servo.h>  // 引入舵机控制库
      const int RECV_PIN = 11;  // 定义红外接收引脚
      IRrecv irrecv(RECV_PIN);  // 创建红外接收对象
      decode_results results;   // 用于存储解码结果的对象
      Servo myServo;      // 创建舵机对象
      const int servoPin = 9;  // 定义信号引脚
      int angle = 0;      // 当前角度值
      // 电位器代码
      const int POT_PIN = A0;  // 定义电位器连接的引脚(A0)
      
      void setup() {
        Serial.begin(9600);     // 初始化串口通信
        irrecv.enableIRIn();    // 启用红外接收
        //irrecv.blink13(true);   // 启用LED指示(可选)
        Serial.println("等待红外信号...");
        myServo.attach(servoPin);  // 初始化舵机连接
        myServo.write(90);
        //Serial.begin(9600);    // 初始化串口通信,波特率9600
        pinMode(POT_PIN, INPUT);  // 将A0设置为输入模式
      }
      boolean f1 = false;
      //boolean f2 = false;
      void loop() {
        if (irrecv.decode(&results)) {  // 尝试解码接收到的信号
          Serial.println(results.value, HEX);  // 以十六进制打印按键值
          irrecv.resume();  // 继续接收下一个信号
          if (results.value == 0XFF6897) {
            myServo.write(0);
          } else if (results.value == 0XFF30CF) {
            myServo.write(90);
          } else if (results.value == 0XFF18E7) {
            myServo.write(180);
          } else if (results.value == 0XFF7A85) {//3
            //f1 = true;
            f1 = !f1;
          } else if (results.value == 0XFF10EF) {//4
            //f1 = true;
            //f2 = true;
            boolean f2 = false;
            for (int i = 0; i <= 180; i++) {
              myServo.write(i);
              delay(10);
              //        if (f2 == true) {
              //          break;
              //        }
              if (irrecv.decode(&results)) {  // 尝试解码接收到的信号
                Serial.println(results.value, HEX);  // 以十六进制打印按键值
                irrecv.resume();  // 继续接收下一个信号
                if (results.value == 0XFF38C7) {//5
                  //f1 = true;
                  f2 = true;
                  break;
                }
              }
            }
      
            for (int i = 180; i >= 0; i--) {
              if (f2 == true) {
                break;
              }
              myServo.write(i);
              delay(10);
              if (irrecv.decode(&results)) {  // 尝试解码接收到的信号
                Serial.println(results.value, HEX);  // 以十六进制打印按键值
                irrecv.resume();  // 继续接收下一个信号
                if (results.value == 0XFF38C7) {//5
                  //f1 = true;
                  f2 = true;
                  break;
                }
              }
            }
          }
        } else {
        }
      
        if (f1 == true) {
          int value = map(analogRead(POT_PIN), 0, 1023, 0, 180);
          myServo.write(value);
        }
      
        delay(20);  // 短暂延时
      
        // 读取电位器的值(范围0-1023)
        //int potValue = analogRead(POT_PIN);
        // 将模拟值转换为百分比(0-100%)
        //int percentage = map(potValue, 0, 1023, 0, 100);
        //myServo.write(angle);
      }
      
      
      
      • @ 2025-6-16 19:39:18
        #include <IRremote.h>  // 引入红外遥控库
        #include <Servo.h>  // 引入舵机控制库
        const int RECV_PIN = 11;  // 定义红外接收引脚
        IRrecv irrecv(RECV_PIN);  // 创建红外接收对象
        decode_results results;   // 用于存储解码结果的对象
        Servo myServo;      // 创建舵机对象
        const int servoPin = 9;  // 定义信号引脚
        int angle = 0;      // 当前角度值
        // 电位器代码
        const int POT_PIN = A0;  // 定义电位器连接的引脚(A0)
        
        void setup() {
          Serial.begin(9600);     // 初始化串口通信
          irrecv.enableIRIn();    // 启用红外接收
          //irrecv.blink13(true);   // 启用LED指示(可选)
          Serial.println("等待红外信号...");
          myServo.attach(servoPin);  // 初始化舵机连接
          myServo.write(90);
          //Serial.begin(9600);    // 初始化串口通信,波特率9600
          pinMode(POT_PIN, INPUT);  // 将A0设置为输入模式
        }
        boolean f1 = false;
        //boolean f2 = false;
        void loop() {
          if (irrecv.decode(&results)) {  // 尝试解码接收到的信号
            Serial.println(results.value, HEX);  // 以十六进制打印按键值
            irrecv.resume();  // 继续接收下一个信号
            if (results.value == 0XFF6897) {
              myServo.write(0);
            } else if (results.value == 0XFF30CF) {
              myServo.write(90);
            } else if (results.value == 0XFF18E7) {
              myServo.write(180);
            } else if (results.value == 0XFF7A85) {//3
              //f1 = true;
              f1 = !f1;
            } else if (results.value == 0XFF10EF) {//4
              //f1 = true;
              //f2 = true;
              boolean f2 = false;
              for (int i = 0; i <= 180; i++) {
                myServo.write(i);
                delay(10);
                //        if (f2 == true) {
                //          break;
                //        }
                if (irrecv.decode(&results)) {  // 尝试解码接收到的信号
                  Serial.println(results.value, HEX);  // 以十六进制打印按键值
                  irrecv.resume();  // 继续接收下一个信号
                  if (results.value == 0XFF38C7) {//5
                    //f1 = true;
                    f2 = true;
                    break;
                  }
                }
              }
        
              for (int i = 180; i >= 0; i--) {
                myServo.write(i);
                delay(10);
                if (f2 == true) {
                  break;
                }
                if (irrecv.decode(&results)) {  // 尝试解码接收到的信号
                  Serial.println(results.value, HEX);  // 以十六进制打印按键值
                  irrecv.resume();  // 继续接收下一个信号
                  if (results.value == 0XFF38C7) {//5
                    //f1 = true;
                    f2 = true;
                    break;
                  }
                }
              }
            }
          } else {
          }
        
          if (f1 == true) {
            int value = map(analogRead(POT_PIN), 0, 1023, 0, 180);
            myServo.write(value);
          }
        
          delay(20);  // 短暂延时
        
          // 读取电位器的值(范围0-1023)
          //int potValue = analogRead(POT_PIN);
          // 将模拟值转换为百分比(0-100%)
          //int percentage = map(potValue, 0, 1023, 0, 100);
          //myServo.write(angle);
        }
        
        
        
        • @ 2025-6-14 16:34:03
          #include <IRremote.h>  // 引入红外遥控库
          #include <Servo.h>  // 引入舵机控制库
          const int RECV_PIN = 11;  // 定义红外接收引脚
          IRrecv irrecv(RECV_PIN);  // 创建红外接收对象
          decode_results results;   // 用于存储解码结果的对象
          Servo myServo;      // 创建舵机对象
          const int servoPin = 9;  // 定义信号引脚
          int angle = 0;      // 当前角度值
          // 电位器代码
          const int POT_PIN = A0;  // 定义电位器连接的引脚(A0)
          
          void setup() {
            Serial.begin(9600);     // 初始化串口通信
            irrecv.enableIRIn();    // 启用红外接收
            //irrecv.blink13(true);   // 启用LED指示(可选)
            Serial.println("等待红外信号...");
            myServo.attach(servoPin);  // 初始化舵机连接
            //Serial.begin(9600);    // 初始化串口通信,波特率9600
            pinMode(POT_PIN, INPUT);  // 将A0设置为输入模式
          }
          
          void loop() {
            if (irrecv.decode(&results)) {  // 尝试解码接收到的信号
              Serial.println(results.value, HEX);  // 以十六进制打印按键值
              irrecv.resume();  // 继续接收下一个信号
            }
            delay(20);  // 短暂延时
          
            // 读取电位器的值(范围0-1023)
            //int potValue = analogRead(POT_PIN);
            
            // 将模拟值转换为百分比(0-100%)
            //int percentage = map(potValue, 0, 1023, 0, 100);
            //myServo.write(angle);
          }
          
          
          • 1