动手智能小车记(5)-坦克底盘硬件模块大杂烩

简介: 动手智能小车记(5)-坦克底盘硬件模块大杂烩

关于小车,之前也写了好几期了,先给大家放一段视频,后面打算将机械臂集成到坦克上,目前还在调试中,夹具已经能够控制夹紧和松开了:


上次那辆小车的底盘实在是脆弱,一不小心就撞碎了,后面直接上了个坦克底盘,在基于坦克底盘的小车上,控制坦克行走和之前小车的方法一致,采用的是PWM直驱,通过改变占空比的形式让坦克前进、后退、左右转。此次加上各种模块,分别如下:


  • 激光瞄准头
  • 蜂鸣器报警(因为还没买电磁炮,所以暂时用来代替发射)
  • 步进电机(用来调节发射瞄准角度)
  • MG996R舵机(打算做成360°旋转避障,据说会影响精度,还没试)
  • 超声波模块SR04
  • 游戏摇杆模块控制

一、激光瞄准头

这个没什么好说的,就跟点灯一样,高电平打开激光射线,低电平关闭激光射线,但我总觉得这个太暗了,改天一定要买一个亮度更大,效果看起来更明显的。

、蜂鸣器

这里选用的是有源蜂鸣器,也是跟点灯一样,高低电平控制,当小车收到SHOT指令时,发射炮弹,用蜂鸣器高电平的响声暂时代替,后续替换成电磁炮。

三、步进电机的控制

电机控制是一门非常高深的学问,如果想去走工控行业需要玩到电机方面的,那么步进电机一定少不了,不管怎么说,我们还是可以把它驱动起来的,以下是我买的一个步进电机驱动模块:

640.jpg

步进电机选用的型号是:28BYJ48-H12

640.jpg

这里在软件编程上有一个比较重要参数需要了解一下,就是步距角。


那么什么是步距角呢?度娘给你答案,可以详细看看。

https://baike.baidu.com/item/%E6%AD%A5%E8%B7%9D%E8%A7%92/5946465?fr=aladdin


来看看下面这个换算公式,或许你就明白了,如上图所示,步距角=5.625°/64,意思就是每64个脉冲步进电机就会转5.625度,因此我们很容易得出以下计算公式:电机转一圈有360°,那么转一圈的脉冲数 = 360 / 5.625 * 64 = 4096 个脉冲。进而很容易得到以下角度与脉冲的简单算法:

/*
 Rotation_Angle:旋转角度
 返回:Motor_Pulse 根据公式计算得出的脉冲个数
*/
int Motor_Angle_Cal(int Rotation_Angle)
{
    if(Rotation_Angle < 0 || Rotation_Angle > 360)
      return -1 ;
    Motor_Pulse = (int)((double)(Rotation_Angle / 5.625) * 64) ;
    return Motor_Pulse ;
}

关于详细配置和程序编写,之前在CSDN博客上也已经做过类似的笔记,这里就不重复写了:

https://yangyuanxin.blog.csdn.net/article/details/100901635

四、MG996R舵机控制

关于舵机控制,我想世伟之前写的文章介绍就已经非常详细了,链接如下:


STM32Cube-21(补充) | 使用通用定时器产生PWM驱动舵机


这里的舵机我让它以固定频率进行360旋转,这个效果感觉像激光雷达哈哈哈,有时间一定买个来玩玩。

五、超声波模块SR04

主要用来实现测距避障用,引用之前学习32时听了温老师的课,这是他的课堂笔记,我觉得下面这个图理解起来超级通俗易懂了,文末回复关键字获取。

640.png

六、游戏摇杆模块控制

根据模块提供的手册,下面来了解下工作原理以及如何来应用

640.jpg

看到这里我们就明白了,x,y是模拟量,而z是一个二值数据,在这里,可以利用STM32的ADC控制器来读取X,Y的输出,Z轴就很简单了,把它当作普通按键就可以了,关于ADC介绍,温老师的笔记值得收藏,通俗易懂。

640.png

关于游戏摇杆模块控制小车,其实只要把摇杆方向的AD值测出来,然后写个简单的函数进行区分就可以了,以下是我实测的控制数据,可能并不是特别精准,但个人觉得够用了,后期也可以进行优化:

//通过DMA通道转换得到的值
uint32_t JOY_VALUE[2];
//保存转换计算后的电压值
__IO float ADC_VOL_VALUE[2];
#define UP         0
#define DOWN       1
#define LEFT       2
#define RIGHT      3
#define LEFT_UP    4
#define LEFT_DOWN  5
#define RIGHT_UP   6
#define RIGHT_DONW 7
#define ENTER      8
#define UNKNOW_KEY 99
//获取摇杆键值
uint8_t GET_KEY_VALUE(int x, int y, int z)
{
    if((0 == x) && (y > 50 && y < 255))
        return UP;
    else if((255 == x) && (y > 0 && y < 255))
        return DOWN ;
    else if((x > 0 && x < 255) && (255 == y))
        return LEFT ;
    else if((x > 0 && x < 255) && (0 == y))
        return RIGHT ;
    else if((0 == x) && (255 == y))
        return LEFT_UP ;
    else if((255 == x) && (255 == y))
        return LEFT_DOWN ;
    else if((0 == x) && (0 == y))
        return RIGHT_UP ;
    else if((255 == x) && (0 == y))
        return RIGHT_DONW ;
    else if(x > 0 && y > 0 && 0 == z)
        return ENTER ;
    return UNKNOW_KEY ;
}

