aydali 发表于 2009-8-11 22:35:05

步进电机做双足机器人不合适

几个月前开始注意到本网站和其他网站介绍DIY机器人,兴趣大发,也想尝试动手自己做一个双足的。正好手头有几个从旧软驱和打印机上拆下的步进电机,心想,咱没钱买得起昂贵的舵机,何不因陋就简,就用这几个步进电机做一个试试呢。
    因为本人以前没有单片机基础,电子知识也知道不多,所以也算是边学边干。在本地买到两片89S52,前后做了三条ISP下载线,参考网上电路用2003驱动了6线4相步进电机,这两天刚刚用LB1838驱动4线2相软驱电机成功。其实最费时间和精力的是我参考声控楼道灯电路自己设计制作了一块声控板,用以启动和待机机器人。
    利用业余时间连续奋战了几个月,目前还是一堆散件,离整机拼装调试大概还要很多时日吧,哎~,自己都累得想要放弃了。

    体会到这个过程的困难之处,自己没有基础是一方面,最主要的是越到后来越发觉自己选择步进电机做双足机器人是不合适的,会带来很多麻烦。为题主要有两个:
    1.步进电机本身没有位置反馈。做机器人关节和头部驱动至少要有初始位置反馈才可以。
    2.步进电机单步转矩很小。做双足机器人,关节动作不需要太快的速度,活动也多是很小的角度范围,所以步进电机需要适当速度以获得转矩,然后用减速齿轮组降速驱动机器人才合适。

    我初步考虑加上槽型光偶以探测步进电机的初始位置,然后自制减速齿轮组以获得合适的速度和转矩。每个步进电机这样改装后,岂不就是自制的舵机吗!!!哈哈,绕了一圈还是得回到舵机。
   
    自己用步进电机拼装舵机会很大很丑陋不说,步进电机的控制线加上光偶的信号线,会远远多于舵机的控制线。

    我的经验结论就是:用步进电机做双足机器人不合适!

                                                                                    aydali    2009.08.11

deepsky 发表于 2009-9-2 13:38:48

步进电机+减速箱+编码器反馈=一样可以解决问题

TRINAMIC 发表于 2009-9-3 10:47:13

步进用在力矩不是很大的小型机器人中是最优的选择

aydali 发表于 2009-9-3 16:56:14

步进电机+减速箱+编码器,组装起来还是挺麻烦的。

TRINAMIC 发表于 2009-9-3 20:28:09

现在有现成的这样的电机啊,下面这个产品是德国的集成可控制+驱动+电机+编码器.
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_477590.gif
(原文件名:1.gif)

http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_477591.gif
(原文件名:2.gif)


TRINAMIC MONTION CONTROLL GERMANY
Chinese office
Gavy 13812617052

aydali 发表于 2009-9-8 22:07:13

目前看做机器人四肢关节动力的,还是舵机合适些。(尽管一提“舵机堆”这个词似乎有些贬低舵机方案缺乏技术含量的意思,呵呵,但比较后还是觉得使用舵机较为合适。)
    机器人四肢动作不需要太过精确,但动力扭矩要足够大,控制要简单,响应速度合适。从这些条件分析,舵机是最佳选材。

aydali 发表于 2009-9-28 22:22:44

近段时间单位工作特别忙,没有什么闲时间继续前面的工作。
    不过我一直没有放弃,从淘宝买的几个辉盛9克舵机这两天就要到了,会抽时间修改成舵机方案。

    请用过舵机的朋友传一些经验,大家觉得这个辉盛固定翼版9克舵机怎么样呢?做腿部动力够吗?另外控制电路有什么好建议吗?

xflqsw 发表于 2009-9-30 10:22:35

楼主经验不错,学习学习!

thomasdu 发表于 2009-10-4 12:43:18

德国那个贵吧,多少钱

