오래된 전화를 스파크펀 아두이노 프로 미니로 보물찾기 단서 시스템으로 변환
부품 및 소모품
| SparkFun 아두이노 프로 미니 328 - 5V/16MHz | 1개 |
| MP3/WAV 트리거 보드 | 1개 |
| 오래된 전화기 | 1개 |
| 브레드보드 (일반) | 1개 |
| 점퍼 와이어 (일반) | 1세트 |
| SparkFun 연결 와이어 | 1개 |
| 마이크로 SD 카드 | 1개 |
필요한 도구 및 기계
- 납땜 인두 (일반)
- 열풍기 (SparkFun)
프로젝트 소개
오래된 전화기를 보물찾기 단서 시스템으로 변환하는 방법을 안내합니다.
1단계 - 키패드 행과 열 파악
전화기를 분해하고 키패드를 분리하세요. 키패드는 행과 열의 매트릭스로 키 입력을 감지합니다. 이 페이지에서 멀티미터 연속성 모드로 키패드 버튼을 식별하고 행/열에 매핑하는 방법을 잘 설명하고 있습니다. 제 키패드는 다음과 같았습니다:



키패드 회로가 보이면 어떤 핀이 각 키에 연결되는지 쉽게 알 수 있습니다. 불행히도 제 키패드 핀은 완벽한 행/열 구조가 아니어서, 두 번째 사진처럼 매트릭스를 만들어 핀을 행과 열로 나누었습니다. 원으로 표시된 숫자는 키패드 핀 번호, 매트릭스의 숫자는 키, 박스 안의 'I/O' 숫자는 아두이노 핀입니다. 핀 매핑을 기록한 후 각 키패드 핀을 아두이노 핀에 할당하세요. 제 키패드는 필요 이상의 핀이 있는 이상한 구조지만 괜찮습니다.
세 번째 사진은 실제로 사용하는 버튼만으로 단순화한 최종 매트릭스입니다. 이제 거의 행/열 구조처럼 보입니다. 코드에서는 키패드에 없는 빈 자리를 A, B, C, D 플레이스홀더로 채웠습니다.
2단계 - 키패드 핀에 연장선 납땜
키패드 핀을 브레드보드에 쉽게 연결하기 위해 필요한 핀에 연장선을 납땜하세요. 프로젝트에 키패드의 모든 키를 사용할 필요는 없으므로, 아래 사진은 제가 사용하기로 한 핀만 보여줍니다. 4자리 비밀번호를 사용하므로 * 키를 포함해 5개 키만 필요했습니다.

3단계 - 오디오 파일 준비
이 프로젝트에서 단서 음성은 Natural Readers의 텍스트 투 스피치 'Peter' 목소리입니다. 음성 파일을 다운로드하세요. 모스 부호 음성도 필요합니다. 온라인 모스 부호 생성기가 많은데, 저는 SCPhillips.com 것을 사용했습니다. 이 파일도 다운로드하세요. 키패드 비프음도 다운로드하세요.
Audacity는 오디오 편집에 훌륭한 도구로, 모스 부호와 음성 파일을 병합하고 비프음을 단일 비프로 자르는 데 사용할 수 있습니다.
이 파일들을 Audacity에 드래그 앤 드롭하고 필요에 맞게 단서 파일을 조정하세요. 키패드 비프음도 불필요한 부분을 하이라이트하고 삭제하여 짧게 만드세요.


Audacity 파일을 저장한 후 각 트랙을 별도 MP3로 내보내세요. Audacity를 처음 사용하는 경우 LAME MP3 인코더를 다운로드해야 할 수 있습니다.
이 MP3 플레이어 보드에서 오디오 파일이 재생되려면 파일 이름이 올바르게 지정되어 SD 카드 내 폴더에 있어야 합니다. 각 MP3 파일은 001, 002 등 MP3 보드의 트리거 핀 1~9에 대응되게 이름을 지정해야 합니다. 또한 파일들은 SD 카드 안의 01 폴더 안에 있어야 합니다. 다른 MP3 트리거 보드는 더 쉽게 처리할 수 있을 수 있습니다.
4단계 - 라이브러리 다운로드 및 코드 준비
이 프로젝트에는 Keypad와 Password 아두이노 라이브러리가 필요합니다. 이 라이브러리를 다운로드하여 설치하고, 아래 프로젝트 코드를 다운로드하세요. 원하는 비밀번호를 설정하고 키 매트릭스에 해당하는 키를 채우세요.
5단계 - 모든 것 연결
전화기 내부를 비우고 새로운 부품들을 안에 넣으세요. 파워뱅크도 들어갈 수 있습니다.





이 프로젝트가 마음에 드시나요? 제 다른 프로젝트도 확인해 보세요!
코드
전화 키패드 스케치
#include <Password.h> //https://www.arduino.cc/playground/uploads/Code/Password.zip
#include <Keypad.h> //https://www.arduino.cc/playground/uploads/Code/Keypad.zip
Password password = Password( "7365" );
const byte ROWS = 4; // 4행
const byte COLS = 3; // 3열
// 키맵 정의
char keys[ROWS][COLS] = {
{'4','5','6'},
{'7','8','A'}, // "A"는 플레이스홀더; 내 키패드에 없는 버튼
{'B','2','3'}, // "B"는 플레이스홀더; 내 키패드에 없는 버튼
{'*','C','D'} // "C", "D"는 플레이스홀더; 내 키패드에 없는 버튼
};
byte rowPins[ROWS] = { 7,5,3,8 }; // 키패드 행을 이 아두이노 핀에 연결
byte colPins[COLS] = { 6,4,2 }; // 키패드 열을 이 아두이노 핀에 연결
const int dial = 13; // MP3 트리거 보드로 가는 디지털 아두이노 핀
const int morse = 12; // MP3 트리거 보드로 가는 디지털 아두이노 핀
// 키패드 생성
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup(){
pinMode(dial, OUTPUT);
pinMode(morse, OUTPUT);
digitalWrite(dial, HIGH); // MP3 보드는 액티브 로우 트리거이므로 HIGH로 시작
digitalWrite(morse, HIGH); // MP3 보드는 액티브 로우 트리거이므로 HIGH로 시작
Serial.begin(9600);
keypad.addEventListener(keypadEvent); // 이 키패드에 이벤트 리스너 추가
}
void loop(){
keypad.getKey();
}
// 특수 이벤트 처리
void keypadEvent(KeypadEvent eKey){
switch (keypad.getState()){
case PRESSED:
Serial.print("Pressed: ");
Serial.println(eKey);
digitalWrite(dial, LOW); // 다이얼 비프 오디오 파일 재생; 키 누를 때마다 발생
delay(50);
digitalWrite(dial, HIGH);
switch (eKey){
case '*':
checkPassword();
break; // *는 엔터 키
default:
password.append(eKey);
}
}
}
void checkPassword(){
if (password.evaluate()){
Serial.println("Success");
password.reset(); // 다음 시도를 위해 키 입력 초기화
digitalWrite(morse, LOW); // 단서 오디오 파일 재생
delay(50);
digitalWrite(morse, HIGH);
}else{
Serial.println("Wrong");
password.reset(); // 다음 비밀번호 시도를 위해 키 입력 초기화
}
}
회로도
