9/30 RC car

정유석·2024년 9월 29일

조이스틱을 이용한 RC car 만들기

stm32로 각 모듈들 제어, 블루투스와 stm32는 uart로 통신, 두개의 stm32는 블루투스를 통한 무선 통신

RC car stm32

  • RC car용 stm32와 dc모터 드라이버와 연결 dc모터 드라이버는 4개의 모터와 연결
  • stm32와 블루투스 연결-uart로 통신(pc와 연결을 위해 uart2는 사용 불가)
  • 코드 작성이 완료되면 배터리를 이용한 외부 전원으로 dc모터 드라이버에 전원을 인가하고 드라이버에서 나오는 5v로 stm32에 전원 인가 이때 E5V에 연결하고 리셋버튼 아래 점퍼선도 위치 옮김

조이스틱 stm32

조이스틱용 stm32와 조이스틱, 블루투스 연결 코드작성 완료되면 배터리 1개를 사용한 외부전원으로 전원 인가

RC car 코드

#include "main.h"
#include "dma.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

uint8_t rxData[1];
uint8_t rxBData;

uint8_t dutyValue;
uint8_t dutyValue2;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
//void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
//{
//  if(huart->Instance == USART2)
//    {
//      HAL_UART_Transmit_IT(&huart2, rxData, sizeof(rxData));
//      HAL_UART_Receive_IT(&huart2, rxData, sizeof(rxData));
//    }
//}

//void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
//{
//  HAL_UART_Receive_DMA(&huart1, rxBData, sizeof(rxBData));
//}

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_TIM3_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);

//  HAL_UART_Receive_IT(&huart2, rxData, sizeof(rxData));
  HAL_UART_Receive_DMA(&huart1, &rxBData, sizeof(rxBData));




  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {


      if(rxBData == 'w' || rxBData == 's' || rxBData == 'p' || rxBData == 'a' || rxBData == 'd')
        {
          dutyValue = rxBData;
          switch(dutyValue)
          {
            case 'w':
              TIM3->CCR1 = 500;
              TIM3->CCR2 = 500;

              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);
              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
              break;
            case 's':
              TIM3->CCR1 = 500;
              TIM3->CCR2 = 500;

              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET);
              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
              break;
            case 'a':
              TIM3->CCR1 = 500;
              TIM3->CCR2 = 500;

              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);
              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
              break;
            case 'd':
              TIM3->CCR1 = 500;
              TIM3->CCR2 = 500;

              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET);
              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
              break;
            default:
              TIM3->CCR1 = 0;
              TIM3->CCR2 = 0;
              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET);
              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
              HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
              break;
          }
        }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

조이스틱 코드

#include "main.h"
#include "adc.h"
#include "dma.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

#include <stdio.h>
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

volatile uint16_t adcValueX;
volatile uint16_t adcValueY;

uint8_t txBData;

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
  adcValueY = HAL_ADC_GetValue(&hadc2);
}

//void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
//{
//  HAL_UART_Transmit_IT(&huart1, &txBData, 1);
//}

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_ADC2_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  HAL_ADC_Start_DMA(&hadc1, &adcValueX, 1);
  HAL_ADC_Start_IT(&hadc2);

//  HAL_UART_Transmit_DMA(&huart2, txBData, sizeof(txBData));
//  HAL_UART_Transmit_IT(&huart1, &txBData, 1);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
    {
      HAL_UART_Transmit(&huart1, &txBData, 1, 100);

      if((adcValueX <= 3000 && adcValueX >= 1000) && (adcValueY <= 3000 && adcValueY >= 1000))
        {
          txBData = 'p';
        }
      else if(adcValueX > 3000)
        {
          txBData = 'a';
        }
      else if(adcValueX < 1000)
        {
          txBData = 'd';
        }
      else if(adcValueY > 3000)
        {
          txBData = 'w';
        }
      else if(adcValueY < 1000)
        {
          txBData = 's';
        }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    }
  /* USER CODE END 3 */
}
  • 인터럽트 사용
    while문 안에 HAL_UART_Transmit(&huart1, &txBData, 1, 100); 없이
    HAL_UART_Transmit_IT(&huart1, &txBData, 1);을 사용하여도 동작 됨
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
  HAL_UART_Transmit_IT(&huart1, &txBData, 1);
}

위와같이 콜백함수를 같이 사용해주어야함(Tx인지 Rx인지 확인)

  • DMA 사용
    HAL_UART_Transmit_DMA(&huart2, txBData, sizeof(txBData)); 사용
    콜백 함수 없어도 됨

uart1, uart2 모두 동작됨을 확인

사진

profile
개인 기록공간

0개의 댓글