请选择 进入手机版 | 继续访问电脑版

作品展示

原创作品:ahut_time1_alic

系统分类: 机器人创想秀 - 技术流

作品版权:ahut_time1_alic 版权所有,禁止匿名转载;禁止个人使用。

ahut_time1_alic

2016-5-9 00:19:55

作品亮点:

1.机械结构方面:考虑到整体重量结构问题,综合国内外研究成果我们考虑采用双臂协同结构,约定双臂分别为正臂和负臂。 2.视觉处理方面:HVS正是结合了PBVS和IBVS二种算法,各取所长,是HVS具有很多的优越之处。它将是三维任务空间信息与二维图像空间信息结合起来得到误差向量。它从三维任务空间得到的信息用来调节旋转误差,而二维图像空间信息则用来调节平移误差。 3可单臂工作,也可双臂高效协同工作,结构简单、易于实现。

作品说明:

目       录

整体实物

整体实物

图4.jpg


1. 项目介绍        2
    1.1 团队介绍        2
   1.2 设计要求及需要解决的问题        3
  2. 总体方案        4
    2.1 设计思路        4
    2.2 确定设计方案        5
   2.3 方案创新点介绍        6
  3. 机械结构设计        6
    3.1 基于solidworks的三维建模        6
   3.2平移机构        7
   3.3旋转机构        8
   3.4夹持机构        8
4.  电气控制系统搭建        10
    4.1 控制系统简述        10
   4.2 双目立体视觉控制系统        11
   4.3搬运机器人运动学分析及计算        11
5.  样机模型制作及试验        11
       5.1模型制作        19
      5.2试验结果分析        21
  6.  总结展望        21
附:机器人调试主程序

1. 项目介绍

file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsD94.tmp.png  file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsD95.tmp.png  主要是设计帮助快递员进行载运和搬动物品等工作的辅助装置。所设计的商品载运装置不仅要快捷,而且要保证投递员和商品的安全,便于实现文明装卸、文明分发、投递各类快件;助力装置主要指在搬运商品的过程中可以减轻投递员劳动强度、且能保障商品安全的小型与轻便的机械装置。

1-1目前存在的问题
目前存在的问题:( 1 ) 快递商品数量大、分拣效率低;
                ( 2 ) 分拣载运受空间地形因素限制较大;
                ( 3 ) 人工成本高,存在“暴力分拣”;
针对目前快递分拣载运过程中出现的问题
结合载运、助力主题,从需求出发进行机械设计。
  各国研究人员早已预见到移动双臂系统的应用价值,最近 10 余年,关于此类机器人的各种应用研究大量开展。其中运动规划与控制研究所受关注最多,OMDAR 这类多自由度复杂系统,控制器的参考输入主要来源为系统运动规划模块的输出,因此需要基于可靠的运动规划结果,设计稳定、高精度的控制系统,以实现规划的操作过程,从而完成指定的任务。由于机器人系统结构复杂、应用环境多样、综合考量因素较多等原因,此类移动双臂机器人系统运动规划研究,在系统运动性能评估指标、多种性能指标综合、系统多自由度协调方法、规划求解方法、障碍规避规划、稳定性优化、环境感知交互规划等方面,仍有待深入研究。本作品针对于快递分拣及商品载运行业目前存在的问题,提出一种空间滑轨式双臂协同工作机器人。
2.总体方案
2.1 设计思路
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsD96.tmp.jpg
2-1设计思路
本作品针对现有传统载运过程中效率低,自动化程度低,人工成本高且大多只能针对平面进行搬运等问题,从现有技术3D打印机,起重机中获得思路,结合二者机构设计一能进行高效率空间搬运的协同式空间双臂搬运机。
2.2 确定设计方案
  本作品从实际需要出发,设计双机械臂,快速搬运机械系统的设计不仅考虑在3D环境中运动的灵活性,而且考虑在最大化机械自主性能的情况下最小化能耗。考虑到整体重量结构问题,综合国内外研究成果我们考虑采用双臂协同结构,约定双臂分别为正臂和负臂。单臂工作时,一个机械臂可以进行XYZ方向三个自由度的快递箱搬运工作;双臂工作时,两个机械臂协同工作,完成对一个空间内快递箱高效率的快速搬运工作。
  本作品以步进电机作为驱动件,单边机械臂以一对步进电机驱动水平,竖直两滚珠丝杆,两丝杆通过360°舵机云台进行联接,竖直丝杆上装有悬臂梁与夹爪,通过两丝杆移动和云台转动使单边夹具能到达一定空间范围内任意一点位置。
