STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结

06-01 749阅读

前言

需要小车实物的可以在文章最下方加我,本篇文章的小车所有功能实现的代码还有硬件清单放在资源包里,有需要的自行下载即可!

小车资料图示:

STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结

资料下载

  • STM32智能小车资料,包含程序源代码,原理图,软件流程图,硬件清单,演示视频资源-CSDN文库

    演示视频:

    STM32智能小车演示视频

    目录

    1.电机模块开发

    1.1 让小车动起来

    1.2 串口控制小车方向

    1.3 如何进行小车PWM调速

    1.4 PWM方式实现小车转向

    2.循迹小车 

    2.1 循迹模块使用

    2.2 循迹小车原理

    2.3 循迹小车核心代码

    2.4 循迹小车解决转弯平滑问题

    3.跟随/避障小车

    3.1 红外壁障模块分析​编辑

    3.2 跟随小车的原理

    3.3 跟随小车开发和调试代码

    3.4 超声波模块介绍

    3.5 舵机模块介绍

    3.6 摇头避障小车开发和调试代码

    4.测速小车

    4.1 测速模块

    4.2 测试原理和单位换算

    4.3 定时器和中断实现测速开发和调试代码

    4.4 小车速度显示在OLED屏

    5.远程控制小车

    5.1 蓝牙控制小车

    5.2 蓝牙控制并测速小车

    5.3 wifi控制测速小车

    5.4 4g控制小车

    6.语音控制小车

    6.1语音模块配置:

    6.2 语音控制小车开发和调试代码


    1.电机模块开发

    L9110s概述

    接通VCC,GND 模块电源指示灯亮, 以下资料来源官方,具体根据实际调试

    IA1输入高电平,IA1输入低电平,【OA1 OB1】电机正转;

    IA1输入低电平,IA1输入高电平,【OA1 OB1】电机反转;

    IA2输入高电平,IA2输入低电平,【OA2 OB2】电机正转;

    IA2输入低电平,IA2输入高电平,【OA2 OB2】电机反转;

    STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结

    接线参考:

    B-1A -- PA0

    B-1B -- PB1

    A-1A -- PA1

    A-1B -- PB10 

    STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结

    1.1 让小车动起来

    代码实现:

    motor.c

    #include "motor.h"
    void goForward(void)
    {
        // 左轮
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET);
        // 右轮
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
    }
    void goBack(void)
    {
        // 左轮
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);
        // 右轮
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
    }
    void goLeft(void)
    {
        // 左轮
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET);
        // 右轮
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
    }
    void goRight(void)
    {
        // 左轮
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET);
        // 右轮
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
    }
    void stop(void)
    {
        // 左轮
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);
        // 右轮
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
    }

    motor.h

    #ifndef __MOTOR_H__
    #define __MOTOR_H__
    #include "main.h"
    void goForward(void);
    void goBack(void);
    void goLeft(void);
    void goRight(void);
    void stop(void);
    #endif

    main.c

    #include "motor.h"
    //main函数的while循环部分:
    while (1)
    {
        goForward();
        HAL_Delay(1000);
        goBack();
        HAL_Delay(1000);
        goLeft();
        HAL_Delay(1000);
        goRight();
        HAL_Delay(1000);
        stop();
        HAL_Delay(1000);
    }
    
    1.2 串口控制小车方向
    • 串口分文件编程进行代码整合——通过现象来改代码
    • 接入蓝牙模块,通过蓝牙控制小车
    • 添加点动控制,如果APP支持按下一直发数据,松开就停止发数据(蓝牙调试助手的自定义按键不 能实现),就能实现前进按键按下后小车一直往前走的功能

      代码实现:

      usart.c

      #include "usart.h"
      #include "string.h"
      #include "stdio.h"
      #include "motor.h"
      //串口接收缓存(1字节)
      uint8_t buf=0;
      //定义最大接收字节数 200,可根据需求调整
      #define UART1_REC_LEN 200
      // 接收缓冲, 串口接收到的数据放在这个数组里,最大UART1_REC_LEN个字节
      uint8_t UART1_RX_Buffer[UART1_REC_LEN];
      //  接收状态
      //  bit15,      接收完成标志
      //  bit14,      接收到0x0d
      //  bit13~0,    接收到的有效字节数目
      uint16_t UART1_RX_STA=0;
      #define SIZE 12
      char buffer[SIZE];
      // 接收完成回调函数,收到一个数据后,在这里处理
      void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
      {
      	// 判断中断是由哪个串口触发的
      	if(huart->Instance == USART1)
      	{
      		// 判断接收是否完成(UART1_RX_STA bit15 位是否为1)
      		if((UART1_RX_STA & 0x8000) == 0)
      		{
      			// 如果已经收到了 0x0d (回车),
      			if(UART1_RX_STA & 0x4000)
      			{
      				// 则接着判断是否收到 0x0a (换行)
      				if(buf == 0x0a)
      				{
      					// 如果 0x0a 和 0x0d 都收到,则将 bit15 位置为1
      					UART1_RX_STA |= 0x8000;
      					// 灯控指令
      					if(!strcmp(UART1_RX_Buffer, "M1"))
      						goForward();
      					else if(!strcmp(UART1_RX_Buffer, "M2"))
      						goBack();
      					else if(!strcmp(UART1_RX_Buffer, "M3"))
      						goLeft();
      					else if(!strcmp(UART1_RX_Buffer, "M4"))
      						goRight();
      					else
      						stop();
      					
      					memset(UART1_RX_Buffer, 0, UART1_REC_LEN);
      					UART1_RX_STA = 0;
      				}
      				else
      					// 否则认为接收错误,重新开始
      					UART1_RX_STA = 0;
      			}
      			else	// 如果没有收到了 0x0d (回车)
      			{
      				//则先判断收到的这个字符是否是 0x0d (回车)
      				if(buf == 0x0d)
      				{
      					// 是的话则将 bit14 位置为1
      					UART1_RX_STA |= 0x4000;
      				}
      				else
      				{
      					// 否则将接收到的数据保存在缓存数组里
      					UART1_RX_Buffer[UART1_RX_STA & 0X3FFF] = buf;
      					UART1_RX_STA++;
      					
      					// 如果接收数据大于UART1_REC_LEN(200字节),则重新开始接收
      					if(UART1_RX_STA > UART1_REC_LEN - 1)
      						UART1_RX_STA = 0;
      				}
      			}
      		}
      		// 重新开启中断
      		HAL_UART_Receive_IT(&huart1, &buf, 1);
      	}
      }
      int fputc(int ch, FILE *f)
      {      
      	unsigned char temp[1]={ch};
      	HAL_UART_Transmit(&huart1,temp,1,0xffff);  
      	return ch;
      }
      1.3 如何进行小车PWM调速

      原理:

      全速前进是LeftCon1A = 0; LeftCon1B = 1;

      完全停止是LeftCon1A = 0;LeftCon1B = 0;

      那么单位时间内,比如20ms, 有15ms是全速前进,5ms是完全停止, 速度就会比5ms全速前进,15ms完全停止获得的功率多,相应的速度更快!

      开发:借用PWM的舵机控制代码

      将控制车轮的4个 GPIO 口配置修改如下,否则小车动不起来。

      原因:L9110每个控制口需要一高一低才可以动起来,如果PWM有效电平为高电平,则另一个 GPIO口则需要输出低电平才可以驱动轮子。

      STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结

      代码实现:

      main.c

      // main函数里
      HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
      HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
      while (1)
      {
          __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, 8);
          __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 8);
          HAL_Delay(1000);
          __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, 10);
          __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 10);
          HAL_Delay(1000);
          __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, 15);
          __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 15);
          HAL_Delay(1000);
      }
      1.4 PWM方式实现小车转向

      右转原理: 左轮速度大于右轮

      左转原理: 右轮速度大于左轮

      左右轮各自调速代码实现:

      // main函数里
      while (1)
      {
          __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,8);
          __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,15);
          HAL_Delay(1000);
          __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,15);
          __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,8);
          HAL_Delay(1000);
      }

      2.循迹小车 

      2.1 循迹模块介绍
      • TCRT5000传感器的红外发射二极管不断发射红外线
      • 当发射出的红外线没有被反射回来或被反射回来但强度不够大时
      • 红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态
      • 被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,红外接收管饱和
      • 此时模块的输出端为低电平,指示二极管被点亮
      • 总结就是一句话,没反射回来,D0输出高电平,灭灯

        STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结

        接线方式

        • VCC:接电源正极(3-5V)
        • GND:接电源负极 DO:TTL开关信号输出0、1
        • AO:模拟信号输出(不同距离输出不同的电压,此脚一般可以不接)
          2.2 循迹小车原理

          由于黑色具有较强的吸收能力,当循迹模块发射的红外线照射到黑线时,红外线将会被黑线吸收,导致 循迹模块上光敏三极管处于关闭状态,此时模块上一个LED熄灭。在没有检测到黑线时,模块上两个LED常亮

          总结就是一句话,有感应到黑线,D0输出高电平 ,灭灯

          STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结

          2.3 循迹小车核心代码

          硬件接线

          • B-1A -- PA0
          • B-1B -- PB1
          • A-1A -- PA1
          • A-1B -- PB10
          • 循迹模块(左)--  PB3
          • 循迹模块(右) -- PB4

            代码示例:

            #define LeftWheel_Value HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3)
            #define RightWheel_Value HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4)
            // main函数里
            while (1)
            {
                if (LeftWheel_Value == GPIO_PIN_RESET && RightWheel_Value == GPIO_PIN_RESET)
                    goForward();
                if (LeftWheel_Value == GPIO_PIN_SET && RightWheel_Value == GPIO_PIN_RESET)
                    goLeft();
                if (LeftWheel_Value == GPIO_PIN_RESET && RightWheel_Value == GPIO_PIN_SET)
                    goRight();
                if (LeftWheel_Value == GPIO_PIN_SET && RightWheel_Value == GPIO_PIN_SET)
                    stop();
            }
            2.4 循迹小车解决转弯平滑问题

            原理:两轮都有速度且一轮速度大于另一轮

            代码实现:

            #define LeftWheel_Value HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3)
            #define RightWheel_Value HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4)
            // main函数里
            while (1)
            {
                if(LeftWheel_Value == GPIO_PIN_RESET && RightWheel_Value == GPIO_PIN_RESET)
                {
                    __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,19);
                    __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,19);
                }
                if(LeftWheel_Value == GPIO_PIN_SET && RightWheel_Value == GPIO_PIN_RESET)
                {
                    __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,15);
                    __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,8);
                }
                if(LeftWheel_Value == GPIO_PIN_RESET && RightWheel_Value == GPIO_PIN_SET)
                {
                    __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,8);
                    __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,15);
                }
                if(LeftWheel_Value == GPIO_PIN_SET && RightWheel_Value == GPIO_PIN_SET)
                {
                    __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,0);
                    __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,0);
                }
            }

            3.跟随/避障小车

            3.1 红外壁障模块分析STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结

            原理和循迹是一样的,循迹红外观朝下,跟随朝前

            3.2 跟随小车的原理
            • 左边跟随模块能返回红外,输出低电平,右边不能返回,输出高电平,说明物体在左边,需要左转
            • 右边跟随模块能返回红外,输出低电平,左边不能返回,输出高电平,说明物体在右边,需要右转
              3.3 跟随小车开发和调试代码

              硬件接线

              • B-1A -- PB0
              • B-1B -- PB1
              • A-1A -- PB2
              • A-1B -- PB10
              • 跟随模块(左) -- PB5
              • 跟随模块(右) -- PB6

                代码示例:

                #define LeftWheel_Value HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5)
                #define RightWheel_Value HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6)
                // main函数里
                while (1)
                {
                    if(LeftWheel_Value == GPIO_PIN_RESET && RightWheel_Value == GPIO_PIN_RESET)
                        goForward();
                    if(LeftWheel_Value == GPIO_PIN_SET && RightWheel_Value == GPIO_PIN_RESET)
                        goRight();
                    if(LeftWheel_Value == GPIO_PIN_RESET && RightWheel_Value == GPIO_PIN_SET)
                        goLeft();
                    if(LeftWheel_Value == GPIO_PIN_SET && RightWheel_Value == GPIO_PIN_SET)
                        stop();
                }
                
                3.4 超声波模块介绍

                使用超声波模块,型号:HC-SR04

                STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结

                • 怎么让它发送波 Trig ,给Trig端口至少10us的高电平
                • 怎么知道它开始发了 Echo信号,由低电平跳转到高电平,表示开始发送波
                • 怎么知道接收了返回波 Echo,由高电平跳转回低电平,表示波回来了
                • 怎么算时间 Echo引脚维持高电平的时间! 波发出去的那一下,开始启动定时器 波回来的拿一下,我们开始停止定时器,计算出中间经过多少时间
                • 怎么算距离 距离 = 速度 (340m/s)* 时间/2

                  时序图:

                  STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结

                  3.5 舵机模块介绍

                   1. 什么是舵机

                  如下图所示,最便宜的舵机sg90,常用三根或者四根接线,黄色为PWM信号控制 用处:垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等 常见的有0-90°、0-180°、0-360°

                  STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结

                  2. 怎么控制舵机

                  向黄色信号线“灌入”PWM信号

                  PWM波的频率不能太高,大约50HZ,即周期=1/频率=1/50=0.02s,20ms左右

                  确定周期/频率:

                  STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结

                  如果周期为20ms,则 PSC=7199,ARR=199

                  角度控制

                  0.5ms-------------0度; 2.5% 对应函数中CCRx为5

                  1.0ms------------45度; 5.0% 对应函数中CCRx为10

                  1.5ms------------90度; 7.5% 对应函数中CCRx为15

                  2.0ms-----------135度; 10.0% 对应函数中CCRx为20

                  2.5ms-----------180度; 12.5% 对应函数中CCRx为25STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结

                  3.6 摇头避障小车开发和调试代码

                  硬件接线

                  • sg90 -- PB9

                    cubeMX配置STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结

                    代码实现

                    sg90.c

                    #include "sg90.h"
                    #include "gpio.h"
                    #include "tim.h"
                    void initSG90(void)
                    {
                        HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4); //启动定时器4
                        __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 17); //将舵机置为90度
                    }
                    void sgMiddle(void)
                    {
                        __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 17); //将舵机置为90度
                    }
                    void sgRight(void)
                    {
                        __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 5); //将舵机置为0度
                    }
                    void sgLeft(void)
                    {
                        __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 25); //将舵机置为180度
                    }

                    sg90.h

                    #ifndef __SG90_H__
                    #define __SG90_H__
                    void initSG90(void);
                    void sgMiddle(void);
                    void sgRight(void);
                    void sgLeft(void);
                    #endif

                    main.c

                    initSG90();
                    HAL_Delay(1000);
                    while (1)
                    {
                        sgLeft();
                        HAL_Delay(1000);
                        sgMiddle();
                        HAL_Delay(1000);
                        sgRight();
                        HAL_Delay(1000);
                        sgMiddle();
                        HAL_Delay(1000);
                    }

                    封装超声波传感器

                    超声波模块接线:

                    • Trig       --    PB7
                    • Echo     -- PB8

                      cubeMX配置

                      STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结

                      代码实现

                      sr04.c

                      #include "sr04.h"
                      #include "gpio.h"
                      #include "tim.h"
                      //使用TIM2来做us级延时函数
                      void TIM2_Delay_us(uint16_t n_us)
                      {
                          /* 使能定时器2计数 */
                          __HAL_TIM_ENABLE(&htim2);
                          __HAL_TIM_SetCounter(&htim2, 0);
                          while(__HAL_TIM_GetCounter(&htim2)  
                      

                      sr04.h

                      #ifndef __SR04_H__
                      #define __SR04_H__
                      double get_distance(void);
                      #endif
                      

                      main.c

                      while (1)
                      {
                          if(dir != MIDDLE){
                              sgMiddle();
                              dir = MIDDLE;
                              HAL_Delay(300);
                          }
                          disMiddle = get_distance();
                          if(disMiddle > 35){
                          //前进
                          }
                          else
                          {
                              //停止
                              //测左边距离
                              sgLeft();
                              HAL_Delay(300);
                              disLeft = get_distance();
                              sgMiddle();
                              HAL_Delay(300);
                              sgRight();
                              dir = RIGHT;
                              HAL_Delay(300);
                              disRight = get_distance();
                          }
                      }

                      封装电机驱动

                      代码实现:

                      while (1)
                      {
                          if(dir != MIDDLE){
                              sgMiddle();
                              dir = MIDDLE;
                              HAL_Delay(300);
                          }
                          disMiddle = get_distance();
                          if(disMiddle > 35){
                              //前进
                              goForward();
                          }else if(disMiddle  
                      

                      4.测速小车

                      4.1 测速模块

                      STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结

                      • 用途:广泛用于电机转速检测,脉冲计数,位置限位等。
                      • 有遮挡,输出高电平;无遮挡,输出低电平
                      • 接线 :VCC 接电源正极3.3-5V
                      • GND 接电源负极 DO TTL开关信号输出
                      • AO 此模块不起作用
                        4.2 测试原理和单位换算
                        • 轮子走一圈,经过一个周长,C = 2x3.14x半径= 3.14 x 直径(6.5cm)
                        • 对应的码盘也转了一圈,码盘有20个格子,每经过一个格子,会遮挡(高电平)和不遮挡(低电平), 那么一个脉冲就是走了 3.14 * 6.5 cm /20 = 1.0205CM
                        • 定时器可以设计成一秒,统计脉冲数,一个脉冲就是1cm
                        • 假设一秒有80脉冲,那么就是80cm/s
                          4.3 定时器和中断实现测速开发和调试代码

                          测试数据通过串口发送到上位机

                          硬件接线

                          测速模块:

                          • VCC -- 3.3V 不能接5V,否则遮挡一次会触发3次中断
                          • OUT -- PB14

                            cubeMX配置STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结

                            代码实现:

                            unsigned int speedCnt;
                            void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
                            {
                                if (GPIO_Pin == GPIO_PIN_14)
                                    if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_14) == GPIO_PIN_RESET)
                                        speedCnt++;
                            }
                            void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
                            {
                                printf("speed: %d\r\n", speedCnt);
                                speedCnt = 0;
                            }
                            main函数里:
                            HAL_TIM_Base_Start_IT(&htim2);
                            4.4 小车速度显示在OLED屏

                            OLED模块介绍:STM32 OLED屏幕显示详解

                            硬件接线

                            • SCL -- PB6
                            • SDA -- PB7

                              代码示例:

                              oled.c

                              #include "oled.h"
                              #include "i2c.h"
                              #include "oledfont.h"
                              void Oled_Write_Cmd(uint8_t dataCmd)
                              {
                              	
                              	HAL_I2C_Mem_Write(&hi2c1, 0x78, 0x00, I2C_MEMADD_SIZE_8BIT,
                              										&dataCmd, 1, 0xff);
                              }
                              void Oled_Write_Data(uint8_t dataData)
                              {
                              	HAL_I2C_Mem_Write(&hi2c1, 0x78, 0x40, I2C_MEMADD_SIZE_8BIT,
                              										&dataData, 1, 0xff);
                              }
                              void Oled_Init(void){
                              	Oled_Write_Cmd(0xAE);//--display off
                              	Oled_Write_Cmd(0x00);//---set low column address
                              	Oled_Write_Cmd(0x10);//---set high column address
                              	Oled_Write_Cmd(0x40);//--set start line address  
                              	Oled_Write_Cmd(0xB0);//--set page address
                              	Oled_Write_Cmd(0x81); // contract control
                              	Oled_Write_Cmd(0xFF);//--128   
                              	Oled_Write_Cmd(0xA1);//set segment remap 
                              	Oled_Write_Cmd(0xA6);//--normal / reverse
                              	Oled_Write_Cmd(0xA8);//--set multiplex ratio(1 to 64)
                              	Oled_Write_Cmd(0x3F);//--1/32 duty
                              	Oled_Write_Cmd(0xC8);//Com scan direction
                              	Oled_Write_Cmd(0xD3);//-set display offset
                              	Oled_Write_Cmd(0x00);//
                              	
                              	Oled_Write_Cmd(0xD5);//set osc division
                              	Oled_Write_Cmd(0x80);//
                              	
                              	Oled_Write_Cmd(0xD8);//set area color mode off
                              	Oled_Write_Cmd(0x05);//
                              	
                              	Oled_Write_Cmd(0xD9);//Set Pre-Charge Period
                              	Oled_Write_Cmd(0xF1);//
                              	
                              	Oled_Write_Cmd(0xDA);//set com pin configuartion
                              	Oled_Write_Cmd(0x12);//
                              	
                              	Oled_Write_Cmd(0xDB);//set Vcomh
                              	Oled_Write_Cmd(0x30);//
                              	
                              	Oled_Write_Cmd(0x8D);//set charge pump enable
                              	Oled_Write_Cmd(0x14);//
                              	
                              	Oled_Write_Cmd(0xAF);//--turn on oled panel		
                              }
                              void Oled_Screen_Clear(void){
                              	char i,n;
                              	Oled_Write_Cmd (0x20);                    //set memory addressing mode
                              	Oled_Write_Cmd (0x02);                    //page addressing mode
                              	for(i=0;i4));                            //high	
                              	for(i=((oledChar-32)*16);i>4));                            //high
                              	for(i=((oledChar-32)*16+8);i 35){
                              		//前进
                              		goForward();
                              	}else if(disMiddle  
                              

                                                                                                  👇🏻 需要实物 添加 博主👇🏻

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码