February 25, 2017

디바이스마트 미디어:

[38호]라즈베리파이 SENSE HAT 리뷰

Cap 2016-12-08 10-23-45-719

라즈베리파이 SENSE HAT 리뷰

우주정거장으로 날아 간

라즈베리파이 Sense HAT

글 | 금강초롱 blog.naver.com/crucian2k3

우리는 누군가가 순발력과 재치가 있어 다른 사람에게 일종의 기쁨 내지는 편안함을 선사한다면 ‘그 사람 참 센스가 있더라’라는 칭찬성 멘트를 일상에서 사용하곤 합니다.

이번에는 이러한 의미로 흔히 사용하곤 하는 센스(Sense : 감각)와 알파벳 대문자로 HAT(hat : 모자, 머리)라는 키워드가 붙은 보드라 조금은 어색함을 느끼며 리뷰를 시작하게 되었습니다.

38 sr 금강초롱 (1)

HAT가 그냥 모자를 의미하지는 않을듯하여 잠시 찾아보니 Hardware Attached on Top(HAT : 업보드, 쉴드 보드 등)의 머리글자를 따서 HAT를 만들었음을 알 수 있었습니다. 그냥 멀티센서쉴드 정도로 명명하면 누구나 쉽게 이해 할 수 있지 않을까 생각도 듭니다만 아두이노 진영에서 사용하는 쉴드라는 용어는 가급적 쓰고 싶지 않았을 수도 있고 아두이노는 이탈리아 태생이고 라즈베리파이는 잉글랜드 태생이라 문화적인 차이에 기인하기도 한 것으로 여겨집니다.
한마디로 Sense HAT 보드는 라즈베리파이보드 기반에서 현존하는 어지간한 센서는 모두 장착된 올인원 쉴드보드 정도라고 보면 틀리지 않을 듯합니다.

필자가 느끼는 아쉬움을 거론한다면 바이브레이션모터와 피에조스피커를 꼽을 수 있을 것입니다. 만일 Sense HAT에 진동과 사운드를 발생시킬 수 있는 소자가 추가가 되었더라면 더욱 크게 히트치지 않았을까 생각을 해봤습니다.

여러분~ 이제 이 센스쟁이 모자(?)와 즐거운 여행을 떠나 볼까요?

이 글은 (주)엔티렉스의 지원을 받아 작성하게 되었습니다.

라즈베리파이의 파이는 파이썬에서 따왔을 만큼 파이썬 언어와 관련이 깊습니다. 파이썬으로 작성된 센스햇 라이브러리와 gcc 기반에서 작성된 예제를 차근차근 실행시켜 보면서 이 보드가 어떤 재미난(?) 일을 할 수 있는지를 살펴보도록 하겠습니다.

1. 개요

구분 I2C Addr. 성능(기능)
MCU 0×46 ATtiny88
자이로스코프 0x1C LSM9DS1, 각도측정센서 : ±245/500/2000dps
가속도계 0x1C LSM9DS1, 선형가속센서 : ±-2/4/8/16g
지자기센서 0x6A LSM9DS1, Magnetic Sensor: ± 4/8/12/16gauss
기압센서 0x5C LPS25H, 260 – 1260hPa absolute range
온도센서 0x5F HTS221, ± 2degC in the 0-65 degC
습도센서 0x5F HTS221, 20-80%Rh의 범위 내에서 정확도 +/- 4.5%, 15-40degC의 범위 내에서 정확도 +/- 0.5degC
디스플레이 모듈 0×46 LED2472G, 8×8 LED matrix display
조이스틱 0×46 ALPS SKRHABE010, 소형 5 button joystick

Sense HAT 보드는 Atmel사(현재는 Microchip사(PIC)에 인수합병 됨)의 8비트 MCU인 ATtiny88을 기반으로 설계되어졌으며 일반적으로 사용되는 거의 모든 종류의 센서가 총망라 되어 있습니다. 모션센서는 MPU6050등 6축으로 구성된 칩이 하비일렉트로닉스 시장에서는 널리 사용됩니다만 이 보드에서는 ST Microelectronics의 LSM9DS1을 사용하여 9축 정보를 제공하는 등 차별화를 시도하고 있는 점이 이채롭습니다.
각각의 센서에 대한 정보를 살펴보는 것이 Sense HAT 보드를 이해하는데 상당한 도움이 될 듯하며 우선 총괄적인 부분을 살펴보면 아래와 같습니다.
이제 이 글을 읽는 독자님들이 궁금해 할 각각의 센서를 개략적으로 살펴보도록 하겠습니다.

1.1. 9축 모션센서

38 sr 금강초롱 (2)
● 모델명 : LSM9DS1
● 칩벤더 : ST Microelectronics사
● 주요 기능
· 3축 가속도계, 3축 자이로, 3축 지자계 센서
· ±2/±4/±8/±16g 선형가속계 감도
· ±4/±8/±12/±16가우스 지자계 센서 감도
· ±245/±500/±2000dps angular rate full scale
· 16-bit 데이터 출력
· SPI / I2C serial 인터페이스
· Analog 부문 공급전압 1.9V to 3.6V
· “Always-on” eco power mode down to 1.9mA
· Programmable interrupt generators
· 온도센서 내장
· Embedded FIFO
· 위치, 움직임 감지 함수 내장
· 휴대기기를 위한 저전력소모 기능 내장

일전에도 다룬바 있는 Genuino 101 보드에서도 모션센서를 내장하고 있기는 합니다만 가속도계와 자이로센서로 구성된 6축을 채용하고 있습니다.
Sense HAT에 내장된 9축 모션센서는 피치, 롤, 요 정보를 제대로 출력해 줄 수 있으므로 쿼드콥터, 밸런싱로봇, 게임기 등등 움직임이 수반되는 기기에 응용해 볼 수 있을 것으로 봅니다.

1.2. 기압센서

38 sr 금강초롱 (3)
● 모델명 : LPS25H
● 칩벤더 : ST Microelectronics사
● 주요 기능
· 절대기압 범위 260 to 1260hPa
· 고 분해능 모드 : 1Pa RMS
· 저 소비전력 : (저 분해능 모드)4μA, (고 분해능 모드)25μA
· 과압성능(High overpressure capability) : 20x full scale
· 내장 온도보정 기능
· Embedded 24-bit ADC
· Selectable ODR from 1Hz to 25Hz
· SPI and I²C 인터페이스
· 동작전압 : 1.7 to 3.6V
· 충격성능(High shock survivability) : 10,000g

Sense HAT을 활용하여 대기 중 온도, 습도, 기압 정보를 얻어와 날씨정보를 표시하거나 고도정보를 표시하는 용도로 응용이 가능할 듯합니다.
흔히 사용되지 않는 기압센서를 이번 기회에 라즈베리파이 유저들이 간편하게 접근해 볼 수 있도록 세심한 배려를 해둠에 감사할 따름입니다.

1.3. 온습도센서

38 sr 금강초롱 (4)
● 모델명 : HTS221
● 칩벤더 : ST Microelectronics사
● 주요 기능
· 상대습도측정 범위 : 0 to 100%
· 온도측정범위 : -40 to +120°C
· 전원공급 : 1.7 to 3.6V
· 소비전력 : 2μA @ 1Hz ODR
· Selectable ODR from 1Hz to 12.5Hz
· 고감도 rH : 0.004% rH/LSB
· 습도정밀도 : ± 3.5% rH, 20 to +80% rH
· 온도정밀도 : ± 0.5°C, 15 to +40°C
· 온습도 데이터 출력 : 16-bit
· SPI and I²C 인터페이스
· 제조자 보정 후 출고
· 패키지사이즈 : Tiny 2 x 2 x 0.9mm

취미전자 등에 흔히 사용하는 DHT-xx 시리즈에 비해 넓은 온습도 측정범위를 가진 칩이 장착되어져 있습니다. 이 칩이 제공해주는 기능을 활용해 라즈베리파이로 에어컨, 자동제어 등의 실험을 해볼 수 있을 것으로 예상해 봅니다.

1.4. RGB 고휘도 LED 모듈

38 sr 금강초롱 (5)
● 모델명 : CLP6R-FKW
● 칩벤더 : CREE사
● 주요 기능
· 사이즈(mm) : 6.0 x 5.0
· 주파장(Dominant Wavelength) : Red (610 – 625nm), Green (514 – 534nm), Blue (460 – 480nm)
· 광도(Luminous Intensity, mcd) : Red (450 – 1800), Green (710 – 1800), Blue (280 – 710)
· 가시각 : 120 degree

풀칼라 표현이 가능한 RGB 고휘도 LED모듈로 Sense HAT에는 8행 8열, 즉 64개가 실장되어 있습니다. 매우 밝고 반응속도도 빠르며 픽셀마다 RGB 독립 혹은 혼합색 표현이 가능하므로 각종 정보 표출이나 게임 등에 재미난 활용가치가 있을 것으로 봅니다.
다만 ATtiny88에 의해 다이나믹 제어를 하고 있으므로 전체적인 리프레시 타임은 한계가 있습니다.
보다 효과적인 LED 통제를 위해 LED2472G 8채널 FULL COLOR LED 드라이버를 사용하고 있으며 컬럼 라인은 래치를 사용하여 MCU가 직접 제어를 하는 방식으로 설계되어 있습니다.

1.5. 5버튼 조이스틱

38 sr 금강초롱 (6)
● 모델명 : SKRHABE010
● 칩벤더 : ALPS사
● 주요 기능 : 4방향키 + center push 스위치
● 스위치 내부구조

2. Hello World에 도전하기

2.1. 기본환경

38 sr 금강초롱 (7)

우선 실험을 진행하기 위해서는 라즈베리파이3와 Sense HAT을 결합하고 여기에 라즈비안(운영체제)까지 깔려있는 상태여야 합니다.
라즈베리파이3를 사용한다면 와이파이모듈이 기본적으로 내장되어 있으므로 외부에서 간단히 접속할 수 있습니다.
와이파이 동글을 끼우지 않아도 되고 RJ45 잭을 꽂지 않아도 이더넷 환경이 만들어 진다는 것은 대단한 강점이라고 볼 수 있겠습니다.
여기까지의 상황에 대한 준비는 전월호(36호)의 ‘라즈베리파이를 활용한 인터넷 라디오 & 게임머신 작업기’편에서 다뤘으므로 참고하시기 바랍니다.
※ 필자의 블로그 참조 :
http://blog.naver.com/crucian2k3/220788282079

자, Tera Term을 띄워 라즈베리파이에 접속해 들어갑니다.

38 sr 금강초롱 (8)

SSH가 지원이 되는 터미널프로그램이라면 어떤 것이든 상관없습니다.
· 접속 아이디와 비밀번호 : pi / raspberry

이렇게 접속한 후 보여지는 첫 화면은 아래와 같습니다.

38 sr 금강초롱 (34)

2.2. Sense HAT API 설치
우선 라즈베리파이에 API(이하 라이브러리)가 설치되어 있어야 합니다.
공식 설치소개 페이지는 아래 주소를 참고 합니다.
https://www.raspberrypi.org/documentation/hardware/sense-hat/

$ sudo apt-get update
$ sudo apt-get install sense-hat
$ sudo reboot

