📄 vr_function.c
字号:
#include "Eagle_Lookaround.h"
#include "hardware.h"
extern int VR_PrevResult_Color;
extern int VR_PrevResult_Shape;
extern int VR_Result;
extern int VR_OverFlag;
extern int VR_PrevResult_CenterX;
extern int VR_PrevResult_CenterY;
extern int VR_PrevResult_AreaH;
extern int VR_PrevResult_AreaL;
extern int gActivated;
extern int R_PreColor;
extern int PlayFlag ;
extern int VR_TimeDeldy;
extern int VR_TimeFlag;
extern void PlayRespond(int Result);
//=================================================
//函数:VR_Search_Color()
//用途:调用
//描述:分辨物体的特征并采用语音播放
//参数:无
//返回:无
//==================================================
void VR_Search_Color(void)
{
VR_PrevResult_Color = 0; //变量初始化
VR_PrevResult_Shape = 0;
VR_OverFlag = 0;
LookAround_Initial(); // 初始化
while (VR_OverFlag!=1)
{
LookAround(); // 判断物体分辨是否结束
}
switch(VR_PrevResult_Color)
{
case C_Red:
PlayRespond(S_Red); // 播放是红色
VR_TimeFlag = 0;
VR_TimeDeldy = 0;
break;
case C_Green:
PlayRespond(S_Green); // 播放是绿色
VR_TimeFlag = 0;
VR_TimeDeldy = 0;
break;
case C_Blue:
PlayRespond(S_Blue); // 播放是兰色
VR_TimeFlag = 0;
VR_TimeDeldy = 0;
break;
case C_Yellow:
PlayRespond(S_Yellow); // 播放是黄色
VR_TimeFlag = 0;
VR_TimeDeldy = 0;
break;
default:
break;
}
switch(VR_PrevResult_Shape)
{
case C_Triangle: // 播放是三角形
PlayRespond(S_Triangle);
break;
case C_Circle: // 播放是圆形
PlayRespond(S_Circle);
break;
case C_Square: // 播放是正方形
PlayRespond(S_Square);
break;
case C_Rectangle: // 播放是长方形
PlayRespond(S_Rectangle);
break;
case C_Pentagon: // 播放是五角形
PlayRespond(S_Pentagon);
break;
default:
break;
}
}
//============================= 子函数结束 ============================
int Delay(int time);
int EagleGoFormer(int VR_Step);
int EagleGoBack(int Step);
int EagleTurnRight(int VR_Step);
int EagleTurnLeft(int VR_Step);
void EagleStopMotor(void);
//=================================================
//函数:VR_Chase_Ball()
//用途:调用
//描述:跟踪移动的红色物体,其他颜色的物体不跟踪
//参数:无
//返回:无
//==================================================
void VR_Chase_Ball(void)
{
int i,j,K;
VR_PrevResult_Color = 0; // 初始化
VR_PrevResult_Shape = 0;
VR_OverFlag = 0;
SP_Export(Port_IOB_Data,0x0000);
LookAround_Initial(); // 分辨物体的特征
while (VR_OverFlag!=1)
{
LookAround();
}
if (VR_PrevResult_Color == C_Red ) // 是否是红色的物体
{
PlayRespond(S_Yes); // 是红色物体做回答
PlayRespond(S_Red);
i = VR_PrevResult_Color;
LookAround_Initial();
VR_TimeFlag = 0;
VR_TimeDeldy = 0;
while (i == C_Red ) // 一直跟踪红色的物体
{
Find_Color_Shape(); // 分辨一个物体的特征
i = VR_PrevResult_Color;
if ( VR_PrevResult_CenterX < 30) // 30H<水平距离<70H 在视野内
{
// EagleTurnRight(1); // 水平距离<30H右移动
EagleTurnLeft(1); // 水平距离>70H左移动
}
else if ( VR_PrevResult_CenterX >70)
{
// EagleTurnLeft(1); // 水平距离>70H左移动
EagleTurnRight(1); // 水平距离<30H右移动
}
else
{
j = VR_PrevResult_AreaH<<8; // 空间位置判断
j = j + VR_PrevResult_AreaL;
EagleStopMotor();
if ( j <2000)
EagleGoFormer(1); // 物体移动远了则向前
// EagleGoBack(1); // 物体移动近了则向后
else if ( j >3000)
// EagleGoFormer(1); // 物体移动远了则向前
EagleGoBack(1); // 物体移动近了则向后
else
EagleStopMotor(); // 在视野范围内电机不工作
}
}
PlayRespond(S_Bingo); // 分辨不到物体就结束跟踪
VR_TimeFlag = 0;
VR_TimeDeldy = 0;
}
else
{
VR_TimeFlag = 0; // 不是红色的物体的跟踪说NO
VR_TimeDeldy = 0;
PlayRespond(S_No);
PlayRespond(S_No);
}
}
//======================== 子函数结束 ===========================
//=================================================
//函数:Delay(int time)
//用途:调用
//描述:延时
//参数:无
//返回:无
//==================================================
int Delay(int time)
{
if (VR_TimeDeldy == time) VR_TimeFlag = 1; //延时时间到置标志
}
//============================= 直流电机控制 ============================
//描述:
// IOB10 IOB11 IOB12 IOB13
// 左电机 左电机 右电机 右电机
// 1 0 0 1 后进0x2400
// 0 1 1 0 前拐0x1800
// 1 0 1 0 左拐0x1400
// 0 1 0 1 右退0x2800
// 0 0 0 0 停止0x0000
//======================== 2003.11.11 chengjie ======================
//=================================================
//函数:EagleGoFormer(int VR_Step)
//用途:调用
//描述:驱动电机前进
//参数:无
//返回:无
//==================================================
int EagleGoFormer(int VR_Step) //前进
{
unsigned int i,j ;
for(j=0;j<VR_Step;j++)
{
// * ClearWatchdog = 0x0001;
SP_Export(Port_IOB_Data,C_GoFormer);
VR_TimeFlag = 0;
VR_TimeDeldy = 0;
while (VR_TimeFlag != 1) Delay(30);
SP_Export(Port_IOB_Data,0);
VR_TimeFlag = 0;
VR_TimeDeldy = 0;
while (VR_TimeFlag != 1) Delay(30);
}
}
//=================================================
//函数:EagleGoBack(int Step)
//用途:调用
//描述:驱动电机后退
//参数:无
//返回:无
//==================================================
int EagleGoBack(int Step) //倒退
{
int i,k ;
// * ClearWatchdog = 0x0001;
for(k=0;k < Step;k++)
{
SP_Export(Port_IOB_Data,C_GoBack);
VR_TimeFlag = 0;
VR_TimeDeldy = 0;
while (VR_TimeFlag != 1) Delay(30);
SP_Export(Port_IOB_Data,0);
VR_TimeFlag = 0;
VR_TimeDeldy = 0;
while (VR_TimeFlag != 1) Delay(30);
}
}
//=================================================
//函数:EagleTurnLeft(int VR_Step)
//用途:调用
//描述:驱动电机左转
//参数:
//返回:
//==================================================
int EagleTurnLeft(int VR_Step) //左转
{
int i,j ;
// * ClearWatchdog = 0x0001;
for(j=0;j<VR_Step;j++)
{
SP_Export(Port_IOB_Data,C_TurnLeft);
VR_TimeFlag = 0;
VR_TimeDeldy = 0;
while (VR_TimeFlag != 1) Delay(40);
SP_Export(Port_IOB_Data,0);
VR_TimeFlag = 0;
VR_TimeDeldy = 0;
while (VR_TimeFlag != 1) Delay(25);
}
}
//=================================================
//函数:EagleTurnRight(int VR_Step)
//用途:
//描述:
//参数:
//返回:
//==================================================
int EagleTurnRight(int VR_Step) //右转
{
int i,j ;
// * ClearWatchdog = 0x0001;
for(j=0;j<VR_Step;j++)
{
SP_Export(Port_IOB_Data,C_TurnRight);
VR_TimeFlag = 0;
VR_TimeDeldy = 0;
while (VR_TimeFlag != 1) Delay(40);
SP_Export(Port_IOB_Data,0);
VR_TimeFlag = 0;
VR_TimeDeldy = 0;
while (VR_TimeFlag != 1) Delay(25);
}
}
//=================================================
//函数:EagleStopMotor(void)
//用途:
//描述:
//参数:
//返回:
//==================================================
void EagleStopMotor(void)
{
SP_Export(Port_IOB_Data,0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -