티스토리 뷰

해당 포스팅은 2016.08.16에 작성되었습니다.





제품명 : ACCENT RaspberryPi & BananaPi Shield Series

------------------------------------------
판매처
Accent_GitHub

위 링크에 제품에 대한 소개가 잘 나와있습니다.
첫 번째, 판매처에서 Spec과 Block Diagram, 초기설정 내용을 보실 수 있습니다.
두 번째, GitHub에 스크립트 파일 및 소스 등이 업로드되어 있습니다.
------------------------------------------

테스트환경 : Windows7 64bit, Raspbian Jessie(OS), RaspberryPi 2 B or RaspberryPi 3 B



들어가기에 앞서서 포스팅 방향에 대해 말씀드리겠습니다.

현재 이 실드의 경우, 전문가용이 아닌 일반 유저들을 대상으로 판다고 가정하고 있기에
기술적인 지식이 없는 일반인이 이러한 실드나 모듈들을 쉽게 활용하는 방법에 대해 포스팅하도록 하겠습니다.
물론 엔지니어인데 해당 모듈을 처음 써보는 사람들도 전문가로 가정하고 넘어가겠습니다.
이런 사람들은 어느정도 접근 방법을 알고 있기 때문이죠.

따라서, 기본은 검색을 통한 자료 확보와 활용에 대해 포스팅하도록 하겠습니다.








Accelerometer_Sensor_Shield




지난번에 다루어보았던 조도센서와 사용방법은 유사합니다.

센서가 주는 값을 어떻게 처리하여 필요한 값을 얻어내느냐의 문제를 제외하고는 하는 방법은 같습니다.
따라서, 이번에는 wringPi가 아닌 Python을 활용하여 해보겠습니다.

먼저 Datasheet입니다. 사실 Datasheet는 매뉴얼정도입니다.
자신이 잘 모르는 제품은 사용설명서를 읽어보죠. 그와 비슷합니다.
다만 영어로 되어있다는 점이 장벽이 될수도 있겠지만, 가장 기본이 되는 부분이니 항상 잘 챙겨주세요.
ADXL345
Application-note
Quick Link

그리고 제조사에서 제공하는 Guide도 살펴보죠.
뭐든지, 제조사에서 제공하는 가이드가 기본입니다. 허술한 경우도 있지만, 벤더의 경우는 보통은 잘되어있습니다.
SparkFun Guide

그리고, 구글에 검색을 해봅니다. 영어가 불편하신 분들은 먼저 네이버에 검색하셔도 됩니다.
그럴 경우 ICbanq를 비롯한 오픈카페나 블로그에서 자료를 얻으실 수 있으십니다.
하지만, 안타깝게도 정보 공유의 활성화는 외국에 비해 한참 떨어지는게 우리나라의 현실입니다.
따라서 저는 구글링을 해보겠습니다.

구글에 이렇게 검색을 해봅니다. 오늘 사용할 모듈에 들어간 칩이 ADXL345 이므로,
   "  raspberrypi ADXL345  " 
매우 단순하죠? 그냥 raspberrypi 에서 ADXL345 센서를 사용할 것이니 두 키워드만 두고 검색을 해봅니다.
물론 이렇게 해도 안나오는 경우도 있습니다만, 보통은 이정도만 해도 키워드가 들어있기 때문에 좋은 결과물을 찾을 수 있습니다. 여기서 한번 더 언급하고 넘어가지만, 자료검색과 확보도 꼭 갖추어야하는 실력입니다 :)

리스트가 쭉 나오는데, 제목과 간략한 내용을 보고서 몇개 픽업을 해보겠습니다.
SparkFun Guide
how to use the ADXL345 on Raspberry pi
raspberry-pi-adxl345-accelerometer
http://www.i2cdevlib.com/devices/adxl345#source
https://github.com/pimoroni/adxl345-python/blob/master/adxl345.py

여기서 간단히 둘러봅니다.
저는 세번째 내용이 step by step이라 좋아보이는 군요. 세번째 링크로 가겠습니다.

한 번 그대로 따라해보겠습니다.







실행방법



초기설정


이 곳에서는 adafruit사의 모듈을 사용했군요.
우리는 실드형태이니 제위치에 실드를 결합시켜주면 되겠습니다.

우선, 라즈베리파이 설정에 I2C모듈을 추가하는 과정이 필요합니다.
( 이 과정은 필요없는 경우도 있습니다. 라즈베리 설정마다 다르므로 이 과정을 수행해서 확인하시면 되겠습니다 )


1
$ sudo nano /etc/modules
cs


위의 명령어로 편집기에 들어가서
아래 내용을 포함시켜 줍니다.

i2c-bcm2708

i2c-dev


그리고, 아래의 blacklist로부터 i2c-bcm2708을 제거해줍니다.


1
$ sudo nano /etc/modprobe.d/raspi-blacklist.conf
cs


아래처럼 주석처리만 해주셔도 됩니다.

#blacklist i2c-bcm2708 

그리고, 재부팅!


1
$ sudo reboot
cs





I2C체크 및 오픈모듈 활용


몇 가지 소프트웨어를 설치할 겁니다.

아래 명령어를 통해 신규 설치 혹은 업데이트를 해줍니다.


1
$ sudo apt-get install python-smbus i2c-tools git-core
cs


다음, 연결된 모듈의 주소를 확인합니다.


1
$ sudo i2cdetect -y 1
cs


그렇게 되면, '53'이라는 주소를 확인하실 수 있으실 겁니다.

다음, 오픈되어있는 모듈을 다운받습니다.