aydali 发表于 2009-10-13 21:50:42


    这两天偷闲试了下网购的9g小舵机。发现两个问题:
      
      1.用S52单片机的P1.0做PPM信号驱动,需要上拉电阻。
      2.P1.0的信号只驱动一个舵机,动作很干净,没抖动,可是取P1.0信号同时驱动两个舵机,动作就不流畅,抖动还有噪声。分为P1.0和P1.1两路分别驱动也不行。

    有高手能帮助解答一下吗?尤其是问题2,不知道原因出在哪里。

    (声明:电源我用的是PC的ATX电源,况且是两个9g的小舵机,应该不是电源功率的问题。)

flyunlimit 发表于 2009-10-13 23:28:11

第一个问题,单片机的基础问题,自己重看手册去。第二个问题,电源处理,电容、电容、电容。

aydali 发表于 2009-10-14 21:12:07



    谢谢 flyunlimit 飞行无极限 解答,不过有疑问,ATX电源驱动小单片机板子加两个9g小舵机还需要电容滤波吗?

    今天调试的时候,发现问题2不是总出现,即使共用一个P1.0信号,偶尔也有两个舵机动作都很干净准确的时候。
    我会接受建议,先用电容给电源滤波试试看。

aydali 发表于 2009-10-25 21:25:03


    两腿能够挪动了,但是因为重心没有调整,所以迈不开步子。
    打算在两脚踝处增加调节重心的舵机。
    原来是用两个时钟中断分别驱动两个舵机,下面就需要在一个时钟中断里驱动多个舵机的尝试。

    哈,刚入门,各位高手不要见笑。

shaxiao163 发表于 2009-10-25 22:30:35

LZ那你不看看主板上(山寨主板除外)有多少电容么?
其一是主板对电源要求高
其二 ATX电源输出 拿示波器看看吧
不知道楼主的电源怎么样 不好说
看样子是不怎么样的

aydali 发表于 2009-11-3 21:44:37

;
    干扰舵机动作的原因找到了:电源线和信号线过长,接头过多且接触不牢所致。所以告诫其他网友调试时要尽量布线合理,接头要牢。

aydali 发表于 2009-11-3 21:52:24


    这两天试着用一个时钟中断驱动多个舵机,自己设计的中断程序,发现中断响应时间太长,控制精度不高。

    今晚在别的地方搜到一个控制8路舵机的c程序,觉得思路很好,摘录如下,明天参考这个修改试一试。

    -----------------------------
# include<REG51.h>
# define uchar unsigned char
# define uint unsigned int
sbit dl=P1^0;
sbit d2=P1^1;
sbit d3=P1^2;
sbit d4=P1^3;
sbit d5=P1^4;
sbit d6=P1^5;
sbit d7=P1^6;
sbit d8=P1^7;

uint order1;
uint t1,t2,t3,t4,t5,t6,t7,t8;
void timer0(void) interrupt 1 using 1
{
switch(order1)
{
case 1: dl=1;
         TH0=-t1/256;
         TL0=-t1%256;
         break;
case 2: dl=0;         
         TH0=-(2700-t1)/256;
         TL0=-(2700-t1)%256;               
         break;
case 3: d2=1;
         TH0=-t2/256;
         TL0=-t2%256;
         break;
case 4: d2=0;
         TH0=-(2700-t2)/256;
         TL0=-(2700-t2)%256;
         break;
case 5: d3=1;
         TH0=-t3/256;
         TL0=-t3%256;
         break;
case 6: d3=0 ;
         TH0=-(2700-t3)/256;
         TL0=-(2700-t3)%256;
         break;
case 7: d4=1;
         TH0=-t4/256;
         TL0=-t4%256;
         break;
case 8: d4=0;
         TH0=-(2700-t4)/256;
         TL0=-(2700-t4)%256;
         break;
case 9:d5=1;
         TH0=-t5/256;
         TL0=-t5%256;               
         break;
case 10: d5=0;
         TH0=-(2700-t5)/256;
         TL0=-(2700-t5)%256;
          break;
case 11: d6=1;
          TH0=-t6/256;
          TL0=-t6%256;
          break;
case 12: d6=0;
          TH0=-(2700-t6)/256;
         TL0=-(2700-t6)%256;
          break;
case 13: d7=1;
          TH0=-t7/256;
          TL0=-t7%256;
          break;
case 14:d7=0;
         TH0=-(2700-t7)/256;
         TL0=-(2700-t7)%256;
         break;
case 15: d8=1;
         TH0=-t8/256;
         TL0=-t8%256;
         break;
case 16:d8=0;
         order1=0;
         TH0=-(2700-t8)/256;
         TL0=-(2700-t8)%256;
         break;
default : order1=0;
}
order1++;
}