이 라이브러리가 설치되면 자이로스코프, 가속도계, 지자기센서, 온도센서, 습도센서, 기압센서, 조이스틱 등을 자유롭게 접근할 수 있습니다.

이렇게 라이브러리를 설치한 후에 시험 삼아 Hello.py를 작성해 봅니다.
작성된 파일에 chmod 755 hello.py를 하여 실행파일로 만들어 줍니다.
파이썬으로 만들어진 파일을 실행을 시킬 때는 ./hello.py를 칩니다.

pi@raspberrypi:~/examples/crucian2k3 $ cat hello.py
#!/usr/bin/python

from sense_hat import SenseHat
sense = SenseHat()
sense.show_message(“Hello world!”)

pi@raspberrypi:~/examples/crucian2k3 $ chmod 755 hello.py
pi@raspberrypi:~/examples/crucian2k3 $ ls -al
total 12
drwxr-xr-x 2 pi pi 4096 Aug 31 22:27 .
drwxr-xr-x 6 pi pi 4096 Aug 31 22:22 ..
-rwxr-xr-x 1 pi pi 105 Aug 31 22:27 hello.py
pi@raspberrypi:~/examples/crucian2k3 $

동작하고 있는 장면은 아래와 같습니다.
‘Hello World’가 우에서 좌로 살짝 빠르게 스크롤 됩니다.
이처럼 스크롤이 일어나는 것은 Sense HAT 내부에 ATtiny88이 올려져 있기 때문입니다. 라즈베리파이 SOC는 ‘뿌려져라’라는 명령을 I2C 채널을 통해 ATtiny88로 보내고, MCU에서는 후처리를 알아서 담당하는 방식입니다. 일종의 역할분담입니다.

38 sr 금강초롱 (9)
아래는 Tera Term에서 명령을 내리는 모든 과정을 캡처한 것입니다.
여기서

$ ls -al hello.py는 hello.py가 실행이 가능한 상태인 755 퍼미션이 들어가 있는지 보는 것입니다.

$ cat hello.py는 hello.py에 무슨 내용이 담겨져 있는지 리스팅 해보는 것입니다.

$ ./hello.py는 리눅스 등 유닉스 기반의 OS에서는 실행할 때 실행파일명과 경로를 반드시 명기해야 하며 ./는 현재 경로를 의미 합니다.

38 sr 금강초롱 (10)

여기까지는 잘 따라 오셨나요?
일단 Hello Word에 성공하였다면 Sense HAT을 갖고 놀고, 즐길 수 있는 만반의 준비가 끝났다고 볼 수 있습니다.
사실 이러한 제품을 구상하고 만드는 사람이 어렵지 쓰는 사람은 그저 그 분들의 노고에 감사해하며 잘 써주면 그만일 듯합니다.

3. Sense HAT 학습을 위한 재단의 배려

이제부터 Sense HAT을 학습에 어떻게 이용할 수 있는지를 살펴보도록 하겠습니다.
라즈베리파이 재단에서는 가르치는 선생님을 위한 페이지, 공부하고자 하는 학생을 위한 페이지, 그리고 활용할 수 있는 실습코너 등을 준비해 놓고 있습니다.
정말 어지간한 정성이 아니고선 보기 힘든 싸이트라고 생각 됩니다.
필자는 모든 코너를 따라가며 실행해 보았습니다.
정말 감탄이 절로 나올 정도로 잘 만들어져 있음을 알 수 있었습니다.
이 글을 읽는 독자님들도 한번쯤 방문해 보실 것을 강력히 권합니다.
우측 상단에 ‘Help / Teach / Learn / Make’ 가 메인 링크입니다.

38 sr 금강초롱 (11)
https://www.raspberrypi.org/learning/getting-started-with-the-sense-hat/
재단에서 신경 써서 만들어 놓은 것 중에 시뮬레이터라는 것도 있습니다.
라즈베리파이보드와 Sense HAT을 갖고 있지 않더라도 간단한 실험을 여기에서 해볼 수 있습니다. 크롬웹브라우져에서는 별 탈 없이 구동되나 인터넷익스플로러 상에서는 약간의 문제가 있어 보입니다. 아래는 Rainbow.py를 구동시켜본 장면입니다.

38 sr 금강초롱 (12)

4. Sense HAT 활용을 위한 API 접근

Sense HAT으로 뭔가를 해보고자 한다면 라즈베리파이 재단에서 공개한 API에 대해 학습해 보는 것이 순서일 듯합니다.
API는 일종의 라이브러리라고 이해해도 무방하며 이 역시 파이썬으로 제작이 되어 있습니다. 아래 주소에서 최신판에 대한 확인이 가능합니다.

https://github.com/RPi-Distro/python-sense-hat

이 API는 Sense HAT이 가지고 있는 모든 종류의 센서를 비롯하여 조이스틱까지를 핸들링 할 수 있도록 파이선 기반으로 작성되어 있으며, 파이선 자체가 워낙 가독성이 좋으므로 언어를 잘 몰라도 어떻게 동작이 되는지를 짐작해 보는데 큰 무리는 없다고 봅니다.
프로그램은 sense_hat.py에 본격적으로 기술되어 있습니다.
이장에서 언급하는 API는 아래 주소를 참조 하였습니다.

https://pythonhosted.org/sense-hat/api/

4.1. LED 매트릭스 핸들링과 관련된 API(라이브러리)
LED 매트릭스는 RGB 색상을 가지는 LED가 8*8로 배열되어 있으며 ATtiny88 AVR에 의해 제어됩니다. 포드절약을 위해 다이나믹 디스플레이 방식을 사용함에 따라 한번에 8개의 LED가 점등한 후 나머지는 소등하는 방식으로 바르게 반복하여 원하는 글자나 문양을 표현해 낼 수 있습니다.
만일 라즈베리파이 메인 SOC에게 이 일을 시키면, LED 매트릭스에 글자 표시하느라 다른 일을 제대로 할 수 없을 것입니다.

