[其他ST产品] 基于STM32红外避障小车的设计(有代码)

[复制链接]
2009|24
 楼主| 4c1l 发表于 2022-8-29 23:00 | 显示全部楼层 |阅读模式
什么是避障小车 用红外光电传感器,探测到物体即输出脉冲,输入到单片机中处 理一下,再对电机驱动模块进行控制,实现壁障的功能,这样的避障小车又称为简单的避障机器人。
各种避障方法:
1、红外线避障 2、超声波避障
红外避障原理 基本硬件 红外发射管和接收管:分离式和一体式
40233630cd49e2c7cf.png
变送电路:模拟量;数字量:将模拟量经过比较器输出开关量

评论

———————————————— 版权声明:本文为CSDN博主「ShawnWang1994」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/ShawnWang1994/article/details/106760347  发表于 2022-8-29 23:01
 楼主| 4c1l 发表于 2022-8-29 23:02 | 显示全部楼层
选择模块简介:

2372630cd4ed10534.png
不怕光HJ-IR2传感器 • 1、HJ-IR2相当于一个红外电子开关,检测到障碍输出低电平,平 时高电平。。 • 2、前方有障碍物时,红外管发出的红外信号经红外接收管接收 回来后,经集成的芯片放大,比较后,输出一低电平,点亮模块 上的LED发光管,同时可以输出一个低平信号,信号可以作为单 片机的信号输入检测控制外部各种驱动模块之用。 • 3、模块三线制,VCC为电原+5V,OUT为信号输出端,GND接电源 负极。 • 4、探测距离大概为1~30CM(探测距离的长短和供电电压、电流还 有周围环境有关,这里只作为参考) • 5、工作电压5V 工作电流 18-30ma左右。
 楼主| 4c1l 发表于 2022-8-29 23:02 | 显示全部楼层
2路壁障模块的输出 :

在一般电子设计比赛等对壁障模块功能要求不高的场合,完全可 以采用比较器输出开关量,这样编程简单,易于实现; 1路壁障模块模块则输出1路开关量,可以接单片机的普通输入IO 口;
 楼主| 4c1l 发表于 2022-8-29 23:03 | 显示全部楼层
路壁障模块原理 :

根据小车的运行情况有以下几种运动方式:
若没有被任何一个探头检测到,小车直行; 左边探头检测到物体时小车向右转 ; 右这探头检测到物体时小车向左转 •;上述算法描述是最简单的红外壁障算法,如果有一定的速度需求, 则在以上算法上进行改进。
 楼主| 4c1l 发表于 2022-8-29 23:04 | 显示全部楼层
壁障模块的安装调试步骤 :

将2路探头呈一行布置在智能车前方,探头朝前面, 可以采用铜柱+螺丝方式固定; 将中控板固定在车身上; 正确连接中控板和探头的杜邦线; 正确连接控制主板; 将小车放到地面上,前方10CM处放物体,调节电位器, 保证某探头在经过物体时,LED的状态不同。 若无论怎么调节电位器,LED状态都不变化,则应该 是杜邦线接触不好,要更换。
 楼主| 4c1l 发表于 2022-8-29 23:05 | 显示全部楼层
简单源码分析—IO口定义

28469630cd58ee9056.png
 楼主| 4c1l 发表于 2022-8-29 23:31 | 显示全部楼层
简单源码分析—算法分析
87616630cdbc4ecc4e.png
 楼主| 4c1l 发表于 2022-8-29 23:32 | 显示全部楼层