图1.jpg
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsDA6.tmp.jpg
2-2模型创建
2.3 方案创新点介绍
1)可单臂工作,也可双臂高效协同工作,分拣载运效率高,工作稳定,同时整体结构简单、易于实现;
2)视觉处理方面采用基于位置的视觉控制与基于图像的视觉控制的混合控制,控制精确,可用于高柔性的精细作业场合;
3)本作品可多机协同同时工作,既可在大型企业使用,同时也可以满足中小型企业需要;
4)模块化设计,维护方便,可根据实际需求添加多种功能;

3. 机械结构设计
3.1 基于solidworks的三维建模

模型演示2

模型演示2

模型演示

模型演示
   根据设计思路及查找相关资料,运用solidworks2013创建本方案的三维模型并进行了危险部位的有限元分析。验证了方案的可行性。
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsDA7.tmp.jpg

3-1 Solidworks三维模型创建
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsDB8.tmp.pngfile:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsDB9.tmp.png

file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsDBA.tmp.png

3-2 危险部位的有限元分析

有限元1

有限元1

有限元3

有限元3

4

4

3.2平移机构
   机械臂的移动机构是利用滚珠丝杆,滚珠丝杆具有以下优点:
1)、摩擦损失小、传动效率高;
2)、传动精度高;
3)、高速进给和微进给可能;
4)、轴向刚度高;
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsDCB.tmp.jpgfile:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsDCC.tmp.jpg
3-3 滚珠丝杠(丝杠滑轨)
3.3旋转机构
  机械臂的旋转机构是利用旋转云台,旋转云台具有以下优点:
  旋转云台是一种可以用来安装、固定的支撑设备,双机械臂搭载在云台上,可以精确调整转动角度使机械臂达到最好的工作姿态,且可以承受一定的载荷,完成一系列连续的载运分拣工作。
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsDCD.tmp.jpgfile:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsDCE.tmp.jpg
3-3 滚珠丝杠(丝杠滑轨)
3.4夹持机构
图3.jpg
   机械臂的夹持机构是利用“一”字型简易夹爪,旋转云台具有以下特点:机械爪是整个载运分拣装置的核心,本作品拟采用一种“一”字型简易夹爪代替实际工作夹爪,它可以在一定方向上自由转动,对箱体等较为规则的商品快递夹持精确,夹持的电动夹爪的夹持力可以调整,并可以实现力的闭环控制,夹持力的精度高,可用于高柔性的精细作业场合。
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsDDE.tmp.pngfile:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsDDF.tmp.jpg
3-4 夹持机构


4. 电气控制系统搭建
  4.1控制系统简述
图5.jpg
   基本系统利用 STM32 为主控核心,主要由视觉识别处理模块、机械运动模块,无线控制模块;同时利用WIFI 模块进行图像信息的传输,为用户设计上位机界面实现了分拣搬运的远程监控功能。
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsDF0.tmp.png
4-1 电路搭建
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsDF1.tmp.png
4-2模块化设计
   4.2双目立体视觉控制系统 图6.jpg
