< 본 체험 제품은 아이씨뱅큐의 지원을 받아 작성한 것입니다.>
현재 이 실드의 경우, 전문가용이 아닌 일반 유저들을 대상으로 판다고 가정하고 있기에
기술적인 지식이 없는 일반인이 이러한 실드나 모듈들을 쉽게 활용하는 방법에 대해 포스팅하도록 하겠습니다.
물론 엔지니어인데 해당 모듈을 처음 써보는 사람들도 전문가로 가정하고 넘어가겠습니다.
이런 사람들은 어느정도 접근 방법을 알고 있기 때문이죠.
따라서, 기본은 검색을 통한 자료 확보와 활용에 대해 포스팅하도록 하겠습니다.
Accelerometer_Sensor_Shield
실행방법
- 초기설정
이 곳에서는 adafruit사의 모듈을 사용했군요.
우리는 실드형태이니 제위치에 실드를 결합시켜주면 되겠습니다.
우선, 라즈베리파이 설정에 I2C모듈을 추가하는 과정이 필요합니다.
( 이 과정은 필요없는 경우도 있습니다. 라즈베리 설정마다 다르므로 이 과정을 수행해서 확인하시면 되겠습니다 )
sudo nano /etc/modules
위의 명령어로 편집기에 들어가서 아래 내용을 포함시켜 줍니다.
i2c-bcm2708
i2c-dev
그리고, blacklist로부터 i2c-bcm2708을 제거해줍니다.
sudo nano /etc/modprobe.d/raspi-blacklist.conf
위의 명령으로 편집기로 들어가서
#blacklist i2c-bcm2708
위와 같이 만들어줍니다.
sudo reboot
그리고 재부팅을 해줍니다.
- I2C체크 및 오픈모듈 활용
몇 가지 소프트웨어를 설치할 겁니다.
아래 명령어를 통해 신규 설치 혹은 업데이트를 해줍니다.
sudo apt-get install python-smbus i2c-tools git-core
다음, 연결된 모듈의 주소를 확인합니다.
sudo i2cdetect -y 1
그렇게 되면, '53'이라는 주소를 확인하실 수 있으실 겁니다.
다음, 오픈되어있는 모듈을 다운받습니다.
우리가 검색한 사이트에 나와있는 것처럼 해당 주소로부터 clone합니다.
git clone - https://github.com/pimoroni/adxl345-python
다운이 되었다면, 다운된 디렉토리로 이동합니다.
cd adxl345-python
디렉토리로 가면 4가지 파일이 있습니다. 라이센스 파일도 있으시니, 활용하시려면 숙지하시고 사용하세요.
여기서 바로 설명대로 sudo python example.py를 통해 테스트를 해도 됩니다.
하지만, 전 약간 바꾸고 싶군요.
몇 가지 수정을 하겠습니다.
Source
우선 제공된 예제를 그대로 활용하면, x, y, z의 값으로 나옵니다.
하지만 이 값들은 직관적이지도 않고 불편합니다.
드론이나 비행체에 주로 활용되는 roll, pitch, yaw 값으로 표현하는 것이 좋을 것 같습니다.
아참, 여기서 yaw는 구하지 않을 것입니다. yaw값 자체가 지자계센서 없이는 측정이 어려워서 자기 마음대로 값이 튀어다닙니다.
따라서 roll, pitch 만 구하겠습니다.
그리고 여담이지만, 현재 센서는 자이로 센서입니다. 가속도는 측정하지 않죠.
자이로(각속도)는 드리프트(값 누적)현상이 있고, 가속도는 외부요인에 영향을 많이 받습니다(진동에 약하다 등).
따라서 이 두가지 센서 값들을 상보(상호보완)하여 오차를 줄여줍니다. 필터를 사용한다고 하죠.
아무튼, 현재 자이로값만 있기때문에, 온전한 센서값으로 존재하기는 어렵다는 점을 미리 말씀드리고 진행하겠습니다.
위 그림은 Application 노트에 있는 내용입니다.
(11)번 식으로 pitch 값을
(12)번 식으로 roll 값을
(13)번 식으로 yaw 값을 구현할 수 있습니다.
다만 여기서 pitch와 roll만 하기로 했으므로 (13)번식은 버려두겠습니다.
math 모듈 추가
그런데, 우린 위의 식에서 아크탄젠트와 루트 계산을 해주어야합니다.
파이썬에선 어떻게 할까요?
https://docs.python.org/2/library/math.html
모르면 항상 검색을 합니다.
그리고 가장 우선은 python의 Document를 보는 것이 중요하겠죠.
위 링크에 그 내용이 잘 나와 있습니다.
결국 사용방법은 import math 를 해서 math.atan2 를 사용하던지,
하나하나 지정해서 math.을 생략하는 방법이 있겠습니다. 저는 후자로 하겠습니다.
먼저, 아래 명령어를 통해 편집기로 소스를 열어줍니다.
sudo (편집기) (파일명.확장자명) ex) sudo nano adxl345.py
그리고 아래 내용처럼 추가를 해줍니다.
from time import sleep // 반복문 실행시 딜레이를 주기 위해 필요합니다.
from math import atan2 // 아크탄젠트, 뒤에 있는 2는 인자가 2개 필요하다는 겁니다.
from math import sqrt // 루트연산을 하기위해서 필요합니다.
from math import pi // 3.14할 때 그 파이입니다.
공식 적용
그 다음 어플레케이션 노트에서 봤던 공식을 아래 내용처럼 작성을 해줍니다.
roll = atan2(y, sqrt(x*x+z*z))*180/pi // 뒤에 있는 *180/pi는 여기선 설명하지 않겠습니다.
pitch = atan2(x, sqrt(y*y+z*z))*180/pi
그리고 리턴값도 수정을 해줍니다.
return {"roll": roll, "pitch":pitch}
소스를 수정했으니 Ctrl + O로 저장을 해주고,
편집기를 나가 아래 명령어를 통해 example.py를 수정해 줍니다.
sudo (편집기) (파일명.확장자명) ex) sudo nano example.py
변경해야될 내용은 우리의 리턴값이 바뀌었으니 추가를 해주어야 된다는 것입니다.
그리고, 여기 sleep함수를 사용하기 위해 모듈 추가도 해주어야겠죠.
아래 화면과 같이 바꿔줍니다.
이제 실행을 해보죠.
sudo python example.py
Source
- RPi.GPIO 모듈 추가
GPIO를 제어해야하니 모듈을 추가합니다.
sudo (편집기) (파일명.확장자명) ex) sudo nano example.py
그리고 아래 내용처럼 추가를 해줍니다.
import RPi.GPIO as GPIO // as 뒤는 앞의 내용을 GPIO 라는 이름으로 사용하겠다는 겁니다
- GPIO 설정 및 활용
다음으로 GPIO 기본 셋업을 설정해 줍니다.
GPIO.setmode(GPIO.BCM) // 핀모드를 무엇으로 할 것인지 정하는 것입니다. BCM으로 합니다.
GPIO.setup(26, GPIO.OUT) // 전 26번핀에 연결했고, OUT모드로 지정하였습니다.
GPIO.output(26, False) // 풀다운 기준 LED를 오프시켜둡니다.
아! 핀은 아래의 핀맵을 보고 진행합니다.
그리고 GPIO를 어떻게 활용할 것인지 추가해줍니다.
if axes['roll']>15 or axes['pitch']>15 or axes['roll']<-15 or axes['pitch']<-15:
GPIO.output(26, True)
print " Alert!! " // 경고메시지 출력
else :
GPIO.output(26, False)
print " Safe :) " // 안전메시지 출력 :)
소스를 수정했으니 Ctrl + O로 저장을 해주고, 이제 실행을 해보죠.
sudo python example.py
터미널에서는 위와 같이 진행이 됩니다.
그리고 아래 영상은 LED 작동 영상입니다.
원래는 과전류를 막기 위해 저항도 달아주고 해야되는데.. 잠깐 테스트할꺼라 다이렉트로 연결했습니다.
< 텍스트 버전 ( example.py ) >
[장점]
- 모듈화로 인한 사용 편리
[단점]
- 모듈의 확장성 부족 (지난번에 작성한 내용이지만 동일하기 때문에 그대로 두겠습니다)
- 레퍼런스가 부족합니다.
회로공개가 어렵다면 유저메뉴얼이라도 만들어서 충분한 레퍼런스가 필요하다고 생각됩니다.
이상 Accelerometer Sensor Shield 활용기였습니다. 감사합니다.