우리가 검색한 사이트에 나와있는 것처럼 해당 주소로부터 clone합니다.


1
$ git clone https://github.com/pimoroni/adxl345-python
cs


다운이 되었다면, 다운된 디렉토리로 이동합니다.


1
$ cd adxl345-python
cs


디렉토리로 가면 네 가지 파일이 있습니다.

라이센스 파일도 있으시니, 활용하시려면 숙지하시고 사용하세요.

여기서 바로 " 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.을 생략하는 방법이 있겠습니다. 저는 후자로 하겠습니다.

먼저, 아래 명령어를 통해 편집기로 소스를 열어줍니다.

1
$ sudo (편집기) (파일명.확장자명)     //  ex) sudo nano adxl345.py
cs

그리고 아래 내용처럼 추가를 해줍니다.

1
2
3
4
5
 from time import sleep         // 반복문 실행시 딜레이를 주기 위해 필요합니다.
 from math import atan2        // 아크탄젠트, 뒤에 있는 2는 인자가 2개 필요하다는 겁니다.
                               // 물론 연산 방법도 차이가 있습니다. 위의 링크를 참조하세요.
 from math import sqrt          // 루트연산을 하기위해서 필요합니다.
 from math import pi            // 3.14할 때 그 파이입니다.
cs

잘 모르시겠다면, 아래 화면을 참조하세요






공식 적용

그 다음 어플레케이션 노트에서 봤던 공식을 아래 내용처럼 작성을 해줍니다.

1
2
roll = atan2(y, sqrt(x*x+z*z))*180/pi      // 뒤에 있는 *180/pi는 여기선 설명하지 않겠습니다.
pitch = atan2(x, sqrt(y*y+z*z))*180/pi
cs

그리고 리턴값도 수정을 해줍니다.

1
return {"roll": roll, "pitch":pitch}
cs

결국, 아래 화면처럼 해주시면 됩니다.
( 해당 위치에 있던 내용을 아래처럼 바꿔주시면 됩니다. 기존엔 x = round(x, 4) 이런게 있을 겁니다 )


소스를 수정했으니 Ctrl + O로 저장을 해주고,
편집기를 나가 아래 명령어를 통해 example.py를 수정해 줍니다.

1
$ sudo (편집기) (파일명.확장자명)      // ex) sudo nano example.py
cs

변경해야될 내용은 우리의 리턴값이 바뀌었으니 추가를 해주어야 된다는 것입니다.
그리고, 여기 sleep함수를 사용하기 위해 모듈 추가도 해주어야겠죠.
아래 화면과 같이 바꿔줍니다.


이제 실행을 해보죠.

1
$ sudo python example.py
cs










활용 방안



활용 방안으로는 기울기 측정을 통해 어느정도 이상 기울어지면 경고를 해주는 것이 있겠네요.
단순한게 GPIO 제어로, 특정값이 되면 불이 켜지게 한다던지,
혹은 네트워크로 정보를 보내준다던지 하는 것이 있을 것 같습니다.


그럼 간단하게, LED제어와 값이 나오던 터미널에 경고 메시지가 출력되게 해보겠습니다.
LED는 GPIO26번핀과 바로 옆의 GND에 연결하여 테스트하였습니다.




RPi.GPIO 모듈 추가


GPIO를 제어해야하니 모듈을 추가합니다.


1
$ sudo (편집기) (파일명.확장자명)       //   ex) sudo nano example.py
cs


그리고 아래 내용처럼 추가를 해줍니다.


1
import RPi.GPIO as GPIO         // as 뒤는 앞의 내용을 GPIO 라는 이름으로 사용하겠다는 겁니다
cs






GPIO 설정 및 활용


다음으로 GPIO 기본 셋업을 설정해 줍니다.


1
2
3
 GPIO.setmode(GPIO.BCM)   // 핀모드를 무엇으로 할 것인지 정하는 것입니다. BCM으로 합니다.
 GPIO.setup(26, GPIO.OUT)   // 전 26번핀에 연결했고, OUT모드로 지정하였습니다.
 GPIO.output(26, False)   // 풀다운 기준 LED를 오프시켜둡니다.
cs


그리고 GPIO를 어떻게 활용할 것인지 추가해줍니다.


1
2
3
4
5
6
 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 :) "    // 안전메시지 출력 :)
cs



소스를 수정했으니 Ctrl + O로 저장을 해주고, 이제 실행을 해보죠.


1
$ sudo python example.py
cs



터미널에서는 위와 같이 진행이 됩니다.

그리고 아래 영상은 LED 작동 영상입니다.
원래는 과전류를 막기 위해 저항도 달아주고 해야되는데.. 잠깐 테스트할꺼라 다이렉트로 연결했습니다.





example.py 전체 Source


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from adxl345 import ADXL345
from time import sleep
import RPi.GPIO as GPIO
 
GPIO.setmode(GPIO.BCM)
GPIO.setup(26, GPIO.OUT)
GPIO.ouput(26, False)
 
adxl345 =ADXL345()
 
while(1):
       axes = adxl345.getAxes(True)
       print "ADXL345 on address 0x%x:" % (adxl345.address)
       print " roll = %.3fG" % ( axes['roll'] )
       print " pitch = %.3fG" % ( axes['pitch'] )
       if axes['roll']>15 oraxes['pitch']>15 or axes['roll']<-15 or axes['pitch']<-15:
                 GPIO.output(26, True)
                 print " Alert!! "
       else :
                 GPIO.output(26, False)
                 print  " Safe :) "
       sleep(1)
cs



댓글
댓글쓰기 폼