void main(void)
{
TMOD =0x11;
order1=1;
TH0=-1500/256;
TL0=-1500%256;
EA=1;EX0=0;
ET0=1; TR0=1;PT0=1;PX0=0;
t1=1500;
t2=1000;
t3=1500;
t4=1000;
t5=1750;
t6=2000;
t7=2500;
t8=2000;
while(1)
{
}
}

dragonzcy 发表于 2009-11-4 21:10:05

辉盛9g舵机扭力1.5KG左右,做双足会不会太小?也考虑过用这个呢,便宜哈。盼LZ的实验经验共享。

zajia 发表于 2009-11-22 21:34:28

楼主, 上舵机的图片看看, 顺便哪里买的,几个米?

aydali 发表于 2009-11-30 19:53:25


    这段时间忙里偷闲地干,终于算是能走起来了。虽然步态不算好看,但毕竟是有了质的变化。
    我的四自由度双足用的就是如图辉盛9g固定翼版小舵机,最便宜的那种,所以力量也很勉强。

    http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_509199.jpg
辉盛9g舵机 (原文件名:辉盛9g舵机.jpg)

aydali 发表于 2009-11-30 19:59:16


    要公布也要起码像那么回事才行啊,所以这两天还在调试完善程序,会尽快上传我的1号“东东”的照片和视频。

aydali 发表于 2009-12-10 22:25:28


    四自由度方案本身确实有难度,再者板子和电池都是每次写完程序后临时挂在机身上的,所以重心不确定,不太好调。这几天也是绑来绑去,不知道板子和电池如何固定好。
    编排了一段表演动作,单腿平衡、踢球、慢走、快走、退着走。还有声控启动和随时暂停。声控已通过,几个动作里退着走一直很满意,就是前面几个动作还不稳定,还在调整组装结构。得出体会:造型结构中重心的位置是关键。

aydali 发表于 2009-12-22 19:50:04


    终于可以上传我的第一个机器人照片和视频了,虽说样子看起来有点简陋,毕竟是第一个试制机器人,能够走起来已经很高兴了。
    先传照片,视频在土豆网审核处理阶段,待后续传上视频地址。
   

    http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_517563.JPG
我的第一个四自由度机器人 (原文件名:上传.JPG)

flyunlimit 发表于 2009-12-22 19:57:57

能动手做的就是好同志,鼓励。

aydali 发表于 2009-12-22 20:01:07


   视频可以看了。
   这是我试做的第一个机器人,四自由度的。表演动作:单腿平衡,踢球,慢走,快走,退着走。可以声控启动,也可以声控随时停止。
   http://www.tudou.com/programs/view/xlwMornSgmg/

guozs1984 发表于 2010-2-10 15:55:53

mark

zs5577517 发表于 2011-4-27 16:50:10

回复【8楼】thomasdu
-----------------------------------------------------------------------

想请教下4个伺服电机是用什么芯片来驱动的呢?ULN2003嘛?

donghao2154 发表于 2011-4-29 11:07:37

回复【22楼】aydali
-----------------------------------------------------------------------

楼主你好,我看了你的这个机器人,也想自己做个,可不可以给我点知道,加我QQ:591390921

jrcsh 发表于 2011-4-29 11:29:48