主程序:

  1. #include "stm32f10x.h"
  2. #include "interface.h"
  3. #include "LCD1602.h"
  4. #include "IRCtrol.h"
  5. #include "motor.h"
  6. #include "UltrasonicCtrol.h"
  7. #include "redvoid.h"

  8. //全局变量定义
  9. unsigned int speed_count=0;//占空比计数器 50次一周期
  10. char front_left_speed_duty=SPEED_DUTY;
  11. char front_right_speed_duty=SPEED_DUTY;
  12. char behind_left_speed_duty=SPEED_DUTY;
  13. char behind_right_speed_duty=SPEED_DUTY;

  14. unsigned char tick_5ms = 0;//5ms计数器,作为主函数的基本周期
  15. unsigned char tick_1ms = 0;//1ms计数器,作为电机的基本计数器
  16. unsigned char tick_200ms = 0;//刷新显示

  17. char ctrl_comm = COMM_STOP;//控制指令
  18. char ctrl_comm_last = COMM_STOP;//上一次的指令
  19. unsigned char continue_time=0;

  20. int main(void)
  21. {
  22.         delay_init();
  23.         GPIOCLKInit();
  24.         UserLEDInit();
  25. //        LCD1602Init();
  26. //        IRCtrolInit();
  27.         TIM2_Init();
  28.         MotorInit();
  29.         //UltraSoundInit();
  30.         RedRayInit();
  31.         ServoInit();

  32. while(1)
  33. {         
  34.                          if(tick_5ms >= 5)
  35.                 {
  36.                         tick_5ms = 0;
  37.                         tick_200ms++;
  38.                         if(tick_200ms >= 40)
  39.                         {
  40.                                 tick_200ms = 0;
  41.                                 LEDToggle(LED_PIN);
  42.                         }

  43.                         VoidRun();

  44.                 }
  45.                
  46. }
  47. }


 楼主| 4c1l 发表于 2022-8-29 23:32 | 显示全部楼层
串口部分:
  1. #include "uart.h"
  2. #include "interface.h"

  3. //UART function
  4. //UART1 TxD GPIOA9   RxD GPIOA10
  5. void USART1Conf(u32 baudRate)
  6. {
  7.         USART_InitTypeDef USART_InitSturct;//定义串口1的初始化结构体

  8.         GPIO_InitTypeDef GPIO_InitStruct;//定义串口对应管脚的结构体

  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA , ENABLE);//打开串口管脚时钟
  10.         //USART1_Tx_Pin Configure
  11.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;//输出引脚
  12.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;//设置最高速度50MHz
  13.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//推挽复用输出
  14.         GPIO_Init(GPIOA , &GPIO_InitStruct);//将初始化好的结构体装入寄存器

  15. //USART1_Rx_Pin Configure
  16.   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//GPIO模式悬浮输入
  17.   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;//输入引脚
  18.   GPIO_Init(GPIOA, &GPIO_InitStruct);//将初始化好的结构体装入寄存器

  19. //USART1 Configure       
  20.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);//时钟使能
  21.         USART_InitSturct.USART_BaudRate = baudRate;//波特率19200
  22.         USART_InitSturct.USART_WordLength = USART_WordLength_8b;//数据宽度8位
  23.         USART_InitSturct.USART_StopBits = USART_StopBits_1;//一个停止位
  24.         USART_InitSturct.USART_Parity = USART_Parity_No;//无奇偶校验
  25.         USART_InitSturct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  26.         USART_InitSturct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//使能发送与接收
  27.         USART_Init(USART1 , &USART_InitSturct);//将初始化好的结构体装入寄存器       
  28.         //USART1_INT Configure
  29.         USART_ITConfig(USART1 , USART_IT_RXNE , ENABLE);//使能接收中断
  30. //        USART_ITConfig(USART1 , USART_IT_TXE , ENABLE);
  31.         USART_Cmd(USART1 , ENABLE);//打开串口
  32.         USART_ClearFlag(USART1 , USART_FLAG_TC);//解决第一个数据发送失败的问题
  33. }

  34. void PutChar(u8 Data)
  35. {
  36.         USART_SendData(USART1 , Data);
  37.         while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//等待发送完毕
  38. }
  39. void PutStr(char *str)//发送一个字符串
  40. {
  41.         while(*str != '\0')
  42.         {
  43.                 USART_SendData(USART1 , *str++);
  44.                 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//等待发送完毕
  45.         }
  46. }

  47. void PutNChar(u8 *buf , u16 size)
  48. {
  49.   u8 i;
  50.         while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); //防止第一字节丢失
  51.         for(i=0;i<size;i++)
  52.         {
  53.                  USART_SendData(USART1 , buf[i]);
  54.                  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//等待发送完毕
  55.         }
  56. }




 楼主| 4c1l 发表于 2022-8-29 23:33 | 显示全部楼层
