搜索
bottom↓
回复: 28

双足机器

[复制链接]

出0入0汤圆

发表于 2012-8-8 17:25:48 | 显示全部楼层 |阅读模式



是个新手,视频传不上去。


第一次做双足,第一次参加比赛,机器跑完全程,对于我和它来说都是很大的胜利。嘿嘿。
2012Robocup标准竞速。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2012-8-8 17:28:04 | 显示全部楼层
    ://v.youku.com/v_show/id_XNDM2MjEwNjE2.html

出0入0汤圆

 楼主| 发表于 2012-8-8 17:29:39 | 显示全部楼层
在前面 再加http

出0入0汤圆

 楼主| 发表于 2012-8-8 17:31:49 | 显示全部楼层
/*---------------------------------------------------------------------*/
/*
函 数 名:         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[0] = (uint16)(GPIO2->DATA);
        back_data[0] = (uint16)(GPIO1->DATA);

        back_data[0]        &=~(1<<6);                                         //P1_6 7 为串口的口
        back_data[0]         &=~(1<<7);
        back_data[0]        |= (GPIO1->DATA&(1<<10))>>4;//未完成
        back_data[0]         |= (GPIO1->DATA&(1<<11))>>4;
        for(i = 10;i<16;i++)
        {
                           front_data[0] &=~(1<<i);                        //十六字节剩下的位清零
                          back_data[0]  &=~(1<<i);
        }
}
#else
{
        uint16 count,i,data;
        front_data[0] =0;                                                          //防止出现Waring
        back_data[0] =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[0] |= data;
                               
                        }
                        else                                                                  //后8个数据是后脚的跟上
                        {
                                data<<=(i-8);                                         //同上。
                                back_data [0] |= data;
                        }
                }
                #else
                {
                         if( i < 4 )                                                //前面右边
                         {
                                         data<<=i;                               
                                        front_data[0] |= data;
                         }
                         else if( i >= 4&&i < 8)                        //后面右边
                         {
                                         data<<=(i-4);                               
                                        back_data [0] |= data;       
                         }
                         else if(i >= 8&&i < 12)                        //前面左边
                         {
                                           data<<=(i-4);                                       
                                        front_data[0] |= data;
                         }
                         else                                                                   //后面左边
                         {
                                         data<<=(i-8);                               
                                        back_data [0] |= data;       
                         }
                                
                }
                #endif
        }
        #if 1                                                                                 //根据队友焊接的红外 是低电平是黑线,还是高电平是黑线,是否选择条件编译
                                                                                                //还有个作用 当调试时候用 ,貌似最终要写1。
        {
                front_data[0] =(~(front_data[0]));
                back_data[0] =(~(back_data[0]));
        }
        #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
作    者:        路明
备    注:        有两种方法,前简单,采用前者
*/          
/*---------------------------------------------------------------------*/
uint8  Deal_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;                                                        //记录前脚的左右无信号的

                static  uint8 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[0],Back_Data[0],&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[0],Back_Data[0],&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;
}

出0入0汤圆

发表于 2012-8-26 00:41:11 | 显示全部楼层
支持楼主,共同学习~~

出0入0汤圆

 楼主| 发表于 2012-8-26 14:28:59 | 显示全部楼层
shawn0lee0 发表于 2012-8-26 00:41
支持楼主,共同学习~~

谢谢 共同加油~~~

出0入0汤圆

 楼主| 发表于 2012-8-26 14:48:31 | 显示全部楼层
http://v.youku.com/v_show/id_XNDM2MjEwNjE2.html

出0入0汤圆

发表于 2012-8-26 14:53:53 | 显示全部楼层
来看视频的 好厉害1

出0入0汤圆

 楼主| 发表于 2012-8-26 14:55:18 | 显示全部楼层
qq325600 发表于 2012-8-26 14:53
来看视频的 好厉害1

谢谢 嘿嘿。

出0入0汤圆

发表于 2012-9-12 21:47:20 | 显示全部楼层
问问,这个机器人沿着黑线走,是不是利用的智能小车循迹的原理。

出0入0汤圆

 楼主| 发表于 2012-9-13 07:41:23 | 显示全部楼层
回家吃饭 发表于 2012-9-12 21:47
问问,这个机器人沿着黑线走,是不是利用的智能小车循迹的原理。