回复【22楼】aydali

    终于可以上传我的第一个机器人照片和视频了,虽说样子看起来有点简陋,毕竟是第一个试制机器人,能够走起来已经很高兴了。
    先传照片,视频在土豆网审核处理阶段,待后续传上视频地址。
   
   

我的第一个四自由度机器人 (原文件名:上传.jpg)

-----------------------------------------------------------------------

~~~非常好 很恶劣

aydali 发表于 2011-4-30 00:00:11

【28楼】 jrcsh 邪恶的小会会

~~~非常好 很恶劣

没懂,请教,呵呵。

aydali 发表于 2011-4-30 00:06:28

【27楼】 donghao2154


    近段时间在忙“数码舵机机器人开发系统”上位机编制。这个是刚学几个月单片机时的成果,AT89S52程序,程序不是很规范,呵呵,所以一直犹豫没上传。放很久了,下周有空传上来给需要的朋友。

donghao2154 发表于 2011-5-1 13:02:51

好的,谢谢楼主

aydali 发表于 2011-5-3 12:55:34

#include <reg51.h>
                                 
#defineuint unsigned int
#defineuchar unsigned char
#definetimexiuzheng 11.0592/12
#defines20ms 20000*timexiuzheng

sbit jp0=P1^0;
sbit jp1=P1^1;
sbit jp2=P1^2;
sbit jp3=P1^3;
sbit jp4=P1^4;
sbit jp5=P1^5;
sbit jp6=P1^6;
sbit jp7=P1^7;
sbit jp20=P2^0;
sbit jp24=P2^4;

bitbt0=0;
bitbt1=0;
bitbg=0,bx=0;

uint jptmid,jps;
uint jpth,jptl;
uint bumc;       

char bxz=0;
uchar order=0,ti1=0,jiz=0,ftz=0,sdm=0,sdk=0,hti,sy=0;
uintdms,sd,bi,ji,feetz,feety,zuoyi,youyi,buh,bum;


void time0() interrupt 1   using 1
{           
           TH0=jpth;TL0=jptl;

           switch (order++){                     
           case 0:                
                jp0=1;                                        
                break;
           case 1:
                jp0=0;                            
                break;          
           case 2:                
                jp1=1;                                        
                break;
           case 3:
                jp1=0;                            
                break;          
          case 4:                
                jp2=1;                                        
                break;
           case 5 :
                jp2=0;                            
                break;          
           case 6:                
                jp3=1;                                        
                break;
           case 7:
                jp3=0;                            
                order=0;
                break;                                       
           }       
}


void time1() interrupt 3 using 2                //100us
{
       
        if(!bx&&!bg){if(jp24){jp20=1;        bx=1;}}
                                  
        if (bt1){
          if (ti1++==10){
                  if(!dms--)bt1=0;         //dmsms
                        ti1=0;                  
                }
        }      

}

void delay(unsigned int ms)
{
   dms=ms;ti1=0; bt1=1;
   while(bt1);
}

void jpc(uchar jn,uint jp)
{
       
        jptmid=(jp*timexiuzheng);
        jpth=-(jptmid/256);
        jptl=-(jptmid%256);               
       
        jps=s20ms/4-7-jptmid;
        jpth=-(jps/256);
        jpth=-(jps%256);

}

void you(uint jd)
{
      while(feetz>bumc-jd){
       feetz-=ftz; feety-=ftz;
         jpc(3,feetz);jpc(2,feety);
       delay(sd);
      }
      while(feetz<bumc-jd){
       feetz+=ftz; feety+=ftz;
       jpc(3,feetz);jpc(2,feety);
       delay(sd);
      }
}

void zuo(uint jd)
{
      while(feetz<bumc+jd){
         feetz+=ftz; feety+=ftz;
       jpc(3,feetz);jpc(2,feety);
       delay(sd);
      }
      while(feetz>bumc+jd){
       feetz-=ftz; feety-=ftz;
       jpc(3,feetz);jpc(2,feety);
       delay(sd);
      }
}

