[RaspberryPI] 센서 & 센스헷

센서란?

정보를 수집하여, 수치 값으로 만들어내는 장치
사람의 시각/청각/후각/미각/촉각 뿐만 아니라, 초음파/압력/자기/온도/가스/가속도 등을 수치로 만들어 내는 장치

MEMS

MEMS : Micro Electro Mechanical System로, 반도체 제조 공정으로 만드는
초소형 기계, 톱니바퀴 등을 Nano 공정으로 제작한다. 초소형 센서를 제작할 때
이 기술을 사용한다.

센스햇

센서들이 모여있는 Hat으로 자이로 센서,가속도 센서, 기압 센서, 지자기 센서, 온 습도 센서, 8x8 LED, 8 방향 조이스틱이 있다.

cmd창을 통해 sudo apt-get install sense-emu-tools을 통해 가상 Sense Hat을 설치해줍니다.

8x8 LED 테스트

테스트 코드

from sense_emu import SenseHat # emualtor에서 동작되도록
from sense_hat import SenseHat # 실제 보드에서 동작되도록

sense = SenseHat()
sense.show_message("HELLO")

회전 출력

from sense_hat import SenseHat
from time import sleep

sense = SenseHat()

sense.show_message("A")
sense.set_rotation(90)
sense.show_message("A")
sense.set_rotation(180)
sense.show_message("A")
sense.set_rotation(270)

픽셀조정

from sense_emu import SenseHat
from time import sleep

sense = SenseHat()

X = [255,0,0] # RED
O = [255,255,255] # White
A = [233, 20,100]
B = [22,240,130]

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,O,X,O,A,
    O,O,O,O,O,X,O,B,
    O,O,O,O,O,X,O,O,
    O,O,O,O,O,X,O,O,
    O,O,O,O,O,X,O,O,
    ]

sense.set_pixels(question_mark)

sense.flip_v() # 글자 반전
원래반전

좌표로 픽셀 조작

from sense_emu import SenseHat
from time import sleep

sense = SenseHat()

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

sense.set_pixel(0,0,red)
sense.set_pixel(1,0,green)
sense.set_pixel(0,1,blue)

전체화면 조작

from sense_emu import SenseHat
from time import sleep

sense = SenseHat()

sense.clear() # ALL CLEAR
sleep(1)
sense.clear(255, 255, 255) # ALL White

밝기 & 속도 조절

밝기 조절

from sense_hat import SenseHat
import time

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

속도 조절

from sense_emu import SenseHat
import time

sense = SenseHat()

sense.show_message("1", 0.1, text_colour=[255,0,0]) # fast
sense.show_message("2", 0.15, text_colour=[255,255,0]) 
sense.show_message("3", 0.3, text_colour=[255,0,255]) # slow

한글자씩 출력

from sense_emu import SenseHat
from time import sleep

sense = SenseHat()

str = "HOON"

for i in range(4):
    sense.show_letter(str[i])
    sleep(1)

온습도센서

온도와 습도 모두 측정이 가능하다. 실크가 U3으로 적혀있다.
실크 : 보드에 흰색으로 표기된 것

라즈베리파이 회로도에서 센스헷 회로도를 통해 온습도센서(U3) 확인가능하다.

HTS221 데이터시트에서도 살펴볼 수 있다.

테스트코드

from sense_hat import SenseHat
from time import sleep

sense = SenseHat()

while True:
    humi = sense.get_humidity()
    temp = sense.get_temperature()
    
    print("Humidity : %s" % humi)
    print("Temperature : %s" % temp)
    sleep(1)

기압센서

대기압 측정이 가능하다. 실크는 U5이다. 사용할 센서명은 LPS25H이다.

테스트코드

from sense_hat import SenseHat
from time import sleep

sense = SenseHat()

while True:
    press = sense.get_pressure()
    
    print("Pressure : %s" % press)
    sleep(1)

IMU

Inertial Measurement Unit 관성 측정 장치, 실크 U4, 모델명 : LSM9DS1
종류
1. 3축센서 : 자이로스코프 or 가속도 센서 or 지자기 센서 - (X, Y, Z) 값을 읽을 수 있음
2. 6축센서 : 자이로스코프 + 가속도 센서 - (X, Y, Z) 두 set 값을 읽을 수 있음
3. 9축센서 : 자이로스코프 + 가속도 센서 + 지자기 센서 - •(X, Y, Z) 세 set 값을 읽을 수 있음

자이로스코프 값 출력하기

pitch / roll / yaw 으로 기울기를

from sense_hat import SenseHat
from time import sleep

sense = SenseHat()

while True:
    ori = sense.get_orientation_degrees()
    print(f'[{ori["pitch"]:5.1f}] - ', end = '')
    print(f'[{ori["roll"]:5.1f}] - ', end = '')
    print(f'[{ori["yaw"]:5.1f}]', end = '')
    print()

가속도센서

X, Y, Z 축의 가속도를 측정할 수 있다. 이 센서를 이용하여 속도이동 경로까지 알아낼 수 있다.

가속도 출력

from sense_hat import SenseHat
from time import sleep

sense = SenseHat()

while True:
    acc = sense.get_accelerometer_raw()
    print(f'[{acc["x"]:5.1f}] - ', end = '')
    print(f'[{acc["y"]:5.1f}] - ', end = '')
    print(f'[{acc["z"]:5.1f}]', end = '')
    print()

자기력측정

from sense_hat import SenseHat
from time import sleep

sense = SenseHat()

while True:
    com = sense.get_compass_raw()
    print(f'[{com["x"]:5.1f}] - ', end = '')
    print(f'[{com["y"]:5.1f}] - ', end = '')
    print(f'[{com["z"]:5.1f}]', end = '')
    print()

조이스틱

상 , 하 , 좌 , 우 , 클릭 가능

이벤트 발생 대기 코드

f
rom sense_hat import SenseHat
from time import sleep

sense = SenseHat()

while True:
    event = sense.stick.wait_for_event()
    print("The joystick was {} {}".format(event.action, event.direction))
    sleep(0.1)

인터럽트 방식

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

def pushed_up(event):
    global y
    if event.action != ACTION_RELEASED: y-=1
    
def pushed_down(event):
    global y
    if event.action != ACTION_RELEASED: y+=1
    
def pushed_left(event):
    global x
    if event.action != ACTION_RELEASED: x-=1

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

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

sense = SenseHat()

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

pause()

폴링 방식

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))

좋은 웹페이지 즐겨찾기