电机模块:
  1. #include "motor.h"
  2. #include "interface.h"
  3. #include "stm32f10x.h"

  4. //GPIO配置函数
  5. void MotorGPIO_Configuration(void)
  6. {               
  7.         GPIO_InitTypeDef GPIO_InitStructure;
  8.         GPIO_InitStructure.GPIO_Pin = FRONT_LEFT_F_PIN;
  9.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        
  11.         GPIO_Init(FRONT_LEFT_F_GPIO, &GPIO_InitStructure);   
  12.        
  13.         GPIO_InitStructure.GPIO_Pin = FRONT_LEFT_B_PIN;       
  14.         GPIO_Init(FRONT_LEFT_B_GPIO, &GPIO_InitStructure);
  15.        
  16.         GPIO_InitStructure.GPIO_Pin = FRONT_RIGHT_F_PIN;       
  17.         GPIO_Init(FRONT_RIGHT_F_GPIO, &GPIO_InitStructure);
  18.        
  19.         GPIO_InitStructure.GPIO_Pin = FRONT_RIGHT_B_PIN;       
  20.         GPIO_Init(FRONT_RIGHT_B_GPIO, &GPIO_InitStructure);
  21.        
  22.         GPIO_InitStructure.GPIO_Pin = BEHIND_LEFT_F_PIN;       
  23.         GPIO_Init(BEHIND_LEFT_F_GPIO, &GPIO_InitStructure);  
  24.        
  25.         GPIO_InitStructure.GPIO_Pin = BEHIND_LEFT_B_PIN;       
  26.         GPIO_Init(BEHIND_LEFT_B_GPIO, &GPIO_InitStructure);  
  27.        
  28.         GPIO_InitStructure.GPIO_Pin = BEHIND_RIGHT_F_PIN;       
  29.         GPIO_Init(BEHIND_RIGHT_F_GPIO, &GPIO_InitStructure);  
  30.        
  31.         GPIO_InitStructure.GPIO_Pin = BEHIND_RIGHT_B_PIN;       
  32.         GPIO_Init(BEHIND_RIGHT_B_GPIO, &GPIO_InitStructure);  
  33.        
  34. }

  35. //根据占空比驱动电机转动
  36. void CarMove(void)
  37. {   
  38.        
  39.          BEHIND_RIGHT_EN;
  40.        
  41. /* //左前轮
  42.         if(front_left_speed_duty > 0)//向前
  43.         {
  44.                 if(speed_count < front_left_speed_duty)
  45.                 {
  46.                         FRONT_LEFT_GO;
  47.                 }else
  48.                 {
  49.                         FRONT_LEFT_STOP;
  50.                 }
  51.         }
  52.         else if(front_left_speed_duty < 0)//向后
  53.         {
  54.                 if(speed_count < (-1)*front_left_speed_duty)
  55.                 {
  56.                         FRONT_LEFT_BACK;
  57.                 }else
  58.                 {
  59.                         FRONT_LEFT_STOP;
  60.                 }
  61.         }
  62.         else                //停止
  63.         {
  64.                 FRONT_LEFT_STOP;
  65.         }*/
  66.        
  67.                 //右前轮
  68.         if(front_right_speed_duty > 0)//向前
  69.         {
  70.                 if(speed_count < front_right_speed_duty)
  71.                 {
  72.                         FRONT_RIGHT_GO;
  73.                 }else                //停止
  74.                 {
  75.                         FRONT_RIGHT_STOP;
  76.                 }
  77.         }
  78.         else if(front_right_speed_duty < 0)//向后
  79.         {
  80.                 if(speed_count < (-1)*front_right_speed_duty)
  81.                 {
  82.                         FRONT_RIGHT_BACK;
  83.                 }else                //停止
  84.                 {
  85.                         FRONT_RIGHT_STOP;
  86.                 }
  87.         }
  88.         else                //停止
  89.         {
  90.                 FRONT_RIGHT_STOP;
  91.         }
  92.        
  93.         //左后轮
  94.         if(behind_left_speed_duty > 0)//向前
  95.         {
  96.                 if(speed_count < behind_left_speed_duty)
  97.                 {
  98.                         BEHIND_LEFT_GO;
  99.                 }        else                //停止
  100.                 {
  101.                         BEHIND_LEFT_STOP;
  102.                 }
  103.         }
  104.         else if(behind_left_speed_duty < 0)//向后
  105.         {
  106.                 if(speed_count < (-1)*behind_left_speed_duty)
  107.                 {
  108.                         BEHIND_LEFT_BACK;
  109.                 }        else                //停止
  110.                 {
  111.                         BEHIND_LEFT_STOP;
  112.                 }
  113.         }
  114.         else                //停止
  115.         {
  116.                 BEHIND_LEFT_STOP;
  117.         }
  118.        
  119. /*                //右后轮
  120.         if(behind_right_speed_duty > 0)//向前
  121.         {
  122.                 if(speed_count < behind_right_speed_duty)
  123.                 {
  124.                         BEHIND_RIGHT_GO;
  125.                 }        else                //停止
  126.                 {
  127.                         BEHIND_RIGHT_STOP;
  128.                 }
  129.         }
  130.         else if(behind_right_speed_duty < 0)//向后
  131.         {
  132.                 if(speed_count < (-1)*behind_right_speed_duty)
  133.                 {
  134.                         BEHIND_RIGHT_BACK;
  135.                 }        else                //停止
  136.                 {
  137.                         BEHIND_RIGHT_STOP;
  138.                 }
  139.         }
  140.         else                //停止
  141.         {
  142.                 BEHIND_RIGHT_STOP;
  143.         }*/
  144. }

  145. //向前
  146. void CarGo(void)
  147. {
  148.         front_left_speed_duty=SPEED_DUTY;
  149.         front_right_speed_duty=SPEED_DUTY;
  150.         behind_left_speed_duty=SPEED_DUTY;
  151.         behind_right_speed_duty=SPEED_DUTY;
  152. }

  153. //后退
  154. void CarBack(void)
  155. {
  156.         front_left_speed_duty=-SPEED_DUTY;
  157.         front_right_speed_duty=-SPEED_DUTY;
  158.         behind_left_speed_duty=-SPEED_DUTY;
  159.         behind_right_speed_duty=-SPEED_DUTY;
  160. }

  161. //向左
  162. void CarLeft(void)
  163. {
  164.         front_left_speed_duty=-20;
  165.         front_right_speed_duty=SPEED_DUTY;
  166.         behind_left_speed_duty=-20;
  167.         behind_right_speed_duty=SPEED_DUTY+10;//增加后轮驱动力
  168. }

  169. //向右
  170. void CarRight(void)
  171. {
  172.         front_left_speed_duty=SPEED_DUTY;
  173.         front_right_speed_duty=-20;
  174.         behind_left_speed_duty=SPEED_DUTY+10;//增加后轮驱动力
  175.         behind_right_speed_duty=-20;
  176. }

  177. //停止
  178. void CarStop(void)
  179. {
  180.         front_left_speed_duty=0;
  181.         front_right_speed_duty=0;
  182.         behind_left_speed_duty=0;
  183.         behind_right_speed_duty=0;
  184. }

  185. void MotorInit(void)
  186. {
  187.         MotorGPIO_Configuration();
  188.         CarStop();
  189. }


 楼主| 4c1l 发表于 2022-8-29 23:34 | 显示全部楼层
