> 한 줄 요약: 택배로 도착한 OLED를 아두이노에 연결하고 Gemini 기능 탑재, 와 음악 감지기능까지 살려냈다. 아직 MOSFET이 없어 진짜 바람 조절까지는 안되지만, 선풍기의 ‘뇌와 표정’은 먼저 완성됐다.
## 지난 이야기: 부품만 도착해라, 바로 완성해주리라
지난 번에는 방구석에서 자리만 차지하던 애물단지 USB 선풍기에 Gemini AI를 얹을 아이디어를 구체화했다. 음악이 들리면 신나게 반응하고, 사용자가 “버그 때문에 답답해 죽겠어!”라고 말하면 스트레스 지수를 분석해 강풍으로 머리를 식혀주는 분노조절선풍기.
아이디어를 확정하고, 책상 위에서 돌아다니던 Arduino UNO를 잡아오고, 장바구니에 잘못 담은 3만 원짜리 해외직구 부품을 2,500원짜리 국내부품으로 바꾸는 데까지가 지난 이야기였다. 마지막에는 자신 있게 이렇게 적었다.
> “택배가 도착하면 브레드보드에 선들을 쏙쏙 꽂아 회로를 완성한다.”
그때는 몰랐다. 선 네 개를 꽂는 일보다 Windows의 COM 포트와 드라이버를 설득하는 일이 훨씬 오래 걸릴 줄은.
## 이번 사례는 이런 경우에 도움이 됩니다
- Arduino 호환 보드를 처음 PC와 연결해본다
- CH340 보드가 처음에는 연결되다가 다시 열면 끊어진다
- Gemini API와 Arduino를 Python으로 연결해보고 싶다
- 코드는 분명히 실행되는데 하드웨어에서는 아무 반응이 없어 답답하다
- 부품이 모두 준비되지 않아도 프로젝트를 단계적으로 검증해보고 싶다
## 1️⃣ MOSFET은 없지만, 할 수 있는 것부터 시작했다
주문한 부품 중 0.96인치 OLED 디스플레이와 점퍼선은 도착했지만, 선풍기 모터의 전원을 제어할 IRF520 MOSFET 모듈은 일시 품절이라는 메세지가 왔다. MOSFET이 없으면 Arduino의 작은 출력신호로 USB 선풍기의 실제 전원을 안전하게 켜고 끄거나 속도를 제어할 수가 없다.
MOSFET이 올 때까지 작업을 멈추고 기다려도 될 법 했지만, 언제올지 모를 녀석을 마냥 기다릴 수도 없는 노릇이라 이걸 제외한 나머지 파이프라인을 완성해보기로 했다. 실제 팬 속도 대신 Arduino 13번 내장 LED를 켜고 끄도록 펌웨어를 만들면, 적어도 PC → 시리얼 통신 → Arduino → OLED/LED 흐름은 검증할 수 있기 때문이다.
결과적으로 이 선택이 옳았다. 하드웨어 한 부품의 배송이 늦어도 소프트웨어와 통신 문제를 먼저 찾아낼 수 있었고, 나중에 MOSFET이 도착하면 마지막 출력부만 연결하면 되는 구조가 됐다.
## 2️⃣ OLED 선 네 가닥, 드디어 AI가 표정을 지었다
도착한 OLED 모듈을 살펴보니 구멍이 있는 암놈 헤더가 아니라 핀이 튀어나온 수놈 헤더 였다. 빵판을 거칠 필요없이 암-수 점퍼선 네 개로 Arduino에 바로 연결했다.
| OLED | Arduino UNO |
| ---- | ----------- |
| GND | GND |
| VCC | 5V |
| SCL | A5 |
| SDA | A4 |
Arduino IDE 2.3에서 Adafruit SSD1306, Adafruit GFX 라이브러리를 설치하고 펌웨어를 업로드했다. 펌웨어의 역할은 단순하다. PC에서 아래처럼 한 줄짜리 명령을 받는다.
```text
200,MUSIC
255,ANGRY
0,IDLE
```
앞의 숫자는 팬 속도에 해당 하는 0~255 값이고, 뒤의 단어는 OLED에 띄울 표정 태그다. 아직 실제 모터는 없으므로 속도가 100을 넘으면 13번 내장 LED가 켜지도록 했다.
업로드 직후 OLED에 AI FAN / Waiting PC...가 나타났다. 처음으로 텍스트 화면 안에만 있던 AI가 물리적인 얼굴을 얻은 순간이었다. 아직 바람은 없었지만, 적어도 선풍기의 눈은 떠지게 한 거다.
## 3️⃣ Python 파일은 왜 실행조차 안 됐을까
이제 PC의 Python 스크립트를 실행해 Gemini와 Arduino를 연결하면 될 줄 것이었다. 하지만 첫 실행부터 오류가 이어졌다.
### NumPy DLL부터 삐걱거렸다
음악 RMS 계산에 사용하는 NumPy가 Anaconda의 Intel MKL 라이브러리와 충돌하면서 _multiarray_umath DLL 로드 오류가 발생했다. NumPy와 MKL 관련 패키지를 다시 설치해 해결했다.
```powershell
pip uninstall -y numpy
pip install --force-reinstall numpy mkl mkl-service
```
패키지 문제를 고치고 나니 이번에는 Arduino 포트 연결이 막혔다.
### COM3은 Arduino가 아니라 Bluetooth였다
Gemini는 Arduino 포트가 COM3이라고 했고 Python 코드도 PORT = 'COM3'으로 되어 있었다. 그런데 아무리 해도 동작을 하지 않아서 Windows의 포트를 하나씩 확인해보니 결과가 달랐다.
- COM3, COM4: Bluetooth 가상 직렬 포트
- COM7: USB-SERIAL CH340, 실제 Arduino 호환 보드
코드는 엉뚱한 Bluetooth 포트에 계속 말을 걸고 있었던 셈이다. 더 재미있는 것은 COM3 연결실패 자체가 마지막 오류가 아니었다