当前位置:   article > 正文

32代码 四驱简易电动小车 蓝牙控制、语音控制、巡线、寻光、避障(内含语音模块天问ASR-PRO开发板的串口配置程序)_asrpro控制小车

asrpro控制小车

作者声明:
作者笔名为:北风
作者QQ号为:2547903457
作者个人简介1:现为大二的一名普通学生,祝自己努力加油!!!!
作者个人简介2:因作者初学,能力有限,部分代码并不精简,可根据自身能力进行更改;
作品简介1:
本车为四驱小车,现在具有的功能:蓝牙、语音、寻光、巡线、避障。通过上行蓝牙或语音模块来控制下行车辆行驶(前进、后退、左转、右转、原地左转、原地右转)以及三个功能(寻光、巡线、避障)。

作品简介2:
本车用到一个stm32f103rct6作为主控板、两块tb6612集成的电机驱动板D24A、
四个带编码器的电机(但没用到编码器)、一个电源模块(12V转3.3/5/12V)、一个四路红外巡线模块、
一个舵机模块SG90、一个超声波测距避障模块HC-SR04、三个光敏电阻传感器模块、一个天问语音模块、
两块电池(一块12V)、两块板子(电机在中间)、几个雪糕棒(用来向外扩展四路巡线模块)、杜邦线若干

作者提示1:
本车程序代码的绝大部分注释均为作者本人所写。

db50973856b748eb91cfdc38322a12d4.jpeg

70bac0cfca454e81a5a3b4d8a5b1d9f5.png

