|
控制程序源代码
void DodgeEdge(void)
{
FindEdge(); // 开始检测边缘
while(g_edge_find_flag) // 如果到达边缘
{
MoveBack(15); // 机器人后退
FindEdge(); // 再次检测边缘
}
}
检测敌人:
temp16 = read_gpio(); // 红外传感器触发时输出为低
io_in = (uint8)(temp16>>8);
io_in &= (FIND_ENEMY_SENSOR); // #define FIND_ENEMY_SENSOR 0x80
if((io_in & FIND_ENEMY_SENSOR) == 0) // 检测传感器如检测到输入则再检测4次防止误判断
{
temp8++;
or(i = 0 ; i < 3 ; i++) // 120ms内检测再3次传感器累加值大于2即说明传感器输入有效
{delay(2); // 延时2*20=40ms
temp16 = read_gpio();
io_in = (uint8)(temp16>>8);
io_in &= (FIND_ENEMY_SENSOR); // 默认传感器触发时输出为低
if((io_in & FIND_ENEMY_SENSOR) == 0)
{
temp8++;
}
}
}
碰撞检测:
FindEnemy(); // 开始检测敌人
if(g_enemy_find_flag == 1) //前超声传感器检测到敌人
{
g_enemy_find_times = 0; //前超声传感器检测敌人次数初始为0
DodgeEdge(); // 开始检测边缘
MoveOn(20); // 前进驱赶敌人
FindEnemy();
}
else //即前后超声传感器都没检测到敌人
{
DodgeEdge(); // 开始检测边缘
TurnRight(3); // 转动一个角度
delay(10);
FindEnemy();
}
武术擂台赛机器人程序主函数说明如下 int main(void)
{
Sys_Init(); // 系统初始化
gpio_mode_set(IO_MODE); // 设置io口模式IO0-IO7全为输入IO8-IO15全为输出(1为输出0为输入)
write_gpio(g_io_value); // 设置io输出值及输入状态IO0-IO7输入使能由于电路原因。
// 输出为低时led才会亮IO8-IO15输出信号为低0。
g_find_redblock_mode = 1; //进入寻心模式
delay(10); //延时10x0.1s=1s
武术擂台攻击型机器人控制系统设计
30 FindRedBlockFirstTime();
while(TRUE) // TRUE,FALSE
{
while(g_find_redblock_mode) //进入寻心模式
{
FindblackBlock(); //寻找擂台黑色圆心
}
while(g_anti_enemy_mode) //进入寻找敌人攻击敌人模式
{
AntiEnemyAction(); //寻找并攻击敌人
}
}
while(FALSE) // 单模式调试用
{
AntiEnemyAction(); //寻找并攻击敌人
}
while(FALSE) // 单模式调试用
{
FindblackBlock(); //寻找擂台黑色圆心
}
}
机器人前行与后退;
void MoveOn(uint8 move_time) / /机器人前行
{
uint8 array_dc[8] = {0}; //定义机器人运动数组
array_dc[0] = 0;
array_dc[1] = 1 * move_time; //电机运动函数的分辨率为0.1s注意控制延时的长短
array_dc[2] = 0xFE; //左右前轮为12电机左右后轮为三四电机两两速度相反 rray_dc[3] = 1 * move_time;
array_dc[4] = 0;
array_dc[5] = 1 * move_time;
rray_dc[6] = 0xFE;
array_dc[7] = 1 * move_time;
dc_moto_control(array_dc);
delay(5 * move_time);
}
void MoveBack(uint8 move_time) //机器人后退
{
uint8 array_dc[8]={0};
array_dc[0]=0xFE;
array_dc[1]=1*move_time;
array_dc[2]=0;
array_dc[3]=1*move_time;
array_dc[4]=0xFE;
array_dc[5]=1*move_time;
array_dc[6]=0;
array_dc[7]=1*move_time;
dc_moto_control(array_dc);
delay(5*move_time);
}
机器人左右转转:
void TurnRight(uint8 move_time) //机器人右转
{
uint8 array_dc[8]={0};
array_dc[0]=0;
array_dc[1]=1*move_time;
array_dc[2]=0;
array_dc[3]=1*move_time;
array_dc[4]=0;
array_dc[5]=1*move_time;
array_dc[6]=0;
array_dc[7]=1*move_time;
dc_moto_control(array_dc);
delay(5*move_time);
}
void TurnLeft(uint8 move_time) //机器人3转
{
uint8 array_dc[8]={0};
array_dc[0]=0xFE;
array_dc[1]=1*move_time;
array_dc[2]=0xFE;
array_dc[3]=1*move_time;
array_dc[4]=0xFE;
array_dc[5]=1*move_time;
array_dc[6]=0xFE;
array_dc[7]=1*move_time;
dc_moto_control(array_dc);
delay(5*move_time);
}
|
|