with-RL
로봇 / STM322024년 1월 20일

STM32 자동차 제어하기(1) - 기본환경 설정

이번 과정은 STM32 보드와 추가로 제작된 확장보드 및 RC카 구동체를 이용해서 자동차를 제어하기 위한 간단한 프로그램을 만드는 과정입니다.

과정이 복잡하고 길어질 수 있어서 몇 편이 될지는 알 수 없지만 시리즈로 작성할 예정입니다.

아래 과정은 아래 환경과 보드를 이용했습니다.

1. 구성품 소개

확장보드의 구성은 다음과 같습니다.

  1. LED
  2. 5 볼트
  3. 12 볼트
  4. 12 볼트에서 5 볼트 변환장치
  5. 부저
  6. IMU
  7. 모터 드라이버
  8. 모터 연결단자
  9. STM32 연결단자

2. STM32 프로젝트 생성

3. 파이썬 프로젝트 생성

conda create -n ros1 python=3.7
conda activate ros1
pip install pyserial
pip install jupyter notebook

4. STM32 - UART 통신하기

/* BSP include */
#include "bsp_uart.h"

/* BSP functions */
void Bsp_Init(void);
void Bsp_Loop(void);
/* BSP UART function */
void USART2_Init(void);
#include "bsp.h"


void Bsp_Init(void)
{
	USART2_Init();
}

void Bsp_Loop(void)
{
}
#include <string.h>
#include "main.h"
#include "bsp_uart.h"


extern UART_HandleTypeDef huart2;
uint8_t rx_flag;


void USART2_Init(void)
{
	HAL_UART_Receive_IT(&huart2, &rx_flag, 1);
}


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if (huart->Instance == USART2) {
		HAL_UART_Transmit(&huart2, &rx_flag, 1, 10);

		HAL_UART_Receive_IT(&huart2, &rx_flag, 1);
	}
}
#include "bsp.h"
Bsp_Init();
Bsp_Loop();

5. Python - UART 통신하기

import itertools
import threading

import serial


class CarDriver:
    def __init__(self, baudrate=115200, port="COM1"):
        # unique seq counter
        self.seq = itertools.count()
        # serial communication driver
        self.ser = serial.Serial()
        self.ser.baudrate = baudrate
        self.ser.port = port
        self.ser.open()
        # serial recive thread run
        self.run_receive_thread()

    def run_receive_thread(self):
        task_receive = threading.Thread(target=self.__recv_data, name="serial_recv_task")
        task_receive.setDaemon(True)
        task_receive.start()

    def __recv_data(self):
        while True:
            data = bytearray(self.ser.read())
            print(data)

    def set_led(self, state):
        cmd = []
        cmd.append(1 if state else 0)
        self.ser.write(bytearray(cmd))
from Car_driver import CarDriver

driver = CarDriver(baudrate=115200, port="COM5")

driver.set_led(True)

driver.set_led(False)
STM32 자동차 제어하기(1) - 기본환경 설정 | with-RL