主函数main.c 

  1. #include "stm32f10x.h"
  2. #include "system.h"
  3. #include "Delay.h"
  4. #include "moto.h"
  5. #include "pwm.h"
  6. #include "Car.h"
  7. #include "Serial.h"
  8. #include "Timer1.h"
  9. #include "Ultrasound.h"
  10. #include "Track.h"
  11. #include "usart3.h"
  12. #include "Light.h"
  13. #include "Timer2.h"
  14. uint16_t Data1;
  15. extern u16 flag_send;
  16. extern u8 com_data;
  17. /*******************************************************************************************
  18. 作者声明:
  19. 作者笔名为:北风
  20. 作者QQ号为:2547903457
  21. 作者个人简介1:现为大二的一名普通学生,祝自己努力加油!!!!
  22. 作者个人简介2:因作者初学,能力有限,部分代码并不精简,可根据自身能力进行更改;
  23. 作品简介1
  24. 本车为四驱小车,现在具有的功能:蓝牙、语音、寻光、巡线、避障。通过上行蓝牙或语音模块来控制
  25. 下行车辆行驶(前进、后退、左转、右转、原地左转、原地右转)以及三个功能(寻光、巡线、避障)。
  26. 作品简介2
  27. 本车用到一个stm32f103rct6作为主控板、两块tb6612集成的电机驱动板D24A、
  28. 四个带编码器的电机(但没用到编码器)、一个电源模块(12V转3.3/5/12V)、一个四路红外巡线模块、
  29. 一个舵机模块SG90、一个超声波测距避障模块HC-SR04、三个光敏电阻传感器模块、一个天问语音模块、
  30. 两块电池(一块12V)、两块板子(电机在中间)、几个雪糕棒(用来向外扩展四路巡线模块)、杜邦线若干
  31. 作者提示1
  32. 本车程序代码的绝大部分注释均为作者本人所写。
  33. ********************************************************************************************/
  34. int main() //语音控制(三个功能1.寻光功能 xunguang(); 2.巡线功能 xunxian(); 3.避障功能 bizhang();)
  35. { //int main()的上花括号
  36. SystemInit(); //配置系统时钟为72M
  37. delay_init(); //延时函数初始化
  38. moto_Init(); //初始化gpioB pin_0/1/8/9/12/13/14/15
  39. TIM4PWM_Init(); //初始化设置舵机转向 右边为00°对应500 90°对应1500 180°对应2500
  40. Car_Init(); //初始化车辆行驶方向
  41. Light_Init(); //初始化寻光模块
  42. Track_Init(); //初始化巡线模块
  43. Ultrasound_Init(); //初始化避障模块
  44. USART3_Init(); //初始化语音模块(语音模块用到串口3
  45. Serial_Init(); //初始化蓝牙模块(蓝牙模块用到串口1
  46. PWM_Int(0,0); //初始化电机模块(此车为四驱,定时器五的四个通道都用了)
  47. while(1) //循环上花括号(设计的是通过蓝牙或语音来切换功能)
  48. { //(三个功能1.寻光功能 xunguang(); 2.巡线功能 xunxian(); 3.避障功能 bizhang();)
  49. if(Data1 == 0x37)xunguang(); //蓝牙模式下的寻光模式
  50. if(Data1 == 0x38)xunxian(); //蓝牙模式下的巡线模式
  51. if(Data1 == 0x39)bizhang(); //蓝牙模式下的避障模式
  52. if(com_data == 0x37)xunguang(); //语音模式下的寻光模式
  53. if(com_data == 0x38)xunxian(); //语音模式下的巡线模式
  54. if(com_data == 0x39)bizhang(); //语音模式下的避障模式
  55. } //循环下花括号
  56. } //int main()的下花括号
  57. /*****************************************************************************************************
  58. 下方函数功能 :通过蓝牙或语音控制车辆的前进、后退、左转、右转、原地左转、原地右转。
  59. 作者提示1:通过调用USART_ClearITPendingBit函数,可以将接收中断挂起位清零,以便下一次接收中断能够正常触发。
  60. 作者提示2:USART_ClearFlag(USART3,USART_FLAG_RXNE);同理一样的作用。
  61. ******************************************************************************************************/
  62. void USART1_IRQHandler(void) //蓝牙模块(蓝牙模块用到串口1)串口1中断服务程序
  63. {
  64. if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  65. {
  66. Data1=USART_ReceiveData(USART1);
  67. if(Data1 == 0x30)Car_Stop(); //停车函数可鼠标右键跳转查看
  68. if(Data1 == 0x31)Go_Ahead(); //前进函数可鼠标右键跳转查看
  69. if(Data1 == 0x32)Go_Back(); //后退函数可鼠标右键跳转查看
  70. if(Data1 == 0x33)Turn_Left(); //左转函数可鼠标右键跳转查看
  71. if(Data1 == 0x34)Turn_Right(); //右转函数可鼠标右键跳转查看
  72. if(Data1 == 0x35)Self_Left(); //原地左转函数可鼠标右键跳转查看
  73. if(Data1 == 0x36)Self_Right(); //原地右转函数可鼠标右键跳转查看
  74. USART_ClearITPendingBit(USART1, USART_IT_RXNE);
  75. }
  76. }
  77. void USART3_IRQHandler(void) //语音模块(语音模块用到串口3)串口3中断服务程序
  78. {
  79. if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  80. {
  81. USART_ClearFlag(USART3,USART_FLAG_RXNE);
  82. com_data = USART3->DR;
  83. if(com_data == 0x30)Car_Stop();
  84. if(com_data == 0x31)Go_Ahead();
  85. if(com_data == 0x32)Go_Back();
  86. if(com_data == 0x33)Turn_Left();
  87. if(com_data == 0x34)Turn_Right();
  88. if(com_data == 0x35)Self_Left();
  89. if(com_data == 0x36)Self_Right();
  90. }
  91. }
  92. /*******************************************************************************************
  93. 下方为各功能模块的独立代码:1.寻光功能 xunguang(); 2.巡线功能 xunxian(); 3.避障功能 bizhang();
  94. 在测试使用各功能模块时请解除对应模块的注释。
  95. ********************************************************************************************/
  96. /*******************************************************************************************
  97. 功能模块:1.寻光功能 xunguang();
  98. ********************************************************************************************/
  99. //int TargetVelocity=500;
  100. //int main(void)
  101. // {
  102. // SystemInit(); //配置系统时钟为72M
  103. // delay_init(); //延时函数初始化
  104. // moto_Init(); //初始化gpioB pin_0/1/8/9/12/13/14/15
  105. // Car_Init();
  106. // Light_Init();
  107. // PWM_Int(0,0);
  108. // while(1)
  109. // {
  110. // xunguang();
  111. // }
  112. // }
  113. /*******************************************************************************************
  114. 功能模块:2.巡线功能 xunxian();
  115. ********************************************************************************************/
  116. //int TargetVelocity=500;
  117. //int main(void)
  118. //{
  119. // SystemInit(); //配置系统时钟为72M
  120. // delay_init(); //延时函数初始化
  121. // moto_Init(); //初始化gpioB pin_0/1/8/9/12/13/14/15
  122. // Car_Init();
  123. // Track_Init();
  124. // PWM_Int(0,0);
  125. //
  126. // while(1)
  127. // {
  128. // xunxian();
  129. // }
  130. //}
  131. /*******************************************************************************************
  132. 功能模块:3.避障功能 bizhang();
  133. ********************************************************************************************/
  134. //int TargetVelocity=500; //自动避障功能
  135. //int main(void)
  136. // {
  137. // SystemInit(); //配置系统时钟为72M
  138. // delay_init(); //延时函数初始化
  139. // moto_Init(); //初始化gpioB pin_0/1/8/9/12/13/14/15
  140. // TIM4PWM_Init();
  141. // Car_Init();
  142. // Ultrasound_Init();
  143. // PWM_Int(0,0);
  144. // while(1)
  145. // {
  146. // bizhang();
  147. // }
  148. //}
  149. /*******************************************************************************************
  150. 直线巡线时绕开障碍物后继续巡线:绕开障碍物的函数(本代码实现从左侧绕过障碍物并回到直行线上)
  151. (需按照实际情况更改)
  152. ********************************************************************************************/
  153. // Car_Stop();
  154. // delay_ms(240);
  155. // Self_Left();
  156. // delay_ms(834);
  157. // Go_Ahead();
  158. // delay_ms(520);
  159. // Self_Right();
  160. // delay_ms(750);
  161. // Go_Ahead();
  162. // delay_ms(800);
  163. // Self_Right();
  164. // delay_ms(740);
  165. // Go_Ahead();
  166. // delay_ms(790);
  167. // Self_Left();
  168. // delay_ms(380);
  169. // Car_Stop();
  170. // delay_ms(500);
  171. /*******************************************************************************************
  172. 后续功能可按照自己所需功能自行添加
  173. ********************************************************************************************/