4.1.1. set_rotation
● 기능 : 라즈베리파이를 거꾸로 사용하거나 옆으로 사용하여야 하는 상황에서 이미지의 방향을 회전시킬 수 있는 기능을 제공합니다.
이 함수는 인자를 2개 갖습니다. 첫 번째 인자는 회전하는 각도를 담고 두 번째 인자는 갱신시킬 것인지를 결정하며, 만일 두 번째 인자를 생략하면 작동으로 True가 입력되어 갱신이 일어납니다. 이러한 기능은 아래 함수에서 똑같이 적용됩니다.

38 sr 금강초롱 (3)

● 예제 코드

#!/usr/bin/python

from sense_hat import SenseHat
sense = SenseHat()
sense.set_rotation(180)
# 다른 방법으로 이렇게 할 수도 있음
sense.rotation = 180

4.1.2. flip_h
● 기능 : LED 매트릭스에 표출된 이미지를 수평방향으로 반전시킵니다.
반전된 RGB 값이 들어 있는 목록정보가 리턴됩니다.
파라메터에 값을 넣지 않으면 True가 자동으로 입력되어 리프레시가 일어납니다.

38 sr 금강초롱 (7)

 

#!/usr/bin/python
from sense_hat import SenseHat

sense = SenseHat()
sense.flip_h()

4.1.3. flip_v
● 기능 : LED 매트릭스에 표출된 이미지를 수직방향으로 반전시킵니다.
반전된 RGB 값이 들어 있는 목록정보가 리턴됩니다.
파라메터에 값을 넣지 않으면 True가 자동으로 입력되어 리프레시가 일어납니다.

38 sr 금강초롱 (4)

#!/usr/bin/python

from sense_hat import SenseHat

sense = SenseHat()
sense.flip_v()

4.1.4. set_pixels
● 기능 : 화소값의 64바이트 길이를 갖는 리스트에 기반하여 LED매트릭스 행렬을 업데이트 합니다. 이 함수는 리턴값이 없습니다.

38 sr 금강초롱 (8)

#!/usr/bin/python

from sense_hat import SenseHat

sense = SenseHat()

X = [255, 0, 0] # Red
O = [255, 255, 255] # White

question_mark = [
O, O, O, X, X, O, O, O,
O, O, X, O, O, X, O, O,
O, O, O, O, O, X, O, O,
O, O, O, O, X, O, O, O,
O, O, O, X, O, O, O, O,
O, O, O, X, O, O, O, O,
O, O, O, O, O, O, O, O,
O, O, O, X, O, O, O, O
]

sense.set_pixels(question_mark)

4.1.5. get_pixels
64바이트의 RGB정보가 포함된 목록이 리턴됩니다.
픽셀리스트에 담겨진 정보가 RGB565 포맷 즉 R:5, G:6, B:5로 됨에 따라 컬러비트 손실이 발생됨에 유의해야 합니다.

#!/usr/bin/python

from sense_hat import SenseHat

sense = SenseHat()
pixel_list = sense.get_pixels()

4.1.6. set_pixel
● 기능 : x, y로 지정된 픽셀의 색좌표를 설정 할 수 있습니다.

38 sr 금강초롱 (9)

from sense_hat import SenseHat

sense = SenseHat()

# examples using (x, y, r, g, b) //각각의 좌표와 r,g,b를 넣는 방법
sense.set_pixel(0, 0, 255, 0, 0)
sense.set_pixel(0, 7, 0, 255, 0)
sense.set_pixel(7, 0, 0, 0, 255)
sense.set_pixel(7, 7, 255, 0, 255)

red = (255, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)

# examples using (x, y, pixel) // 튜플로 엮어서 한방에 넣는 방법이 있음
sense.set_pixel(0, 0, red)
sense.set_pixel(0, 0, green)
sense.set_pixel(0, 0, blue)

4.1.7. get_pixel
● 기능 : 지정된 좌표의 픽셀의 r,g,b 값을 반환합니다.

38 sr 금강초롱 (10)

#!/usr/bin/python

from sense_hat import SenseHat

sense = SenseHat()
top_left_pixel = sense.get_pixel(0, 0)

4.1.8. load_image
● 기능 : 8*8로 구성된 rgb 이미지를 LED 매트릭스에 표시합니다.
rgb로 변환되어 표출된 픽셀값을 반환합니다.

38 sr 금강초롱 (11)

#!/usr/bin/python

from sense_hat import SenseHat

sense = SenseHat()
invader_pixels = sense.load_image(“space_invader.png”, redraw=False)

4.1.9. clear
● 기능 : LED 매트릭스를 단일 색상으로 정리합니다. 기본적으로는 블랭크(아무것도 없는 상태, off)로 만들어 줍니다.

38 sr 금강초롱 (12)

#!/usr/bin/python

from sense_hat import SenseHat
from time import sleep

sense = SenseHat()

red = (255, 0, 0)

sense.clear() # no arguments defaults to off
sleep(1)
sense.clear(red) # passing in an RGB tuple
sleep(1)
sense.clear(255, 255, 255) # passing in r, g and b values of a colour

4.1.10. show_message
● 기능 : 오른쪽에서 왼쪽으로 스크롤되는 텍스트 메시지를 보여줍니다. 배경화면의 색상을 지정해줄 수 있습니다.

38 sr 금강초롱 (13)

#!/usr/bin/python

from sense_hat import SenseHat

