지난번 모터 드라이버를 연결하여, 각 GPIO OUTPUT과 PWM 신호를 통해, 모터를 제어해보았다.
이번엔 센서값을 읽어, 센서값에 따른 모터 제어를 해보려고한다.
센서는 적외선 센서로, 데이터 시트랑 회로도는 구하지 못했다.
쿠팡에서 1000원에 싸게 팔길래 사서 사용했다.
먼저 한것은 센서 값 확인이었다. STM32CUBE IDE에 터미널을 설치해서 값을 확인할 수 있기에, 센서값을 받고
HAL_UART_Transmit_IT 함수를 사용해서 값을 확인했다.
이게 센서OUTPUT이 당연히 ANALOG인줄알고 ANALOG INPUT으로 테스트를 해봤다. 아래 코드를 통해...
char uart_buf[30];
uint16_t adc1;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 100);
memset(uart_buf,0,30);
adc1 = HAL_ADC_GetValue(&hadc1);
sprintf(uart_buf,"value : %d\n\r", adc1);
HAL_UART_Transmit_IT(&huart3, uart_buf, sizeof(uart_buf));
HAL_Delay(1000-1);
}
/* USER CODE END 3 */
근데 이게 아날로그가 아니라 디지털 신호였다. 이걸 몰라서 당황했었네...
디지털로 다시 테스트 후, 대상이 감지되면 0, 아니면 1 신호가 나오는것을 확인할 수 있었다.
그리고 센서값을 포함한 IF문으로 변경해, 아래처럼 센서에 대상이 감지되면 정지, 아니면 전진 하는 신호를 완성했다.
GPIO INPUT 핀이 없어서, ANALOG INPUT을 바꿔줬다.
위핀을, GPIO INPUT, ARD_A0_PIN으로 명칭하고, HAL_GPIO_ReadPin 함수를 통해 구할 수 있었다.
/* USER CODE BEGIN 2 */
char uart_buf[30];
uint16_t value;
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4); //TIM1 CH4
HAL_GPIO_WritePin(GPIOG, ARD_D2_Pin, 0);
HAL_GPIO_WritePin(GPIOG, ARD_D4_Pin, 0);
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2); //TIM4 CH2
HAL_GPIO_WritePin(GPIOG, ARD_D7_Pin, 0);
HAL_GPIO_WritePin(GPIOG, ARD_D8_Pin, 0);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
memset(uart_buf,0,30);
value = HAL_GPIO_ReadPin(GPIOC, ARD_A0_Pin);
sprintf(uart_buf,"value : %d\n\r", value);
if(value == 1){
HAL_GPIO_WritePin(GPIOG, ARD_D2_Pin, 1);
HAL_GPIO_WritePin(GPIOG, ARD_D4_Pin, 0);
HAL_GPIO_WritePin(GPIOG, ARD_D7_Pin, 0);
HAL_GPIO_WritePin(GPIOE, ARD_D8_Pin, 1);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, 700);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, 700); // 전진
HAL_UART_Transmit_IT(&huart3, uart_buf, sizeof(uart_buf));
HAL_Delay(1000);
}
else
{
HAL_GPIO_WritePin(GPIOG, ARD_D2_Pin, 1);
HAL_GPIO_WritePin(GPIOG, ARD_D4_Pin, 1);
HAL_GPIO_WritePin(GPIOG, ARD_D7_Pin, 1);
HAL_GPIO_WritePin(GPIOE, ARD_D8_Pin, 1);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, 700);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, 700); //정지
HAL_UART_Transmit_IT(&huart3, uart_buf, sizeof(uart_buf));
HAL_Delay(1000);
}
HAL_Delay(1000-1);
}
/* USER CODE END 3 */
'STM32 > 프로젝트' 카테고리의 다른 글
[STM32] 4. 로봇 팔 / 배달 (0) | 2024.06.26 |
---|---|
[STM32] 3.적외선 센서와 모터로 라인 트레이싱 (0) | 2024.05.02 |
[STM32] 1.L298N 모터 드라이버로 모터 구동하기 (0) | 2024.04.16 |