要控制小车,那么就要把WIFI和摇杆模块的控制绑定起来,首先肯定是要让WIFI进入透传模式,然后通过WIFI发送控制指令给小车,核心代码如下:

int main(void)
{
    /* USER CODE BEGIN 1 */
    int JOY_X, JOY_Y, JOY_Z ;
    uint8_t key_value ;
    /* USER CODE END 1 */
    /* MCU Configuration--------------------------------------------------------*/
    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();
    /* USER CODE BEGIN Init */
    /* USER CODE END Init */
    /* Configure the system clock */
    SystemClock_Config();
    /* USER CODE BEGIN SysInit */
    /* USER CODE END SysInit */
    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_DMA_Init();
    MX_USART1_UART_Init();
    MX_USART3_UART_Init();
    MX_ADC1_Init();
    /* USER CODE BEGIN 2 */
    ESP8266_Init();
    printf("正在配置 ESP8266 ......\n" );
    if(ESP8266_AT_Test())
    {
        printf("AT test OK\n");
    }
    printf("\n< 1 >\n");
    if(ESP8266_Net_Mode_Choose(STA))
    {
        printf("ESP8266_Net_Mode_Choose OK\n");
    }
    printf("\n< 2 >\n");
    while(!ESP8266_JoinAP(User_ESP8266_ApSsid, User_ESP8266_ApPwd));
    printf("\n< 3 >\n");
    ESP8266_Enable_MultipleId(DISABLE);
    while(!ESP8266_Link_Server(enumTCP, User_ESP8266_TcpServer_IP, User_ESP8266_TcpServer_Port, Single_ID_0));
    printf("\n< 4 >\n");
    while(!ESP8266_UnvarnishSend());
    printf("配置 ESP8266 完毕\n");
    HAL_ADC_Start_DMA(&hadc1, JOY_VALUE, 2);
    /* USER CODE END 2 */
    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1)
    {
        /* USER CODE END WHILE */
        /* USER CODE BEGIN 3 */
        //3.3V为AD转换的参考电压值,STM32的AD转换为12bit,所以2^12=4096
        //故当输入参考电压为3.3V时,AD转换的结果为4096
        //取12bit数值
        //ADC_VOL_VALUE[0] = (float)(JOY_VALUE[0] & 0xFFF) * 3.3 / 4096 ;
        //ADC_VOL_VALUE[1] = (float)(JOY_VALUE[1] & 0xFFF) * 3.3 / 4096 ;
        //printf("x:%.2fv   y:%.2fv\n", ADC_VOL_VALUE[0], ADC_VOL_VALUE[1]);
        //只取8位有效数据
        JOY_X = JOY_VALUE[0] & 0xFF;
        JOY_Y = JOY_VALUE[1] & 0xFF;
        JOY_Z = HAL_GPIO_ReadPin(JOY_Z_GPIO_Port, JOY_Z_Pin);
        key_value = GET_KEY_VALUE(JOY_X, JOY_Y, JOY_Z);
        //printf("x:%d   y:%d  z:%d\n", JOY_X, JOY_Y, JOY_Z);
        switch(key_value)
        {
            //小车前进
            case UP :
                printf("上\n");
                ESP8266_SendString(ENABLE,"GO",strlen("GO"),0);
                break ;
            //小车后退
            case DOWN :
                printf("下\n");
                ESP8266_SendString(ENABLE,"BACK",strlen("BACK"),0);
                break ;
            //小车左转
            case LEFT :
                printf("左\n");
                ESP8266_SendString(ENABLE,"LEFT",strlen("LEFT"),0);
                break ;
              //小车右转
            case RIGHT  :
                printf("右\n");
                ESP8266_SendString(ENABLE,"RIGHT",strlen("RIGHT"),0);
                break ;
              //控制步进电机向右旋转45°
            case LEFT_UP:
                printf("左上\n");
                ESP8266_SendString(ENABLE,"MOTOR_RADJ",strlen("MOTOR_RADJ"),0);
                break ;
            case LEFT_DOWN:
                printf("左下\n");
                break ;
            //控制步进电机向左旋转45°
            case RIGHT_UP:
                printf("右上\n");
                ESP8266_SendString(ENABLE,"MOTOR_LADJ",strlen("MOTOR_LADJ"),0);
                break ;
            case RIGHT_DONW :
                printf("右下\n");
                break ;
           //控制发射炮弹
            case ENTER :
                printf("确认\n");
                ESP8266_SendString(ENABLE,"SHOT",strlen("SHOT"),0);
                break ;
            //控制小车停止
            default:
                ESP8266_SendString(ENABLE,"STOP",strlen("STOP"),0);
                break ;
        }
        HAL_Delay(200);
    }
    /* USER CODE END 3 */
}