sense = SenseHat()
sense.show_message(“One small step for Pi!”, text_colour=[255, 0, 0])

4.1.11. show_letter
● 기능 : LED 매트릭스에 하나의 문자를 표출합니다.

38 sr 금강초롱 (14)

#!/usr/bin/python

import time
from sense_hat import SenseHat

sense = SenseHat()

for i in reversed(range(0,10)):
sense.show_letter(str(i))
time.sleep(1)

4.1.12. low_light
● 기능 : Sense HAT을 어두운 환경에서 사용 시 조도를 낮춰서 사용할 수 있도록 해줍니다.

#!/usr/bin/python

import time
from sense_hat import SenseHat

sense = SenseHat()
sense.clear(255, 255, 255)
sense.low_light = True
time.sleep(2)
sense.low_light = False

4.1.13. gamma
● 기능 : 고급사용자를 위한 기능입니다. 일반 유저는 위의 low_light 정도만 사용해도 문제가 없습니다.
Sense HAT 파이선API는 리눅스프레임 버퍼로 데이터가 넘어갈 때 565포맷으로 변환을 시키며 이 값이 LED 매트릭스 제어용 MCU인 AtTiny88 AVR로 전달됩니다.
감마테이블이 이 값이 변환되는 과정에 관여하는 것으로서 0~31사이의 값으로 정의되어 있습니다.

38 sr 금강초롱 (15)

#!/usr/bin/python

import time
from sense_hat import SenseHat

sense = SenseHat()
sense.clear(255, 127, 0)

print(sense.gamma) # 현재의 감마 값
time.sleep(2)

sense.gamma = reversed(sense.gamma) # 감마 값을 반전 시켜 봄
print(sense.gamma)
time.sleep(2)

sense.low_light = True # low_light 함수를 적용해봄
print(sense.gamma) # 이때 감마값이 어떻게 변화하는지를 관찰
time.sleep(2)

sense.low_light = False

4.1.14. gamma_reset
● 기능 : 감마 룩업테이블을 원위치 시켜줍니다.

#!/usr/bin/python

import time
from sense_hat import SenseHat

sense = SenseHat()
sense.clear(255, 127, 0)
time.sleep(2)
sense.gamma = [0] * 32 # Will turn the LED matrix off
time.sleep(2)
sense.gamma_reset()

4.2. 환경센서(습도, 온도, 기압)용 API(라이브러리)
Sense HAT에는 별로 흔치 않은 기압센서가 장착되어져 있습니다.
이 센서를 활용하여 날씨, 고도 등 재미난 어플리케이션을 만들어 볼 수 있을 듯 합니다.
또한 온습도센서는 매우 컴팩트하여 과연 잘 동작 될 수 있을까 의문이 들기도 하지만 라즈베리파이를 활용하여 온실이나 실내 환경제어에도 응용해 볼 수 있는 방법을 제시해 주는데 부족함이 없으리라 봅니다.

4.2.1. get_humidity
● 기능 : 습도 센서에서 상대 습도의 비율을 가져옵니다.

38 sr 금강초롱 (16)

#!/usr/bin/python

from sense_hat import SenseHat

sense = SenseHat()
humidity = sense.get_humidity()
print(“Humidity: %s %%rH” % humidity)

# alternatives
print(sense.humidity)

4.2.2. get_temperature
● 기능 : 습도센서에서 섭씨의 현재 온도 값을 얻어 옵니다.
내부적으로 get_temperature_from_humidity() 함수를 호출함

38 sr 금강초롱 (17)

#!/usr/bin/python

from sense_hat import SenseHat

sense = SenseHat()
temp = sense.get_temperature()
print(“Temperature: %s C” % temp)

# alternatives
print(sense.temp)
print(sense.temperature)

4.2.3. get_temperature_from_humidity
● 기능 : 습도센서에서 섭씨의 현재 온도 값을 얻어옵니다.

38 sr 금강초롱 (18)

#!/usr/bin/python

from sense_hat import SenseHat

sense = SenseHat()
temp = sense.get_temperature_from_humidity()
print(“Temperature: %s C” % temp)

4.2.4. get_Temperature_from_pressure
● 기능 : 압력 센서에서 섭씨의 현재 온도를 가져옵니다.

38 sr 금강초롱 (19)

#!/usr/bin/python

from sense_hat import SenseHat

sense = SenseHat()
temp = sense.get_temperature_from_pressure()
print(“Temperature: %s C” % temp)

4.2.5. get_pressure
● 기능 : 압력 센서에서 밀리바의 현재 압력을 가져옵니다.

38 sr 금강초롱 (20)

#!/usr/bin/python

from sense_hat import SenseHat

sense = SenseHat()
pressure = sense.get_pressure()
print(“Pressure: %s Millibars” % pressure)

# alternatives
print(sense.pressure)

4.3. IMU Sensor API(라이브러리)
IMU(관성측정유닛) 센서는 X, Y, Z축을 측정할 수 있는 3종의 센서로 되어 있습니다. 이렇게 3종의 센서를 사용하여 9축의 모션센싱 기능을 수행할 수 있습니다.

· 자이로스코프
· 가속도계
· 지자기센서(나침반)

4.3.1. set_imu_config
● 기능 : 자이로스코프, 가속도계, 지자기센서를 활성화시킬지 비활성화시킬지를 설정합니다.

38 sr 금강초롱 (21)

#!/usr/bin/python

from sense_hat import SenseHat

sense = SenseHat()
sense.set_imu_config(False, True, False) # gyroscope only

4.3.2. get_orientation_radians
● 기능 : 피치, 롤, 요축의 정보로부터 라디안을 얻어옵니다.

38 sr 금강초롱 (23)

#!/usr/bin/python

