您现在的位置是:首页 >技术交流 >桌面级格斗机器人:小chomp的设计日志(2)网站首页技术交流

桌面级格斗机器人:小chomp的设计日志(2)

tmyy210 2025-12-12 00:01:02
简介桌面级格斗机器人:小chomp的设计日志(2)

1、步行代码补全

因为自己的c语言并不熟练,所以代码使用的也比较低级,尤其体现在编程动作上,这里贴下代码,同时也想请教一下更简洁的代码。

这是对八个关节舵机(ts90A 9g舵机)动作的编程 ,mid、walk、run,对应的是默认位,转22.5度,以及转45度(相对于中位),define为词组主要也是方便记忆,后面的1和2表示的是方向

#define mid 1500
#define walk1 1750
#define run1 2000
#define walk2 1250
#define run2 1000

void Act_2 (void)//前行
{
	PWM_SetCompare1(run2);
	PWM_SetCompare2(mid);
	PWM_SetCompare3(walk2);
	PWM_SetCompare4(run1);
	PWM_SetCompare5(run1);
	PWM_SetCompare6(walk1);
	PWM_SetCompare7(run2);
	PWM_SetCompare8(run1);
	Delay_ms(90);
	
	PWM_SetCompare1(run2);
	PWM_SetCompare2(mid);
	PWM_SetCompare3(walk2);		//5621
	PWM_SetCompare4(run1);		//8734
	PWM_SetCompare5(run2);
	PWM_SetCompare6(run2);
	PWM_SetCompare7(run2);
	PWM_SetCompare8(run2);
	Delay_ms(90);
	
	PWM_SetCompare1(run2);
	PWM_SetCompare2(mid);
	PWM_SetCompare3(walk2);		//5621
	PWM_SetCompare4(run1);		//8734
	PWM_SetCompare5(run1);
	PWM_SetCompare6(run2);
	PWM_SetCompare7(walk2);
	PWM_SetCompare8(run2);
	Delay_ms(90);
	PWM_SetCompare1(run2);
	PWM_SetCompare2(run2);
	PWM_SetCompare3(run1);		//5621
	PWM_SetCompare4(run2);		//8734
	PWM_SetCompare5(run1);
	PWM_SetCompare6(mid);
	PWM_SetCompare7(mid);
	PWM_SetCompare8(run2);
	Delay_ms(90);
	
	PWM_SetCompare1(run1);
	PWM_SetCompare2(run1);
	PWM_SetCompare3(run1);		//5621
	PWM_SetCompare4(run1);		//8734
	PWM_SetCompare5(run1);
	PWM_SetCompare6(mid);
	PWM_SetCompare7(mid);
	PWM_SetCompare8(run2);
	Delay_ms(90);

	
	PWM_SetCompare1(run2);
	PWM_SetCompare2(run1);
	PWM_SetCompare3(run1);		//5621
	PWM_SetCompare4(run1);		//8734
	PWM_SetCompare5(run1);
	PWM_SetCompare6(mid);
	PWM_SetCompare7(mid);
	PWM_SetCompare8(run2);
	Delay_ms(90);
	PWM_SetCompare1(run2);
	PWM_SetCompare2(mid);
	PWM_SetCompare3(mid);		//5621
	PWM_SetCompare4(run1);		//8734
	PWM_SetCompare5(run1);
	PWM_SetCompare6(mid);
	PWM_SetCompare7(mid);
	PWM_SetCompare8(run2);
	Delay_ms(90);
	
}

这里代码就是以输入的Compare值设置TIM2_CH1的CCR值,我配置计数器周期为20000-1,当输入compare=mid=1500时,设置CCR=1500,占空比可以得到是1500/20000=0.075,我的ts90a舵机,脉冲周期20ms,输入脉冲宽度0.5ms到2.5ms,占空比0.025到0.125,对应角度0-90度,那么当占空比为0.075此时的角度就是45度中位。

//配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//不分频
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//选择向上计数(累加)
//时基单元内三个关键寄存器的参数
	TIM_TimeBaseInitStructure.TIM_Period = 20000-1;//计数器(周期)10k/10000=1,于是最终定时1s:ARR,按照分辨率决定,此时分辨率1%
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72-1;//预分频器:72M/7200=10k:PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复寄存器的值,高级寄存器才有,这里直接给0
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);

