工控网首页
>

应用设计

>

仿生机器人制作之控制器

仿生机器人制作之控制器

2013/9/5 9:58:48

机器人普遍的定义就是在某机械结构上通过微电子技术进行自动控制的一个综合实体,其实就是机电一体化的应用表现。例如我们的家庭打印机就是一两维台坐标机器人,工厂里的数控加工中心就是一台三坐标机器人,甚至我们家里的VCD播放机的光头寻迹机构也是一台超小型的三维小机械人。机器人并不是什么神秘的家伙,从比较简单的智能玩具到复杂昂贵的火星探测机器人,它们一直存在于我们的生活当中并默默奉献,那么对于我们广大的业余电子爱好者来说,要DIY机器人也并不是件不可跨越的事情,其实我们不需要对谁去交待,我们没有压力,也不需要让谁去评分,我们只用自己的热情和创作幻想,用自己的知识来完成自己梦。机器人目前常见的可以分为轮式机器人,坐标机器人,仿生机器人三大类,其中仿生机器人是最为吸引人的一种,它的随动机构可以是电动机、气动、液压等,但由于工业应用的器件价格非常昂贵,几乎没有人在业余的要求下能承受得起这类价格,那么我们要在业余条件下DIY机器人就要另找“门路”。玩过航模的读者可能会认识一种叫“舵机”的随动机构(港、澳、台流行叫伺服电机),它其实就是一个直流小电机带上减速箱,并且在减速箱的输出轴上同步并联上一个电位器,让输出轴的转动同步带动电位器摆动来检测旋转角,由此完成闭环控制中的反馈检测。位置信息通过电位器分压检测后,和舵机外面的控制信号通过里面的比较电路进行比较,并且获得正反输出的控制电平来驱动双向的直流电机驱动电路,驱动电路的输出端当然就是接上舵机的小直流电机了,那么就完成了一个简单的闭环伺服电机控制系统。 

此主题相关图片如下:


此主题相关图片如下:



此主题相关图片如下:


此主题相关图片如下:


此主题相关图片如下:


标准的舵机有三条引线,分别为:电源(红)、地(黑)及控制(白)。电源线与地线用于提供内部的直流马达及控制线路所需的能源,电压通常介于4V-6V之间,控制线输入一个周期性的正向脉冲信号,这个周期性脉冲信号的高电平时间通常在0.5ms-2.5ms之间(要求较严格)。而低电平时间应在5ms到20ms间(并不很严格)。下表表示出一个典型的20ms周期性脉冲的正脉冲宽度与微型伺服马达的输出臂位置的关系:


此主题相关图片如下:



此主题相关图片如下:



我们要控制舵机的角度可以通过单片机产生一个上面规律的脉冲,通过改变脉冲的宽度就可以很方便地控制舵机的旋转角。
笔者在这里为广大爱好者提供了一个示范程序,程序代码为了适合不同型号的单片机进行跨平台移植,故采用C语言编写。目前C语言在单片机的应用上占了重要的地位,企业为了方便技术保留和交接,甚至要单片机开发人员必须用C来写程序。同样,C语言可以让开发人员把所有的精力放在程序的结构和算法上,而其用C来编写程序所编译出来的效率可以达到汇编语言的80% ,这使到笔者已经有好几年没用过汇编了。在当今产品开发上首先追求的是稳定性,其次才是功能性,可以说用C 语言开发大型单片机程序在稳定性方面站有绝对的优势。至于C语言的学习资料书店多得很,也很容易学,这也是计算机技术中必修的一门。
下面就以AVRmega8515为例子作一个带PC机串口通讯的最小单片机系统,AVRmega8515是ATMEL公司推出的高性能单片机,其外围引脚和51 单片机兼容,至于使用方法,读者可以到书店很容易就买到AVR系列单片机的书,这里鉴于篇幅限制,该单片机的使用技术可以参考《电子制作》的其它专栏。
在这里也要说明一下,电子爱好者想涉及到机器人制作范畴,那么单片机技术也是不可缺少的范畴,单片机在自学上其实也不算什么困难的事情,关键是你能否勤奋地熬过开始的头一个月,当你熬过了,你就发现前面突然海阔天空。掌握了单片机,在电子制作应用上是另外一个境界,而有电子功底的人学单片机,相信是件乐趣无穷的事情。

此主题相关图片如下:


此主题相关图片如下:


下面是以CodeVisionAVR 为编译器写的C语言的示范代码,该程序通过windows的超级终端来调整3台舵机的转动角。
/*****************************************************
编译器:CodeWizardAVR V1.24.3b Standard

项目: 3路舵机控制示范测试程序
版本: TEST V1
日期: 2005-6-6
作者: 罗建章                         
单位: 顺德职业技术学院--机电工程系                                
备注: 通过PC电脑的串口来控制舵机的旋转角试验,
单片机的PA0,PA1,PA2来接舵机控制端  

芯片  : ATmega8515L
时钟  : 8MHz
内存  : 小模式
扩展  : 0
堆栈  : 128 byte
*****************************************************/

#include   //器件库
#include      //延时函数库
#include      //标准I/O函数库
#include     //标准函数库

unsigned char m0,m1,m2;
unsigned char s,s1;  


