测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A20113. 主题:红外角度指示器器件:Atmega328P主控板1块,红外接收套件1套,LED模块1个,电位器模块1个,舵机1个。以上模块也可使用分立器件结合面包板搭建。任务要求:红外角度指示器通过旋转电位器控制舵机的转动角度,通过LED灯指示不同的位置。红外角度指示器有两种工作状态:连续状态和刻度状态,两种状态通过红外按键切换。当指示器处于连续状态时,舵机随着电位器的转动而平滑转动;当指示器处于刻度状态时…

填空题 较难

题目描述

主题:红外角度指示器

器件:

Atmega328P主控板1块,红外接收套件1套,LED模块1个,电位器模块1个,舵机1个。以上模块也可使用分立器件结合面包板搭建。

任务要求:

红外角度指示器通过旋转电位器控制舵机的转动角度,通过LED灯指示不同的位置。红外角度指示器有两种工作状态:连续状态和刻度状态,两种状态通过红外按键切换。当指示器处于连续状态时,舵机随着电位器的转动而平滑转动;当指示器处于刻度状态时,随着电位器的转动,舵机位置仅位于0度、90度和180度三个位置。具体要求如下:

(1) 点击红外遥控器的1键,指示器进入连续工作状态。当电位器从一端旋转至另外一端时,舵机的转动角度从0度旋转至180度,LED灯的亮度从熄灭渐变至最亮;

(2) 点击红外遥控器的2键,指示器进入刻度工作状态。当电位器的返回值小于256时,舵机的转动角度为0度,LED灯熄灭;当电位器的返回值大于等于256且小于768时,舵机的转动角度为90度,LED灯点亮;当电位器的返回值大于等于768时,舵机的转动角度为180度,LED灯闪烁;

(3) 控制程序采用Arduino C/C++代码编写,不得使用图形化软件编写;

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

说明:

程序编写过程中不得打开其它示例程序,如发现,实操成绩按照0分处理。

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

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

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

参考资料:

舵机类库及常用成员函数如下:

头文件:Servo.h

类库对象:Servo

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

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

红外遥控示例:

#include <IRremote.h>     
const int RECV_PIN = 12;  
IRrecv irrecv(RECV_PIN);  
decode_results results;   
void setup(){
  Serial.begin(9600);                       
  irrecv.enableIRIn();                      
}
void loop() {
  if (irrecv.decode(&results)) {        
    Serial.println(results.value, HEX);  
    irrecv.resume();                         
  }
  delay(100);
}

参考答案

#include<IRremote.h> #include<Servo.h> const int RECV_PIN = 12; IRrecv irrecv(RECV_PIN); decode_results results; Servo Servo; int servoPin = 2; int led = 5; int dwq = A0; int dwqval = 0; int tmp= 0; void setup() { Serial.begin(9600); irrecv.enableIRIn(); Servo.attach(servoPin); pinMode(led,OUTPUT); pinMode(dwq,INPUT); } void loop() { if(irrecv.decode(&results)){ Serial.println(results.value,HEX); switch(results.value){ case 0xFF30CF:tmp=1;break; case 0xFF18E7:tmp=2;break; } irrecv.resume(); } dwqval = analogRead(dwq); Serial.println(dwqval); if(tmp==1){ Servo.write(map(dwqval,0,1023,0,180)); analogWrite(led,map(dwqval,0,1023,0,255)); }else if(tmp==2){ if(dwqval<256){ Servo.write(0); digitalWrite(led,LOW); }else if(dwqval>=256 && dwqval<768){ Servo.write(90); digitalWrite(led,HIGH); }else if(dwqval>768{ Servo.write(180); digitalWrite(led,HIGH); delay(1000); digitalWrite(led,LOW); delay(1000); } } }
上一题 下一题