这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 高校专区 » 湖北理工TEA » 23组【张**** 韩庆祥 】基于单片机的电位器线控机械手臂

共4条 1/1 1 跳转至

23组【张**** 韩庆祥 】基于单片机的电位器线控机械手臂

菜鸟
2015-04-22 23:50:53     打赏
制作机械手臂的初衷是想做出一个能模仿人的手臂活动的机械手臂,并且可以拿起移动一些质量较轻的物体。

设计思路是想利用单片机采集电位器上的变化,然后把采集到的信号通过转换输送给舵机,让舵机转换相同的角度。
进程:目前还有一些细节还需要讨论,舵机型号还未选定,不过会尽快定下来。




关键词: 23组     张****     韩庆祥          机械手臂    

菜鸟
2015-04-22 23:53:31     打赏
2楼
话说 张 明 慧 的名字怎么变成xxx了?

菜鸟
2015-05-25 01:15:57     打赏
3楼

现在手臂已经搭建完成,采用4个盛辉MG995舵机实现机械手臂的8自由度移动;还有一个机械爪重量较重,由于舵机的扭力不够,不能控制机械手臂保持原来的姿势,所以不准备装上了,这是舵机选择的失误。

控制采用的STC83C51单片机,由系统板和键盘构成,系统板和键盘都是自己手工焊的,舵机输出口定在P1口,键盘定在P0口,一共八个键盘实现4个舵机的左右旋转。

程序写的用两个定时器定时输出pwm波,通过检测键盘的高低点位来输出不同的pwm波程序如下:

#include<reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit pwm1=P1^0;//输出PWM信号
sbit pwm2=P1^1;//输出PWM信号
sbit pwm3=P1^2;
sbit pwm4=P1^3;
sbit key1 = P0^0;
sbit key2 = P0^1;
sbit key3 = P0^2;
sbit key4 = P0^3;
sbit key5 = P0^4;
sbit key6 = P0^5;   
sbit key7 = P0^6;
sbit key8 = P0^7;

uint pwm_value=1500;//初值为1.5ms
uint key=0xff;//初始化键盘
uint value[]={1500,1000,2000};

void delay_ms(uint x)
{
uint i;  
while(x--)for(i=0;i<125;i++);
}

void InitTimer(void)
{
TMOD=0x11;//开定时器0,1
TH0=-20000/256;//定时20MS,20MS为一个周期
TL0=-20000%256;

TH1=-1500/256;//定时1.5MS,这时舵机处于0度
TL1=-1500%256;

EA=1;//开总断
TR0=1;//开定时器0
ET0=1;
TR1=1;//开定时器1
ET1=1;

}

void timer0(void) interrupt 1//定时器0中断函数
{
pwm1=1;
pwm2=1;
pwm3=1;
pwm4=1;
TH0=-20000/256;
TL0=-20000%256;
TR1=1;
}

void timer1(void) interrupt 2//定时器1中断函数
{
TH1=-pwm_value/256;
TL1=-pwm_value%256;
TR1=0;
if((key1 ==0)||(key2 == 0))
{
pwm1=0;
pwm2=1;
pwm3=1;    
pwm4=1;

}
if((key3 ==0)||(key4 == 0))
{

{ pwm1=1;
pwm2=0;
pwm3=1;
pwm4=1;

}

if((key5 ==0)||(key6 == 0))
{
pwm1=1;
pwm2=1;
pwm3=0;
pwm4=1;

}
if((key7 ==0)||(key8 == 0))
{
pwm1=1;
pwm2=1;
pwm3=1;
pwm4=0;

}



}


void timer2(void) interrupt 3//定时器1中断函数
{
TH1=-pwm_value/256;
TL1=-pwm_value%256;
TR1=0;
if((key1 ==0)||(key2 == 0))
{
pwm1=0;
pwm2=1;
pwm3=1;
pwm4=1;

}
if((key3 ==0)||(key4 == 0))
{

pwm1=1;
pwm2=0;
pwm3=1;
pwm4=1;



if((key5 ==0)||(key6 == 0))
{
pwm1=1;
pwm2=1;
pwm3=0;
pwm4=1;

}
if((key7 ==0)||(key8 == 0))
{
pwm1=1;
pwm2=1;
pwm3=1;
pwm4=0;

}
}  

void main(void)//主函数
{
InitTimer();
pwm_value=1500;
while(1)
{  
if(key1==0) //检测按键K1是否按下
{
   delay_ms(10); //消除抖动
if(key1==0)
{
pwm_value=value[1];//通过数组就可以改变舵机的转角度

delay_ms(1000);
}
if(key1==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key1==0)
{
pwm_value=value[0];//通过数组就可以改变舵机的转角度

delay_ms(1000);
}
}

}
if(key2==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key2==0)
{
pwm_value=value[2];//通过数组就可以改变舵机的转角度

delay_ms(1000);
}
if(key2==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key2==0)
{
pwm_value=value[0];//通过数组就可以改变舵机的转角度

delay_ms(1000);
}
}

  }
/*****************************************************************************/
            if(key3==0) //检测按键K1是否按下
{
   delay_ms(10); //消除抖动
if(key3==0)
{
pwm_value=value[1];//通过数组就可以改变舵机的转角度

delay_ms(1000);
}
if(key3==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key3==0)
{
pwm_value=value[0];//通过数组就可以改变舵机的转角度

delay_ms(1000);
}
}

}
if(key4==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key4==0)
{
pwm_value=value[2];//通过数组就可以改变舵机的转角度

delay_ms(1000);
}
if(key4==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key4==0)
{
pwm_value=value[0];//通过数组就可以改变舵机的转角度

delay_ms(1000);
}
}

  }
/********************************************************************************/
if(key5==0) //检测按键K1是否按下
{
   delay_ms(10); //消除抖动
if(key5==0)
{
pwm_value=value[1];//通过数组就可以改变舵机的转角度

delay_ms(1000);
}
if(key5==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key5==0)
{
pwm_value=value[0];//通过数组就可以改变舵机的转角度

delay_ms(1000);
}
}

}
if(key6==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key6==0)
{
pwm_value=value[2];//通过数组就可以改变舵机的转角度

delay_ms(1000);
}
if(key6==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key6==0)
{
pwm_value=value[0];//通过数组就可以改变舵机的转角度

delay_ms(1000);
}
}
}
/*****************************************************************************/
  if(key7==0) //检测按键K1是否按下
{
   delay_ms(10); //消除抖动
if(key7==0)
{
pwm_value=value[1];//通过数组就可以改变舵机的转角度

delay_ms(1000);
}
if(key7==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key7==0)
{
pwm_value=value[0];//通过数组就可以改变舵机的转角度

delay_ms(1000);
}
}

}
if(key8==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key8==0)
{
pwm_value=value[2];//通过数组就可以改变舵机的转角度

delay_ms(1000);
}
if(key8==0) //检测按键K1是否按下
{
delay_ms(10); //消除抖动
if(key8==0)
{
pwm_value=value[0];//通过数组就可以改变舵机的转角度

delay_ms(1000);
}
}

  }  
  
}
}
// 0是归0,即舵机的中间位置 1是左转45度(正面看)2是右转45度



菜鸟
2015-11-03 17:26:06     打赏
4楼
这个程序看的我毛骨悚然呀!玩玩可以产品NONONONO

共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]