void qian(uint jd)
{
      if (!bx){
              ji=bumc+jd;bi=bumc+jd;
                  jpc(0,ji);jpc(1,bi);
          }
}

void hou(uint jd)
{
      if(!bx){
              ji=bumc-jd;bi=bumc-jd;
                  jpc(0,ji);jpc(1,bi);
          }             
}

void guiwei()
{
      while(ji>bumc){
                     bi-=jiz;jpc(1,bi);
                        ji-=jiz;jpc(0,ji);
                        delay(sd);
          }
          while(ji<bumc){
                    bi+=jiz;jpc(1,bi);
                        ji+=jiz;jpc(0,ji);
                        delay(sd);
          }                       
}

void stop()
{
              guiwei();
      sd=20;
        if(feetz<bumc)zuo(0);
        else if(feetz>bumc)you (0);
        delay(50);                                                                                  
}                       

main() {
           
       TMOD=0x21;             
         TH0=-(1500/256); TL0=-(1500%256);   //1.5ms
       TR0=1;ET0=1;                  
       TH1=0xa4; TL1=0xa4;   
         TR1=1;ET1=1;
       EA=1;
               
       bumc=1500-30;
       bumc=1500-40;
       bumc=1500;
       bumc=1500+50;
       for(ji=0;ji<=3;ji++){
             jpc(ji,bumc);
       }       
               
       order=0;
       jp20=1;
               
       delay(5000);
       jp24=1;bx=1;
       while(jp24); while(!jp24);       while(jp24);
       jp20=0;                             
       
       buh=100;               
       youyi=130;       zuoyi=130;
   
         feety=bumc;               
       feetz=bumc;
       ji=bumc;
       bi=bumc;               
              
       jiz=10;ftz=5;
       bt0=1;bxz=0;
       bx=0;bg=1;
         sd=30;
       you(youyi);       
       //qian(400);
       while(ji<bumc+300){
             ji+=jiz;jpc(0,ji);
             bi+=jiz;jpc(1,bi);
             delay(sd);
       }
       delay(1000);
       you(youyi-30);
       //hou(0);
       while(ji>bumc){
          bi-=jiz;jpc(1,bi);
          ji-=jiz;jpc(0,ji);
          delay(sd);
       }
       
       delay(100);                       
       you(youyi);
       //hou(200);
       while(ji>bumc-300){
             bi-=jiz;jpc(1,bi);
             ji-=jiz;jpc(0,ji);
                 delay(sd);
       }
       delay(1000);
       //qian(0);
       while(ji<bumc){
               ji+=jiz;jpc(0,ji);
               bi+=jiz;jpc(1,bi);
               delay(sd);
       }                       
       {zuo(0); delay(3000);}
       zuo(zuoyi);
       qian(150);delay(1000);
       
       ji=bumc-200;jpc(0,ji);
       bi=bumc-300;jpc(1,bi);
       //zuo(zuoyi-30);
       delay(500);
                                      
       zuo(zuoyi-30);
       guiwei();bi=bumc;jpc(1,bi);
       you(0);
       bx=0;bg=0;
       delay(3000);
       while(1){
                     
             if(bx){ET1=0;while(jp24);while(!jp24) ;while(jp24);jp24=0;jp20=0; bx=0;bxz=0;ET1=1;}               
               buh=80; youyi=120;       zuoyi=120;
               sdm=4;sdk=2;
               switch (bxz)
               {
               case 0:                                                                     
                     jiz=4;ftz=2;
                     break;                       
               case 5:
                     jiz=6;ftz=3;
                     delay(3000);
                     break;                       
               case 20:                       
                     bxz=0;
                     jiz=4;ftz=2;
                     delay(3000);
                     break;
               }
                                                                                      
               sd=sdm;if(!bx)you(youyi);delay(10);
               sd=sdk;qian(buh);//else qian(buh);
               sd=sdm;if(!bx)zuo(30);        delay(10);
               guiwei();//delay(10);                       
               sd=sdm;if(!bx)zuo(zuoyi); delay(10);
               sd=sdk;hou(buh);
               sd=sdm;if(!bx)you(30);delay(10);
               guiwei();
               if(bx)stop();
               bxz=bxz+1;
               if (bxz==20&&!bx)
               {
                     delay(3000);
                     youyi=100;       zuoyi=80;
                     sdm=6;sdk=3;
                     jiz=10;ftz=5;                               
                     for(hti=0;hti<15;hti++)
                     {
                         if(bx)break;
                       sd=sdm;if(!bx)you(youyi);
                       sd=sdk;hou(70);                               
                       sd=sdm;if(!bx)zuo(20);delay(20);
                       guiwei();
                       sd=sdm;if(!bx)zuo(zuoyi);       
                       sd=sdk;qian(70);
                       sd=sdm;if(!bx) you(20);delay(20);
                       guiwei();
                     }

                     if(bx)stop();
                }                       
          }
}

