홍창민정보·인공지능 교사

움직임·거리·위치 · 난이도 쉬움

SW-420 진동 센서로 흔들림을 바뀐 횟수로 세고 감지 거리와 받침 재질의 영향 재기

SW-420 모듈은 통 안의 스프링이 흔들려 붙었다 떨어지는 순간을 LM393 비교기로 디지털 신호로 바꿔요. 3.3V 배선, 상태가 아니라 바뀐 횟수를 인터럽트로 세는 코드, 가변저항 민감도 맞추기, 공을 떨어뜨려 감지 거리와 받침 재질을 비교하는 탐구를 정리했어요.

글 홍창민 · 갱신 2026-10-31 · 읽는 데 약 8분 · 가상 실행 확인 (실물 미확인)

이 센서로 무엇을 잴 수 있나

SW-420 진동 센서 모듈은 파란 가변저항과 작은 원통 모양 스위치가 붙은 기판이에요. 판매 자료(components101)에는 동작 전압 3.3~5V, 전류 15mA, LM393 비교기를 쓴 디지털 출력(DO)이 적혀 있어요. 아날로그 출력은 없어요.

이 센서가 알려 주는 것은 "흔들림이 있었나"와 "흔들리는 동안 신호가 몇 번 바뀌었나"예요. 가속도처럼 흔들림의 크기를 g 단위로 재지는 못해요. 크기가 필요하면 MPU6050 가속도 센서를 써요. 그 대신 값이 단순해서, 책상에 떨어진 공이 몇 cm 밖까지 느껴지는지, 받침에 따라 진동이 얼마나 덜 전해지는지처럼 "감지됐나, 안 됐나"를 여러 번 세는 탐구에 잘 맞아요.

원리

원통 안에는 스프링과 금속 막대가 들어 있어요. 흔들리면 둘이 붙었다 떨어졌다 하면서 스위치가 빠르게 열리고 닫혀요. LM393 비교기는 스위치 쪽 전압과 가변저항이 정한 기준 전압을 비교해서 DO를 HIGH 또는 LOW로 바꿔요. 가변저항을 돌리면 기준이 바뀌어 민감도가 달라져요.

가만히 있을 때의 DO 상태는 자료마다 달라요. components101은 진동이 없으면 LOW, 있으면 HIGH라고 설명하고, Seeed의 Grove 진동 센서(SW-420) 위키는 평소 HIGH이다가 흔들리면 잠깐 LOW가 된다고 설명해요. 모듈 회로가 다르기 때문이에요. 그래서 이 글의 코드는 DO가 0인지 1인지 보지 않고, 0에서 1로, 1에서 0으로 "바뀐 횟수"를 세요. 이렇게 하면 어느 모듈이든 같은 코드로 쓸 수 있어요.

한 번 톡 쳐도 스위치가 여러 번 튀면서 신호가 여러 번 바뀌어요. 바뀐 횟수는 흔들림이 세고 오래갈수록 대체로 늘어나지만, 가변저항 위치와 붙인 방법에 따라 달라지는 상대적인 숫자예요.

준비물

  • 라즈베리파이 피코와 USB 케이블
  • SW-420 진동 센서 모듈, 암-수 점퍼선 3개
  • 작은 십자 드라이버(가변저항용)
  • 탁구공, 30cm 자, 줄자, 종이테이프, 양면테이프
  • 탐구용: 작은 나무판(10cm 안팎), 스펀지, 고무판, 종이 묶음

배선