//配置输出比较模式
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);//为结构体赋初始值,然后再更改自己想改的值
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//输出比较的模式
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出比较的极性
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能
	TIM_OCInitStructure.TIM_Pulse = 0;//设置CCR
	//频率Freq=CK_PSC/(PSC+1)/(ARR+1)
	//占空比Duty=CCR/(ARR+1)
	//分辨率Reso=1/(ARR+1)
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);//设置了通道,在TIM2的OC1通道可输出波形,根据定义表,也就是PA0端口

void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2, Compare);//配置CCR
}

 这就是A0腿的TIM配置以及和其他腿一同的动作编程。

前一篇文章我有提到过,将两个通道的配合通过系统的判断来完成各项动作

在尝试了几番之后,我是这么一个逻辑:

接着我声明了一个动作选择Action_Select变量,通过if函数输出num的值,然后再通过num的值,以switch函数分配动作。图中的通道1和通道2,是遥控器上的名字,通过接收机输入到单片机中,然后用PWMI模式读取输入pwm信号的占空比,解析遥控器的命令。

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//随便配一个了,1分频/不分频
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//选择向上计数(累加)
	//时基单元内三个关键寄存器的参数
	TIM_TimeBaseInitStructure.TIM_Period = 65536-1;//ARR选最大值防止溢出
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72-1;//PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复寄存器的值,高级寄存器才有,这里直接给0
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStructure);

TIM_ICInitTypeDef TIM_ICInitStructure;
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//计划使用TIM4的Ch1
	TIM_ICInitStructure.TIM_ICFilter = 0x0F;//设置滤波器
	TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//设置极性
	TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//设置预分频器,每隔几次触发
	TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//选择触发引脚从哪儿输入,数据选择器:直连通道或交叉通道
	TIM_ICInit(TIM4, &TIM_ICInitStructure);

TIM_PWMIConfig(TIM4, &TIM_ICInitStructure);//设置PWMI模式,对TIM4_ch2做相反配置

TIM_SelectInputTrigger(TIM4, TIM_TS_TI1FP1);//选择触发源
	TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset);//选择从模式
	
	TIM_Cmd(TIM4,ENABLE);//启动定时器

 这里以TIM4举例

我将TIM4和TIM1计时器作为对两个pwm信号源解析的通道,TIM2和TIM3计时器的八个通道作为八个舵机的驱动通道。

以上就是我的步行驱动代码了,也算是将学到的一点stm32知识皮毛运用了起来。

2、云台与武器

因为需要完成的任务点众多,我是打算先做一个只有步行、云台、武器的原型机试试(连护甲也没有)。

云台我打算直接使用stm32学习套件里的sg90a 9g舵机,(手头舵机用得少,基本全用来做这个了哈哈哈),然后因为单片机巨大的面积(虽然是最小系统板,但是对于寸土寸金的220g格斗机器人来说,太大了),我打算把舵机架设在机器尾部,然后通过四连杆结构,拉扯钢丝(钢丝我用了我妈妈做花用的杆哈哈哈),来控制云台的朝向。

不过这里是有问题的,因为舵机本身的角度限制以及四连杆结构的问题,我的云台只能做到前方180度指向,之后我打算通过n20或者更加微型的电机来驱动云台,装在云台或底盘内侧,来实现无限360度旋转。

武器的话,我直接使用了之前用的1908配m22gxr马步奇减速箱(直接从我1.36kg格斗机器人上拆下来的哈哈),然后打算上下独立控制,这样的话也节省了布线。

也因为只是个原型机,对布局做的都很随意,(正常来说我绝对无法忍受这么一个不对称的玩意哈哈哈),锤子也用的老锤子上的tc4钛合金一体锤,通过6mm内孔的法兰连轴器,连在减速箱出轴

然后就是3d打印~(我自己的3d打印机是海王星4哈哈哈)

3、原型机

(炮台模式挥击,这个趴下动作本来其实打算作为后退的,但是趴下出锤更加稳当,所以嘛~)

 

做出来的原型机看着还是挺糙的(而且还超出了奖励质量315g,现在是355g),但是我真的相当感动

我成功做到了曾经令我放弃的32单片机学习!

我再一次成为了纯正的锤子机爱好者!

我终于做出了自己的步行机!

这是我目前自己独立完成的原创的最复杂的东西!

而它只是原型机,还有相当高的上限!

我可得加把劲继续努力了哈哈哈,现在原型机已经出现,初步验证了我这小chomp的可行性,接下来要做的,就是给他加入更加先进的元素!

 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。