피봇(PiBot): 아두이노 기반 88건반 피아노 연주 로봇
필요한 부품 및 소모품
| 부품 |
수량 |
비고 |
| 아두이노 101 (Arduino 101) |
1 |
|
| 74HC595 시프트 레지스터 (Texas Instruments) |
11 |
8비트 직렬-병렬 변환용 |
| IRFZ44N N채널 MOSFET |
88 |
솔레노이드 구동용 |
| 12V 배터리 (자동차 배터리 활용) |
2 |
고전류 공급용 |
| 커패시터 100µF |
11 |
각 시프트 레지스터 전원 안정화 |
| 와이어 케이블 (OpenBuilds) |
다량 |
배선용 |
| 브레드보드 또는 만능 기판 |
11 |
컨트롤러 보드 제작용 |
| 8핀 IC 소켓 |
11 |
74HC595 소켓 장착 권장 |
| 저항 10kΩ |
88 |
MOSFET 게이트 풀다운용 (미사용 권장) |
| 다이오드 1N4007 |
88 |
MOSFET 보호용 (미사용 권장) |
필요 도구
사용 소프트웨어 및 온라인 서비스
프로젝트 배경
어릴 적 악기 가게 쇼윈도에서 자동 연주 피아노를 본 후 언젠가 직접 만들어보고 싶다는 꿈을 품었습니다. 특별한 이유보다는 단순히 "만들고 싶어서" 시작한 프로젝트입니다.
개요: 저비용으로 88개 솔레노이드 제어하기
아두이노 메가 두 개로 88개 솔레노이드를 제어하려면 약 $80가 들지만, 아두이노 우노 하나와 74HC595 시프트 레지스터 11개를 사용하면 훨씬 저렴하게 구현 가능합니다. 시프트 레지스터는 적은 출력 핀으로 다수의 출력을 제어하는 방식입니다.
MIDI 신호 대신 PC에서 비트 패턴을 아두이노로 전송합니다. MIDI 파일을 미리 비트 데이터로 변환하여 사용합니다.
하드웨어 구현
솔레노이드 힘 문제 해결: 중국산 솔레노이드로는 피아노 건반을 누를 힘이 부족했습니다. 안쪽에서 누르면 더 큰 힘이 필요하지만 피아노 손상을 피하기 위해 이 방식을 고수했습니다. 결국 12V 솔레노이드에 24V를 인가하여 충분한 힘을 확보했습니다.
전원 공급: 88개 솔레노이드는 대용량 전류를 소모합니다. 비싼 SMPS 대신 자동차 배터리 2개를 직렬/병렬 연결하여 사용했습니다.
컨트롤러 보드: 시프트 레지스터 1개와 MOSFET 8개씩 11개 보드로 구성했습니다. 74HC595 예제 회로 2번에서 LED 대신 MOSFET 게이트를 연결한 구조입니다. 풀다운 저항은 원가 절감과 납땜 난이도 문제로 생략했으며, MOSFET이 5V에서 개방되고 4V 이하에서 차단됨을 실험적으로 확인했습니다.
솔레노이드 장착: 플라스틱 판에 핫글루로 고정했으나 발열로 접착제가 녹는 문제가 발생했습니다. 결국 150°C 내열 양면 테이프로 교체하여 해결했습니다.
소프트웨어 파이프라인
- MIDI 파일 준비
- 텍스트 변환: 위 웹사이트에서 MIDI → 텍스트 변환 (시간, 음표, 온/오프, 채널, 벨로시티 정보 포함)
- Python 스크립트로 11개×8비트 데이터셋 생성: 시간 정보 포함 11개 레지스터용 비트 패턴으로 변환
- Processing으로 아두이노에 시리얼 전송: 템포 배율 적용 및 바이트 순서 반전 (피아노 우측→좌측 순서 보정)
- 아두이노 수신 및 시프트 레지스터 출력: 888/999 제어 문자로 래치 제어
주요 코드
Python 변환 코드: MIDI 텍스트를 읽어 시간별 11개 레지스터 비트 패턴으로 변환, translated.txt로 저장
Processing 전송 코드: 변환 파일 읽어 템포 보정 후 아두이노로 전송, 바이트 순서 반전 처리
아두이노 수신 코드: 시리얼로 11바이트 수신 후 74HC595로 시프트 아웃 (코드는 다운로드 제공)
문제 해결
- 솔레노이드 과열로 핫글루 용해: 내열 양면 테이프로 교체
- 배선 복잡도: 모듈형 컨트롤러 보드로 관리
- 타이밍 정밀도: Processing 지연 함수와 템포 배율로 보정
소스 코드 및 회로도
깃허브 저장소에 Python, Processing, 아두이노 코드 전체 포함
회로도는 아두이노 공식 ShiftOut 튜토리얼 참조 (MOSFET만 추가됨)