SW-420 진동 센서로 흔들림을 바뀐 횟수로 세고 감지 거리와 받침 재질의 영향 재기: 브레드보드에 피코와 센서를 꽂은 배선 그림
시나브로 PICO 브레드보드 작업대와 같은 계산으로 그린 배선이에요. 위 + 줄은 3.3V, 아래 + 줄은 5V예요.
브레드보드 따라 꽂기 순서 (8단계)
  1. 피코를 브레드보드 가운데 홈에 걸쳐 꽂아요. USB 단자가 왼쪽을 보게 하고, 1번 핀이 f2, 40번 핀이 e2에 들어가요. 다리가 홈 양쪽에 모두 들어갔는지 옆에서 봐요.
  2. 주황 선: 피코 36번 핀(3V3(OUT)) 옆 칸 a6 → 위쪽 + 줄(3.3V). 이제 이 줄 전체가 3.3V예요.
  3. 검은 선: 피코 38번 핀(GND) 옆 칸 a4 → 위쪽 − 줄(GND). 이제 이 줄 전체가 GND예요.
  4. 진동·충격 SW-420 꽂기: 다리 VCC · GND · DO를 위쪽 a24 · a25 · a26에 차례로 꽂아요. 다리가 브레드보드에 바로 안 들어가면 암-수 점퍼선으로 같은 칸에 이어요.
  5. 주황 선(3.3V 전원): 진동·충격 VCC 줄 b24 → 위쪽 + 줄(3.3V)
  6. 검은 선(GND): 진동·충격 GND 줄 b25 → 위쪽 − 줄(GND)
  7. 초록 선(신호): 진동·충격 DO 줄 b26 → 피코 21번 핀(GP16) 옆 칸 a21
  8. 마지막 확인: ① 위쪽 + 줄(3.3V)과 아래쪽 + 줄(5V)이 서로 이어지지 않았나요? ② 모든 부품의 GND가 − 줄에 이어졌나요? ③ 5V 신호 다리는 저항을 거쳐 피코에 이어졌나요? ④ 긴 브레드보드는 + − 줄이 가운데에서 끊긴 것도 있어요(빨간·파란 선이 끊겨 있으면 짧은 선으로 이어요). ⑤ 그림과 한 칸씩 비교한 뒤 USB를 꽂아요.
모듈 핀 피코 핀 비고
VCC 3V3 (36번) 3.3V로 켜면 DO도 3.3V 아래로 나와요
GND GND (38번) 공통 접지
DO GP16 (21번) 디지털 출력

전원을 3V3에 이으면 DO가 피코 핀의 전압 범위 안에 머물러요. 같은 모듈을 5V로 켜면 DO가 5V까지 나올 수 있으니, 이 글처럼 3.3V로 켜요. 기판의 LED 두 개는 전원 표시와 출력 표시예요. 출력 LED가 깜빡이는 모습으로 가변저항을 맞출 수 있어요.

센서는 양면테이프로 받침에 단단히 붙여요. 그냥 올려 두면 모듈 자체가 튀면서 값이 커져요. 붙이는 방법을 실험 내내 같게 두는 것이 중요해요.

코드

from machine import Pin
import time

vib = Pin(16, Pin.IN)          # DO → GP16
edges = 0                      # 처음 켠 뒤 바뀐 횟수 누계

def on_edge(p):
    global edges
    edges += 1                 # 인터럽트에서는 숫자만 세요

vib.irq(trigger=Pin.IRQ_RISING | Pin.IRQ_FALLING, handler=on_edge)

WINDOW = 0.5                   # 몇 초마다 셀지
last = 0
events = 0
quiet = True
while True:
    time.sleep(WINDOW)
    now = edges
    n = now - last             # 이번 창에서 바뀐 횟수
    last = now
    if n > 0 and quiet:
        events += 1            # 조용하다가 처음 바뀐 창 = 새 사건
    quiet = (n == 0)
    print(f"DATA: vib={n}, events={events}")
  • vib.irq(...)는 DO가 오르거나 내릴 때마다 on_edge를 불러요. 처리 함수는 누계 edges에 1을 더하기만 해요. MicroPython 문서도 인터럽트 처리 함수는 짧게 쓰라고 권해요.
  • 본 반복은 0.5초마다 누계의 차이를 구해요. 처리 함수가 숫자를 0으로 되돌리지 않으니, 세는 도중에 값이 사라지는 일이 없어요.
  • events는 조용한 창 다음에 처음 신호가 바뀐 창을 한 번의 사건으로 세요. 공을 한 번 떨어뜨렸는데 vib가 두 창에 걸쳐 나와도 사건은 1번이에요.

값 해석과 보정

vib 숫자에는 단위가 없어요. 같은 모듈, 같은 가변저항 위치, 같은 붙임 방법에서만 서로 비교해요. 실험을 시작하기 전에 가변저항을 한 번 맞추고 위치를 사진으로 남겨요. 센서를 가만히 둔 채 출력 LED가 저절로 깜빡이지 않는 범위에서 가장 민감한 쪽으로 맞추면 실험 내내 조건을 지키기 쉬워요. 너무 민감하면 가만히 있어도 신호가 바뀌어 events가 저절로 늘어요.