from sense_hat import SenseHat

sense = SenseHat()
orientation_rad = sense.get_orientation_radians()
print(“p: {pitch}, r: {roll}, y: {yaw}”.format(**orientation_rad))

# alternatives
print(sense.orientation_radians)

4.3.3. get_orientation_degrees
● 기능 : 피치, 롤, 요축의 정보로부터 각도를 얻어옵니다.

38 sr 금강초롱 (24)

#!/usr/bin/python

from sense_hat import SenseHat

sense = SenseHat()
orientation = sense.get_orientation_degrees()
print(“p: {pitch}, r: {roll}, y: {yaw}”.format(**orientation))

4.3.4. get_orientation
● 기능 : get_orientation_degrees()와 동일한 기능을 수행합니다.

38 sr 금강초롱 (23)

#!/usr/bin/python

from sense_hat import SenseHat

sense = SenseHat()
orientation = sense.get_orientation()
print(“p: {pitch}, r: {roll}, y: {yaw}”.format(**orientation))

# alternatives
print(sense.orientation)

4.3.5. get_compass
● 기능 : 자이로스코프와 가속도계가 set_imu_config에서 disable 되면 지자기센서로부터 북쪽방위 정보를 얻어올 수 있습니다.

38 sr 금강초롱 (25)

#!/usr/bin/python

from sense_hat import SenseHat

sense = SenseHat()
north = sense.get_compass()
print(“North: %s” % north)

# alternatives
print(sense.compass)

4.3.6. get_compass_raw
● 기능 : 원시 x, y, z축 자력계 데이를 출력합니다.

38 sr 금강초롱 (26)

#!/usr/bin/python

from sense_hat import SenseHat

sense = SenseHat()
raw = sense.get_compass_raw()
print(“x: {x}, y: {y}, z: {z}”.format(**raw))

# alternatives
print(sense.compass_raw)

4.3.7. get_gyroscope
● 기능 : set_imu_config에서 지자기센서, 가속도 센서를 사용하지 않도록 하면 자이로스코프 센서를 사용하여 현재 방향정보를 가져올 수 있습니다.

38 sr 금강초롱 (27)

#!/usr/bin/python

from sense_hat import SenseHat

sense = SenseHat()
gyro_only = sense.get_gyroscope()
print(“p: {pitch}, r: {roll}, y: {yaw}”.format(**gyro_only))

# alternatives
print(sense.gyro)
print(sense.gyroscope)

4.3.8. get_gyroscope_raw
● 기능 : 원시 x, y, z축 자이로스코프 데이터를 가져옵니다.

38 sr 금강초롱 (28)

#!/usr/bin/python

from sense_hat import SenseHat

sense = SenseHat()
raw = sense.get_gyroscope_raw()
print(“x: {x}, y: {y}, z: {z}”.format(**raw))

# alternatives
print(sense.gyro_raw)
print(sense.gyroscope_raw)

4.3.9. get_accelerometer
● 기능 : set_imu_config에서 지자기센서, 자이로스코프를 사용하지 않도록 하면 가속도계만으로 현재 방향 정보를 얻어올 수 있습니다.

38 sr 금강초롱 (29)

#!/usr/bin/python

from sense_hat import SenseHat

sense = SenseHat()
accel_only = sense.get_accelerometer()
print(“p: {pitch}, r: {roll}, y: {yaw}”.format(**accel_only))

# alternatives
print(sense.accel)
print(sense.accelerometer))

4.3.10. get accelerometer_raw
● 기능 : x, y, z축의 가속도계 원시데이터를 가져옵니다.

38 sr 금강초롱 (31)

#!/usr/bin/python

from sense_hat import SenseHat

sense = SenseHat()
raw = sense.get_accelerometer_raw()
print(“x: {x}, y: {y}, z: {z}”.format(**raw))

# alternatives
print(sense.accel_raw)
print(sense.accelerometer_raw)

4.4. 조이스틱관련 API(라이브러리)
조이스틱은 손잡이도 없이 좀 빈약하게 붙어 있습니다.
조이스틱과 관련된 라이브러리는 stick.py에 파이썬으로 짜여져 있습니다.

4.4.1. InputEvent
조이스틱의 이벤트는 튜플로 반환되며 아래와 같은 3가지 형태가 있습니다.
· timestamp : 이벤트가 발생한 시간으로, “초”
· direction : 조이스틱이 이동한 방향으로, 문자열로 구성, “up, “down”, left”, right”, “push” 등
· action : 발생한 상황에 대한 문자열 “pressed”, “released”, “held”

4.4.2. wait_for_event
● 기능 : 조이스틱 이벤트가 발생할 때까지 대기합니다.

#!/usr/bin/python

from sense_hat import SenseHat
from time import sleep

sense = SenseHat()
event = sense.stick.wait_for_event()
print(“The joystick was {} {}”.format(event.action, event.direction))
sleep(0.1)
event = sense.stick.wait_for_event()
print(“The joystick was {} {}”.format(event.action, event.direction))

조이스틱을 한쪽 방향으로 전환시켜 제대로 동작되는 지를 확인코자 하는 경우의 예제

#!/usr/bin/python

from sense_hat import SenseHat
from time import sleep

sense = SenseHat()
event = sense.stick.wait_for_event()
print(“The joystick was {} {}”.format(event.action, event.direction))
sleep(0.1)
event = sense.stick.wait_for_event(emptybuffer=True)
print(“The joystick was {} {}”.format(event.action, event.direction))

4.4.3. get_events
● 기능 : 이벤트의 목록을 튜플로 출력합니다.

#!/usr/bin/python

from sense_hat import SenseHat