// 单片机定时器0溢出中断服务程序段  
// 产生伺服电机动作所需要的脉宽
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{ TCNT0=0xBA;
  if(s  if(s  if(s  s++; 
  if(s>127)   //脉冲产生完成后关闭定时器0,打开定时器1
    { s=0; s1=0;
      TCCR0=0x00; TCCR1B=0x02; 
      TCNT1H=0xff; TCNT1L=0x59; } 
}

// 单片机定时器1溢出中断服务程序段  
// 产生0.5ms的开始脉宽和5ms以上的间隔脉宽
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{ 
#asm("wdr"); //喂狗
   TCNT1H=0xff; TCNT1L=0x59; s1++;
  if(s1<65) PORTA=PORTA&0B11111000;      //5ms以上的间隔脉宽
    else 
     {  PORTA=PORTA|0B00000111;          //0.5ms
        if(s1>70)        //脉冲产生完成后关闭定时器1,打开定时器0
        { TCCR1B=0x00;TCCR0=0x01;s1=0;TCNT0=0xBA;}
     }

}

void main(void)
{  unsigned char i,j,count=0;
   unsigned char c[3]; 
   unsigned int k;

// 设置A口为输出状态,并且初始值为低电平
PORTA=0x00; DDRA=0xFF;

// 设置B、C、D、E口为高阻输入状态,在该程序中不使用
PORTB=0x00; DDRB=0x00;
PORTC=0x00; DDRC=0x00;
PORTD=0x00; DDRD=0x00;
PORTE=0x00; DDRE=0x00;

//设置定时器0的时钟来源为系统晶体
//设置计数周期为8000KHZ,清空计数寄存器
TCCR0=0x00; TCNT0=0x00;  OCR0=0x00;  

//设置定时器1的时钟来源为系统晶体
//设置计数周期为1000KHZ,清空计数寄存器
TCCR1A=0x00; TCCR1B=0x02;
TCNT1H=0x00; TCNT1L=0x00;
ICR1H=0x00;  ICR1L=0x00;
OCR1AH=0x00; OCR1AL=0x00;
OCR1BH=0x00; OCR1BL=0x00;

//使能定时器
TIMSK=0x82;
                 
// 串口模数据:8个数据位,1个停止位,无奇偶效验
// 串口使能:发送、接收
// 串口模式:异步
// 串口速率:9600
UCSRA=0x02; UCSRB=0x18; UCSRC=0x86;
UBRRH=0x00; UBRRL=0x34; 

//设置模拟比较器
ACSR=0x80;
         
//使能看门狗,设置喂狗周期为 时钟/2048
WDTCR=0x1F; WDTCR=0x0F;

// 打开总中断
#asm("sei")
delay_ms(500);
putchar(0x0d);  putchar(0x0a); 
putsf("***********************************\r");   
putsf("*          3路舵机驱动小程序      *\r"); 
putsf("* 顺德职业技术学院    机电工程系  *\r");
putsf("*              罗建章             *\r");
putsf("***********************************\r"); 

while (1)
{  count=0;
   putsf("输入舵机编号(1~3):");  
   putchar(0x0d); 
n1:i=getchar();
   if((i<0x31)||(i>0x38))
     { putsf("error\r");
       putchar(0x0d);
       goto n1; 
     }
   putchar(i);
   i=i-0x30; 
   putchar(0x0d); putchar(0x0a); 
   putsf("输入舵机位置值(0~127),默认为0:");
   putchar(0x0d); 
   c[0]=0;c[1]=0;c[2]=0;
n2:j=getchar();
   if(j!=0x0d)
   { if((j<0x30)||(j>0x39)) 
     goto n2;
     else
     {  putchar(j);
        c[count++]=j;
        if(count<3)
        goto n2;
        else 
        goto n3;
     }      
   } 
n3:k=atoi(c); 
   if(k>127)
    {  putsf("---error\r"); putchar(0x0d);
       count=0; goto n2;
    }
   putsf("---OK\r");
   putchar(0x0d);

   switch (i)
   {  case 1: m0=k; break;
      case 2: m1=k; break;
      case 3: m2=k; break;

   }
}
}

使用很简单,就是用WINDOWS自带的超级终端,把速率调整到9600,8个数据位,1个停止位,无奇偶效验,无流量控制(握手协议Xon/Xoff),接上串口线,按照屏幕提示输入数据就可以直观地控制3台躲机的旋转角度。

一下为大家介绍一款笔者设计的24路机器人专用控制器,其主要是针对不懂单片机的读者来DIY机器人中使用,整体硬件基本和上面最少单片机系统一样,并且增加了一片以I2C总线通讯的24C256 EEPROM存储器,用来记录24路庞大的动作表,主控单片机也是采用AVRmega 8515,整个动作编程是以PC机的终端仿真器通过串口来实现。可同时控制24台舵机,并且能分别对台舵机进行速度控制,其中可以插入循环、延时指令。该控制器能让DIY机器人的制作者从繁琐的单片机编程中剥离出来,并且能让有PC机编程能力的读者进行二次开发。


此主题相关图片如下:

投诉建议

提交

查看更多评论
其他资讯

查看更多

自动化机床的故障排除技术浅析

安川焊接机器人编程

ABB机器人控制软件RobotWare应用手册SafeMove(英文)

ABB IRB7600 机器人维护信息

ABB IRC5P机器人培训教材