아두이노 아이언맨 제작: 부품, 센서, 단계별 가이드
부품 및 소모품
| 아두이노 우노 |
1개 |
| 점퍼 와이어 |
1세트 |
| 초음파 센서 HC-SR04 |
1개 |
| MP3 모듈 DFPlayer Mini |
1개 |
| 4채널 릴레이 모듈 |
1개 |
필요한 도구
앱 및 온라인 서비스
프로젝트 개요
아이언맨 피규어에 생명을 불어넣는 프로젝트입니다. 아두이노 우노가 모든 것을 제어하며, DFPlayer Mini 라이브러리와 random() 함수로 아이언맨 음성 파일을 랜덤 재생합니다.
준비물
- 아두이노 우노
- 4채널 릴레이 보드
- 초음파 모듈
- 330Ω 저항
- 미니 MP3 플레이어 모듈 (DFPlayer Mini)
- P2 오디오 케이블
작동 원리
- 초음파 센서로 약 1.3m 이내 접근 감지
- 아두이노가 랜덤 음성 파일 번호 선택 (1~18번)
- DFPlayer Mini로 해당 음성 재생
- 릴레이 4채널로 머리, 가슴, 양팔 액추에이터 동기 작동
음성 파일은 토니 스타크 영화 대사에서 추출, 001~018번으로 명명해 SD카드에 저장. GitHub에서 음성 파일 다운로드 가능.
회로도
첨부 이미지 4장 참조 (메인 회로, 릴레이 회로, 램프 회로, 배선도)
코드
#include
#include
#include
// 소프트웨어 시리얼: 핀 6(RX), 7(TX) - DFPlayer 통신용
SoftwareSerial mySoftwareSerial(6, 7);
DFRobotDFPlayerMini myDFPlayer;
String buf;
int pausa = 0;
int equalizacao = 0;
int maxSongs = 0;
#define GND 5
#define ECHO 4
#define TRIG 3
#define VCC 2
Ultrasonic ultra(TRIG, ECHO);
int distancia;
#define CABECA 13 // 릴레이 1: 머리
#define PEITO 12 // 릴레이 2: 가슴
#define ESQUERDA 11 // 릴레이 3: 왼팔
#define DIREITO 10 // 릴레이 4: 오른팔
int x = 3;
void setup() {
mySoftwareSerial.begin(9600);
Serial.begin(115200);
// DFPlayer 초기화
if (!myDFPlayer.begin(mySoftwareSerial)) {
Serial.println(F("DFPlayer 초기화 실패: 연결 확인 / SD카드 삽입"));
while (true);
}
Serial.println("DFPlayer Mini 초기화 완료!");
myDFPlayer.setTimeOut(500);
myDFPlayer.volume(30); // 0~30
myDFPlayer.EQ(0); // 일반 이퀄라이저
maxSongs = myDFPlayer.readFileCounts(DFPLAYER_DEVICE_SD);
Serial.print("SD카드 음원 수: "); Serial.println(maxSongs);
pinMode(CABECA, OUTPUT);
pinMode(PEITO, OUTPUT);
pinMode(ESQUERDA, OUTPUT);
pinMode(DIREITO, OUTPUT);
pinMode(VCC, OUTPUT);
pinMode(GND, OUTPUT);
digitalWrite(GND, LOW);
digitalWrite(VCC, HIGH);
digitalWrite(CABECA, HIGH); // 릴레이 OFF (Active LOW 가정)
digitalWrite(PEITO, HIGH);
digitalWrite(ESQUERDA, HIGH);
distancia = ultra.Ranging(CM);
}
void loop() {
distancia = ultra.Ranging(CM);
Serial.println(String(distancia) + " cm 감지");
if (distancia <= 150 && x == 3) {
buf = String(random(1, 19)); // 1~18 랜덤
play();
delay(3000);
while (ultra.Ranging(CM) <= 150) {
digitalWrite(ESQUERDA, HIGH);
x = 2;
delay(1200);
}
} else {
digitalWrite(DIREITO, LOW);
Serial.println("미감지");
x = 3;
}
}
void play() {
digitalWrite(DIREITO, HIGH); // 릴레이 ON
Serial.println("POU");
delay(300);
digitalWrite(DIREITO, LOW);
delay(300);
digitalWrite(DIREITO, HIGH);
Serial.println("POU");
delay(300);
digitalWrite(DIREITO, LOW);
delay(300);
// 시리얼 입력 대기 후 재생 (실제로는 buf에 저장된 번호로 바로 재생)
while (Serial.available() >= 0) {
int track = buf.toInt();
if (track >= 1 && track <= maxSongs) {
Serial.print("재생: "); Serial.println(track);
myDFPlayer.play(track);
buf = "-1";
break;
}
}
}
회로도
첨부 이미지 참조 (브레드보드 배선도)
개선 포인트
- 코드 내
while(Serial.available() >= 0) 부분은 논리적 오류가 있을 수 있음 (즉시 재생 방식으로 수정 권장)
- 릴레이 Active LOW/High 확인 후 디지털라이트 로직 조정 필요
- 초음파 센서 노이즈 필터링(평균값 등) 추가 시 안정성 향상