한 번의 자극에서 나온 vib는 꽤 들쭉날쭉해요. 스위치가 튀는 횟수가 그때그때 다르기 때문이에요. 그래서 같은 자극을 10번 주고 "감지된 비율(%)"과 vib의 중앙값을 함께 적어요. 감지 비율은 이 센서의 장점인 "됐나, 안 됐나"를 그대로 살린 숫자라 결론을 내기 좋아요.

창 길이(WINDOW)도 결과에 영향을 줘요. 창이 너무 짧으면 한 번의 흔들림이 여러 사건으로 쪼개지고, 너무 길면 가까이 일어난 두 번의 흔들림이 하나로 합쳐져요. 공 떨어뜨리기처럼 사건 사이가 몇 초 넘게 떨어진 실험에서는 0.5초가 알맞아요. 고른 창 길이는 기록에 적어요.

자주 하는 실수

  1. DO가 1이면 진동이라고 정하기. 평소 상태가 모듈마다 반대일 수 있어요. 바뀐 횟수로 판단해요.
  2. 5V로 켜고 DO를 피코에 바로 잇기. DO가 5V까지 나올 수 있어요. 이 글처럼 3.3V로 켜요.
  3. 센서를 붙이지 않고 올려 두기. 모듈이 튀는 정도가 매번 달라 비교가 안 돼요.
  4. 인터럽트 처리 함수 안에서 print나 sleep 쓰기. 처리가 길어지면 그사이 들어온 신호를 놓쳐요. 숫자만 세고 출력은 본 반복에서 해요.
  5. 실험 중간에 가변저항을 만지기. 기준이 바뀌어 앞뒤 결과를 견줄 수 없어요.

이 센서로 잴 수 있는 탐구

1. 떨어뜨린 높이가 높을수록 신호가 많이 바뀔까 - 질문: 탁구공을 떨어뜨리는 높이에 따라 한 번의 사건에서 바뀐 횟수가 늘어날까? - 바꾸는 것: 낙하 높이 5cm, 10cm, 20cm, 40cm. 떨어지는 자리는 센서에서 30cm로 고정 - 재는 것: 사건 한 번의 vib 합(횟수), 감지된 비율(%) - 방법: 자를 세워 높이를 맞추고 공을 손에서 그냥 놓아요. 높이마다 10번 떨어뜨리고, 한 번 튄 공은 손으로 잡아 두 번째 충돌을 막아요.

2. 몇 cm 밖까지 느껴질까 - 질문: 같은 높이에서 떨어뜨린 공을 센서는 얼마나 먼 곳까지 감지할까? - 바꾸는 것: 센서와 떨어지는 자리 사이 거리 10cm, 30cm, 60cm, 90cm, 120cm. 높이는 20cm 고정 - 재는 것: 10번 중 감지된 비율(%) - 방법: 책상 위에 줄자로 거리를 표시해요. 감지 비율이 50%가 되는 거리를 이 조건의 "감지 거리"로 정하고, 다른 책상에서도 해 봐요.

3. 받침을 바꾸면 진동이 덜 전해질까 - 질문: 센서를 붙인 나무판 아래에 스펀지나 고무판을 깔면 감지 비율이 줄어들까? - 바꾸는 것: 받침(책상에 바로, 종이 묶음, 고무판, 스펀지) - 재는 것: 감지된 비율(%), vib의 중앙값 - 방법: 센서는 나무판에 붙이고 나무판만 받침 위에 올려요. 공은 30cm 떨어진 곳에서 20cm 높이로 10번 떨어뜨려요. 건물의 진동을 줄이는 받침 원리와 연결해 결과를 해석해요.

안전

  • 탁구공처럼 가볍고 튀어도 다치지 않는 공만 쓰고, 얼굴 높이 위에서 떨어뜨리지 않아요.
  • 배선은 USB를 뽑은 채로 바꾸고, VCC를 VBUS(5V)에 잇지 않아요.
  • 판매 설명에 지진 경보나 도난 경보가 적혀 있어도, 이 모듈은 교육용 흔들림 감지기예요. 사람의 안전을 지키는 데 쓰지 마세요.

더 알아보기

글쓴이

홍창민 · 울산 학성고등학교 정보·인공지능 교사. 수업에 쓰는 도구(시나브로 PICO 웹 IDE, 학교 AI 서버 등)를 직접 만들어 운영해요. 소개 보기 · 고칠 곳 알려 주기