- 机器人等级考试
【2209】CIE机器人四级实操 主题:红外遥控舵机
- 2025-5-31 18:01:01 @
一、填空题。 (共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分)
7 条评论
-
admin SU @ 2025-6-2 18:16:07
以下是一些**表达“度过难关后就轻松了”**的古诗词或名句,这些诗句虽然语境不同,但都蕴含着“熬过艰难时刻,前方便是坦途”的哲理,适合用来鼓励人坚持、不放弃:
✅ 一、经典诗句(直接表达或隐含“度过困难就会轻松”)
-
山重水复疑无路,柳暗花明又一村。
——陆游《游山西村》
📌 释义:正怀疑无路可走时,突然出现了一个村庄,比喻在困境中看到了希望。 -
长风破浪会有时,直挂云帆济沧海。
——李白《行路难·其一》
📌 释义:尽管前路重重困难,但我终将乘风破浪,驶向理想的彼岸。 -
千磨万击还坚劲,任尔东西南北风。
——郑燮《竹石》
📌 释义:历经无数打击依然坚韧不拔,任凭风吹雨打都不动摇。 -
不经一番寒彻骨,怎得梅花扑鼻香。
——冯梦龙《醒世恒言》
📌 释义:没有经历严寒的考验,就不会有梅花的清香,寓意成功来自磨砺。 -
宝剑锋从磨砺出,梅花香自苦寒来。
——《警世贤文》
📌 释义:只有经过艰苦的磨练,才能获得真正的成功与芬芳。 -
沉舟侧畔千帆过,病树前头万木春。
——刘禹锡《酬乐天扬州初逢席上见赠》
📌 释义:旧事物虽已衰败,但新事物不断涌现,寓意新生与希望。 -
人生如逆水行舟,不进则退;心似平原走马,易放难收。
——《对联》
📌 释义:人生就像逆水而行,必须努力向前,一旦松懈就可能倒退。 -
世上无难事,只要肯登攀。
——毛泽东《水调歌头·重上井冈山》
📌 释义:只要坚持不懈地攀登,就没有克服不了的困难。 -
路漫漫其修远兮,吾将上下而求索。
——屈原《离骚》
📌 释义:前方的道路漫长而艰难,但我仍将不懈追求理想。 -
欲穷千里目,更上一层楼。
——王之涣《登鹳雀楼》
📌 释义:想要看得更远,就要站得更高,寓意突破自我、勇往直前。
✅ 二、现代诗/励志句子(通俗易懂,适合激励人心)
-
黑夜无论怎样悠长,白昼总会到来。
——莎士比亚《麦克白》 -
风雨之后,必有彩虹。
-
阳光总在风雨后,请相信有彩虹。
——歌词《阳光总在风雨后》 -
每一次挫折,都会在你人生的某个时刻派上用场。
——村上春树 -
生活不可能像你想象得那么好,但也不会像你想象得那么糟。
——莫泊桑
-
-
2025-6-2 18:14:48@
以下是一些表达度过难关后就很轻松的诗词:
- 更喜岷山千里雪,三军过后尽开颜:出自毛泽东的《七律·长征》。诗句描绘了红军战士们战胜了岷山的积雪这一艰难险阻后,内心充满喜悦,展现出一种历经磨难后迎来轻松与胜利的欢快心情。
- 寒极必春暖,苦尽会回甘:此句虽非古代经典诗词,但蕴含着深刻的哲理。它告诉人们,寒冷到了极致就会迎来温暖,苦难结束后就会品尝到甘甜,表达了度过艰难时期后,便会迎来轻松美好的生活。
- 玉经磨琢多成器,剑拔沉埋便倚天:出自王定保的《唐摭言》。意思是玉石经过雕琢打磨大多能成为有用之器,宝剑从沉埋中拔出便能倚天而鸣,寓意着经历磨难和挫折后,就能展现出自身的价值,迎来美好的境遇,有一种苦尽甘来的轻松感。
- 小舟从此逝,江海寄余生:是苏轼《临江仙·夜归临皋》中的句子。苏轼在经历人生的种种坎坷后,借这句诗表达了想要摆脱尘世束缚,乘小舟消失于江海,自在度过余生的愿望,体现出一种从世俗困境中解脱出来的轻松与豁达。
- 回首向来萧瑟处,归去,也无风雨也无晴:源自苏轼的《定风波·莫听穿林打叶声》。诗人回首刚刚经历过的风雨路程,觉得无论是风雨还是晴天,都已无所谓,表现出一种历经风雨后的平静与超脱,度过了人生的风雨难关,内心变得豁达从容,不再为外界变化而烦恼。
-
2025-6-2 18:12:04@
以下是一些表达度过难关就不难的诗词:
- 长风破浪会有时,直挂云帆济沧海:出自李白的《行路难·其一》。诗句展现了诗人虽身处困境,但坚信总有一天能乘风破浪,扬起高帆渡过茫茫大海,实现理想,告诉人们面对困难要保持信心,勇往直前,终将迎来成功。
- 山重水复疑无路,柳暗花明又一村:源自陆游的《游山西村》。此句描绘了山水萦绕的迷路之感后,突然出现新景象,寓意着在人生遭遇困境时,不要绝望,只要坚持前行,就可能会出现转机,迎来新的希望。
- 千磨万击还坚劲,任尔东西南北风:出自清代郑燮的《竹石》。以竹子为喻,表明历经无数磨难和打击,依然坚韧不拔,不管外界环境如何恶劣,都能坚守自我,战胜困难。
- 沉舟侧畔千帆过,病树前头万木春:是刘禹锡《酬乐天扬州初逢席上见赠》中的诗句。诗人以“沉舟”“病树”自比,却看到旁边千帆竞发,万木逢春,体现了一种豁达的心态,暗示困难只是暂时的,新事物必将取代旧事物,未来充满希望。
- 千淘万漉虽辛苦,吹尽狂沙始到金:出自刘禹锡的《浪淘沙·其八》。意思是经过千万次的淘洗、过滤虽然很辛苦,但只有去除了泥沙,才能得到闪闪发光的黄金,寓意着克服重重困难后,才能收获成功。
- 竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生:苏轼在《定风波·莫听穿林打叶声》中写下此句。诗人在雨中漫步,以竹杖草鞋行走胜过骑马,表现出一种不畏艰难、乐观豁达的心态,面对生活中的风雨,从容不迫,泰然处之。
-
2025-6-2 18:08:41@
以下是针对你提供的红外遥控舵机代码的详细注释说明:
#include <IRremote.h> // 导入红外遥控库,用于接收和解码红外信号 #include <Servo.h> // 导入舵机控制库,用于控制舵机转动 Servo myservo; // 创建舵机对象 const int recvPin = 3; // 红外接收模块连接到Arduino的数字引脚3 IRrecv irrecv(recvPin); // 创建红外接收对象并指定接收引脚 decode_results results; // 用于存储红外解码结果的结构体 const int POT_PIN = A0; // 电位器连接到模拟输入引脚A0 int servoPin = 9; // 舵机信号线连接到数字引脚9 int angle = 0; // 舵机当前角度 int direction = 1; // 自动摆动方向控制:1为增加角度,-1为减小角度 void setup() { Serial.begin(9600); // 初始化串口通信,波特率9600(用于调试输出) irrecv.enableIRIn(); // 启用红外接收功能 myservo.attach(9); // 将舵机连接到指定引脚 myservo.write(90); // 初始化舵机角度为90度 } int dianKaiGuan = 0; // 电位器控制开关标志(0=关闭,1=开启) int duojikaiguan = 0; // 自动摆动开关标志(0=关闭,1=开启) void loop() { // 检查是否接收到红外信号并成功解码 if (irrecv.decode(&results)) { // 将接收到的红外码以十六进制形式输出到串口 Serial.println(results.value, HEX); // 根据不同的红外按键码执行相应操作 if (results.value == 0xFF6897) { // 按键0:舵机转到0度 myservo.write(0); dianKaiGuan = 0; // 关闭电位器控制 } if (results.value == 0xFF30CF) { // 按键1:舵机转到90度 myservo.write(90); dianKaiGuan = 0; // 关闭电位器控制 } if (results.value == 0xFF18E7) { // 按键2:舵机转到180度 myservo.write(180); dianKaiGuan = 0; // 关闭电位器控制 } if (results.value == 0xFF7A85) { // 按键3:切换电位器控制模式 dianKaiGuan = !dianKaiGuan; // 取反开关状态 duojikaiguan = 0; // 关闭自动摆动 } if (results.value == 0xFF38C7) { // 按键4:启动自动摆动 duojikaiguan = 1; dianKaiGuan = 0; } if (results.value == 0xFF5AA5) { // 按键5:停止所有动作 duojikaiguan = 0; dianKaiGuan = 0; } irrecv.resume(); // 继续接收下一个红外信号 } // 读取电位器值(范围0-1023) int potValue = analogRead(POT_PIN); // 如果电位器控制模式开启 if (dianKaiGuan == 1) { // 将电位器值从0-1023映射到舵机角度0-180度 int ang = map(potValue, 0, 1023, 0, 180); myservo.write(ang); // 设置舵机角度 } // 如果自动摆动模式开启 if (duojikaiguan == 1) { myservo.write(angle); // 设置当前角度 delay(15); // 等待舵机转动到指定位置 // 更新角度值,实现往复摆动 angle = angle + direction; if (angle >= 180) { direction = -1; // 到达最大角度,开始减小角度 } if (angle <= 0) { direction = 1; // 到达最小角度,开始增加角度 } } delay(15); // 主循环延时,稳定控制频率 }
功能说明
这段代码实现了通过红外遥控器控制舵机的多种功能:
-
初始化:系统启动后,舵机默认转到90度位置。
-
固定角度控制:
- 按遥控器0键:舵机转到0度
- 按遥控器1键:舵机转到90度
- 按遥控器2键:舵机转到180度
-
电位器控制:
- 按遥控器3键:切换电位器控制模式
- 模式开启后,旋转电位器可控制舵机在0-180度范围内任意转动
-
自动摆动:
- 按遥控器4键:启动自动摆动模式,舵机在0-180度之间往复摆动
- 按遥控器5键:停止所有动作,舵机保持当前位置
硬件连接建议
- 舵机信号线 → Arduino数字引脚9
- 舵机电源线 → Arduino 5V(或外部电源正极)
- 舵机地线 → Arduino GND(与电源负极共地)
- 红外接收模块数据脚 → Arduino数字引脚3
- 红外接收模块VCC → 5V
- 红外接收模块GND → GND
- 电位器中间脚 → Arduino模拟引脚A0
- 电位器两端脚 → 5V和GND
-
-
2025-6-2 18:07:32@
#include <IRremote.h>//导入红外库文件 #include <Servo.h> Servo myservo; const int recvPin = 3;//红外接受模块的连接引脚常量 IRrecv irrecv(recvPin);//创建红外对象 同时初始化recvPin引脚//红外对象提供红外接受、发送操作的相关函数 decode_results results;//创建存放红外接受解码后结果的容器//用于保存接受解码后的数据 const int POT_PIN = A0; // 电位器连接的模拟引脚 int servoPin=9; int angle = 0; // 舵机初始角度 int direction = 1; // 摆动方向:1表示增加角度,-1表示减小角度 void setup() { Serial.begin(9600);//初始化串口,设置波特率为9600 irrecv.enableIRIn();//红外对象初始化//启动红外接受 myservo.attach(9); // (2) 控制板上电后,舵机初始化角度为90°; myservo.write(90); //pinMode(LED_PIN,INPUT); } int dianKaiGuan = 0; int duojikaiguan = 0; void loop() { //decode对红外信号进行解码操作的函数 if(irrecv.decode(&results)){//如果接受到红外数据,接受并解码成功则把解码后的结果存放到results //irrecv.resume(); Serial.println(results.value,16);//将解码结果以16进制的形式输出 //Serial.println(results.value,HEX); if(results.value == 0xFF6897){// (3) 使用红外遥控器控制舵机到0°,如按下0号键舵机转到0°; myservo.write(0); dianKaiGuan = 0; } if(results.value == 0xFF30CF){// (4) 使用红外遥控器控制舵机到90°,如按下1号键舵机转到90°; myservo.write(90); dianKaiGuan = 0; } if(results.value == 0xFF18E7){// (5) 使用红外遥控器控制舵机到1800°,如按下2号键舵机转到90°; myservo.write(180); dianKaiGuan = 0; } if(results.value == 0xFF7A85){// (6) 使用红外遥控器允许通过电位器控制舵机角度,如按下3号键后,扭动电位器旋钮,舵机角度跟随发生变化; dianKaiGuan =!dianKaiGuan; } if(results.value == 0xFF38C7){//4 duojikaiguan = 1; dianKaiGuan = 0; } if(results.value == 0xFF5AA5){//5 duojikaiguan=0; dianKaiGuan = 0; } irrecv.resume();//清空缓存 准备接受下一个红外信号 //decode和resume成对使用,否则只能读取到第一次接受的红外编码值,而不再接受新的编码值 } // 读取电位器的模拟值(范围0~1023) int potValue = analogRead(POT_PIN); if(dianKaiGuan == 1){ int ang = map(potValue, 0, 1023, 0, 180); myservo.write(ang); } if(duojikaiguan == 1){ myservo.write(angle); //Serial.println(angle); delay(15); angle=angle+direction; if(angle>=180){ direction=-1; }if(angle<=0){ direction=1; } } delay(15); }
-
2025-6-2 17:27:50@
#include <IRremote.h>//导入红外库文件 #include <Servo.h> Servo myservo; const int recvPin = 3;//红外接受模块的连接引脚常量 IRrecv irrecv(recvPin);//创建红外对象 同时初始化recvPin引脚//红外对象提供红外接受、发送操作的相关函数 decode_results results;//创建存放红外接受解码后结果的容器//用于保存接受解码后的数据 const int POT_PIN = A0; // 电位器连接的模拟引脚 void setup() { Serial.begin(9600);//初始化串口,设置波特率为9600 irrecv.enableIRIn();//红外对象初始化//启动红外接受 myservo.attach(9); // (2) 控制板上电后,舵机初始化角度为90°; myservo.write(90); //pinMode(LED_PIN,INPUT); } int dianKaiGuan = 0; int duoJiKaiGuan = 0; int servoPin = 9; // 舵机信号引脚连接到Arduino的数字引脚9 int angle = 0; // 舵机初始角度 int direction = 1; // 摆动方向:1表示增加角度,-1表示减小角度 void loop() { //decode对红外信号进行解码操作的函数 if (irrecv.decode(&results)) { //如果接受到红外数据,接受并解码成功则把解码后的结果存放到results //irrecv.resume(); Serial.println(results.value, 16); //将解码结果以16进制的形式输出 //Serial.println(results.value,HEX); if (results.value == 0xFF7A85) { // (3) 使用红外遥控器控制舵机到0°,如按下0号键舵机转到0°; myservo.write(0); } if (results.value == 0xFF30CF) { // (4) 使用红外遥控器控制舵机到90°,如按下1号键舵机转到90°; myservo.write(90); } if (results.value == 0xFF18E7) { // (5) 使用红外遥控器控制舵机到1800°,如按下2号键舵机转到90°; myservo.write(180); } if (results.value == 0xFF7A85) { // (6) 使用红外遥控器允许通过电位器控制舵机角度,如按下3号键后,扭动电位器旋钮,舵机角度跟随发生变化; dianKaiGuan = 1; } if (results.value == 0xFF10EF) { // (6) 按下4号键后 duoJiKaiGuan = 1; } if (results.value == 0xFF38C7) { // (6)按下5号键后 duoJiKaiGuan = 0; } irrecv.resume();//清空缓存 准备接受下一个红外信号 //decode和resume成对使用,否则只能读取到第一次接受的红外编码值,而不再接受新的编码值 } // 读取电位器的模拟值(范围0~1023) int potValue = analogRead(POT_PIN); if (dianKaiGuan == 1) { int ang = map(potValue, 0, 1023, 0, 180); myservo.write(ang); } if (duoJiKaiGuan == 1) { // 移动舵机到当前角度 myservo.write(angle); Serial.print("当前角度: "); Serial.println(angle); // 延迟一段时间,让舵机有足够的时间到达指定位置 delay(15); // 更新角度 angle = angle + direction; // 当角度达到最大值或最小值时,改变方向 if (angle >= 180) { direction = -1; // 改变方向为减小角度 Serial.println("到达最大角度,开始往回摆动"); } else if (angle <= 0) { direction = 1; // 改变方向为增加角度 Serial.println("到达最小角度,开始向前摆动"); } // 延迟一段时间,控制摆动速度 } delay(15); //delay(20); }
-
2025-5-31 18:01:15@
#include <IRremote.h>//导入红外库文件 #include <Servo.h> Servo myservo; const int recvPin = 3;//红外接受模块的连接引脚常量 IRrecv irrecv(recvPin);//创建红外对象 同时初始化recvPin引脚//红外对象提供红外接受、发送操作的相关函数 decode_results results;//创建存放红外接受解码后结果的容器//用于保存接受解码后的数据 const int POT_PIN = A0; // 电位器连接的模拟引脚 void setup() { Serial.begin(9600);//初始化串口,设置波特率为9600 irrecv.enableIRIn();//红外对象初始化//启动红外接受 myservo.attach(9); // (2) 控制板上电后,舵机初始化角度为90°; myservo.write(90); //pinMode(LED_PIN,INPUT); } int dianKaiGuan = 0; void loop() { //decode对红外信号进行解码操作的函数 if(irrecv.decode(&results)){//如果接受到红外数据,接受并解码成功则把解码后的结果存放到results //irrecv.resume(); Serial.println(results.value,16);//将解码结果以16进制的形式输出 //Serial.println(results.value,HEX); if(results.value == 0xFF7A85){// (3) 使用红外遥控器控制舵机到0°,如按下0号键舵机转到0°; myservo.write(0); } if(results.value == 0xFF30CF){// (4) 使用红外遥控器控制舵机到90°,如按下1号键舵机转到90°; myservo.write(90); } if(results.value == 0xFF18E7){// (5) 使用红外遥控器控制舵机到1800°,如按下2号键舵机转到90°; myservo.write(180); } if(results.value == 0xFF7A85){// (6) 使用红外遥控器允许通过电位器控制舵机角度,如按下3号键后,扭动电位器旋钮,舵机角度跟随发生变化; dianKaiGuan = 1; } irrecv.resume();//清空缓存 准备接受下一个红外信号 //decode和resume成对使用,否则只能读取到第一次接受的红外编码值,而不再接受新的编码值 } // 读取电位器的模拟值(范围0~1023) int potValue = analogRead(POT_PIN); if(dianKaiGuan == 1){ int ang = map(potValue, 0, 1023, 0, 180); myservo.write(ang); } delay(20); }
- 1