
基于stm32的机械四爪
简介
基于stm32f103c8tc设计的简易机械四足。
简介:基于stm32f103c8tc设计的简易机械四足。开源协议
:CC BY-NC-ND 3.0
描述
前言
在刷b站时,偶然看到了一个up主制作的机械四足,于是突发奇想就做了一个简易版的,做的很简单见谅。
所需材料
1.一块stm32f103c8t6开发板
2.8个蓝色SG9经典180度舵机
3.一块iic通信的oled屏(大屏小屏都可以)
4.一块3.7v锂电池+一块5v锂电池 or 用我的懒蛋方法直接使用stlink供电
原理图和PCB设计说明
一共分为四部分:电源、oled、舵机、stm32板。
1.电源
只需要一个微型拨动开关+两个2p排针或者排母,也可以只放焊盘随后飞线链接电池。
用微型拨动开关控制stm32板子的供电。
3V3是给stm32f103c8t6板子进行供电的,可以用一块小的3.7v锂电池。
5V是给舵机供电的,可以用一块5V锂电池供电。
两块电池可以用热熔胶枪粘在底板的下面。
当然对于我这样的懒蛋来说,直接使用stlink上的3V3和5V驱动,还可以随时改代码。
2.OLED屏的iic通信端口
同样只需要一个4p的排针即可。
这里我用的屏幕可以3V3驱动,也可以根据使用更换5V。
通信端口SCl和SDA分别用的PA5和PA7这两个IO口(代码是这样写的),可以根据自己的代码进行更换。
如果用的是其他通信方式这一部分是需要自行修改的。
3.舵机部分
这里使用这些端口一个原因是因为距离近,后面排线简单。
其次在控制舵机写代码控制的时候,需要考虑TIM时钟,下图是stm32的TIM时钟对应的IO口。
4.stm32f103c8t6
这里就是用排母把stm32的每一个串口都画出来。
在pcb里要注意排母间距,不然打出来插不进去。
代码部分说明
使用的keil5来进行编程,这里其实只需要编写一下PWM的文件,oled直接抄网上整理好的头文件就好了。
PWM部分
需要先查看stm32的TIM时钟表
我这里选用了TIM2和TIM4,所以要对PA0、1、2、3和PB6、7、8、9这几个IO口进行定义:
void Pwm_Init_TIM2(void)
{
GPIO_InitTypeDef GPIO_InitTypeStruce;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeStruce;
TIM_OCInitTypeDef TIM_OCInitTypeStruce;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//对PA串口进行使能和复用TIM2时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
GPIO_InitTypeStruce.GPIO_Mode=GPIO_Mode_AF_PP;//设置复用推挽输出
GPIO_InitTypeStruce.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//定义PA0、PA1、PA2、PA3串口
GPIO_InitTypeStruce.GPIO_Speed=GPIO_Speed_50MHz;
TIM_TimeBaseInitTypeStruce.TIM_Period=1999;//这里要PWM周期为20ms = (720*2000)/72000000=0.02
TIM_TimeBaseInitTypeStruce.TIM_Prescaler=719;//所以我这里取值分别为2000-1和720-1
TIM_TimeBaseInitTypeStruce.TIM_ClockDivision=0;
TIM_TimeBaseInitTypeStruce.TIM_CounterMode=TIM_CounterMode_Up;
TIM_OCInitTypeStruce.TIM_OCMode=TIM_OCMode_PWM1;//这里是设置PWM模式
TIM_OCInitTypeStruce.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitTypeStruce.TIM_OCPolarity=TIM_OCPolarity_High;
GPIO_Init(GPIOA,&GPIO_InitTypeStruce);//下面是给上面四个串口进行初始化
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitTypeStruce);
TIM_OC1Init(TIM2,&TIM_OCInitTypeStruce);
TIM_OC2Init(TIM2,&TIM_OCInitTypeStruce);
TIM_OC3Init(TIM2,&TIM_OCInitTypeStruce);
TIM_OC4Init(TIM2,&TIM_OCInitTypeStruce);
TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);//下面是使能TIM2时钟
TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Enable);
TIM_Cmd(TIM2,ENABLE);
}
void Pwm_Init_TIM4(void)//TIM4与TIM2的设置相似,其中要将GPIOA改为GPIOB,TIM2改为TIM4,四个串口也要进行修改
{
GPIO_InitTypeDef GPIO_InitTypeStruce;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeStruce;
TIM_OCInitTypeDef TIM_OCInitTypeStruce;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
GPIO_InitTypeStruce.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitTypeStruce.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitTypeStruce.GPIO_Speed=GPIO_Speed_50MHz;
TIM_TimeBaseInitTypeStruce.TIM_Period=1999;
TIM_TimeBaseInitTypeStruce.TIM_Prescaler=719;
TIM_TimeBaseInitTypeStruce.TIM_ClockDivision=0;
TIM_TimeBaseInitTypeStruce.TIM_CounterMode=TIM_CounterMode_Up;
TIM_OCInitTypeStruce.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitTypeStruce.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitTypeStruce.TIM_OCPolarity=TIM_OCPolarity_High;
GPIO_Init(GPIOB,&GPIO_InitTypeStruce);
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitTypeStruce);
TIM_OC1Init(TIM4,&TIM_OCInitTypeStruce);
TIM_OC2Init(TIM4,&TIM_OCInitTypeStruce);
TIM_OC3Init(TIM4,&TIM_OCInitTypeStruce);
TIM_OC4Init(TIM4,&TIM_OCInitTypeStruce);
TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);
TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable);
TIM_Cmd(TIM4,ENABLE);
}

TIM_SetCompare3(TIM2,50);//这里意味着TIM2时钟上的第三个串口(看上面的TIM时钟表)PA2,这个IO口上控制的舵机转到0°位置
TIM_SetCompare2(TIM4,250);//这里意味着TIM4时钟上的第二个串口(看上面的TIM时钟表)PB7,这个IO口上控制的舵机转到180°位置
OLED部分的使用
请大家去CSDN学一下使用方法吧
吃透OLED显示原理——玩转OLED模块各种使用方法_oled使用方法-CSDN博客
建模部分说明和参数
我使用的是solidworks 2022版本
舵机留的孔大小:
经过3d打印后的材料挤压,可以直接用2mm螺丝
脚留的孔大小:
同样用2mm螺丝即可
腿部连接:
因为用了镜像,在自己切片时需要进行一下切割。
安装注意事项
需要知道舵机的三条线:
黄线 or 橙线是信号线
红线是电源线
黑线 or 棕线是地线
首先需要知道舵机是如何旋转的:
然后在安装之前需要用代码将舵机都旋转到90°后再进行脚的固定,可以增大脚左右移动的自由度:
先用这几个代码
TIM_SetCompare1(TIM2,150);
TIM_SetCompare2(TIM2,150);
TIM_SetCompare3(TIM2,150);
TIM_SetCompare4(TIM2,150);
TIM_SetCompare1(TIM4,150);
TIM_SetCompare2(TIM4,150);
TIM_SetCompare3(TIM4,150);
TIM_SetCompare4(TIM4,150);
将舵机调至90°后,按下图连接腿部。
如果要用我的代码进行运行,需要如下图连接舵机线:
总结
因为我也还是一个大学的萌新,所以做的很简单,有问题也请大家指出,谢谢。
设计图

BOM


评论