라즈베리 파이에서 진동을 측정하기 위해서는 진동 센서 모듈이 필요하다. 대표적으로 SW-420 같은 센서를 사용하면 진동측정이 가능하다. 그러나 이번에는 라즈베리파이의 아스트로 파이(Astro Pi)프로젝트로 개발되어 판매되는 통합 센서모듈 Sense-Hat을 통해서 진동감지를 구현해 보려고 한다.
Sense-Hat에는 온/습도 센서, 압력 센서, 가속도 센서, LED매트릭스, 조이스틱 등 다양한 센서가 Hat으로 통합되어 제공되는데 진동감지 구현을 위해서는 내장된 가속도계 센서(Accelerometer)를 활용하여 진동감지(측정)을 구현하려고 한다.
먼저 Sense Hat을 사용하기 위해서는 관련 라이브러리를 설치해야 한다. (샘플코드도 같이 설치된다)
$ sudo apt install sense-hat
Sense Hat 라이브러리 설치 후 재부팅 권장.
Python 언어로 설치된 Sense Hat 라이브러리를 통해 가속도계값을 가져올 수 있고, 정밀도를 위한 약간의 수학식을 통해서 진동값을 최대한 정밀하게 표시하려고 노력하였다.
구현한 소스코드는 아래와 같다.
from sense_hat import SenseHat
import math
#Sense Hat 객체 생성
sense = SenseHat()
try:
while True:
#가속도계 값을 가져와 진동 센서 값 계산
acceleration = sense.get_accelerometer_raw()
x = acceleration['x']
y = acceleration['y']
z = acceleration['z']
#정밀도 향상을 위해 중력값 제거
# 'x'와 'z'값에 대해 'y'값을 기준으로 회전 변환을 수행하여
# 중력값을 제거함. 그리고 각각의 값의 제곱을 더한 후 제곱근을 구하여 진동 센서 값을 계산함.
x = x * math.cos(y) + z * math.sin(y)
y = y + math.cos(x) + z * math.sin(x)
#vibration = ((x**2) + (y**2) + (z**2)) * 0.5
vibration = math.sqrt(x**2 + y**2 + z**2)
vibration = vibration - 1.4
#진동이 감지되면 출력
if vibration > 0.1:
print("진동감지 >> {:.3f} ".format(vibration))
except KeyboardInterrupt:
pass
코드에서는 vibration 값을 계산하는 부분이 수정되었습니다. 먼저 x와 z 값에 대해 y 값을 기준으로 회전 변환을 수행하여 중력값을 제거 후 각각의 값에 제곱을 더한 후 제곱근을 구하여 진동 센서 값을 계산함.
이 코드를 실행하면 Sense HAT 모듈에서 측정한 진동값이 더욱 정밀하게 콘솔에 출력됩니다. 코드 실행 중 Ctrl + C를 누르면 KeyboardInterrupt 예외가 발생하여 프로그램 종료.
[출력결과]