sense = SenseHat()
while True:
for event in sense.stick.get_events():
print(“The joystick was {} {}”.format(event.action, event.direction))

4.4.4. direction_up, direction_left, direction_right, direction_down, direction_middle, direction_any
● 기능 : 조이스틱을 움직인 방향을 추적하는 이벤트로 활용됩니다.

#!/usr/bin/python

from sense_hat import SenseHat, ACTION_PRESSED, ACTION_HELD, ACTION_RELEASED
from signal import pause

x = 3
y = 3
sense = SenseHat()

def clamp(value, min_value=0, max_value=7):
return min(max_value, max(min_value, value))

def pushed_up(event):
global y
if event.action != ACTION_RELEASED:
y = clamp(y – 1)

def pushed_down(event):
global y
if event.action != ACTION_RELEASED:
y = clamp(y + 1)

def pushed_left(event):
global x
if event.action != ACTION_RELEASED:
x = clamp(x – 1)

def pushed_right(event):
global x
if event.action != ACTION_RELEASED:
x = clamp(x + 1)

def refresh():
sense.clear()
sense.set_pixel(x, y, 255, 255, 255)

sense.stick.direction_up = pushed_up
sense.stick.direction_down = pushed_down
sense.stick.direction_left = pushed_left
sense.stick.direction_right = pushed_right
sense.stick.direction_any = refresh
refresh()
pause()

여기까지 라즈베리파이 재단에서 발표한 API를 살펴 봤습니다.
필자가 느끼는 소감은 한마디로 ‘지극정성’이 들어가 있는 프로젝트란 생각이 들 정도입니다. 맛보기가 아니라 이 제품을 활용하여 무엇인가를 실제로 만들어 볼 수 있도록 준비를 다 해 놨습니다.
한걸음 더 나아가 배우고자 하는 사람을 위한 페이지, 가르치고자 하는 페이지를 만들어 줄 정도니 그 정성 대단하다 아니할 수 없을듯합니다.

5. API를 활용한 실제 실험 결과

5.1 실험환경 준비
위의 2.2에서 API를 설치하고 나면 다음과 같은 프로그램이 쭉~ 설치가 되어 있습니다. 우선 제대로 된 테스트를 하기위해 몇 가지 사전 준비를 합니다.
인스톨이 끝나고 나면 아래 주소에 파일이 들어가 있습니다.
/usr/src/sense-hat/examples

이 파일 들을 pi의 홈디렉토리로 복사합니다.
cp /usr/src/sense-hat/examples ~/ -a

여기에 소개되어 있는 프로그램들은 C, C++로 짜여져 있으며 각 디렉토리에서 컴파일을 하여야 실행을 해볼 수 있습니다.
컴파일은 간단하여 해당 디렉토리에서 make를 하는 것만으로 간단히 끝납니다.
API간 전체적인 구성은 아래와 같습니다.

38 sr 금강초롱 (32)

5.2. 파이선으로 작성된 기본예제 실험
우선 디렉토리를 python-sense-hat으로 이동합니다.

38 sr 금강초롱 (13)

컬러 패턴을 보내는 예제와 스네이크바이트의 라즈베리파이향 게임을 하는 장면입니다. 스네이크바이트는 전설과도 같은 게임이라고 생각합니다.

38 sr 금강초롱 (14)

다음으로 무지개와 흐르는 문자를 표시해 봤습니다.

화면에 표출되는 영상이 다이나믹디스플레이 방식이므로 사진에 잘 찍히지 않을 수도 있습니다만 육안으로 보는데는 별 지장이 없습니다.

38 sr 금강초롱 (15)

실행을 할 때는 아래와 같이 경로가 명확히 지정되어져야 합니다.

38 sr 금강초롱 (16)

첫 번째 실험으로 사용한 color_cycle.py는 다음과 같이 짜여져 있음을 알 수 있습니다.

pi@raspberrypi:~/examples/python-sense-hat $ cat colour_cycle.py

#!/usr/bin/python
import time
from sense_hat import SenseHat // SenseHat API를 로드한다.
sense = SenseHat()
r = 255
g = 0
b = 0
msleep = lambda x: time.sleep(x / 1000.0)
def next_colour(): // next_colour 라는 함수를 선언한다.
global r
global g
global b
if (r == 255 and g < 255 and b == 0):
g += 1
if (g == 255 and r > 0 and b == 0):
r -= 1
if (g == 255 and b < 255 and r == 0):
b += 1
if (b == 255 and g > 0 and r == 0):
g -= 1
if (b == 255 and r < 255 and g == 0):
r += 1
if (r == 255 and b > 0 and g == 0):
b -= 1
while True: // 실제 실행이 일어나는 부분이다.
sense.clear([r, g, b])
msleep(2)
next_colour() // 위에서 작성한 함수를 호출한다.

pi@raspberrypi:~/examples/python-sense-hat $

5.3. IMU 실험
RTIMULib 디렉토리에서 9축 모션센서의 동작 상태를 실험해 볼 수 있습니다. 파이썬 프로그램은 당연히 라이브러리는 위에서 언급한 것으로 짜여져 있습니다.

38 sr 금강초롱 (18)

다음으로는 C++언어 기반으로 짜여진 예제입니다.
pi@raspberrypi:~/examples/RTIMULib/RTIMULibDrive로 이동한 후
make를 하면 실행파일인 RTIMULibDrive를 얻을 수 있습니다.

38 sr 금강초롱 (19)

실행하는 방법은 파이썬과 동일 합니다.
pi@raspberrypi:~/examples/RTIMULib/RTIMULibDrive $ ./RTIMULibDrive라고 치면 됩니다.
화면 하단부에 Sample rate, roll, pitch, yaw의 값이 보입니다.