双目立体视觉(Binocular Stereo Vision)是机器视觉的一种重要形式,它是基于视差原理并利用成像设备从不同的位置获取被测物体的两幅图像,通过计算图像对应点间的位置偏差,来获取 物体三维几何信息的方法。融合两只眼睛获得的图像并观察它们之间的差别,使我们可以获得明显的深度感,建立特征间的对应关系,将同一空间物理点在不同图像中的映像点对应起来,这个差别,我们称作视(Disparity)图像。在实际应用中,一般将两台摄像机光轴调到大致平行,通过摄像机标定获取任意放置以及任意配置的两个摄像机之间的相对位置信息以及各自的成像参数,并利用立体图像匹配方法得到点P在两个成像平面上的对应成像点,再根据视差恢复点P的三维信息。
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsDF2.tmp.png
4-2 双目立体视觉模型
为适应实际的需求本作品拟采用一种基于位置的视觉控制与基于图像的视觉控制的混合控制,姿态偏差为3D信息,姿态控制采用基于位置的视觉控制,位置偏差为2D信息,位置控制采用基于图像的视觉控制。混合视觉控制系统如图4-3所示。 图7.png
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE03.tmp.png
4-3 双目立体视觉模型
4.3搬运机器人运动学分析及计算
  在立体空间中,任意一个物体的位姿都包含两方面信息:位置和姿态。为了可以定量的描述物体位姿信息,可以通过在物体上设定一个固连与物体的坐标系,描述出该坐标系的位姿便可以表示出物体的位姿。如图4-4所示,为了表示出物体P的位姿信息,可以在物体P上,相对于世界坐标系W建立一个固接与P的目标坐标系O
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE04.tmp.png
4-4 位姿表述图
物体P的位姿可以表示为:
位置:WTTXw,TYw,TZwT
姿态:{α,β,θ}
图8.jpg
其中位置可以用OP坐标系的原点在世界坐标系(笛卡尔坐标系)中的3个坐标WTTXw,TYw,TZwT来表示,姿态则需要采用该坐标系相对于世界坐标系的三轴旋转角度来表示即绕X轴的旋转角度α,绕Y轴的旋转角度β,绕Z轴的旋转角度θ。
在上述的姿态表述中,通过绕3个轴的旋转角度来表示姿态,是最少参数的表示方式,其本质是描述了两个笛卡尔坐标系之间的姿态旋转关系,所以还可以用旋转矩阵的通用表示法表示,如式(4.1)所示。
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE05.tmp.png                             (4.1
P坐标系若相对与坐标系W仅仅只存在X轴的旋转,则P的姿态矩阵可表示为如式(4.2)所示的矩阵。
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE06.tmp.png                (4.2
式(3.3),(3.4)分别表示P坐标系相对与坐标系W仅仅只存在Y轴和Z轴的旋转姿态。
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE16.tmp.png                (4.3
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE17.tmp.png                 (4.4
坐标转换 图9.jpg
坐标转换指的是空间中任意两个坐标系之间的坐标转换,通过坐标转换,可以统一机器人多坐标系之间的转换,便于实现视觉导航控制。坐标转换一般分为平移转换、旋转转换、复杂转换。
如图4-4所示,其中P坐标系与P’坐标系之间的坐标转换为平移转换。在P坐标系中的点(PX,PY,PZT,在P’坐标系中对应的坐标为(P’X,P’Y,P’ZT,则两坐标满足式(4.5)关系,其中向量WT=[TXw TYw TZw]T可用来描述P相对于P’的位姿。
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE18.tmp.png                 (4.5
如图4-4所示,其中P’坐标系与W坐标系之间的坐标转换为旋转变换。P’相对于W的位姿表述中只含有姿态变换,即可用P’坐标系与W坐标系的旋转变换来表示P’相对于W的位姿。在P’坐标系中的点(P’X,P’Y,P’ZT,在W坐标系中对应的坐标为(WX,WY,WZT,则两坐标满足式(3.6)关系,其中P’RW可用来描述P’相对于W的位姿。
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE19.tmp.png            (4.6
如图3.12所示,其中P坐标系与W坐标系之间的坐标转换为复杂转换,是平移转换和旋转变换的混合。在P坐标系中的点(PX,PY,PZT,在W坐标系中对应的坐标为(WX,WY,WZT,则两坐标满足式(4.7)关系,其中PRWWT可用来描述P相对于W的位姿。
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE1A.tmp.png   (4.7
将式(4.7)表示为齐次坐标形式如式(4.8),其中HWPP的相对位姿矩阵:
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE1B.tmp.png            (4.8
沿xyz轴的平移变换可分别表示为式(4.9)、(4.10)、(4.11):
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE1C.tmp.png                  (4.9
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE2D.tmp.png                  (4.10
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE2E.tmp.png                 (4.11
xyz轴的旋转变换可分别表示为式(4.12)、(4.13)、(4.14):
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE2F.tmp.png             (4.12
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE30.tmp.png            (4.13
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE31.tmp.png            (4.14
搬运机器人的坐标系统及运动模型
以机器人前进方向为x轴正方向,以远离基座的方向为z轴正方向,然后由右手规则确定出y轴方向
关节坐标系的z轴沿着当前关节轴指向相邻关节坐标系原点
关节坐标选定使相互位姿关系简单化,便于计算
图10.jpg
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE41.tmp.png
4-5 搬运机器人关节坐标系统
模型设定:
以旋转轴的正方向为参考,若逆时针旋转则α(或β或θ)为正,反之为负。大写参数为已知常量,小写参数为未知变量。
机器人的脱臂都是向内脱臂的。所有变换都是相对于原坐标。
下面分析各坐标系之间的关系。
1R坐标系与R1坐标系
R坐标系中的点PRXR,YR,ZR,1TR1坐标系中的点PR1XR1,YR1,ZR1,1T相互对应,则二者关系满足式(4.15)及(4.16
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE52.tmp.png    (4.15
根据旋转矩阵的性质可知
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE53.tmp.png           (4.16
2R1坐标系与R2坐标系  
同理可得:
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE54.tmp.png  (4.17
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE55.tmp.png    (4.18
3R2坐标系与R3坐标系
同理可得:
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE56.tmp.png      (4.19
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE57.tmp.png         (4.20
4R3坐标系与b坐标系
同理可得:
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE68.tmp.png (4.21
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE69.tmp.png                  (4.22
5b坐标系与L3坐标系
同理可得:
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE6A.tmp.png         (4.23
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE6B.tmp.png              (4.24
6L3坐标系与L2坐标系
同理可得:
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE6C.tmp.png          (4.25
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE6D.tmp.png              (4.26
L2坐标系与L1坐标系设
同理可得:
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE7D.tmp.png                (4.27
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE7E.tmp.png        (4.28
8L1坐标系与L坐标系
同理可得:
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE7F.tmp.png        (4.29
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE80.tmp.png                (4.30


  搬运机器人的运动模型主要为了研究搬运机器人的运动,在不考虑搬运机器人的驱动力的前提下,分析搬运机器人的关节位姿相对变换,在立体视觉导航中,通过对运动模型的分析,结合双目立体视觉在运动模型中的结构,可以更准确的实现视觉控制。
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE81.tmp.png
4-5 基于多关节的双臂机器人的结构示意图
5. 样机模型制作及试验
5.1模型制作

file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsE92.tmp.png
5-1样机模型正面

file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsEA3.tmp.png
5-2样机模型侧面
file:///C:\Users\何远洋\AppData\Local\Temp\ksohtml\wpsEB3.tmp.png
5-2第二版样机模型
5.2试验结果分析
  实际运行情况良好,能够完成目标任务(分拣和载运)
6. 总结展望
随着我国目前经济与市场发展,新的高效空间的货物的搬运形式意义重大,本作品考虑企业实际需要求,提出一新型协同式空间双臂搬运机。本作品结构简单,成本低廉,便于批量制造,不易损坏,即使出现问题也可快速有效修理。驱动件少,便于设计算法进行控制,可通过不同算法结合不同传感器实现多种功能,以适应各种各样实际工作状况。










图4.jpg


附:机器人调试主程序
注:本程序仅为遥控器调试机构用

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
//#include "system_stm32f10x.h"
#include "stm32f103_delay.h"
#include "stm32f103_led.h"
#include "T_stm32_pwm.h"
#include "T_stm32_sc2272.h"
#include "T_42_57.h"
/* Private typedef ---------------------------------------

--------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Extern variables ----------------------------------------------------------*/

/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/*******************************************************************************
* Function Name  : main.
* Description    : Main routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
#define L_RAD_MAX          3.0
#define L_RAD_MIN          1.1

#define R_RAD_MAX          2.4
#define R_RAD_MIN          0.5

#define L_HAND_MAX         1.5
#define L_HAND_MIN  0.9

#define R_HAND_MAX  1.5
#define R_HAND_MIN  0.88

bool rad_dir=false;
float l_rad=L_RAD_MIN,r_rad=R_RAD_MIN,l_hand=L_HAND_MIN,r_hand=R_HAND_MIN;
int main(void)
{        
        //SystemInit();ÔÚÆô¶¯ÎļþÖУ¬ÏÈÓëmainº¯Êý±»µ÷ÓÃ
        DELAY_init(SystemCoreClock/1000000);//³õʼ»¯ÏµÍ³Ê±ÖÓ£¬¶¨ÒåÑÓʱº¯Êý
        LED_init();
        Motor_Init();
        SC2272_Init();

  while(1)
        {
                if(!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_8)) //ÉÏ
                {
                        DELAY_ms(5);
                        if(!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_8)){
                        LED2_OFF();        
                        DELAY_ms(100);
                        LED2_ON();
                        Motor_KeepRun(MotorLeft_Vertical,700,Forward,true);}
                }
                else if(!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_9))//ÓÒ
                {
                        DELAY_ms(5);
                        if(!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_9)){
                        LED2_OFF();        
                        DELAY_ms(100);
                        LED2_ON();
                        Motor_KeepRun(MotorLeft_Horizontal,700,Backward,true);}
                }
                else if(!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_10))//ÏÂ
                {
                        DELAY_ms(5);
                        if(!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_10)){
                        LED2_OFF();        
                        DELAY_ms(100);
                        LED2_ON();
                        Motor_KeepRun(MotorLeft_Vertical,700,Backward,true);}
                }
                else if(!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_11))//×ó
                {
                        DELAY_ms(5);
                        if(!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_11)){
                        LED2_OFF();        
                        DELAY_ms(100);
                        LED2_ON();
                        Motor_KeepRun(MotorLeft_Horizontal,700,Forward,true);}
                }
                else if(!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_12))//sel
                {
                        DELAY_ms(5);
                        if(!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_12)){
                        LED2_OFF();        
                        DELAY_ms(100);
                        LED2_ON();
                        if(rad_dir) {rad_dir=false;LED1_OFF();}
                        else {rad_dir=true;LED1_ON();}}
                }
                else if(!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_13))//start
                {
                        DELAY_ms(5);
                        if(!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_13)){
                        Motor_Stop();
                        LED2_OFF();        
                        DELAY_ms(100);
                        LED2_ON();}
                }
                else if(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12))//1
                {
                        DELAY_us(100);
                        if(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)){
                        LED2_OFF();        
                        DELAY_ms(100);
                        LED2_ON();
                        Motor_KeepRun(MotorRight_Vertical,700,Forward,true);}
                }
                else if(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13))//2
                {
                        DELAY_ms(5);
                        if(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)){
                        LED2_OFF();        
                        DELAY_ms(100);
                        LED2_ON();
                        Motor_KeepRun(MotorRight_Horizontal,700,Backward,true);}
                }
                else if(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14))//3
                {
                        DELAY_ms(5);
                        if(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)){
                        LED2_OFF();        
                        DELAY_ms(100);
                        LED2_ON();
                        Motor_KeepRun(MotorRight_Vertical,700,Backward,true);}
                }
                else if(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15))//4
                {
                        DELAY_ms(5);
                        if(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)){
                        LED2_OFF();        
                        DELAY_ms(100);
                        LED2_ON();
                        Motor_KeepRun(MotorRight_Horizontal,700,Forward,true);}
                }


                if(SC2272_readVT()&&SC2272_readA())
                {
                        DELAY_ms(5);
                        if(SC2272_readVT()&&SC2272_readA()){
                        if(rad_dir)
                        {
                                if (l_rad>L_RAD_MIN) l_rad-=0.1;
                                else l_rad=L_RAD_MIN;
                        }
                        else
                        {
                                if (l_rad<L_RAD_MAX) l_rad+=0.1;
                                else l_rad=L_RAD_MAX;
                        }
                        RadMotor_Run(MotorLeft_Rad,50,l_rad);
                        LED2_OFF();
                        DELAY_ms(100);
                        LED2_ON();}
                }
                else if(SC2272_readVT()&&SC2272_readB())
                {
                        DELAY_ms(5);
                        if(SC2272_readVT()&&SC2272_readB()){
                        if(rad_dir)
                        {
                                if (r_rad>R_RAD_MIN) r_rad-=0.1;
                                else r_rad=R_RAD_MIN;
                        }
                        else
                        {
                                if (r_rad<R_RAD_MAX) r_rad+=0.1;
                                else r_rad=R_RAD_MAX;
                        }
                        RadMotor_Run(MotorRight_Rad,50,r_rad);
                        LED2_OFF();
                        DELAY_ms(100);
                        LED2_ON();}
                }
                else if(SC2272_readVT()&&SC2272_readC())
                {
                        DELAY_ms(5);
                        if(SC2272_readVT()&&SC2272_readC()){
                        if(rad_dir)
                        {
                                if (r_hand>R_HAND_MIN) r_hand-=0.1;
                                else r_hand=R_HAND_MIN;
                        }
                        else
                        {
                                if (r_hand<R_HAND_MAX) r_hand+=0.1;
                                else r_hand=R_HAND_MAX;
                        }
                        RadMotor_Run(MotorRight_Hand,50,r_hand);
                        LED2_OFF();
                        DELAY_ms(100);
                        LED2_ON();}
                }
                else if(SC2272_readVT()&&SC2272_readD())
                {
                        DELAY_ms(5);
                        if(SC2272_readVT()&&SC2272_readD()){
                        if(rad_dir)
                        {
                                if (l_hand>L_HAND_MIN) l_hand-=0.1;
                                else l_hand=L_HAND_MIN;
                        }
                        else
                        {
                                if (l_hand<L_HAND_MAX) l_hand+=0.1;
                                else l_hand=L_HAND_MAX;
                        }
                        RadMotor_Run(MotorLeft_Hand,50,l_hand);
                        LED2_OFF();
                        DELAY_ms(100);
                        LED2_ON();}
                }
  }
}
#ifdef USE_FULL_ASSERT
/*******************************************************************************
* Function Name  : assert_failed
* Description    : Reports the name of the source file and the source line number
*                  where the assert_param error has occurred.
* Input          : - file: pointer to the source file name
*                  - line: assert_param error line source number
* Output         : None
* Return         : None
*******************************************************************************/
void assert_failed(uint8_t* file, uint32_t line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {}
}
#endif

本作品中内容未经作者同意,禁止转发及用于商业用途,否则后果自行承担。
本作品知识产权归安徽工业大学相关项目负责团队所有。

其他作品
69888发表于 2016-5-23 12:47:54 | 显示全部楼层
点赞,加油。支持
顺丰哇哇发表于 2016-5-15 00:18:12 | 显示全部楼层

支持一下
78563发表于 2016-5-15 00:16:35 | 显示全部楼层
支持一下
HERR发表于 2016-5-15 00:14:47 | 显示全部楼层
支持一下
爱花爱哇发表于 2016-5-15 00:11:17 | 显示全部楼层

赞一个,好棒
78674发表于 2016-5-15 00:08:50 | 显示全部楼层
赞一个,好棒
78787发表于 2016-5-15 00:04:44 | 显示全部楼层
支持,很厉害
文文wen发表于 2016-5-14 23:30:40 | 显示全部楼层
赞一个,好棒
小根根哇发表于 2016-5-14 23:28:53 | 显示全部楼层
赞一个,好棒
12下一页
返回列表