큐브의 윗면과 회전 동작을 입력으로 바꾸어 Firebase Realtime Database에 전달하는 물리형 IoT 컨트롤러 프로토타입입니다. 스마트폰 화면을 계속 조작하는 대신, 손으로 큐브를 놓고 돌리는 촉각적 인터랙션을 탐색했습니다.
- 역할: 프로젝트 기획, 펌웨어 개발
- 개발 시기: 2020년
- 최종 펌웨어: ESP32 + MPU9250 + Firebase (
CUBE_ver.4) - 저장 값: 현재 윗면
/skin, 회전 누적 제어값/angle
이 저장소는 당시 개발 과정을 보존한 포트폴리오 아카이브입니다. 실제 하드웨어에서 다시 검증하지 않은 부분은 아래에 별도로 표시했습니다.
CUBE는 6면체의 방향과 회전을 두 종류의 입력으로 사용합니다.
- MPU9250의 가속도 값을 읽어 위를 향한 면을 1~6으로 판별합니다.
- 해당 면에 수직인 자이로 축을 선택합니다.
- 임계값을 넘는 회전값을 누적해 정수형 제어값으로 만듭니다.
- 200ms 간격의 스레드에서 변경된 값만 Firebase에 전송합니다.
MPU9250
└─ 가속도/자이로 읽기
├─ skinCheck() → 위를 향한 면 1~6
├─ resetting() → 면 변경 시 회전값 초기화
└─ spinData() → 면별 축·방향을 적용한 제어값 누적
└─ sentFirebase() → /skin, /angle
/angle은 시간 간격을 적용해 적분한 물리적 각도(°)가 아니라, 당시 프로토타입이 사용한 정수형 회전 제어값입니다.
| 제작 프로토타입 | 제품 콘셉트 렌더링 |
|---|---|
![]() |
![]() |
별자리 형태로 면을 구분하는 그래픽과 알루미늄 느낌의 외관을 통해, 전자 장치보다 책상 위 오브제에 가까운 인상을 의도했습니다.
| 버전 | 보드/통신 | 센서 처리 | 상태 |
|---|---|---|---|
CUBE_ver.1 |
네트워크 연동 없음 | MPU9250 라이브러리의 자세값으로 6면 판별 | 초기 실험. 번들 라이브러리는 Madgwick 필터 사용 |
CUBE_ver.2 |
ESP8266 + FirebaseArduino | 원시 가속도·자이로 기반 구조로 전환 | 주 루프의 면/회전 처리 코드가 비활성화된 중간 버전 |
CUBE_ver.3 |
ESP8266 + FirebaseArduino | 면 판별, 회전 누적, 200ms 전송 | 전체 데이터 흐름이 연결된 버전 |
CUBE_ver.4 |
ESP32 + FirebaseESP32 | v3 알고리즘을 ESP32로 이식 | 저장소의 최종 개발 버전 |
archive/CUBE_legacy_MPU6050에는 로컬 작업 폴더에 남아 있던 MPU6050 원시값 확인용 스케치를 별도로 보존했습니다. CUBE 최종 동작과 직접 연결된 코드는 아닙니다.
Firebase Realtime Database에는 다음 두 경로를 사용합니다.
{
"skin": 1,
"angle": 0
}/skin: 위를 향한 면 번호 (1~6)/angle: 회전 방향과 크기를 표현하는 누적 정수 제어값
가장 최근 코드는 CUBE_ver.4/CUBE_ver.4.ino입니다. ESP32 보드 패키지와 아래 Arduino 라이브러리가 필요합니다.
- MPU9250 (Bolder Flight Systems 계열 API)
- ArduinoThread (
Thread,ThreadController) - FirebaseESP32
- WiFi (ESP32 코어 포함)
과거 버전은 사용한 보드와 라이브러리 API가 다르므로 각 폴더의 주석을 함께 확인하세요.
실행할 버전 폴더의 secrets.example.h를 secrets.h로 복사한 뒤 실제 값을 입력합니다.
#define FIREBASE_HOST "your-project.firebaseio.com"
#define FIREBASE_AUTH "your-firebase-database-secret"
#define WIFI_SSID "your-wifi-name"
#define WIFI_PASSWORD "your-wifi-password"secrets.h는 .gitignore에 포함되어 있습니다. 실제 인증정보를 커밋하지 마세요.
- MPU9250을 보드의 I2C 핀에 연결합니다.
- Arduino IDE에서 선택한
.ino파일을 엽니다. - 보드와 포트를 설정하고 업로드합니다.
- 시리얼 모니터를
115200 baud로 열어 초기화 및 네트워크 연결 상태를 확인합니다. - Firebase의
/skin,/angle값이 동작에 따라 바뀌는지 확인합니다.
.
├── CUBE_ver.1/ # 자세값 기반 초기 실험
├── CUBE_ver.2/ # 원시 센서 기반 구조 전환
├── CUBE_ver.3/ # ESP8266 + Firebase 동작 버전
├── CUBE_ver.4/ # ESP32 최종 개발 버전
├── archive/
│ └── CUBE_legacy_MPU6050/ # 별도 MPU6050 센서 테스트
├── assets/ # 포트폴리오 이미지
├── tests/ # 공개 안전성·구조 정적 검사
├── SECURITY.md
└── README.md
코드에서 확인되는 구현은 면 판별, 회전 제어값 계산, Firebase 전송입니다. 다음 항목은 당시 제품 아이디어 또는 후속 계획이었으며 이 저장소에는 구현물이 없습니다.
- 스마트폰 앱에서 면별 기능을 설정하는 기능
- 음량·밝기 등 실제 기기를 제어하는 수신 애플리케이션
- 낙상 감지, 스마트워치 연동, SOS 전송
- 점자 외장 또는 시각·청각 장애인을 위한 완성 제품
- 5GHz Wi-Fi 통신
추가로 알아둘 기술적 한계:
angle계산은 샘플 간 시간(dt)을 반영하지 않아 물리적 각도가 아닙니다.- 임계값 밖의 자세에서는 마지막으로 판별한 면이 유지됩니다.
- Wi-Fi 연결 루프에는 타임아웃이 없습니다.
- Firebase 쓰기 실패에 대한 복구 처리가 없습니다.
- 현재 환경에서는 Arduino 라이브러리와 실제 하드웨어를 이용한 컴파일·센서 검증을 수행하지 않았습니다.
공개용 이력에는 Wi-Fi 비밀번호나 Firebase 인증정보를 포함하지 않습니다. 과거 개발용 인증정보를 재사용하고 있다면 반드시 폐기하거나 교체해야 합니다. 자세한 내용은 SECURITY.md를 참고하세요.
프로젝트 자체에 별도 라이선스가 지정되어 있지 않습니다. CUBE_ver.1/MPU9250-0.1.1에 포함된 서드파티 라이브러리는 해당 디렉터리의 LICENSE를 따릅니다.


