# 2020控制组单片机方向线上测试 **Repository Path**: buaarobot_admin/ControlGroupSCMOnlineTest2020 ## Basic Information - **Project Name**: 2020控制组单片机方向线上测试 - **Description**: 北航机器人队2020控制组单片机方向线上测试仓库 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2020-07-04 - **Last Updated**: 2022-07-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 第三周任务 > - 本周任务主题是嵌入式操作系统、传感器通讯以及信号处理。 ## 任务一 了解嵌入式操作系统 ### 任务简介 > 在Robocon的赛场上机器人的控制一般在嵌入式操作系统中进行。嵌入式操作系统的应用是控制组单片机方向的队员们必须要掌握的一项技能。 ### 任务要求 > - 查阅相关资料,谈谈嵌入式操作系统的功能和原理,为什么要使用嵌入式操作系统? ## 任务二 STM32基本操作、FreeRTOS的基本操作 ### 任务简介 > - 在各种嵌入式操作系统中,北航机器人队一般选用FreeRTOS,希望通过线上测试题让大家在入队之前对FreeRTOS有一定的了解。中文版资料(视频和例程以及书籍等)主要参考正点原子,英文原版资料可参考FreeRTOS官网和官方手册。 > > - 单片机与传感器之间的通讯方式有很多种,除去上周的串口通讯,还有SPI、CAN、IIC等通讯方式。本周任务需要完成单片机和激光传感器之间的通讯,单片机通过SPI总线与激光传感器进行通讯。 ### 任务前提 > - 使用STM32的**SPI1(GPIOA5、A6、A7)**与激光传感器进行通讯,片选信号(CSn)引脚为**GPIOA8**。 >- 激光传感器关于其SPI通讯的阐述如下图所示 > - ![task3-2](./Picture/week3-task2-1.png) > > - 对这段英文的部分讲解 > > - 第一句话是阐述该传感器的SPI接口是干什么的,对本任务无任何实际影响。 > - 本传感器在SPI通讯中只能作为从机 > - (It communicates at clock rates up to ...):SPI通信波特率不可以超过10MHz(波特率=84M / 分频系数) > - (As shown in Figure 11...):这句话中所提到的Figure 11指的就是下图。意思是**片选信号为低电平的时候**才能开始进行数据传输。 > - (The sensor samples MOSI...):无实际影响,可不用理会 > - (SPI commands are executed at ...):完整的Command帧传输完毕之后,片选信号为高电平时,Command帧生效。 > - 传感器的通讯时序如下图所示 > - ![task3-2](./Picture/week3-task2-2.png) > > - ADD[x]指的是某个寄存器的地址,也就是下文中出现的“ADDR” > - 命令帧(“Command”帧)的格式如下 > > - ![task3-2](./Picture/week3-task2-3.png) > - **存储距离原始值的寄存器地址为0x3FFF** > - 数据帧(“Data”帧)的格式如下 > - ![task3-2](./Picture/week3-task2-4.png) > - 注意:Bit14是指示此前通讯是否有错误发生的,本任务**默认为0,即无需关心此Bit** ### 任务要求 > - 自行完善LaserSensorDriver.c/h,原始值转成实际距离的函数已经给出,无需自己编写。 > - 在LaserSensorController.c/h中完成传感器交互任务和传感器数据处理任务的编写。其中,传感器交互任务负责与传感器进行通信获取数据,运行频率设置为约100Hz即可,**当接收到完整的一帧,并且将原始值转成实际距离数据后,交互任务将实际距离数据发送给数据处理任务,传感器数据处理任务开始运行进行数据处理,在未收到实际距离数据时,数据处理任务处于阻塞状态**。 > - 请各位同学注意代码的可读性。 ### 任务提示 > - 在完成本任务之前需要对SPI通信有一定的了解。 > - 正点原子关于SPI以及FreeRTOS的教程可以作为参考资料 ## 任务三 传感器的信号处理 ### 任务简介 > 机器人的控制需要传感器数据的配合,传感器上发的数据是真实信号与噪声的叠加结果,一般需要通过滤波来抑制噪声。任务二已经完成了传感器的通信,并且将实际距离数据传到了数据处理任务,接下来我们将完善数据处理任务,完成实际距离数据的滤波操作。 ### 任务前提 > - 我们已经给出了一份传感器的数据表作为参考,在第三周工作空间下陈沁舒文件夹的Data.txt中。 > - 真实信号较平滑。 ### 任务要求 > - 针对我们已经给出的传感器数据,选择一种滤波方法在任务二创建的信号处理任务里实现对距离数据的处理,并且说明选择这种方法的理由。 ### 任务参考 > - [数字滤波算法参考一](https://www.geek-workshop.com/thread-7694-1-1.html) > - [数字滤波算法参考二](https://blog.csdn.net/Do_Not_Ask_Me/article/details/86713387?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.nonecase) > - 机器人控制主程序运行频率较高,为匹配较高的主程序运行频率,传感器数据处理算法输出结果的频率也不能太低,在可以取得相近的滤波效果的两种算法中,一般认为输出结果频率高者更优。 # 第二周测试题 > - 在准备开始写代码之前建议先通读整个工程,了解大致的框架,做到心中有数。 >- 把整个工程移动到自己的个人文件夹下面再开始工作 > - 标记了`/* User Code */`的就是需要测试者补充完善的部分,未标记的或者是有只旺柴在那里的(对,它真的是旺柴,不是乱码,也不是猪,更不是其他物种)就是无需测试者编写的部分,直接调用即可有相应的效果。 ## 任务一 STM32基本操作 ### 任务简介 > 机构组的同学设计出了一款全向轮底盘,控制它运动的重担落在了你的身上。你打算用一个现成的蓝牙手柄作为底盘的遥控器,假设单片机上已经安装了HC-05蓝牙串口模块,蓝牙串口模块和单片机的Usart2(使用引脚为GPIOA2和A3)相连接。 ### 任务前提 > - 串口通信的参数为波特率为115200bps,字长为8位数据格式,一个停止位,无奇偶校验位,无硬件数据流控制,收发模式。串口中断优先级自己设定。 > - 已知使用的遥控器和底盘主控板之间的通讯协议为 > > | 帧头 | 控制信息【1个字节】 | 运动方向【4个字节】 | 速度大小【4个字节】 | 校验码【1个字节】 | > | :--: | :---------------------------------------------------: | :---------------------------: | :---------------------------: | :---------------------------------------------: | > | 0x7F | 5bit为0则为手动模式,为1则为自动模式,其他bit不做处理 | float,数据的最高字节在最左侧 | float,数据的最低字节在最左侧 | 从帧头到速度大小的最后一个字节之和模256所得到值 | > > - 数据的最高字节在最左侧怎么理解? > > 比如说若速度大小为3.14,则数组内速度大小的部分内容从左到右依次为0x40 0x48 0xF5 0xC2 > > - 提醒:STM32采用的是小端模式,即**数据的高字节保存在高地址** ### 任务要求 > - 根据题目已经给出的信息完成STM32相关外设的初始化(即完善RemoteControllerUsartInit函数以及Robot.c中的SetUp函数) > - 按照给定的通讯协议,完成对接收到的信息的校验处理函数的编写,并且将解析出来的运动模式、速度大小和运动方向存入工程中已有的Robot.RemoteController.Mode、Robot.RemoteController.Velocity、Robot.RemoteController.Direction之中 ## 任务二 底盘运动学 ### 任务简介 > ​ 底盘的结构如图所示,该全向轮底盘是由四个电机驱动的,所以你需要根据底盘中心的速度信息以及当前底盘的位置信息,来解算出四个轮子分别应该具有的速度,将速度信息下发至电机上之后,才能够让底盘如你所愿地运动。 > > task3-2 ### 任务前提 > - 假设**底盘的中心已经安装了全场定位模块**,机器人在世界坐标系下的位置信息储存在Robot.RobotChassis.ChassisLocator里面当中,并且是实时更新的。进行后续计算的时候,如果需要使用到机器人位置信息,直接调用即可。 > - 每个电机安装的是AS5047U磁编码器,线数为4096线,4倍频输入(也就是电机转子一圈得到4096 * 4个脉冲,即速度设定函数里面的count的含义) > - 每个电机的速度设定函数已经给出,直接通过结构体内部的函数指针调用即可 > - 四轮全向轮底盘,四个轮子正交放置,完全对称,机器人中心到各个轮子的距离为L = 0.35m,全向轮半径R=0.10m > - **轮子运动正方向:顺时针旋转时为正方向** ### 任务要求 > - 完成Chassis.c/h下的ChassisMotion函数的编写,要求的效果是,通过结构体的函数指针调用此函数之后,底盘即根据输入参数进行运动。 > - 完善Robot.c/h,完成必要的初始化以及主循环中的逻辑。 ## 任务三 路径跟踪 ### 任务简介 > 在真正的Robocon的赛场上,底盘的运动大部分都是自动而非手动控制。现在给定了一条由直线和圆弧组成的目标路径,你需要实现让底盘的中心沿着这条路径移动的功能,具体如何实现不做任何限制,只要能够满足任务要求。 ### 任务前提 > - **假设每一次调用PathFollowing函数时机器人的起始位置信息为[0,0,0](第三个为航向角)** > - 要求跟随的路径如下(图中的单位为m)(左下角为起始位置点): > > ![task3-2](./Picture/week2-task3.jpg) ### 任务要求 > 完成PathFollowing函数的编写,要求实现的效果为**调用一次**PathFollowing函数,位于起始点的机器人可完成对给定的轨迹的跟踪 ### 任务参考 > 一种路径跟随的实现思路:在给定的路径上取一系列中间控制点,让机器人从初始点依次到达每一个中间点直到结束,即可实现对该路径的跟随。而对于每一个中间过程,即实现底盘的Point to Point(点到点)功能,即将当前机器人的位置和中间点位置信息进行PID控制计算,得到机器人所需的中心速度和自转角速度,进一步调用任务二中编写好的运动学解算函数即可。 # 第一周测试题 ## 任务一 git基本操作 ### 任务简介 > ​ Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目,可以帮助你进行自动的版本管理。控制组单片机端的线上测试都是通过gitee发布并且提交。在多人协作的情况下,使用git就会相当的方便,能够有效地协调多位开发者对不同地方的改动。 > ### 任务要求 > - 安装git,并且注册好gitee账户与git绑定,并且点击邀请链接加入本远程仓库 > > - 在你想要克隆本仓库的地方,右键菜单点击“**Git Bash Here**”,输入以下代码,即可实现将远程仓库克隆到本地的操作,注意克隆完毕之后**Picture文件夹和陈沁舒文件夹下的东西均不允许修改,只允许复制到自己的文件夹下**。 > > ``` > git clone https://gitee.com/buaarobot/ControlGroupSCMOnlineTest2020.git > ``` > > - 在第一周测试题文件夹下建立起你个人的文件夹 > - 在你的文件夹下分别建立"task1"、"task2"、"task3"、"task4"四个文件夹,之后的任务所对应的文件分别放入四个文件夹下 > - (**请把后面的做完再回头做这个哦**)创建一个记事本文件,撰写你对本周题目的难度的看法,放到“`ControlGroupSCMOnlineTest2020/第一周测试题/你的名字/task1`”下面 > - (**请把后面的做完再回头做这个哦**)将所有的任务完成了之后,你需要通过以下步骤将你的文件提交到远程仓库中: > - 右键菜单点击“**Git Bash Here**”,输入`git add .`,从而将你所有的改动提交到下次的提交中 > - `git commit -m "在这里写清这次提交改动的内容,如:xxx提交task1+task2"`进行一次提交 > - `git push` 将本地所有未上传的提交推送到远程仓库 > - 此时有可能会提示推送失败,这是因为远程仓库里面有本地未获取的提交 > - 此时需要先`git pull`获取当前远程仓库的最新版本, 将远程仓库的最新版本和本地最新版本合并(merge)后,才能够推送 > - 第一次进行提交操作时需要登记提交者信息,提交时git会有相关的操作说明 > - 更多详细的git用法请查询参考资料或借助网络搜索 > ### 参考资料 > - [git入门教程](https://www.cnblogs.com/imyalost/p/8762522.html) ## 任务二 电机以及电机驱动+通信基础 ### 2.1 电机以及电机驱动 ### 任务简介 > * 查找资料了解无刷电机和有刷电机的区别 > * 了解光电编码器、磁编码器、电容式编码器的基础工作原理和应用范围 ### 任务要求 > - 将上述内容总结归纳为一个文档,文档命名为2-1,文档放到`你的文件夹/task2`下,字数不限。但要求必须是**自己学习相关知识后的有效总结**,而不是简单粗暴的复制。 ### 2.2 通信基础 ### 任务简介 > 无论是机器人工作需要还是日常的调试,PC和单片机之间的交互是必不可少的。你正在使用的电脑和你的单片机,他们之间如何才能建立起通讯呢? > ### 任务要求 > - 请列举出你所熟悉的PC和单片机之间的通讯手段(如果需要额外硬件请说明) > - 选其中之一简要阐明其通讯原理(即信息是以何种形式、如何传递的) > - 将上述内容总结归纳为一个文档,文档命名为2-2,文档放到`你的文件夹/task2`下,字数不限。 > - 将任务二的两个文本文件放到你的个人文件夹的task2文件夹下 > ## 任务三 C/C++基础 ### 3.1 PID的面向对象风格设计及使用 ### 任务简介 > ​ PID算法是一种应用非常广泛的经典的自动控制算法,具有简单、使用灵活、参数容易整定的特点,在Robocon赛事中的控制方面得到了非常广泛的运用。PID算法的计算流程与其应用场景并无关系,那么为了避免重复编写同样的代码,我们往往会将PID算法进行封装。初始化过后直接调用即可,我们已经将用C封装好的PID算法放入到了PID.c/h当中,你只需要掌握如何使用即可。 > > ​ 部分电机驱动器只有速度模式(即没有编写位置环),为了实现电机的位置控制,我们往往需要自行编写位置环,也就是将PID的计算输出结果直接作为速度环的输入。我们需要你完成位置环函数的编写。 > ### 任务前提 > - 用C封装好的PID算法的文件已经给出,位于`ControlGroupSCMOnlineTest2020/第一周测试题/陈沁舒/task3/3-1`下 ### 任务要求 > - 将PID.c/h、Motor.c/h**复制**到`你的文件夹/task3/3-1`下 > - 利用已经编写好的PID结构体来完成位置环的编写,即将Motor.c下的SetTargetPositon编写完毕,工程中的电机结构体内部的CurrentPositon即为当前电机转子的位置。**要求实现的效果为调用SetTargetPosition一次电机即可转动到相应的位置。** > - **在同一目录下面,另行创建PID_CPlus.cpp和PID_CPlus.h文件**。在文件中完成PID类的编写,使用C++完成对PID算法的封装。 > - 程序有一定可读性,包含适当的注释;**即使没能完成任务,也请提交上来**,并且在同目录下创建一个README文本文件中写明原因以及完成的进度情况。 ### 参考资料 > - [PID算法解析](https://blog.csdn.net/he__yuan/article/details/80739800) > - [PID控制器原理及参考代码](http://www.openedv.com/posts/list/36701.htm) > - [伺服控制系统三环控制原理](https://blog.csdn.net/sunjiajiang/article/details/8252026) > - [C++类与对象基础知识](https://www.runoob.com/cplusplus/cpp-classes-objects.html) > ### 3.2 通信编码 ### 任务简介 > ​ 实际的单片机通讯中所发出来的数据往往会遵循一定的格式,因此在发送数据之前需要进行一定的编码工作。 > ### 任务前提 > - 程序的架构已经在`ControlGroupSCMOnlineTest2020/第一周测试题/陈沁舒/task3/3-2/Frame.c`中给出,需要发送的数据在main函数中已经储存在frame结构体中 ### 任务要求 > - 将Frame.c/h**复制**到`你的文件夹/task3/3-2`下 > > - 对于通信帧的定义如下: > > ![task3-2](./Picture/task3-2.png) > > - 请根据上图中对于通信帧的定义,将Framing函数补充完毕,要求实现**将frame中的帧数据整合到编码帧encodedFrame中** > > - 程序有一定可读性,包含适当的注释;**即使没能完成任务,也请提交上来**,并且在同目录下创建一个README文本文件中写明原因以及完成的进度情况。 ## 任务四 Python基础 ### 任务简介 > Python是一种具有面向对象特性的容易上手的高级语言。本任务将对Python的使用做一个简单的考察。 > > Python的IDE可以选用JetBrains的Pycharm,当然安装完Python之后用本身自带的IDE也是可以的。 ### 任务要求 > - 编写Task4.py,实现一个Student类,具有如下两种特性 > > ![task4](./Picture/task4.jpg) > > - 程序有一定可读性,包含适当的注释;**即使没能完成任务,也请提交上来**,并且在同目录下创建一个README文本文件中写明原因以及完成的进度情况。 ### 任务提示 > - 类的`__str__`和`__call__`内置方法 ### 任务资料 > - [python基础](https://www.runoob.com/python/python-tutorial.html) ## 注意事项 > - **任务一的难度反馈文档是否已经完成?** > > - **2020.07.15晚上12点之前,不论任务是否完成**,都请将自己的工程推送到远程仓库中 > > - **如果发现有相互抄袭者,直接取消入队资格!!!** > > - 下一周的内容会更加贴近单片机的实际开发,建议提前安装好MDK-ARM,同时为了更好地学习以及完成下周的测试题,建议购入一块STM32F407开发板进行相关的学习和测试(后面的测试题其实**并不涉及实物实验,理论上没有板子也可以完成任务**,但是有开发板对于此前没有接触过相关知识的同学的入门学习更加方便) > > - 我要怎么安装MDK-ARM?(选择其中之一即可,切莫“我全都要”) > > - [软件安装管家Keil5 MDK版]( https://mp.weixin.qq.com/s?__biz=MzIwMjE1MjMyMw==&mid=2650202449&idx=2&sn=7c131670d19bf9550702536f000229e9&chksm=8ee141bdb996c8abe2c269b6056fda3a0634609f5bba1e446d6db20ef670069ec162bdc1dfea&scene=21#wechat_redirect )(只有软件,STM32F4xx的器件支持包需要自己另外下载) > > - 正点原子的资料盘A内部有,而且资料盘内部很多资料都是后面STM32学习的重要参考,建议选择这条道路 > > 开发板资料A盘: [https://pan.baidu.com/s/1kQDBbC6fRcijsyoXeV0dcw ](https://pan.baidu.com/s/1kQDBbC6fRcijsyoXeV0dcw)提取码:hnde > > - 某人从自己的硬盘里翻出了一点东西 > > 链接:https://pan.baidu.com/s/1a3Cd9OAnFzwrYwggdQtdIg > 提取码:kzxy > > - 那么,在哪里能够买到STM32F407开发板呢? > - https://detail.tmall.com/item.htm?id=561125651860&spm=a1z09.2.0.0.2dc02e8dfUNA4C&_u=533a9mhpea95 买VET6或者ZGT6都行,二者只是Flash和管脚上面有些差别,其他方面区别不是很大 > - [ST-LINK V2调试下载编程仿真器](https://detail.tmall.com/item.htm?id=609757199903&ali_refid=a3_420434_1006:1267360122:N:LNNyeBu/VXiqD2/itoFF7mi3U6IkuaNG:574ecf92e481e24404aebb777a4f5d24&ali_trackid=1_574ecf92e481e24404aebb777a4f5d24&spm=a230r.1.1957635.2)烧录、调试必备 > - [USB转TTL模块](https://detail.tmall.com/item.htm?id=41323941056&ali_refid=a3_430582_1006:1109983619:N:vkO4OfOfcHGfOlZ6LYpNRA==:5618fe070dc9fbb8fe7fe39f8b939c8e&ali_trackid=1_5618fe070dc9fbb8fe7fe39f8b939c8e&spm=a230r.1.14.3&skuId=3944185979947)PC和单片机串口通信常用模块