【嵌入式】手机控制小车行进

一、实验内容:

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

相关文章: