이전 이야기
NeoPixel과 ESP32를 활용해 차량 내부 인테리어용 조명, 즉 엠비언트 라이트를 달기 위해 ESP32 코드를 짜고, 간단히 앱을 개발 중이었습니다. 그러나 몇 가지 난관에 봉착하다보니 이 프로젝트를 잠정 중단하게 되었습니다.
A. ESP32 과열 및 작동 불능 | 원인을 알 수 없었습니다. 1000uF 캐패시터를 추가하니 이 문제는 더이상 일어나지 않았습니다.
B. 확률적으로 NeoPixel 첫 번째 소자 망가짐 | 이를 해결하기 위해 Signal line에 저항을 추가해야 할 것 같은데, 3.3v Logic Level을 가진 ESP32는 이미 NeoPixel을 구동하기에는 전압이 부족한 상태입니다. 그렇다면 로직 컨버터를 달고 또 저항을 단다? 바람직해보이지 않았습니다. 일단은 캐패시터를 추가하니 이 문제도 조금은 해결된 듯 합니다.
C. ESP32 전원 공급 문제 | ESP32는 AMS1117-3.3v LDO레귤레이터가 장착되어 있습니다. 이것이 12v 입력을 받는게 이론적으로는 가능한 것 같은데, 실제로는 12-3.3 = 8.7v 전위차에 해당하는 에너지를 모두 열로 바꿔버립니다. 어떤 Enclosure 내부에서 그렇게 열이 많이 발생하는게 좋은 현상이 아닙니다.
D. 전체 시스템 전원 공급 문제 | 왜 그랬는지 알 수 없는데, 차량에서 12v 정전압이 나올거라 생각했습니다. 하지만 얼터네이터가 동작하는 경우, 차량 전장에는 최대 14.4v의 전압이 흐릅니다. 그런데, ESP32에는 5v를, WS2815에는 12V를 공급해야 하고, 이 경우, 2개의 레귤레이터가 필요합니다. 알리에서 눈물을 머금고 WS2813을 주문하여 전체 입력 전압을 5V로 통일하고, 12~14.4v --> 5V로 바꿔주는 Buck-Boost Converter를 사용했습니다.
E. 애써 개발한 앱 날림 | 쓸데 없는 것들은 Github에 잘만 올리면서, 이 앱의 빌드 내용은 따로 올리지 않았습니다. 그러다 Mac을 초기화하고 나서야 날렸다는 것을 깨달았습니다. 눈물을 머금고 다시 개발했습니다.
이렇게 문제상황을 적고 보니 어떻게 해결했나 조금 놀랍습니다. 이번 포스팅에서는 날린 앱을 복구하면서 필요 없는 기능을 제거하고, 테스트하는 과정을 담아보겠습니다.
실사용을 위해 기능 단순화하기.
개인 레벨에서 MVP 제작은 생각보다 어렵지 않습니다. 그런데 실제로 그것을 사용하는 것은 또 다른 문제입니다. 실사용을 상정했을 때, 그 조건이 너무 까다롭다면, 그것은 만든 사람조차 쓰지 않는 불상사가 생겨버립니다. 따라서 초기 컨셉을 조금 더 단순화하고, 정말 필요한 기능만 담아서 실사용에 최대한 주안점을 두고 개발을 진행했습니다.
A. AccSync 기능 제거 | 브레이크를 밟을 때 빨간 불이 들어오도록 하는 기능을 구현하려 했으나, 가속도센서를 추가적으로 달아야 하고, 심미성에도 그리 좋은 기능일지 의문이 들어 없앴습니다.
B. MultiColor 기능 축소 | 하나의 ESP로 모든 NeoPixel Strip을 제어하는 것이었으나, 직접 차 문을 뜯어보고 나니, 그게 어렵다는 것을 깨달았습니다. 그렇다면 모든 LED를 한 줄로 제어할 필요도, 그라데이션 색 구성을 4가지로 세분화할 필요도 없어집니다. 색은 단색과 2가지 색으로 구성된 그라데이션이면 충분하다는 생각이 들었습니다.
위의 소스를 기반으로 필요한 기능만 골라 만들었습니다.
SwiftUI, ColorPicker
개발하고자 하는 것이 결국 설정 앱이기 때문에, SwiftUI에서 기본 제공되는 Form과 Section을 활용하여 빠르게 화면을 구성했습니다. ColorPicker에서 RGB 값을 받아오는데 좀 애를 먹었으나, 이것 또한 해결할 수 있었습니다. ColorPicker로 색을 뽑아내었을 때 스펙트럼 메뉴에서 색을 고르면 정확한 색을 구하기 어렵고, 슬라이더를 통해 RGB 값을 입력하면 보다 정확한 값을 얻어낼 수 있습니다.
Test
입력 전압을 일원화하기 위해 WS2813을 주문해서 받고 보니 1m에 30개의 LED가 달린 제품으로 구입했다는 것을 깨달았습니다. 이걸 그대로 차에 달면 빛이 띄엄띄엄 나타나니, 밝기와 심미성 어느 하나도 광섬유 엠비언트보다 나을 게 없습니다. 눈물을 머금고 또 다시 주문했습니다.
어디에 쓸까 하다가 펌웨어와 앱 안정성 테스트 겸 집 안에 설치해봤습니다. 5V 전원 공급으로 약 60개 LED를 원활하게 사용할 수 있다는 결론을 얻었습니다. 일단 며칠간 테스트해보니 첫 번째 소자가 죽는 일도, ESP32가 죽는 일도 없었습니다. 이 구성을 그대로 이어가서 차량에 적용해도 괜찮아 보입니다.
긴 글 읽어주셔서 감사합니다. ❤️와 광고 클릭으로 고마움을 간단히 표현할 수 있습니다.
개발환경(Desktop) | Ryzen 5900X, RTX 3080
개발환경(Laptop) | M1 MacBook Air / Mac OS 15.0 Monterey, Python 3.9, ESP-IDF v4.3, EasyEDA 6.4.24
개발환경(Jetson Nano) | JetPack 4.6[L4T 32.6.1], Python 3.6.9, PyTorch 1.8.0, torchvision 0.9.0, OpenCV 4.5.4
제품 개발 및 기타 문의 | dokixote@wklabs.io 혹은 오른쪽 아래 채팅을 통해 문의