38 sr 금강초롱 (20)

라즈베리파이를 움직이면 이에 추종하여 롤, 피치, 요 값이 변하는 것을 확인할 수 있습니다. 이 정보를 균형로봇이나 쿼드콥터 등에 응용해 볼 수 있을 것 같습니다.

위 실험의 소스코드는 라이브러리를 이용하는 방식으로 비교적 간단합니다.

pi@raspberrypi:~/examples/RTIMULib/RTIMULibDrive $ cat RTIMULibDrive.cpp

////////////////////////////////////////////////////////////////////////////
//
// This file is part of RTIMULib
//
// Copyright (c) 2014-2015, richards-tech, LLC
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of
// this software and associated documentation files (the “Software”), to deal in
// the Software without restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
// Software, and to permit persons to whom the Software is furnished to do so,
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

#include “RTIMULib.h”

int main()
{
int sampleCount = 0;
int sampleRate = 0;
uint64_t rateTimer;
uint64_t displayTimer;
uint64_t now;

// Using RTIMULib here allows it to use the .ini file generated by RTIMULibDemo.
// Or, you can create the .ini in some other directory by using:
// RTIMUSettings *settings = new RTIMUSettings(“<directory path>”, “RTIMULib”);
// where <directory path> is the path to where the .ini file is to be loaded/saved

RTIMUSettings *settings = new RTIMUSettings(“RTIMULib”);

RTIMU *imu = RTIMU::createIMU(settings);

if ((imu == NULL) || (imu->IMUType() == RTIMU_TYPE_NULL)) {
printf(“No IMU found\n”);
exit(1);
}

// This is an opportunity to manually override any settings before the call IMUInit
// set up IMU

imu->IMUInit();

// this is a convenient place to change fusion parameters

imu->setSlerpPower(0.02);
imu->setGyroEnable(true);
imu->setAccelEnable(true);
imu->setCompassEnable(true);

// set up for rate timer

rateTimer = displayTimer = RTMath::currentUSecsSinceEpoch();

// now just process data

while (1) {
// poll at the rate recommended by the IMU

usleep(imu->IMUGetPollInterval() * 1000);

while (imu->IMURead()) {
RTIMU_DATA imuData = imu->getIMUData();
sampleCount++;

now = RTMath::currentUSecsSinceEpoch();

// display 10 times per second

if ((now – displayTimer) > 100000) {
printf(“Sample rate %d: %s\r”, sampleRate, RTMath::displayDegrees(“”, imuData.fusionPose));
fflush(stdout);
displayTimer = now;
}

// update rate every second

if ((now – rateTimer) > 1000000) {
sampleRate = sampleCount;
sampleCount = 0;
rateTimer = now;
}
}
}
}

pi@raspberrypi:~/examples/RTIMULib/RTIMULibDrive $

6. 마무리

Sense HAT은 라즈베리파이재단에서 Astro Pi Mission의 일부로 제작되어 실제 우주정거장에 보내진 제품입니다. 아래 사진 속 QR코드로 확인 가능합니다.

Cap 2016-12-08 11-17-15-048

그래서 그런지도 모르겠습니다만 매우 정성이 들어간 설명이 존재하고, 예제프로그램과 API 역시 섬세하게 만들어졌음을 알 수 있었습니다.
학교 등 교육기관에서 컴퓨터 프로그래밍과 센서가 융복합된 과제와 학습을 진행하는데 더할 나위 없이 좋은 제품이 아닐까하는 생각이 듭니다.
위에서도 언급을 한 바가 있습니다만, Sense HAT을 가르치는 자를 위한 별도의 페이지와 Sense HAT을 배우고자하는 이를 위한 페이지 그리고 Sense HAT을 활용하여 창의적인 무엇인가를 해보는 프로젝트를 위한 페이지로 구성된 것 자체가 필자에게는 적잖은 신선함으로 다가왔습니다.
마치 모범답안을 보는 그런 느낌마저 들었습니다.
더군다나 라즈베리파이보드와 Sense HAT이 없이도 학습을 해 볼 수 있는 시뮬레이션 웹싸이트까지 준비해 놓고 있으므로, 이 정도면 제대로 준비해두었다 아니할 수 없을 듯합니다.
이번 리뷰를 진행하는 기간 동안 극강(?)의 회사업무와 숨이 막히는 폭염이 겹쳐서 살짝 고전은 하였습니다만, 이런 훌륭한 제품을 접할 기회가 있었다는 점 하나만으로도 충분히 보람있는 시간이 아니었나 생각됩니다.
다음 편에서는 라즈베리파이와 아두이노의 한계를 뛰어넘는 강력한 컴퓨팅파워를 자랑하는 ‘LattePanda’ 최신형보드에 대해 집중적으로 살펴보려 합니다.
감사합니다.

7. 참고자료
1. 라즈베리파이 가이드
https://www.raspberrypi.org/learning/astro-pi-guide/
2. API레퍼런스
http://pythonhosted.org/sense-hat/api/
3. 파이선에서 지원하는 센스헷 설치 페이지
https://pythonhosted.org/sense-hat/
4. 센스햇 예제
https://github.com/RPi-Distro/python-sense-hat/blob/master/examples/README.md
5. 아스트로파이 페이지의 예제프로그램
https://astro-pi.org/get-involved/program-the-sense-hat/python/
6. 원디하나님 블로그
http://windy.luru.net/1863
7. 우주정거장 실험 관련 영상물
https://astro-pi.org/updates/coding-challenges-update/
8. Sense HAT 시뮬레이터 주소
https://www.raspberrypi.org/learning/getting-started-with-the-sense-hat/worksheet/

 

38 sr 금강초롱 (33)

Leave A Comment

*