青少年机器人技术等级考试实操题(六级)及评分标准(2022-3月)
一、实操考题
主题:码盘控制直流电机转动
器件:ESP32主控、码盘、光电对管、SSD1306 OLED显示屏、电位器模块、直流电机驱动模块、直流电机。
要求:
1、将码盘和直流电机有效固定。通过电位器控制直流电机的启停和转速,当装置通电后,电机处于停止状态。
2、旋转电位器,电机开始转动。
3、通过码盘和光电对管模块,采用中断并累加计数,读取电机的转动数据。
4、将电机的转动数据和转动的圈数实时显示在SSD1306 OLED显示屏上。
5、将电机的转动数据和转动的圈数实时显示到串口监视器。
6、控制程序采用C代码编写。
7、为了便于展示,整个装置需要有效固定。
8、SSD1306 OLED显示屏可使用教材对应的库,其它程序编写均不得使用外部库调用。
9、未作规定可自行处理,无明显与事实违背即可。
10、编写程序文件命名规则为:DJKS6_身份证号,考试完毕拷贝上交备案。
11、程序编写过程中不得打开库例程和其它程序,如发现,实操成绩按照0分处理。
说明:Ssd1306Console类库头文件和相关类库函数如下,供参考。
头文件: ssd1306.h ssd1306_console.h
类库对象: Ssd1306Console
部分成员函数:
ssd1306_128x64_i2c_init(); //初始化SSD1306显示屏
ssd1306_clearScreen(); //清除屏幕
ssd1306_setFixedFont(ssd1306xled_font6x8); //设置显示的文字字体类型
Ssd1306Console.println() //输出内容到SSD1306显示屏
二、评分组成
实操题总分100分,由两部分组成,分别为:电路搭设和功能呈现。其中电路搭设分值20分,功能呈现80分。
三、电路搭设评分 -- 总分20分
原器件:
1、装置中包含直流电机、码盘及直流电机驱动模块,得3分。
2、装置中包含SSD1306 OLED显示屏,得3分。
3、装置中包含光电对管模块,得3分。
4、装置中包含电位器模块,得3分。
电路搭设:
5、整个装置有效固定,得4分。
6、各模块均正确连接,得4分。
四、功能呈现评分 -- 总分80分
1、当装置通电后,电机处于停止状态,得5分。
2、旋转电位器,电机开始转动,得15分。
3、将电机的转动数据和转动的圈数实时显示在SSD1306 OLED显示屏上,得20分。
4、将电机的转动数据和转动的圈数实时显示到串口监视器,得10分。
5、根据电机的旋转,判断显示的圈数数据是否正确,如正确,得15分。
6、旋转电位器,调整电机的转速,串口监视器显示的数据随之而改变,得15分。
代码如下:
//主题:码盘控制直流电机转动
//器件:ESP32主控、码盘、光电对管、SSD1306 OLED显示屏、电位器模块、直流电机驱动模块、直流电机。
//要求:
//1、将码盘和直流电机有效固定。通过电位器控制直流电机的启停和转速,当装置通电后,电机处于停止状态。
//2、旋转电位器,电机开始转动。
//3、通过码盘和光电对管模块,采用中断并累加计数,读取电机的转动数据。
//4、将电机的转动数据和转动的圈数实时显示在SSD1306 OLED显示屏上。
//5、将电机的转动数据和转动的圈数实时显示到串口监视器。
#include <ssd1306.h>
#include <ssd1306_console.h>
Ssd1306Console console; //创建类库对象
const int potPin = 25; //电位器管脚
const int encodePin = 35; //码盘光电对应到管脚
const int resoWheel = 112; //码盘条纹数
unsigned int count = 0; //中断计数使用的
const int mPin1 = 12; //电机控制的管脚
const int mPin2 = 13; //电机控制的管脚
void setup()
{
Serial.begin(115200);
ssd1306_128x64_i2c_init();
ssd1306_setFixedFont(ssd1306xled_font6x8);
ssd1306_clearScreen();
console.println("This is a test"); //简单测试一下屏幕是否正常显示
pinMode(encodePin, INPUT);
digitalWrite(mPin1, LOW);
digitalWrite(mPin2, LOW);
analogSetWidth(10); //ADC的分辨率为10位。
ledcSetup(0, 5000, 10); //频率5000HZ,10位分辨率,0通道
ledcSetup(1, 5000, 10); //频率5000HZ,10位分辨率,1通道
ledcAttachPin(12, 0); //0通道关联12管脚
ledcAttachPin(13, 1); //1通道关联13管脚
attachInterrupt(encodePin, func, RISING); //中断管脚,初始化,fuc为中断回调函数名,上升沿触发中断。
}
void loop()
{
int speed = analogRead(potPin); //获取电位器值
ledcWrite(0, 0);
ledcWrite(1, speed); //向通道1写入获取到到电位器值
int num = count/resoWheel; //获取转动到圈数 除以112 线
Serial.printf("%d--%d\n",count,num); //串口打印中断次数和圈数
console.printf("%d--%d\n",count,num); //OLED屏刷新数据,显示中断次数和圈数
}
void func() //中断回调函数
{
count++;
}