三轴机械臂(佛科院——深夜学习)

目录

前言

一、机械爪的拼装:

1.获取相关的模组三维文件:

2.查看模组三维文件:

二、具体步骤:

1.180°和270°舵机的使用:

2.按键控制代码:

总结:


前言

本文中的是基于机器谱的机械零件与三维文件拼装而成的,详情可登录机器谱官网查看机器谱 (robotway.com)https://www.robotway.com/

控制器使用的是STC89C52


一、机械爪的拼装:

1.获取相关的模组三维文件:

机器谱 (robotway.com)https://www.robotway.com/h-col-122.html

2.查看模组三维文件:

我们可以使用追光几何来查看

追光几何(EverCraft)-创新高效的3D图纸管理与协作平台追光几何(EverCraft)是一款3D图纸管理和多人协作设计平台,帮助设计师团队更好地管理图纸和提升工作效率。追光几何采用版本形式管理图纸,清晰直观,方便查找文件。追光几何支持在线查看3D模型,多端文件同步,图纸在线评审标注一键分享,大幅提升团队沟通效率。https://evercraft.co/

具体方法可查看我之前的文章

(8条消息) 如何使用追光几何查看三维文件(佛科院——深夜学习)_佛科院深夜学习的博客-CSDN博客https://blog.csdn.net/weixin_63568691/article/details/128151682?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167003340916782425680832%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=167003340916782425680832&biz_id=0&utm_medium=distribute.pc_chrome_plugin_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-5-128151682-null-null.nonecase&utm_term=%E8%BF%BD%E5%85%89%E5%87%A0%E4%BD%95&spm=1018.2226.3001.4187

二、具体步骤:

1.180°和270°舵机的使用:

(8条消息) 180度和270度舵机的使用(佛科院——深夜学习)_佛科院深夜学习的博客-CSDN博客https://blog.csdn.net/weixin_63568691/article/details/128158250

2.按键控制代码:

#include <reg52.h>
#include <intrins.h>
sbit X_PWM = P3^5;  //设定PWM输出的I/O端口
sbit Y_PWM = P3^4; 
sbit Claw_PWM = P3^7; 

sbit X_Up = P2^0;
sbit X_Down = P2^1;
sbit Y_Up = P2^2;
sbit Y_Down = P2^3;
sbit Claw_OPEN = P2^4;
sbit Claw_CLOSE = P2^5;
sbit led = P2^7;

unsigned char count = 0;
unsigned char timer1 ;
unsigned char ITR_Over = 0 ;
unsigned char Time_sign;

unsigned char X_move_num;
unsigned char Y_move_num;
unsigned char Claw_move_num;
#define X_sign 1;
#define Y_sign 2;
#define Claw_sign 3;
/*
对于180°舵机
占空比变化范围:t = 0.5ms——>t = 2.5ms
变化最小间隔:0.5ms
*/

/*
对于270°舵机
占空比变化范围:t = 0.5ms——>t = 2.5ms
变化最小间隔:0.1ms
*/
 
void delay(unsigned int timeout)   //误差 0us
{
	while(timeout--)
    _nop_();  //if Keil,require use intrins.h
}
void Timer0_Init();   
void Arm_Init();
void x_axis();
void Y_axis();
void Claw();
void main()
{
	Timer0_Init();
	Arm_Init();//机械臂归中
	while(1)
	{
		x_axis();
		Y_axis();
		Claw();
	}
}
 
/*定时器T0初始化*/
void Timer0_Init()           
{
	unsigned char I_time;
	TMOD |= 0x02; //定时器T0设置8位重装载

	I_time=92;
	TH0 = 256-I_time;   //定时常数 0.1ms 晶振为11.0592MHz
	TL0 = 256-I_time;

	ET0 = 1;      
	TR0 = 1; 
	EA=1; 
}
	