640.jpg

完整程序等我把小车DIY完,会把硬件模块、软件程序等全部开源,如需学习温老师的笔记,请在公众号后台回复STM32学习笔记获取,本着分享原则,本资源从网上搜索获取,如有违规,请联系我删除,谢谢!

往期精彩

STM32在线升级OTA,看这一篇就够啦~


第10期 | ringbuff,通用FIFO环形缓冲区实现库


ESP8266实战贴:使用HTTP POST请求上传数据到公有云OneNet


会C/C++就可以开发Linux/Android应用程序?替代传统串口屏的Yoxios了解一下!

目录
相关文章
|
前端开发 芯片
【芯片前端】保持代码手感——交通灯
【芯片前端】保持代码手感——交通灯
|
6月前
|
传感器 监控 测试技术
单片机开发|基于51单片机的全自动黑板檫粉尘清除装置设计与实现
单片机开发|基于51单片机的全自动黑板檫粉尘清除装置设计与实现
|
6月前
|
传感器 人工智能 Java
单片机开发|基于51单片机的全自动黑板檫粉尘清除装置设计
教师常年在课堂上上课,粉笔的灰尘会对学生的健康造成很大的危害,很多教师都会患上肺部疾病。教师在课堂教学中,如何有效地消除粉尘对教师的身体造成的不良影响,是一个亟待解决的问题。本文以51单片机为核心,实现并设计一种全自动黑板檫粉尘清除装置。由黑板擦上的压力传感器进行检测,由51单片机来控制吸尘器(吸尘风机),以完成清理。本系统的主要功能包括:压力检测、按键控制、灯光显示、电扇除尘等。本文在对国内外有关文献进行整理和归纳的基础上,首先介绍了全自动黑板檫粉尘清除装置的研制背景和研究意义,并结合国内外的研究情况,提出了本文的主要研究内容和系统的设计思路。接着,对系统的硬件电路进行了详细的设计,并编写了
|
传感器 监控 测试技术
单片机开发|基于51单片机的全自动黑板檫粉尘清除装置设计与实现
教师常年在课堂上上课,粉笔的灰尘会对学生的健康造成很大的危害,很多教师都会患上肺部疾病。教师在课堂教学中,如何有效地消除粉尘对教师的身体造成的不良影响,是一个亟待解决的问题。本文以51单片机为核心,实现并设计一种全自动黑板檫粉尘清除装置。由黑板擦上的压力传感器进行检测,由51单片机来控制吸尘器(吸尘风机),以完成清理。本系统的主要功能包括:压力检测、按键控制、灯光显示、电扇除尘等。本文在对国内外有关文献进行整理和归纳的基础上,首先介绍了全自动黑板檫粉尘清除装置的研制背景和研究意义,并结合国内外的研究情况,提出了本文的主要研究内容和系统的设计思路。接着,对系统的硬件电路进行了详细的设计,并编写了
187 0
|
API 数据处理
2022年十月份电赛OpenMV巡线方案(2)---主控代码详细分析
2022年十月份电赛OpenMV巡线方案(2)---主控代码详细分析
177 0
|
人工智能 算法 固态存储
这才是模块化电脑该有的样子:一人打造的超迷你计算机,震动了整个极客圈
这才是模块化电脑该有的样子:一人打造的超迷你计算机,震动了整个极客圈
139 0
|
语音技术
智能小车项目
这篇博客主要进行一次笔记汇总,设计制作一辆玩具小车,此小车系统可具有以下功能:超声波测距,避障,电机调速,蓝牙控制等功能,设置了两种模式避障模式与跟随模式,可以再做个循迹模式,但是没有场地不好调试就没有写了,但是原理和前两个模式是类似的,模块也是使用红外模块,可以2路也可以4路,差别不大
234 0
智能小车项目
|
传感器
嵌入式小项目练习-光电设计竞赛-寻迹小车-02-模块分析
嵌入式小项目练习-光电设计竞赛-寻迹小车-02-模块分析
162 0
嵌入式小项目练习-光电设计竞赛-寻迹小车-02-模块分析
嵌入式小项目练习-光电设计竞赛-寻迹小车-01-赛题与流程图
嵌入式小项目练习-光电设计竞赛-寻迹小车-01-赛题与流程图
234 0
嵌入式小项目练习-光电设计竞赛-寻迹小车-01-赛题与流程图
【“玩物立志”scratch少儿编程】坦克动荡-“穿墙控制”和“子弹反弹”的实现-含完整代码
【“玩物立志”scratch少儿编程】坦克动荡-“穿墙控制”和“子弹反弹”的实现-含完整代码
674 0
【“玩物立志”scratch少儿编程】坦克动荡-“穿墙控制”和“子弹反弹”的实现-含完整代码