本文基于STM32F103C8T6作为主控,实现单腿二自由度的舵机驱动小四足;详细介绍了从 简单原理 到 硬件组成 到 代码实现 各个部分。
楼主认为非常适合作为单片机入门的项目,既可简单实现,也可在此基础上开发更多功能,也能跑实时操作系统;既可不用深究原理就实现一个小机器人的开发,也可对其硬件驱动原理、控制方法进行深入的学习与理解。
本文结构是直接嫖来的,可在B站搜索黑人黑科技-蠢萌四足机器人,楼主懒得去量尺寸一步步画了,只是修改了外观,让它更像狗狗一些;大家也可以按照黑人黑科技的实现方案来做(有开源源码和图纸);不过楼主会介绍的更详细,而且提供评论区答疑服务,欢迎交流;
事实证明,直接拿来的东西很难不出问题,还是建议大家对关键部位(转轴连接处、走线)等仔细审查一下,确保安装的时候稳定可靠,有精力自己设计更好。
楼主改动之后长下图这样:
零部件皆为3D打印,转轴处将轴承改为了3D打印的尼龙轴套,整体连接多为自攻螺丝(足端与膝关节舵机的连接用的3根M2长22mm的螺栓),结构更紧凑,不过还是改为螺栓螺母会更可靠一些
效果视频:
迷你小四足~
STM32是小四足的核心模块,靠它给各个模块发指令,让机器人动起来;如果没有用过单片机,可以简单学习一下C语言和单片机;推荐下方视频,只看C语言和单片机部分就足以完成本文项目;
嵌入式开发系统学习路线
开发过程中可以用STM32CubeMX快速搭建工程;
楼主就不带着一步步做了,不然太长得录视频了,可以点击下方使用STM32定时器实现PWM输出控制舵机转动的例子,看一下如何用STM32CubeMX快速搭建工程进行硬件驱动,本文所使用的舵机也是下方链接中使用的MG90S。
STM32控制舵机转动_从0到1
驱动舵机可以使用STM32定时器控制输出PWM,如上面链接中介绍的;本文要同时驱动四条腿八个舵机(MG90S)完成四足的基础运动,因此外接舵机控制板会更方便且高效且优雅;
PCA9685是16路12位PWM信号发生器,可用于控制舵机、led、电机等设备,I2C通信,节省主机资源。
如何使用STM32CubeMX搭建I2C驱动程序,先码着,后面如果有需要再补上;
将PCA9685通过I2C挂载到STM32F103C8T6,编写好PCA9685的驱动程序,即可控制输出16路周期和占空比均可调的PWM,进而控制16路舵机按照想要的方式运动,楼主学习时参考的博文找不到了,下面贴出我工程里使用的PCA9685驱动程序;
pca9685.h
#ifndef _PCA9685_H
#define _PCA9685_H
#include "i2c.h"
#define uint8 unsigned char
#define uint16 unsigned int
#define uint32 unsigned long
#define PCA9685_SUBADR1 0x2
#define PCA9685_SUBADR2 0x3
#define PCA9685_SUBADR3 0x4
#define LED0_ON_L 0x6
#define LED0_ON_H 0x7
#define LED0_OFF_L 0x8
#define LED0_OFF_H 0x9
#define ALLLED_ON_L 0xFA
#define ALLLED_ON_H 0xFB
#define ALLLED_OFF_L 0xFC
#define ALLLED_OFF_H 0xFD
#define PCA9685_MODE1 0x0
#define PCA9685_PRESCALE 0xFE
#define PCA9685_adrr 0x80
void PCA9685_Reset(void);
void PCA9685_Go(void);
void SetPWMFreq(float freq);
void SetPWM(uint32_t num,uint32_t on,uint32_t off);
uint8_t PCA9685_read(uint8_t startAddress);
void PCA9685_write(uint8_t startAddress, uint8_t buffer);
#endif
pca9685.c
#include "pca9685.h"
#include "i2c.h"
#include "math.h"
void PCA9685_Reset()
{
PCA9685_write(PCA9685_MODE1,0x00);
}
void PCA9685_Go()
{
PCA9685_Reset();
}
void SetPWMFreq(float freq)
{
//calc prescale
uint32_t prescale,oldmode,newmode;
float prescaleval;
freq *= 0.92; // Correct for overshoot in the frequency setting
prescaleval = 25000000;
prescaleval /= 4096; //12 bit accuracy
prescaleval /= freq;
prescaleval -= 1;
prescale = floor(prescaleval + 0.5);
//set prescale
oldmode = PCA9685_read(PCA9685_MODE1);
newmode = (oldmode&0x7F) | 0x10; // sleep
PCA9685_write(PCA9685_MODE1, newmode); // go to sleep
PCA9685_write(PCA9685_PRESCALE, prescale); // set the prescaler
PCA9685_write(PCA9685_MODE1, oldmode);
HAL_Delay(2);
PCA9685_write(PCA9685_MODE1, oldmode | 0xa1);
}
void SetPWM(uint32_t num,uint32_t on,uint32_t off)
{
PCA9685_write(LED0_ON_L+4*num,on);
PCA9685_write(LED0_ON_H+4*num,on>>8);
PCA9685_write(LED0_OFF_L+4*num,off);
PCA9685_write(LED0_OFF_H+4*num,off>>8);
}
void PCA9685_write(uint8_t startAddress, uint8_t buffer) {
//Send address to start reading from.
uint8_t tx[2];
tx[0]=startAddress;
tx[1]=buffer;
HAL_I2C_Master_Transmit(&hi2c1,PCA9685_adrr, tx,2,10000);
}
然后还在mian程序中调用PCA9685_Go()函数,即可对pca9685进行读写操作,输出PWM,控制舵机转动;
蓝牙模块主要是实现遥控功能,从手机端发消息,控制四足运动、停止。
本文使用蓝牙模块HC-05接收手机发送的数据,手机下载蓝牙调试APP(从应用商店里下载几个,挑一个顺眼的就行)。
HC-05通过UART串口将数据发送给STM32f103c8t8,STM32判断接收到的数据,进而控制小四足的不同运动状态;
HC-05的使用可以参考以下链接:
HC-05蓝牙串口通信模块使用详解
HC-05配置好后,接收到手机发送的数据,会自动转发给STM32,不过需先配置后STM32的UART串口模块;这里使用STM32CubeMX搭建UART串口驱动程序,使用UART中断接收,在回调函数里,判断数据,进行下一步操作;
STM32CubeMX搭建UART串口驱动程序也先码着,有需要再贴出详细步骤;
先码着;
稳定的供电系统是机器人能正常工作/工作好的重要基础,楼主在做小四足的过程中才渐渐意识到硬件各部分的重要性所在,以小见大,一个开发智能产品的公司,是需要专业的电源系统开发人员的。
如图,选择上图电源,楼主选择的是12V 3000mAh锂电池,当然还需要一个开关,控制整个电路的通断,如下图所示,电池接DC开关,再接稳压板,稳压板给STM32F103和PCA9685供电。
楼主在开发过程中,使用上图所示的降压板,DC接口12V输入,三路输出12V、5V、5V(USB):
上述步骤中,已经搭建好了小四足的硬件平台,完成了各模块的驱动程序;如果都能运行正常,下面就开始写小四足的控制程序;写之前先看一下四足运动的简单分析,下方链接:
蜘蛛型小四足机器人运动分析
下面就把链接中的介绍代码实现一下,程序就先不贴出来了,后面有时间把工程整合优化后再贴出来详细介绍,可以访问最下方链接下载整个工程的源码(源码可以实现四足的行走);
GitHub:Mini_Quadruped_robot
百度网盘:Mini_Quadruped_robot,提取码:robo