嗯 是的。

出0入0汤圆

发表于 2012-9-18 22:46:41 | 显示全部楼层
好厉害啊。。。。学习了

出0入0汤圆

 楼主| 发表于 2012-9-25 16:52:45 | 显示全部楼层
fangzhiping 发表于 2012-9-18 22:46
好厉害啊。。。。学习了

共同学习~~~
头像被屏蔽

出0入0汤圆

发表于 2012-10-24 21:18:52 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2012-10-25 11:53:25 | 显示全部楼层
好厉害的东西,学习了!

出0入0汤圆

发表于 2012-10-25 12:28:40 | 显示全部楼层
问下LZ的机械部分造价在多少米~~?

出0入0汤圆

 楼主| 发表于 2012-11-4 17:33:33 | 显示全部楼层
skbljs2652 发表于 2012-10-25 12:28
问下LZ的机械部分造价在多少米~~?

1000

出0入0汤圆

 楼主| 发表于 2012-11-4 17:37:24 | 显示全部楼层
heiketiguo 发表于 2012-10-24 21:18
强大!追问楼主的舵机,控制器和总共的成本

2500 吧  机械可以自己做, 我的是商家免费赠给我的 我自己做的图纸给他了,我就花了1500 大部分是舵机的钱 一个70左右吧

出0入0汤圆

发表于 2012-11-6 13:18:43 | 显示全部楼层
这个好玩,它工作时的电流有多大?普通电池供电的?以前做过一个双足,可能是舵机不好,8 9 个舵机一起工作,要1A多的开关电源才撑得起。后来师弟们改善了程序和一些结构,也挺好看的。http://v.youku.com/v_show/id_XNDY5MzUxNjgw.html

出0入0汤圆

发表于 2012-11-15 18:58:11 | 显示全部楼层
hi,楼主,我现在要从零开始做双足机器人,18个舵机,已经能控制舵机,但是没有方向,不知道如何给角度值让其正常行走。目前只要让其开环向前行走就可以,给点意见或者是推荐些资料吧。。。

出0入0汤圆

发表于 2012-11-20 11:00:57 | 显示全部楼层
不错。 好玩友啊。

出0入0汤圆

发表于 2012-12-4 00:56:56 | 显示全部楼层
刚搞的四足    没资金了    求节省办法

出0入0汤圆

 楼主| 发表于 2012-12-5 16:30:13 | 显示全部楼层
Gost 发表于 2012-12-4 00:56
刚搞的四足    没资金了    求节省办法

玩一次 就够了  太耗钱了。

里面没有控制 很简单的。

做倒立摆 比较好 有技术含量

一级的 二级的 等

出0入0汤圆

 楼主| 发表于 2012-12-5 16:31:41 | 显示全部楼层
shuishuo615 发表于 2012-11-15 18:58
hi,楼主,我现在要从零开始做双足机器人,18个舵机,已经能控制舵机,但是没有方向,不知道如何给角度值让 ...

最好上位机  调试角度,
用C_++


安卓 用JAVA

出0入0汤圆

 楼主| 发表于 2012-12-5 16:32:33 | 显示全部楼层
zhaolei254 发表于 2012-11-20 11:00
不错。 好玩友啊。

哈哈哈 谢谢

出0入0汤圆

发表于 2012-12-10 13:45:01 | 显示全部楼层
a4516987 发表于 2012-12-5 16:31
最好上位机  调试角度,
用C_++

但那是静态的吧,动态走起来能平衡吗

出0入0汤圆

 楼主| 发表于 2012-12-10 15:36:25 | 显示全部楼层
shuishuo615 发表于 2012-12-10 13:45
但那是静态的吧,动态走起来能平衡吗

机器走路 有两种规划 一种是静态 一种是动态。
先玩好静态的,在做动态的,涉及到自控 比较难,现在我正搞 ,做的是三级倒立摆模型

出0入0汤圆

发表于 2013-1-1 11:10:19 | 显示全部楼层
楼主莫非工大人?

出0入0汤圆

 楼主| 发表于 2013-1-16 09:35:41 | 显示全部楼层
wuzhen_71 发表于 2013-1-1 11:10
楼主莫非工大人?

  不是 我是山东农大的, 好久没上阿莫了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-14 06:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表