usart3.c串口3全套配置

  1. #include "stm32f10x.h"
  2. #include "usart3.h"
  3. u16 flag_send=0;
  4. u8 com_data;
  5. u16 USART3_RX_STA=0;
  6. /**************************************************************************
  7. 函数功能:语音配置,用到串口3
  8. 作者提示:下方所有函数代码,b站江协科技up主都讲过
  9. ***************************************************************************/
  10. void USART3_Init(void)
  11. {
  12. GPIO_InitTypeDef GPIO_InitStrue;
  13. USART_InitTypeDef USART3_InitStrue;
  14. NVIC_InitTypeDef NVIC_InitStrue;
  15. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  16. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
  17. GPIO_InitStrue.GPIO_Mode = GPIO_Mode_AF_PP;//推挽输出(发射)
  18. GPIO_InitStrue.GPIO_Pin = GPIO_Pin_10;
  19. GPIO_InitStrue.GPIO_Speed = GPIO_Speed_50MHz;
  20. GPIO_Init(GPIOB, &GPIO_InitStrue);
  21. GPIO_InitStrue.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入(接收)
  22. GPIO_InitStrue.GPIO_Pin = GPIO_Pin_11;
  23. GPIO_InitStrue.GPIO_Speed = GPIO_Speed_50MHz;
  24. GPIO_Init(GPIOB, &GPIO_InitStrue);
  25. USART3_InitStrue.USART_BaudRate = 115200;
  26. USART3_InitStrue.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  27. USART3_InitStrue.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
  28. USART3_InitStrue.USART_Parity = USART_Parity_No;//奇偶校验位
  29. USART3_InitStrue.USART_StopBits = USART_StopBits_1;//停止位
  30. USART3_InitStrue.USART_WordLength = USART_WordLength_8b;//数据位
  31. USART_Init(USART3, &USART3_InitStrue);
  32. USART_Cmd(USART3, ENABLE);
  33. USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//打开接收中断,当接收到数据时开启中断
  34. NVIC_InitStrue.NVIC_IRQChannel = USART3_IRQn;
  35. NVIC_InitStrue.NVIC_IRQChannelCmd = ENABLE;
  36. NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 0;
  37. NVIC_InitStrue.NVIC_IRQChannelSubPriority = 1;
  38. NVIC_Init(&NVIC_InitStrue);
  39. }
  40. //extern u8 check_flag;
  41. void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
  42. {
  43. /* 发送一个字节数据到 USART */
  44. USART_SendData(pUSARTx,ch);
  45. /* 等待发送数据寄存器为空 */
  46. while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
  47. }
  48. void Usart_SendString(USART_TypeDef* pUSARTx, char *str)
  49. {
  50. unsigned int k=0;
  51. do
  52. {
  53. Usart_SendByte(pUSARTx, *(str + k));
  54. k++;
  55. }while(*(str + k) != '\0');
  56. /* 等待发送完成 */
  57. while (USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
  58. {}
  59. }

usart3.h串口3全套配置

  1. #ifndef _usart3_H
  2. #define _usart3_H
  3. #include "system.h"
  4. #define USART3_MAX_RECV_LEN 600 //最大接收缓存字节数
  5. #define USART3_MAX_SEND_LEN 600 //最大发送缓存字节数
  6. //#define USART3_RX_EN 1 //0,不接收;1,接收.
  7. extern u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //接收缓冲,最大USART3_MAX_RECV_LEN字节
  8. extern u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //发送缓冲,最大USART3_MAX_SEND_LEN字节
  9. extern u16 USART3_RX_STA; //接收数据状态
  10. void USART3_Init(void); //串口3初始化
  11. void Usart_SendString(USART_TypeDef* pUSARTx, char *str);
  12. #endif

usart3中提及的

system.c的配置

  1. #include "system.h" //请跳转至.h文件查看注释,此模块.c文件中不需要任何代码

 system.h

  1. #ifndef _system_H
  2. #define _system_H
  3. #include "stm32f10x.h"
  4. //位带操作,实现51类似的GPIO控制功能
  5. //具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).
  6. //IO口操作宏定义
  7. #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
  8. #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
  9. #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
  10. //IO口地址映射
  11. #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
  12. #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C
  13. #define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C
  14. #define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C
  15. #define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C
  16. #define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C
  17. #define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C
  18. #define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808
  19. #define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08
  20. #define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008
  21. #define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408
  22. #define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808
  23. #define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08
  24. #define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08
  25. //IO口操作,只对单一的IO口!
  26. //确保n的值小于16!
  27. #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
  28. #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入
  29. #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出
  30. #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入
  31. #define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出
  32. #define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入
  33. #define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出
  34. #define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入
  35. #define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出
  36. #define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入
  37. #define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出
  38. #define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入
  39. #define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出
  40. #define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //输入
  41. #endif

祝你学习进步! 

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

闽ICP备14008679号