aydali 发表于 2011-5-3 13:08:42

:
    1,11.0592MHz晶振。
    2,P1^0-P1^3 四个端口输出四路舵机控制信号。
    3,P2^0 是指示LED链接端。
    4,P2^4 是声控信号输入端。
    5,四个舵机分配:胯部两个做前后运动,脚踝两个做左右运动。
    6,电池是两款旧手机锂电池,分别做左右脚板。7805稳压到5V供电。
    7,可以看出,程序中四个舵机的中位是做了修正的。这跟具体的硬件结构关联,包括步行动作参数。不能直接拷贝应用,要结合自己做的机器人进行相应修改。
    8,时间久了,也没有注释习惯,所以很多参数我也忘记什么用了,呵呵。
    9,初学单片机时的程序,一定不是很规范,仅供参考。

zs5577517 发表于 2011-5-4 12:28:59

请教下52单片机P1口上拉电阻需要多少K的啊?4.7K 的可以吗?我也买了这种舵机准备开始做个了..P口是直接与控制线连接还是中间加个非门好一些呀?

aydali 发表于 2011-5-4 13:11:20

:
    我用了10K做上拉,4.7K应该可以。
    我是P口输出直接连舵机控制线。多P口同时输出时互相间有多大影响我还不很清楚,看有的文章说要加非门电路整形。这点希望高手指点下。

zs5577517 发表于 2011-5-4 21:14:12

回复【35楼】aydali
-----------------------------------------------------------------------

谢谢指点。。我用了6个舵机。双足结构已经弄好了。。开始弄程序了。。还望多多请教哇

zs5577517 发表于 2011-5-6 09:50:15

回复【35楼】aydali
-----------------------------------------------------------------------

我发现这个辉胜舵机如果定时0.1ms的话,就只能以0.1ms为步进移动,也就是45度/0.5ms=9度/0.1ms..这样的话每次移动最少也有9度,这样动作就很生硬了。。不知道有什么解决的方法呢?。。减少定时时间会不会增加单片机的负担呢?

aydali 发表于 2011-5-6 21:32:36

:
    time1是delay延时函数用的,time0才是舵机控制信号产生器。除了中断调用时的跳转指令延时,产生的舵机控制信号很精确的!

aydali 发表于 2011-5-6 21:35:09


    而且这个中断跳转延时我在jpc函数里也做了大致修正。

一介布衣哈哈 发表于 2012-7-5 14:00:14

不错,支持,其实胯部舵机不需要这样安装,你可以把舵机轴朝上安装,机器人会走得更稳。

一介布衣哈哈 发表于 2012-7-5 14:00:29

不错,支持,其实胯部舵机不需要这样安装,你可以把舵机轴朝上安装,机器人会走得更稳。

haoye 发表于 2012-8-30 08:39:24

楼主做的时间也挺长的啊。。。

赛文奥特曼 发表于 2013-7-24 11:17:08

谢谢楼主分享了
页: [1]
查看完整版本: 步进电机做双足机器人不合适