红外遥控配置:
  1. #include "IRCtrol.h"
  2. #include "interface.h"

  3. unsigned char ir_rec_flag=0;//接收数据标志位 1 有新数据 0 没有
  4. unsigned char IRCOM[4];

  5. //use time3 realize delay systick已经在main函数中使用了,在中断中不能重复使用
  6. void Time3Init(void)
  7. {
  8.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  9.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  10.     TIM_TimeBaseStructure.TIM_Period = 1;
  11.     TIM_TimeBaseStructure.TIM_Prescaler = (72 - 1);//72M / 72 = 1us
  12.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
  13.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  14. }

  15. //1us 延时
  16. void DelayUs(vu32 nCount)
  17. {
  18.   u16 TIMCounter = nCount;
  19.   TIM_Cmd(TIM3, ENABLE);
  20.   TIM_SetCounter(TIM3, TIMCounter);
  21.   while (TIMCounter>1)
  22.   {
  23.     TIMCounter = TIM_GetCounter(TIM3);
  24.   }
  25.   TIM_Cmd(TIM3, DISABLE);
  26. }

  27. //外部中断配置 红外遥控配置
  28. void IRCtrolInit(void)
  29. {
  30.         GPIO_InitTypeDef  GPIO_InitStructure;
  31.         EXTI_InitTypeDef         EXTI_InitStructure;//定义一个外部中断相关的结构体
  32.         NVIC_InitTypeDef NVIC_InitStructure; //定义一个中断的结构体
  33.        
  34.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);
  35.         GPIO_InitStructure.GPIO_Pin = IRIN_PIN;//配置使能GPIO管脚
  36.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//配置GPIO模式,输入上拉
  37.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//配置GPIO端口速度
  38.         GPIO_Init(IRIN_GPIO , &GPIO_InitStructure);
  39.                
  40.         GPIO_EXTILineConfig(IRIN_PORTSOURCE , IRIN_PINSOURCE);
  41.         EXTI_InitStructure.EXTI_Line = IRIN_EXITLINE;//将对应的GPIO口连接到中断线上
  42.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//中断事件类型,下降沿
  43.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//选择模式,中断型
  44.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能该中断
  45.         EXTI_Init(&EXTI_InitStructure);//将配置好的参数写入寄存器
  46.                        
  47.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);         //阶级为0,不可嵌套
  48.         NVIC_InitStructure.NVIC_IRQChannel =         IRIN_IRQCH;//打开PINA_8的外部中断
  49.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//主优先级0,最高
  50.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        //子优先级,最低
  51.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //使能该模块中断
  52.         NVIC_Init(&NVIC_InitStructure);        //中断初始化,将结构体定义的数据执行
  53.        
  54.         Time3Init();
  55. }

  56. /*******************************************************************************
  57. * 函 数 名 :DelayIr
  58. * 函数功能 :0.14MS 延时
  59. * 输    入 :无
  60. * 输    出 :无
  61. *******************************************************************************/
  62. void DelayIr(unsigned char x)  
  63. {
  64.   while(x--)
  65. {
  66.   DelayUs(140);
  67. }
  68. }

  69. void IRIntIsr(void)
  70. {
  71.   unsigned char j,k,N=0;
  72.          DelayIr(15);
  73.          if (IRIN==1)
  74.      {
  75.            return;
  76.           }
  77.                  continue_time = 40;//连发信号,表示指令持续 40*5 = 200ms 无指令停车
  78.                            //确认IR信号出现
  79.   while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
  80.     {DelayIr(1);}

  81. for (j=0;j<4;j++)         //收集四组数据
  82. {
  83.   for (k=0;k<8;k++)        //每组数据有8位
  84.   {
  85.    while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
  86.      {DelayIr(1);}
  87.     while (!IRIN)          //等 IR 变为高电平
  88.      {DelayIr(1);}
  89.      while (IRIN)           //计算IR高电平时长
  90.       {
  91.     DelayIr(1);
  92.     N++;           
  93.     if (N>=30)
  94.          {
  95.          return;}                  //0.14ms计数过长自动离开。
  96.       }                        //高电平计数完毕               
  97.      IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
  98.      if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”
  99.      N=0;
  100.   }//end for k
  101. }//end for j
  102.    
  103.         k = ~IRCOM[3];
  104.    if (IRCOM[2] != k)
  105.    {
  106.      return; }
  107.          
  108.                  //指令转换
  109.                  
  110.                  switch(IRCOM[2])
  111.                  {
  112.                          case 0x46: ctrl_comm = COMM_UP;break;
  113.                          case 0x15: ctrl_comm = COMM_DOWN;break;
  114.                          case 0x44: ctrl_comm = COMM_LEFT;break;
  115.                          case 0x43: ctrl_comm = COMM_RIGHT;break;
  116.                          case 0x40: ctrl_comm = COMM_STOP;break;
  117.                          default :  return;
  118.                  }
  119.                  ir_rec_flag = 1;
  120.        
  121. }

 楼主| 4c1l 发表于 2022-8-29 23:35 | 显示全部楼层
