-
라즈베리파이 → STM32 uart를 통한 모터 제어 2Autonomous Lawn Mower/Raspberry pi & STM32 2025. 4. 8. 10:07반응형
Lawn Mower의 위치를 확인하기 위해서 Traction 모터의 위치 제어가 필요한데 기존 모터는 엔코더가 없다. 그래서 모터를 엔코더가 달린 모터(JGB37-520 110rpm)로 변경하였다. 형상은 아래와 같다. DC 모터가 있고 모터 출력이 기어로 연결되어 모터 토크를 증가시킨다. 다행히 브라켓은 기존 것을 그대로 사용가능하였다.
모터 전원으로 BTN7960의 12V full bridge 출력을 사용하였고, 엔코더 전원은 Nucleo보드에서 5V를 입력하였다. PWM 20%인 경우 엔코더 출력은 아래와 같다. 그런데 모터 2개가 10ms 동안 회전수가 상이하였다. 중국산이라서 모터 내부 특성 값들이 동일하지 않은 것 같다.
Right Motor Left Motor 그런데 100% 듀티를 입력한 경우 Left Motor가 106rpm, right Motor가 109rpm으로 듀티 20%인 경우보다 둘의 차이가 현저히 줄어서 반품하려다가 그냥 사용하기로 한다.
기존 "라즈베리파이 → STM32 uart를 통한 모터 제어"에서는 듀티를 이용해서 모터를 제어했는데, 2개의 모터가 같은 듀티 값에서 회전수가 다르기 때문에, 라즈베리파이에서 제어 지령을 rpm으로 변경하였다. Mower 모터는 엔코더가 없는 775 DC Motor이기 때문에 기존대로 듀티제어를 사용한다.
775 DC Motor 모터 제어 명령은 아래와 같이 변경되었다.
모터 엔코더 펄스를 RPM으로 변경한 수식은 다음과 같다. JGB37-520 모터 엔코더는 일반적으로 한바퀴 회전시 11개의 펄스를 출력한다. 이를 PPR(Pulses Per Revolution)이라고 한다. 모터는 엔코더 A상과 B상이 교번하여 출력되며, 아래의 TI1이 엔코더 A, TI2가 엔코더 B라고하면 Counter는 4번 증가하게 된다. 또한 기어박스의 기어비는 110rpm 제품이 1:90의 기어박스비를 가지고 있다. 그렇기 때문에 모터가 한바퀴 회전하는 경우 4 encoder counter x 11 PPR x 90 gearbox ratio = 3960 count / 1turn의 특성을 지닌다.
Timer4가 1sec마다 HAL_TIM_PeriodElapsedCallback 함수를 호출할 수 있도록 설정하고, 1sec마다 counter 갯수를 update_encoder(encoder_instance_t *encoder, TIM_HandleTypeDef *htim) 함수에서 확인하고, int calculate_rpm_int(int velocity_counts_per_period) 함수에서 Counter 갯수 (velocity_counts_per_period x 60) / 3960을 연산후 return하면 이 값이 rpm이 된다.
라즈베리파이에서 목표 rpm을 전송하면, 이 값을 추종하기 위해서 PI 제어 함수 int run_pi_controller(PIController* controller, int measured_rpm)를 사용하였다.
모터 소스코드는 아래 github에 있음.
https://github.com/Raymond-jang/lawn_mower/tree/master/14_uart_motor_encoder_rpm
※ 참고자료
https://www.youtube.com/watch?v=xqzWQgpqHmI&t=399s STM 타이머를 이용한 Encoder 센싱
반응형'Autonomous Lawn Mower > Raspberry pi & STM32' 카테고리의 다른 글
라즈베리파이 부팅시 프로그램 자동 실행 (0) 2025.05.02 라즈베리파이 두번째 Uart (2) 2025.04.24 STM32cubeIDE와 github 연동 (1) 2025.04.06 IMU sensor (MPU-6500) python code with thonny (0) 2025.02.15 DMA를 이용한 2ch ADC (0) 2025.02.08