嵌入式学习小组
直播中

张敏

7年用户 1570经验值
私信 关注

如何实现手机控制小车的行进?

如何实现手机控制小车的行进?

回帖(1)

王兵

2021-12-27 10:15:22
一、实验内容:

1.完成智能小车的组装;2.为组装好的小车进行系统录入,并确认板子焊接完好,无断线;3.通过小车的电路图,并利用keil uVision5和STM32Cube MX等软件对小车的各个模块进行编写程序;4.应用微控制器的端口、外部中断、定时器等基本模块对小车实现基本控制;5.通过控制按键来实现小车上灯光的闪烁控制;6.结合电源板、电机驱动板来控制电机的转动,实现小车的行进;7.加上红外线传感器,来实现小车的测距,加上蜂鸣器实现小车的报警;8.加上摄像头和舵机,来实现摄像头的360度旋转;9.实现小车与PC机的串口通信;10. 对小车加上WiFi模块可以连接手机APP,通过控制手机APP来实现小车的基本功能:前进、后退、转弯、红外线测距。 二、实验过程介绍

1.硬件准备:

    将小车组装好,检查各模块焊接无误:电源模块、单片机模块、红外线传感器模块、电机模块。
2.系统的总电路图:


(1) 芯片模块:

(2) 电源模块:

(3) 电机模块:

(4) 蜂鸣器模块:

(5) 超声波模块:

3.分模块功能:


(1)小车灯模块:

    1>通过按键来控制小车的灯的颜色变换。
      ·相关实验步骤截图:



2>通过按键来控制小车的灯的闪烁及亮度(即添加中断)。
    ·原理图:

    ·相关实验步骤截图:


3>通过按键来控制小车的灯实现呼吸灯效果。
    ·原理图:

    ·相关实验步骤截图:



·实验代码思路:
    1)启动定时器:HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);
    2)设置CMP的值:
        for(i=0;i<=100;i++){
              __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_3,i);
                HAL_Delay(50);
                    }
(2)电机模块:

  通过控制电机的转动来实现小车的行进。     ·原理图:

    ·相关实验步骤截图:



·实验代码思路:
  1)设置制动(即刹车):
void car_init(void){               HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);   //left            __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,0);           HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4);   //right          __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,0);        }   2)设置速度:
void car_front(int speed){                __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,speed);                __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,speed);}   3)设置前进:
void car_front(int speed){        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);  //input1==1        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);     //input2==0        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);  //input1==1        HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET);                 __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,speed);                __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,speed);}   4)设置后退:
`void car_back(void){        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);  //input1==1        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);     //input2==0        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);  //input1==1        HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET);        __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,30);        __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,30);}   5)设置左转:
void car_turn_left(void){        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);  //input1==1        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);     //input2==0        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);  //input1==1        HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET);        __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,0);        __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,30);}   6)设置右转:
void car_turn_right(void){        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);  //input1==1        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);     //input2==0        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);  //input1==1        HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET);        __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,30);        __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,0);}   7)设置停止:
void car_stop(void){        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);  //input1==1        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);     //input2==0        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);  //input1==1        HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET);        __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,0);        __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,0);}   8)调用函数
  car_init();  while (1)        {           car_stop();       HAL_Delay(5000);                car_front(30);    HAL_Delay(5000);                car_front(90);    HAL_Delay(5000);           car_back();       HAL_Delay(5000);                car_turn_left();  HAL_Delay(5000);                car_turn_right(); HAL_Delay(5000);                          } (3)舵机模块:

   通过加入摄像头和舵机实现摄像头的360度旋转。   ·相关实验步骤截图:




·实验代码思路:
  1)启动定时器:
      HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
  2)设置CMP:
        for(i=5;i<=25;i++)
          {
            __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,i);
              HAL_Delay(1000);
              }
        for(i=25;i>=5;i–)
            {
            __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,i);
              HAL_Delay(1000);
              }
(4)通信模块:

  实现的功能:pc发送消息给STM32,STM32返回数据   ·实验原理图:

  ·相关实验步骤截图:




·实验代码思路:
1)uint8_t rx_data[6];
2)使能接收:HAL_UART_Receive_IT(&huart1,rx_data,6);
    //表示每收6个字节才产生中断
3)串口中断函数:
  void HAL_UART_RxCpltCallback(UART_HandleTypeDef huart)
    //产生中断后,使数据保存
4)发送函数:
  HAL_UART_Transmit_IT(&huart1,(uint8_t
)“I love me too!”,strlen(“I love me too!”));
5)重新接收使用:
  HAL_UART_Receive_IT(&huart1,rx_data,6);
(5)蜂鸣器模块:

  实现的功能:利用红外线传感器实现当出现“悬崖”时实现蜂鸣器响。   ·相关实验步骤截图:


·实验代码思路:
  1)先启动定时器 HAL_TIM_Base_Start_IT(&htim2);
  2)写中断函数
(6)超声波模块:

实现的功能:连接超声波传感器并且在PC上接收数据。   ·实验原理图:

  ·相关实验步骤截图:



·实验代码思路:
  1)拉低PC3,并关灯
      HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_RESET);
      HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);
  2)拉高PC3,并启动定时器
      HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);
      HAL_TIM_Base_Start_IT(&htim2);
  3)实现定时器中断
      void HAL_TIM_PeroidElapsedCallback(TIM_HandleTypeDef *htim2)
      {
        }
  4)在中断中进行判断:
  5)设置标志位
4.整体设计:

(1)手机APP界面:


(2)整体实现的功能、思路及步骤:

·功能:
  通过手机APP控制小车,实现小车的前进、后退、左转、右转。并且利用超声波检测到障碍物时小车自动停止。
·思路:

·步骤:




(3)实验主要代码:






5.实验中遇到的问题及解决方法:

  实验中小车APP控制时按键不太灵验,而且经常出现按键抖动,而且连接线有时候经常出现问题,影响实验的进度。在控制小车时,手机上的控制位刚开始不太准确,经过调整后确定为第三位为控制位而进行实验成功。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分