STM32로 DFR0027를 다루어 보기
해당 포스터는 STM32로 나중에 진행할 프로젝트에서 충격을 감지하는 부분으로 활용할 것이다.
따라서 진동센서에 대해 포스팅을 남겨보겠다.
https://wiki.dfrobot.com/DFRobot_Digital_Vibration_Sensor_V2_SKU_DFR0027
DFRobot_Digital_Vibration_Sensor_V2_SKU_DFR0027-DFRobot
DFRobot_Digital_Vibration_Sensor_V2_SKU_DFR0027-DFRobot Introduction What's the simplest way to check vibration with Arduino? Use a vibration sensor from DFRobot. You can directly plug it on our IO Expesion Shield V7. Just vibrate this sensor, Arduino can
wiki.dfrobot.com
센서는 다음 페이지를 참고하여 제어하였다.
진동감지센서가 진동을 감지할 때 LED를 켜는 작업을 진행해 보겠다.
그리고 중간에 진동을 느끼고 500ms정도 유지를 하는데 이 이유는 내가 진행하는 프로젝트에서 충격이 이중으로 발생할 때를 방지하는 부분이 필요하기 때문이다.
GPIO설정을 다음과 같이 해주자
PB12,13은 인터럽트를 설정하여 진동 감지 센서와 연결해주고, PA3,4는 LED를 연결하여 각각의 진동센서가 진동을 감지하면 LED가 켜지게 할것이다.
센서가 아무런 진동이 없으면 5V를 유지하다가 진동이 감지되면 0V로 떨어진다.
인터럽트를 Faling으로 설정해주어 0V로 떨어질떄를 감지한다.
위와 같이 2개를 설정해주고 아래와 같이 인터럽트를 활성화해주자
코드에 들어가보면 10~15까지 제어하는 핸들러가 있는데 이것은 공유 핸들러이다.
따라서 우리가 각각 인터럽트가 들어오는 핀에 따라 동작하게 끔 해줘야한다.
volatile uint16_t state = 0;
volatile uint16_t state_1 = 0;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
if (GPIO_Pin == han_Pin) {
state++; //
}else if(GPIO_Pin == han2_Pin){
state_1++;
}
}
다음과 같이 콜백함수에서 if문으로 나누어 인터럽트가 발생하는 것을 나누어서 인식하게끔 해준다.
물론 핸들러 함수안에 들아가보면 다음과 같이 잘 구현이 되어 있기 때문에 콜백함수만 따로 정의해준것이다.
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
/* EXTI line interrupt detected */
if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
HAL_GPIO_EXTI_Callback(GPIO_Pin);
}
}
이 코드를 해석해보면 해당 EXTI 라인의 Pending Bit를 확인하여 인터럽트 발생여부를 파악하고
Clear를 통해 인터럽트 처리를 완료했다고 알려준다.
이후 콜백함수를 실행시키는 거라 핸들러 함수를 공유한다고 해도 인터럽트는 독립적으로 동작할 수 있다.
if (state != 0) {
state = 0;
HAL_GPIO_WritePin(GPIOA, GPIO_PA3_LED_Pin, GPIO_PIN_SET); // LED ON
HAL_Delay(500); // 500ms
} else {
HAL_GPIO_WritePin(GPIOA, GPIO_PA3_LED_Pin, GPIO_PIN_RESET); // LED OFF
}
if (state_1 != 0) {
state_1 = 0;
HAL_GPIO_WritePin(GPIOA, GPIO_PA4_LED_Pin, GPIO_PIN_SET); // LED ON
HAL_Delay(500); // 500ms
} else {
HAL_GPIO_WritePin(GPIOA, GPIO_PA4_LED_Pin, GPIO_PIN_RESET); // LED OFF
}
이게 메인 함수이다.
이렇게 진동 감지 센서를 가지고 LED를 제어해보았다.
아래는 실험 영상이니 참고 바란다.
https://www.youtube.com/watch?v=S98SFXSaOjA
다음 포스터에는 이 진동 감지 센서를 감지할때 마다 7세그먼트의 숫자를 올리는 것을 해보겠다.