红外避障模块:
  1. #include "redvoid.h"
  2. #include "interface.h"
  3. #include "motor.h"

  4. extern char ctrl_comm;

  5. //获取红外避障模块状态
  6. char GetVoidStatus(void)
  7. {
  8.         char left=0,right=0;
  9.         char count;
  10.         if(VOID_L_IO == BARRIER_Y)
  11.         {
  12.                 count = 2;
  13.                 while(--count)//10ms 采集2次均要采集到前面障碍物信息,滤波
  14.                 {
  15.                         if(VOID_L_IO == BARRIER_N)
  16.                                 break;
  17.                         Delayms(1);
  18.                 }
  19.                 if(count == 0) left = 1;
  20.         }
  21.        
  22.         if(VOID_R_IO == BARRIER_Y)
  23.         {
  24.                 count = 2;
  25.                 while(--count)//10ms 采集2次均要采集到前面障碍物信息,滤波
  26.                 {
  27.                         if(VOID_R_IO == BARRIER_N)
  28.                                 break;
  29.                         Delayms(1);
  30.                 }
  31.                 if(count == 0) right = 2;
  32.         }
  33.        
  34.         return left + right;
  35. }

  36. //延时的同时检测红外,一旦发生障碍物,就停止并跳出延时
  37. void DelayCheck(int ms)
  38. {
  39.         while(ms--)
  40.         {
  41.                 Delayms(1);
  42.                 if(VOID_NONE != GetVoidStatus())
  43.                 {
  44.                         CarStop();
  45.                         return;
  46.                 }
  47.         }
  48. }

  49. //红外避障处理
  50. //处理方式:左边检测到  后退500ms 右转500ms
  51. //                        右边检测到  后退500ms 左转500ms
  52. //                        两边检测到  后退700ms 右转500ms
  53. //          没检测到    直行
  54. void VoidRun(void)
  55. {
  56.         char status;
  57.         status = GetVoidStatus();
  58.        
  59.         switch(status)
  60.         {
  61.                 case VOID_LEFT:
  62.                         ctrl_comm = COMM_RIGHT;CarBack(); Delayms(500); CarRight(); DelayCheck(500);
  63.                         break;
  64.                 case VOID_RIGHT:
  65.                         ctrl_comm = COMM_LEFT;CarBack(); Delayms(500); CarLeft(); DelayCheck(500);       
  66.                         break;
  67.                 case VOID_BOTH:
  68.                         ctrl_comm = COMM_RIGHT;CarBack(); Delayms(700); CarRight(); DelayCheck(500);
  69.                         break;
  70.                 case VOID_NONE:
  71.                         ctrl_comm = COMM_UP;CarGo();
  72.                         break;
  73.                 default: break;
  74.         }
  75. }


zerorobert 发表于 2022-9-7 20:44 | 显示全部楼层
这个能检测小车的姿态吗
lzmm 发表于 2022-9-7 21:02 | 显示全部楼层
平衡车的算法和资料
Stahan 发表于 2022-9-7 22:03 | 显示全部楼层
这个能检测小车的姿态吗
earlmax 发表于 2022-9-8 10:01 | 显示全部楼层
这个小车的工程文件有吗
uiint 发表于 2022-9-8 13:12 | 显示全部楼层
如何调整小车的速度呢?
match007 发表于 2022-9-8 20:42 | 显示全部楼层
成品什么样?能展示么
myiclife 发表于 2022-9-11 15:43 | 显示全部楼层
没有完整的设计吗
primojones 发表于 2022-9-11 20:37 | 显示全部楼层
stm32的驱动代码怎么写
您需要登录后才可以回帖 登录 | 注册

本版积分规则

65

主题

703

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部