/*T0中断初始化*/
void Time0_Init() interrupt 1 
{
  switch(Time_sign)//选择控制哪个电机转动
	{
		case 1 : 
			if(count <= timer1 && count > 0) //确定高电平时间
			{ 
				X_PWM = 1; 
			}
			else 
			{ 
				X_PWM = 0; 
			}
			count++;
			if(count >= 200)    //T = 20ms清零
			{ 
				count = 0; 
				ITR_Over=1;
			}	
		break;
		case 2 : 
			if(count <= timer1 && count > 0) //5==0° 15==90°
			{ 
				Y_PWM = 1; 
			}
			else 
			{ 
				Y_PWM = 0; 
			}
			count++;
			if(count >= 200)    //T = 20ms清零
			{ 
				count = 0; 
				ITR_Over=1;
			}	
		break;
		case 3 : 
			if(count <= timer1 && count > 0) //5==0° 15==90°
			{ 
				Claw_PWM = 1; 
			}
			else 
			{ 
				Claw_PWM = 0; 
			}
			count++;
			if(count >= 200)    //T = 20ms清零
			{ 
				count = 0; 
				ITR_Over=1;
			}	
		break;
  }

}

void Arm_Init()
{
	X_PWM=0;
	Y_PWM=0;
	Claw_PWM=0;
	//x臂归中
	Time_sign=X_sign;
	X_move_num = 14;
	timer1=X_move_num;
	count=0;
	while(!ITR_Over);
	delay(1000);
	ITR_Over=0;
	
	//y臂归中
	Time_sign=Y_sign;
	Y_move_num = 14;
	timer1=Y_move_num;
	count=0;
	while(!ITR_Over);
	ITR_Over=0;
	delay(1000);
	
  //爪打开
	Time_sign=Claw_sign;
	Claw_move_num=10;
	timer1=Claw_move_num;
	count=0;
	while(!ITR_Over);
	ITR_Over=0;
	delay(1000);
}

//x臂 21- 7
void x_axis()
{
		if(!X_Up)
		{
			if(!X_Up)
			{	
				Time_sign=X_sign;//改变标志位,详情请看定时器中断
				X_move_num+=1;//高电平时间加0.1ms
				if(X_move_num>=21)//限制移动最大幅度
					X_move_num=21;
				timer1 = X_move_num;//舵机恢复到0°的位置
		    count=0;//让定时器重新计数
			}
			while(!X_Up||!ITR_Over)led=0;
			ITR_Over=0;
			led=1;
			delay(500);
		}
		/*其他函数同理*/
    if(!X_Down)
		{
			if(!X_Down)
			{	
				Time_sign=X_sign;
				X_move_num -=1;
				if(X_move_num<=7)
					X_move_num=7;
				timer1 = X_move_num;//舵机恢复到0°的位置
		    count=0;//让定时器重新计数
			}
			while(!X_Down||!ITR_Over)led=0;
			ITR_Over=0;
			led=1;
			delay(500);
		}
	
}
//y臂 5-17
void Y_axis()
{
		if(!Y_Down)
		{
			if(!Y_Down)
			{	
				Time_sign=Y_sign;
				Y_move_num+=1;
				if(Y_move_num>=17)
					Y_move_num=17;
				timer1 =Y_move_num;//舵机恢复到0°的位置
		    count=0;//让定时器重新计数
			}
			while(!Y_Down||!ITR_Over)led=0;
			ITR_Over=0;
			led=1;
			delay(500);
		}
    if(!Y_Up)
		{
			if(!Y_Up)
			{	
				Time_sign=Y_sign;
				Y_move_num -=1;
				if(Y_move_num<=5)
					Y_move_num=5;
				timer1 = Y_move_num;//舵机恢复到0°的位置
		    count=0;//让定时器重新计数
			}
			while(!Y_Up||!ITR_Over)led=0;
			ITR_Over=0;
			led=1;
			delay(500);
		}
	
}
//抓
void Claw()
{

		if(!Claw_OPEN)
		{
			if(!Claw_OPEN)
			{	
				Time_sign=Claw_sign;
				timer1 =5;//舵机恢复到0°的位置
		    count=0;//让定时器重新计数
			}	
			while(!Claw_OPEN||!ITR_Over)led=0;	
			ITR_Over=0;
			led=1;
			delay(700);
		  
		}
		
		
    if(!Claw_CLOSE)
		{
			if(!Claw_CLOSE)
			{	
				Time_sign=Claw_sign;
				timer1 =10;//舵机恢复到0°的位置
		    count=0;//让定时器重新计数
			}
			while(!Claw_CLOSE||!ITR_Over)led=0;
			ITR_Over=0;
			led=1;
			delay(700);
		}

}

总结:

如果什么疑问或者建议,可以在评论区留言。


版权声明:本文为weixin_63568691原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。