响应红外信号,稳定地跟随黑线运行。

以下是该智能红外循迹小车的代码实现:

  1. 定义引脚和常量
#define leftMotorForwardPin GPIO_PIN_0
#define leftMotorBackwardPin GPIO_PIN_1
#define rightMotorForwardPin GPIO_PIN_2
#define rightMotorBackwardPin GPIO_PIN_3

#define IR1_Pin GPIO_PIN_0
#define IR1_GPIO_Port GPIOA
#define IR2_Pin GPIO_PIN_1
#define IR2_GPIO_Port GPIOA
#define IR3_Pin GPIO_PIN_2
#define IR3_GPIO_Port GPIOA
#define IR4_Pin GPIO_PIN_3
#define IR4_GPIO_Port GPIOA

#define IR_THRESHOLD 1000
  1. 初始化红外检测器和电机引脚
void MX_GPIO_Init(void)
{
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pins : IR1_Pin IR2_Pin IR3_Pin IR4_Pin */
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  GPIO_InitStruct.Pin = IR1_Pin | IR2_Pin | IR3_Pin | IR4_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pins : leftMotorForwardPin leftMotorBackwardPin rightMotorForwardPin rightMotorBackwardPin */
  GPIO_InitStruct.Pin = leftMotorForwardPin | leftMotorBackwardPin | rightMotorForwardPin | rightMotorBackwardPin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
  1. 定义电机控制函数
void setMotorSpeed(int leftSpeed, int rightSpeed) {
  if (leftSpeed > 0) {
    HAL_GPIO_WritePin(GPIOA, leftMotorForwardPin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, leftMotorBackwardPin, GPIO_PIN_RESET);
  } else if (leftSpeed < 0) {
    HAL_GPIO_WritePin(GPIOA, leftMotorForwardPin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, leftMotorBackwardPin, GPIO_PIN_SET);
  } else {
    HAL_GPIO_WritePin(GPIOA, leftMotorForwardPin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, leftMotorBackwardPin, GPIO_PIN_RESET);
  }
  
  if (rightSpeed > 0) {
    HAL_GPIO_WritePin(GPIOA, rightMotorForwardPin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, rightMotorBackwardPin, GPIO_PIN_RESET);
  } else if (rightSpeed < 0) {
    HAL_GPIO_WritePin(GPIOA, rightMotorForwardPin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, rightMotorBackwardPin, GPIO_PIN_SET);
  } else {
    HAL_GPIO_WritePin(GPIOA, rightMotorForwardPin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, rightMotorBackwardPin, GPIO_PIN_RESET);
  }
  
  __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, abs(leftSpeed));
  __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, abs(rightSpeed));
}
  1. 定义红外检测函数
uint8_t readIR() {
  uint8_t ir = 0;
  
  if (HAL_GPIO_ReadPin(IR1_GPIO_Port, IR1_Pin) < IR_THRESHOLD) {
    ir += 1;
  }
  
  if (HAL_GPIO_ReadPin(IR2_GPIO_Port, IR2_Pin) < IR_THRESHOLD) {
    ir += 2;
  }
  
  if (HAL_GPIO_ReadPin(IR3_GPIO_Port, IR3_Pin) < IR_THRESHOLD) {
    ir += 4;
  }
  
  if (HAL_GPIO_ReadPin(IR4_GPIO_Port, IR4_Pin) < IR_THRESHOLD) {
    ir += 8;
  }
  
  return ir;
}
  1. 主程序代码
int main(void)
{
  HAL_Init();
  MX_GPIO_Init();
  MX_TIM3_Init();

  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
  
  while (1)
  {
    uint8_t ir = readIR();
    
    if (ir == 0b0001 || ir == 0b0100 || ir == 0b1110) { // 左偏
      setMotorSpeed(-250, 250);
    } else if (ir == 0b0010 || ir == 0b1000 || ir == 0b0111) { // 右偏
      setMotorSpeed(250, -250);
    } else if (ir == 0b0011 || ir == 0b0110 || ir == 0b1100) { // 直行
      setMotorSpeed(250, 250);
    } else { // 停止
      setMotorSpeed(0, 0);
    }
  }
}

这个程序实现了对四个红外检测器的读取,并根据读取结果控制小车的转向和速度。具体实现中,当红外检测到黑线时,会输出低电平,因此可以通过读取引脚电平来判断小车的位置。当检测到小车偏离轨道时,会根据偏离的方向控制电机转速,从而使小车回到轨道上

我想要做一辆带有四个红外检测器和两个驱动电机以及型号为STM32F103RCT6的STM32芯片的智能红外循迹小车电池为两节74V2200mAh的锂电池编程软件为STM32CubeIDE我想得到这个小车实现的具体代码要求利用PWM可以控制小车的转弯和转速整体小车运行能够快速

原文地址: https://www.cveoy.top/t/topic/dq67 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录