双足机器
是个新手,视频传不上去。
第一次做双足,第一次参加比赛,机器跑完全程,对于我和它来说都是很大的胜利。嘿嘿。
2012Robocup标准竞速。 ://v.youku.com/v_show/id_XNDM2MjEwNjE2.html 在前面 再加http /*---------------------------------------------------------------------*/
/*
函 数 名: Get_InfData
功能描述: 获取红外数据
输入参数: uint16 *front_data(前脚数据8位),uint16 *back_data(后脚数
据8位)
返 回 值: /
日 期: 2012.7.11-2012.7.24
作 者: 路明
备 注: 1.里面第一预编译处理 用数据转换器 节省IO口
2.GPIO1_(6,7)原本是串口的 数据用GPIO1_(10,11) (没用)
3.自己规定就是 遇见黑线是高电平,如果数据不是,可以改变 程
序最后的条件编译。
4.最后一个条件编译整了我好长时间。原因我放错位置了。
*/
/*---------------------------------------------------------------------*/
void Get_InfData(uint16 *front_data,uint16 *back_data)
{
#ifndef _CODE_
{
uint8 i;
front_data =front_data; //防止出现Waring
back_data = back_data;
front_data = (uint16)(GPIO2->DATA);
back_data = (uint16)(GPIO1->DATA);
back_data &=~(1<<6); //P1_6 7 为串口的口
back_data &=~(1<<7);
back_data |= (GPIO1->DATA&(1<<10))>>4;//未完成
back_data |= (GPIO1->DATA&(1<<11))>>4;
for(i = 10;i<16;i++)
{
front_data &=~(1<<i); //十六字节剩下的位清零
back_data&=~(1<<i);
}
}
#else
{
uint16 count,i,data;
front_data =0; //防止出现Waring
back_data =0;
for(i = 0; i < 16; i++)
{
count = i; //i值给count
count &=0x0f; //只需要十个数据
count<<=4; //根据IO口使用移位
GPIO2->DATA &= ~(1<<4); GPIO2->DATA &= ~(1<<5); //清零 重要 , 不知道怎么总线写
GPIO2->DATA &= ~(1<<6); GPIO2->DATA &= ~(1<<7);
GPIO2->DATA |=count; //送给IO口
Delay_us(40); //等待数据转化完毕可更改 看74hc151数据手册
data =(GPIO2->DATA&(1<<8))>>8; //现将数据放在DATA中也就是一个位的数据 即0或1 先是第八位 然后转为第一位
#if 0 //两种数据安排方法,根据队友的焊接电路来选择~。
{
if(i < 8) //前10个数据是前脚的
{
data<<=i; //数据是第几个 即使front_data的数据中第几位就是编码
front_data |= data;
}
else //后8个数据是后脚的跟上
{
data<<=(i-8); //同上。
back_data |= data;
}
}
#else
{
if( i < 4 ) //前面右边
{
data<<=i;
front_data |= data;
}
else if( i >= 4&&i < 8) //后面右边
{
data<<=(i-4);
back_data |= data;
}
else if(i >= 8&&i < 12) //前面左边
{
data<<=(i-4);
front_data |= data;
}
else //后面左边
{
data<<=(i-8);
back_data |= data;
}
}
#endif
}
#if 1 //根据队友焊接的红外 是低电平是黑线,还是高电平是黑线,是否选择条件编译
//还有个作用 当调试时候用 ,貌似最终要写1。
{
front_data =(~(front_data));
back_data =(~(back_data));
}
#endif
}
#endif
}
/*---------------------------------------------------------------------*/
/*
函 数 名: Check_Inf_Black
功能描述: 检测脚步的黑数据有多少
输入参数: (uint16 front_data(前脚数据8位),uint16 back_data(后脚数据
8位),uint16 *quantity(存放黑数据多少))
返 回 值: /
日 期: 2012.7.23
作 者: 路明
备 注: 1.规定pquantity 4位 左前 4位 右前 4位 左后 4位 右后
2.就是关于位操作的优先顺序,搞了好长时间。
*/
/*---------------------------------------------------------------------*/
void Check_Inf_Black(uint16 front_data,uint16 back_data,uint16 *pquantity)
{
uint16 i ,data1=0,data2=0,data3=0,data4=0;
uint16 fd,bd;
fd = (uint8)front_data;
bd =(uint8)back_data ;
for( i = 0; i < 4; i++)
{
data1 += fd&(1<<0); // 右前
data2 += bd&(1<<0); // 右后
fd>>=1;
bd>>=1;
}
for(i = 0; i< 4; i++)
{
data3 += fd&(1<<0); //左前
data4 += bd&(1<<0); //左后
fd>>=1;
bd>>=1;
}
*pquantity =(data3<<12)+(data1<<8)+(data4<<4)+(data2); //貌似括号必须加
}
/*---------------------------------------------------------------------*/
/*
函 数 名: Deal_InfData
功能描述:
输入参数: front_data(前脚数据8位),back_data(后脚数据8位)
返 回 值: 是否正确处理(1.正确,0.无应答)
日 期: 2012.07.22 - 2012.7.29
作 者: 路明
备 注: 有两种方法,前简单,采用前者
*/
/*---------------------------------------------------------------------*/
uint8Deal_InfData(uint16 front_data,uint16 back_data,uint8 *pack) //左拐是重点
{
uint8 flag_ack = 0 ; //收到信号返回应答信号确认标志
uint8 flag_comp = 0; //完成动作的标志位
// static uint8 flag_state = 0; //上次运行状态值
static uint8 station_none = 0; //记录前脚的左右无信号的
staticuint8 last_state_l,last_state_r; //记录左右 有无数据的,即 无信号时候前个状态
uint8 flag_station = 1;
// flag_ack = flag_ack; //防止 Warning~
if((FORNT_LE_Q !=0)||(FORNT_RI_Q !=0)) //即是 正常运行 左脚或右脚 能检测到。
/*=================================正常运行====================================*/
/*
1.直线运行。
2.左拐加前进运行。 (优先权) 即在两只脚都有信号时候,按左拐弯来。
3.右拐加前进运行。
*/
{
// UART_Send_Byte('a');
flag_station = 1; //有信号记录为下次做准备。
station_none = 0; //非正常状态值 清零
if(((FORNT_LE_03 == 0)&&(FORNT_LE_04 == 0)&&(FORNT_RI_03 == 0)&&(FORNT_RI_04 == 0) //情况1:正常运行
&&(FORNT_LE_02 == 0)&&(FORNT_RI_02 == 0))&&((FORNT_LE_01 != 0)||(FORNT_RI_01 != 0)))
{
flag_ack = GO_Ahead(1,pack,80);
flag_comp = 1;
// flag_state =1;
}
else if((FORNT_LE_02 != 0)||(FORNT_LE_03 != 0)||(FORNT_LE_04 != 0)) //情况2:左拐加前进 左拐有优先权
{
flag_ack = Turn_Left(10,pack,80);
flag_comp = 1;
// flag_state =2;
}
else if((FORNT_RI_02 != 0)||(FORNT_RI_03 != 0)||(FORNT_RI_04 != 0)) //情况3:右拐加前进
{
flag_ack = Turn_Right(10,pack,80);
flag_comp = 1;
// flag_state =3;
}
}
/*=================================非正常运行====================================*/
/*
1. 内线切过多,机器无法回来。
2. 外线切过多,机器无法回来。
3.线在中间没有踩到。
*/
else
{
flag_station = 0; // 不获取状态值
station_none++; // 记录非状态数目 最多2次
if((last_state_l ==0)&&(last_state_r != 0)&&(station_none ==2)) //情况1: 即内线跑 并跑出两步了。
{
while(FORNT_Q ==0)
{ //使劲往右拐。 直到右边检测到
flag_ack = Turn_Right(10,pack,80);
Get_InfData(Fron_Data,Back_Data); //读取红外数据
Check_Inf_Black(Fron_Data,Back_Data,&Quantity_Inf); //分析红外数据 分组
}
flag_station = 1; //记录状态标志位置位 恢复正常~~
flag_comp = 1; //完成动作标志位
station_none = 0; //非正常状态 清零
goto end ;
}
else if((last_state_l !=0)&&(last_state_r == 0)&&(station_none ==2)) //情况2: 即在外线跑并多出跑两步了,可设定。
{
while(FORNT_Q ==0)
{ //使劲往左拐。 直到左边检测到
flag_ack = Turn_Left(10,pack,80);
Get_InfData(Fron_Data,Back_Data); //读取红外数据
Check_Inf_Black(Fron_Data,Back_Data,&Quantity_Inf); //分析红外数据 分组
}
flag_station = 1; //记录状态标志位置位
flag_comp = 1; //完成动作标志位
station_none = 0; //非正常状态 清零
goto end ;
}
}
if(flag_comp == 0) // 无检测就直行 两种 一种就是没有进入正常运行,而是进入非正常运行时候没运行强行信号
{
flag_ack= GO_Ahead(1,pack,80);
}
if(flag_station == 1) //未进入 不正常状态时候 时时检测为下面准备
{
last_state_l = FORNT_LE_Q; //更新数据的
last_state_r = FORNT_RI_Q; //同上用于上面的 非正常处理;
}
end: return flag_ack;
} {:smile:}支持楼主,共同学习~~ shawn0lee0 发表于 2012-8-26 00:41 static/image/common/back.gif
支持楼主,共同学习~~
谢谢 共同加油~~~ http://v.youku.com/v_show/id_XNDM2MjEwNjE2.html 来看视频的 好厉害1 qq325600 发表于 2012-8-26 14:53 static/image/common/back.gif
来看视频的 好厉害1
谢谢 嘿嘿。 问问,这个机器人沿着黑线走,是不是利用的智能小车循迹的原理。 回家吃饭 发表于 2012-9-12 21:47 static/image/common/back.gif
问问,这个机器人沿着黑线走,是不是利用的智能小车循迹的原理。
嗯 是的。 好厉害啊。。。。学习了 fangzhiping 发表于 2012-9-18 22:46 static/image/common/back.gif
好厉害啊。。。。学习了
共同学习~~~ 好厉害的东西,学习了! 问下LZ的机械部分造价在多少米~~? skbljs2652 发表于 2012-10-25 12:28 static/image/common/back.gif
问下LZ的机械部分造价在多少米~~?
1000 {:smile:}{:smile:} {:smile:} {:smile:} heiketiguo 发表于 2012-10-24 21:18 static/image/common/back.gif
强大!追问楼主的舵机,控制器和总共的成本
2500 吧机械可以自己做, 我的是商家免费赠给我的 我自己做的图纸给他了,我就花了1500 大部分是舵机的钱 一个70左右吧 这个好玩,它工作时的电流有多大?普通电池供电的?以前做过一个双足,可能是舵机不好,8 9 个舵机一起工作,要1A多的开关电源才撑得起。后来师弟们改善了程序和一些结构,也挺好看的。http://v.youku.com/v_show/id_XNDY5MzUxNjgw.html hi,楼主,我现在要从零开始做双足机器人,18个舵机,已经能控制舵机,但是没有方向,不知道如何给角度值让其正常行走。目前只要让其开环向前行走就可以,给点意见或者是推荐些资料吧。。。 不错。 好玩友啊。 刚搞的四足 没资金了 求节省办法 Gost 发表于 2012-12-4 00:56 static/image/common/back.gif
刚搞的四足 没资金了 求节省办法
玩一次 就够了太耗钱了。
里面没有控制 很简单的。
做倒立摆 比较好 有技术含量
一级的 二级的 等 shuishuo615 发表于 2012-11-15 18:58 static/image/common/back.gif
hi,楼主,我现在要从零开始做双足机器人,18个舵机,已经能控制舵机,但是没有方向,不知道如何给角度值让 ...
最好上位机调试角度,
用C_++
安卓 用JAVA zhaolei254 发表于 2012-11-20 11:00 static/image/common/back.gif
不错。 好玩友啊。
哈哈哈 谢谢 a4516987 发表于 2012-12-5 16:31 static/image/common/back.gif
最好上位机调试角度,
用C_++
但那是静态的吧,动态走起来能平衡吗 shuishuo615 发表于 2012-12-10 13:45 static/image/common/back.gif
但那是静态的吧,动态走起来能平衡吗
机器走路 有两种规划 一种是静态 一种是动态。
先玩好静态的,在做动态的,涉及到自控 比较难,现在我正搞 ,做的是三级倒立摆模型 楼主莫非工大人? wuzhen_71 发表于 2013-1-1 11:10 static/image/common/back.gif
楼主莫非工大人?
不是 我是山东农大的, 好久没上阿莫了
页:
[1]