아두이노로 만드는 맞춤형 '펀처블' 키보드 버튼: 단계별 가이드
부품 및 소모품
| 부품 |
수량 |
비고 |
| 아두이노 마이크로 (ATmega32U4 기반) |
1 |
아두이노 레오나르도 등 ATmega32U4 탑재 보드면 모두 가능. 마우스/키보드로 인식됨 |
| 피에조 엘리먼트 (압전 소자) |
1 |
뮤지컬 축하 카드 스피커에서 추출 가능 |
| 저항 1MΩ |
1 |
피에조에서 발생하는 전압/전류 제한 및 아날로그 입력 보호용 |
| 점퍼 와이어 |
1 |
|
필요한 도구 및 장비
- 스펀지 재질 (충격 흡수용)
- 천 (아무 색상) - 스펀지와 전자부품 덮개용. 바늘과 실로 주머니 제작
앱 및 온라인 서비스
프로젝트 개요
일하거나 게임 중에 키보드를 때리고 싶은 충동을 느낀 적 있으신가요? 이 '펀처블' 키를 때리거나 차서 스트레스를 해소하세요!
본 프로젝트는 피에조 엘리먼트, ATmega32U4 기반 보드, 1MΩ 고저항, 스펀지로 맞춤형 펀처블 키보드 버튼을 만듭니다. 사용자는 원하는 키를 치거나 차서 입력합니다.
필요 하드웨어
- 아두이노 프로 마이크로: ATmega32U4 마이크로컨트롤러 탑재, 내장 USB로 마우스/키보드 인식 가능. ATmega32U4 칩을 쓴 보드면 모두 사용 가능.
- 피에조 전자 디스크: 진동, 소리, 기계적 변형으로 전압을 생성하는 소자. 뮤지컬 카드 스피커에서 분해해 추출 가능.
- 1MΩ 저항: 피에조 발생 전압/전류 제한 및 아날로그 입력 보호.
- 스펀지: 힘을 가하면 변형되고 놓으면 원상복귀. 피에조 엘리먼트를 스펀지 사이에 넣고 치면 전압이 발생해 아두이노 아날로그 핀으로 전달.
회로도
피에조는 극성이 있습니다. 검은 선(저전압)을 GND에, 빨간 선(고전압)을 아날로그 핀 0(A0)에 연결합니다. 또한 피에조와 병렬로 1MΩ 저항을 연결해 전압/전류를 제한하고 아날로그 입력을 보호합니다.
피에조(노크 센서) 출력이 임계값보다 강하면 보드가 프로그래밍된 키보드 동작을 수행합니다.
스펀지 커버 제작
천으로 바늘과 실을 사용해 스펀지 커버를 만듭니다. 어머니께 부탁해 회로와 스펀지를 감싸는 커버를 제작했습니다.
피에조 엘리먼트 스펀지에 삽입
코드
#include <Keyboard.h>
const int knockSensor = A0; // 피에조는 아날로그 핀 0에 연결
const int threshold = 100; // 임계값
int sensorReading = 0; // 센서 읽기 값 저장
void setup() {
Keyboard.begin();
}
void loop() {
sensorReading = analogRead(knockSensor);
if (sensorReading >= threshold) {
// 키 기능 변경 시 아래 ASCII 값 수정 (참고: https://www.arduino.cc/en/Reference/ASCIIchart)
Keyboard.write(32); // ASCII 32 = 스페이스바
delay(150);
Keyboard.releaseAll();
}
}
- 회로도대로 연결하고 코드 업로드
- 컴퓨터 USB 포트에 연결하면 프로그래밍된 키보드 기능 수행
다른 키보드 동작을 원하면 코드의 Keyboard.write("ASCII 값"); 줄만 수정하세요.
활용 아이디어
- 게임 단축키/컨트롤
- 자주 쓰는 애플리케이션 실행
- 자주 방문하는 웹사이트 열기
- 윈도우 단축키(문서 저장, 전체 창 최소화 등)
- 이메일 주소나 자주 쓰는 문자열 입력
- 복잡한 비밀번호 입력
- 직장용 비상 버튼
읽어주셔서 감사합니다. 더 필요한 정보가 있으면 댓글로 물어봐 주세요!
즐거운 메이킹!
코드
customizable_punchable_keyboard_button.ino
customizable_punchable_keyboard_button.ino Arduino
#include <Keyboard.h>
const int knockSensor = A0;
const int threshold = 100;
int sensorReading = 0;
void setup() {
Keyboard.begin();
}
void loop() {
sensorReading = analogRead(knockSensor);
if (sensorReading >= threshold) {
Keyboard.write(32);
delay(150);
Keyboard.releaseAll();
}
}
회로도
circuit_diagram_dCHo19d2OK.fzz