当前位置:   article > 正文

迷你四足机器人制作_从0到1_stm32f103c8t6 pca9685

stm32f103c8t6 pca9685

前言

本文基于STM32F103C8T6作为主控,实现单腿二自由度的舵机驱动小四足;详细介绍了从 简单原理 到 硬件组成 到 代码实现 各个部分。
楼主认为非常适合作为单片机入门的项目,既可简单实现,也可在此基础上开发更多功能,也能跑实时操作系统;既可不用深究原理就实现一个小机器人的开发,也可对其硬件驱动原理、控制方法进行深入的学习与理解。

  • 用到的软件:keil、STM32CubeMX
  • 用到的硬件:
    • 主控 STM32F103C8T6
    • 舵机控制板 PCA9685
    • 8个MG90S舵机
    • 蓝牙模块HC-05
    • 12V电源、DC线开关、降压板
    • jlink下载线

整机方案

整机框图

一、结构设计

本文结构是直接嫖来的,可在B站搜索黑人黑科技-蠢萌四足机器人,楼主懒得去量尺寸一步步画了,只是修改了外观,让它更像狗狗一些;大家也可以按照黑人黑科技的实现方案来做(有开源源码和图纸);不过楼主会介绍的更详细,而且提供评论区答疑服务,欢迎交流;
事实证明,直接拿来的东西很难不出问题,还是建议大家对关键部位(转轴连接处、走线)等仔细审查一下,确保安装的时候稳定可靠,有精力自己设计更好。
楼主改动之后长下图这样:
在这里插入图片描述
零部件皆为3D打印,转轴处将轴承改为了3D打印的尼龙轴套,整体连接多为自攻螺丝(足端与膝关节舵机的连接用的3根M2长22mm的螺栓),结构更紧凑,不过还是改为螺栓螺母会更可靠一些

效果视频

迷你小四足~

二、主要模块

2.1 主控 STM32103C8T6

STM32是小四足的核心模块,靠它给各个模块发指令,让机器人动起来;如果没有用过单片机,可以简单学习一下C语言和单片机;推荐下方视频,只看C语言和单片机部分就足以完成本文项目;
嵌入式开发系统学习路线

开发过程中可以用STM32CubeMX快速搭建工程;
楼主就不带着一步步做了,不然太长得录视频了,可以点击下方使用STM32定时器实现PWM输出控制舵机转动的例子,看一下如何用STM32CubeMX快速搭建工程进行硬件驱动,本文所使用的舵机也是下方链接中使用的MG90S。
STM32控制舵机转动_从0到1

2.2 舵机控制板 PCA9685

在这里插入图片描述
驱动舵机可以使用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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

然后还在mian程序中调用PCA9685_Go()函数,即可对pca9685进行读写操作,输出PWM,控制舵机转动;

2.3 蓝牙模块HC-05

蓝牙模块主要是实现遥控功能,从手机端发消息,控制四足运动、停止。
本文使用蓝牙模块HC-05接收手机发送的数据,手机下载蓝牙调试APP(从应用商店里下载几个,挑一个顺眼的就行)。
HC-05通过UART串口将数据发送给STM32f103c8t8,STM32判断接收到的数据,进而控制小四足的不同运动状态;

HC-05的使用可以参考以下链接:
HC-05蓝牙串口通信模块使用详解

HC-05配置好后,接收到手机发送的数据,会自动转发给STM32,不过需先配置后STM32的UART串口模块;这里使用STM32CubeMX搭建UART串口驱动程序,使用UART中断接收,在回调函数里,判断数据,进行下一步操作;

STM32CubeMX搭建UART串口驱动程序也先码着,有需要再贴出详细步骤;

2.4 陀螺仪MPU6050

先码着;

三、供电方案

稳定的供电系统是机器人能正常工作/工作好的重要基础,楼主在做小四足的过程中才渐渐意识到硬件各部分的重要性所在,以小见大,一个开发智能产品的公司,是需要专业的电源系统开发人员的。

3.1 电源&开关

12V电源
如图,选择上图电源,楼主选择的是12V 3000mAh锂电池,当然还需要一个开关,控制整个电路的通断,如下图所示,电池接DC开关,再接稳压板,稳压板给STM32F103和PCA9685供电。
DC线开关

3.2 稳压板

降压电源模块板
楼主在开发过程中,使用上图所示的降压板,DC接口12V输入,三路输出12V、5V、5V(USB):

  • 5V输出给PCA9685驱动电路供电,驱动8路舵机运转。
  • 5V(USB)输出给STM32F103供电,同时由于STM32与舵机PCA9685控制电路VCC相连,自然也给PCA9685控制电路供电。

四、功能实现

上述步骤中,已经搭建好了小四足的硬件平台,完成了各模块的驱动程序;如果都能运行正常,下面就开始写小四足的控制程序;写之前先看一下四足运动的简单分析,下方链接:
蜘蛛型小四足机器人运动分析
下面就把链接中的介绍代码实现一下,程序就先不贴出来了,后面有时间把工程整合优化后再贴出来详细介绍,可以访问最下方链接下载整个工程的源码(源码可以实现四足的行走);

4.1 前进
4.2 旋转
4.3 姿态调整

五、源码

GitHub:Mini_Quadruped_robot
百度网盘:Mini_Quadruped_robot,提取码:robo

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/601593
推荐阅读
相关标签
  

闽ICP备14008679号