Kiro Building Note 5 (v0.2→v0.3)

길고 길었던 v0.2 끝! 🎉🎉🎉
컴퓨터에서 'l'로 LED를 켜고 'm'으로 AI 모드를 켜면 아래처럼 페이지를 넘기며 0.25초마다 사진을 찍는다.
원하는 만큼 (v0.2에서는 5페이지) 넘어가면 'm'을 다시 눌러 모드를 멈추고 'b'로 epub 생성하면 아래처럼 한번에 짜잔!

클릭 한 번으로 5장 연속 스캔 후 90% 이상의 정확도로 전자책 변환 ! 🎉🎉🎉
이번 버전 7/8부터 해서 딱 7/17까지 10일 했다. 저번주에 시간을 많이 못 쓴 것도 있었는데 난이도가 확실히 v0.1보다 높아졌다.
v0.2 목표
- 완전 자동 전자책 변환
- 하드웨어 안정성 강화
- 5장 연속 페이지 넘기기
- 촬영 품질 향상
- OCR 정확도 90% 이상 달성
5개 모두 (완벽하진 않지만) 얼추 달성했다! v0.2에서 내가 했던 고민들, 실험들 모두 하나하나씩 정리해본다.
완전 자동 전자책 변환
1. 파이와 서버 간의 websocket 통신
2. 실시간으로 사진 쭉 찍고 다 끝나면 하나씩 html로 변환하고 나중에 다 합쳐 전자책으로 변환
전자책 변환을 엣지에서 하기에는 라즈베리파이(이후 '파이'로 부른다)가 너무 작고 귀여워 감당이 불가능하다. 결국 서버에서 해야 하고 현재 서버를 띄우기엔 일러서 내 맥북 에어로 서버를 대체했다. 전자책 변환 외에 모터, LED, 카메라 제어를 파이가 해야 할까 서버가 해야 할까에 대한 고민이 있었다. 지금 당장은 알고리즘으로 제어하는 것이기에 파이가 해도 부담은 없었지만 향후엔 실시간 비디오를 보면서 제어해야 하기 때문에 이 땐 절대 파이가 감당 불가능하다고 생각하여 지금부터 서버가 제어하는 것으로 개발하였다. 서버가 제어할 때의 단점은 서버의 리소스와 통신지연시간인데 전자는 지금 당장 고려할 사항이 아니기도 하고 크게 비싸지 않을 것이라 생각하여 넘어갔고 후자는 실험해보니 지연시간 크지 않아서 괜찮다고 판단했다. (사실 모터를 아주 미세 조정하기엔 어렵다...)
결국 전자책 변환과 파이 제어를 모두 서버에서 하게 되었고, 서버가 모든 주도권을 가지고 실행하게 되었다. 파이는 실시간으로 비디오를 전송하며, 서버는 모터, LED, 카메라를 제어하고 카메라 캡처하면 이미지를 반환해줘야 한다. 어떤 식으로 개발할까 고민을 해봤는데 실시간 제어가 필요한 만큼 http는 어렵다고 생각이 들어 websocket으로 실시간 통신을 하도록 하였다.
서버를 실행하면 아래처럼 나온다.

마치 게임 같이 쉽게 조작할 수 있도록 만들었다. 사람이 비디오를 보며 실시간으로 모터, LED, 카메라를 제어할 수도 있고, AI 모드를 켜면 AI가 제어해준다.
N장 캡처하고 나서 b를 누르면 EPUB 생성은 서버에서 그대로 한다. 아래에서 더 자세하게 나오겠지만 N장 캡처할 때 중복되는 페이지가 많다. 페이지를 넘기고 캡처하는 것이 아니라 0.25초마다 하나씩 쭉 캡처하고 모터들은 계속 종이를 넘기는 구조로 했기 때문이다. 이런 이유로 EPUB 생성을 하면 각 이미지마다 OCR을 다 때리고, 페이지 번호를 모두 추출한다. 그 다음 페이지 번호를 기준으로 중복된 이미지들을 모두 삭제하고 남은 이미지들로 OpenAI API로 html 변환 후 생성하는 구조이다.
하드웨어 안정성 강화
1. 3D 프린터: Bambu Lab AI Mini
2. 필라멘트: PLA
3. 3D 모델링 툴: Fusion360
4. disk 설계: 외경: 30mm, 내경: 26.4mm, 높이: 9mm
5. spacer 설계: 높이: 50mm, disk 접합부: 6mm x 2mm

3D 프린팅으로 디스크와 스페이서를 만들었다.
나머지 바디는 혁신적인 변화는 없지만 박스를 교체하고 실리콘 테이프로 보다 탄탄하게 만들었다. 나머지 바디들도 하나씩 3D 프린팅으로 교체할 예정이다.
5장 연속 페이지 넘기기
1. 바디 구조: disk + arm
2. 모터: MG996R 2개
3. 디스크 스트립: 실리콘테이프
v0.2에서 제일 어려웠던 5장 연속 페이지 넘기기이다. v0.1의 방법으로는 안정적으로 5장 연속 넘기기가 어려워 아예 다른 방법을 구상해야 했다. 여러 방법 중 최종적으로 v0.2에서는 디스크 + 암 구조로 가기로 했다. 종이를 드는 역할과 종이를 넘기는 역할을 명시적으로 구분했다.
이후 디스크를 프린팅하는 어려움과 디스크를 고정하고 있는 디스크 마운트, 암을 고정하고 있는 암 마운트 2개 모두가 실행만 시키면 난리 부르스를 추며 마구 흔들리는 탓에 이 하드웨어를 안정화시키는 어려움을 극복했다.
그 다음 난관은 알고리즘이었다. 내가 직접 제어하면 알고리즘보다 훨씬 더 잘 넘길 수 있다. 내가 하면 페이지를 넘길 때 끄트머리까지 쭉 디스크를 돌리고 멈춘다. 덜 돌린 상태에서 암으로 넘기면 디스크의 힘 때문에 잘 안 넘어가고, 더 돌리면 종이가 들리고 디스크 위를 다시 덮어 암으로 안 넘어가진다. 적절하게 디스크를 멈춘 후 암으로 돌릴 때도 딱 넘기고 넘긴 페이지가 다시 안 돌아오도록 고정을 잘 시켜야 한다. 0.1초 정도 미리 눌러야 돼서 제어가 쉽진 않다. 비디오로 보면 나도 못하고 현실로 직접 보면서 제어했다.
당장 이렇게 비디오를 보며 제어하는 알고리즘을 구현하긴 어려울 것 같아 넘기는 걸 반드시 보장하는 넘기기가 아니라 모터 2개가 계속 돌며 넘기기를 시도하고 소프트웨어로 중복 페이지를 제거하는 방향으로 바꿨다. 해보니 이게 확실히 더 낫고 안정성이 있다.
촬영 품질 향상

사실 어두울 때 말고는 크게 차이가 나지 않는다. 나중에 천천히 더 실험해봐야겠다.
이것 외에도 초점이 안 맞는 이슈가 있어서 웹캠을 분해해서 초점도 직접 맞췄다.
OCR 정확도 90% 이상 달성
1. PaddleOCR 선택
2. PaddleOCR + VLM (GPT-4o) 조합
기존엔 OpenAI GPT-4o로 이미지 그대로 넣고 전자책 html을 생성해서 변환했다. 하지만 이미지로만 글자를 인식하는 데 한계가 있어 전용 OCR 모델을 도입했다. paddleocr, easyocr, tesserect 등 여러 후보 중 제일 최신이고 후기가 많으며 평이 좋은 paddleocr을 선택했다.

꽤나 괜찮게 인식하는 모습을 볼 수 있다.
이것만으로는 html 생성이 안되기 때문에 위 ocr 결과와 이미지를 같이 넣어서 텍스트 자체는 ocr 기반으로, html 생성은 글자 크기와 폰트 등을 고려하여 생성하도록 하였다.
정확도 90%는 많이 멀긴 했다. OCR보다도 촬영 품질에서의 문제가 더 크다. 개선이 시급하다.
기타 - 파워
- 12V 어댑터 + DC-DC 컨버터
- 돌아간다만 모터에 전류가 과하게 흐르는지 속도가 기존보다 훨씬 빠르고 불안정하다.
- 5V 어댑터 (5A 이상)
- 5V/5A, 5V/6A 2개를 샀는데 5V/5A 어댑터가 배럴잭-터미널 어댑터에 연결이 안된다. 배럴잭 크기가 여러 개 있는 걸 지금 알았다.
- 5V/6A는 깔끔하게! 컨버터 없이 모터 2개 아주 안정적으로 잘 돈다.
- Y자 배럴잭 + 배럴잭-터미널 어댑터 3개
- Y자 배럴잭이랑 배럴잭-터미널 어댑터가 연결이 안된다. 배럴잭 크기가 여러 개 있는 걸 지금 알았다.22
- 배럴잭 + 배럴잭-터미널 어댑터 + WAGO 커넥터 5구
- 깔끔하다! 잘 된다!
- 배럴잭 + 배럴잭-터미널 어댑터 + 터미널 스트립 5구
- 터미널 스트립이 이 때 쓰는 게 아니었다. 연결이 안 된다.
최종적으로 5V/6A 어댑터에 배럴잭-터미널 어댑터 + WAGO 5구 커넥터로 안정적으로 파워를 공급했다. 이렇게 되면서 기존에 쓰던 브레드보드와 브레드보드전원모듈 모두 안 쓰게 되면서 회로가 깔끔해졌다.
구성 요소
분류 | 품목 | 용도 |
---|---|---|
💻 제어 보드 | Raspberry Pi 3 B+ | 전체 시스템 통합 제어 |
🎥 카메라 | Logitech C270 웹캠 | 페이지 이미지 캡처 |
💡 조명 | WS2812 LED 스트립 | 촬영 품질 향상을 위한 조명 |
⚙️ 모터 | MG996R 2개 | 연속 페이지 넘김 제어 |
🔌 전원 | 5V 2A 어댑터 / 5V 6A 어댑터 | 파이 및 모터 전원 공급 |
🔋 저장장치 | SanDisk microSD 32GB | Pi OS, 프로그램, 이미지 저장 |
🧠 케이블 & 회로 | WAGO커넥터, 점퍼케이블 | GPIO ↔ 모터, 조명 연결 |
🦾 바디 구조물 | 헤드, 넥, 플레이트, 암 마운트, 암, 디스크 마운트, 디스크 (3D프린팅), 디스크 스트립(실리콘테이프) | 카메라/조명 고정, 책 지지, 암 제어, 디스크 제어 구조물 |
최종적으로 이렇게 v0.2를 만들었다.
v0.3!
시간이 정말 촉박하다. 14일 안에 Kiro 1대를 팔고 만원의 매출을 내야 한다.
v0.1: 특정 책 한 권에서 한 페이지만 자동으로 넘기고, 사진을 찍어 전자책으로 변환하는 자동 북스캐너의 최소 동작 구현
v0.2: 클릭 한 번으로 5장 연속 스캔 후 90% 이상의 정확도로 전자책 변환
v0.3: 책 한 권 전체를 자동으로 스캔해 전자책으로 변환
v1.0: Kiro 상용화
v0.3, v1.0의 목표는 다음과 같다. v0.3은 7/18부터 7/24까지, v0.4는 7/25부터 7/30까지이다.
목표
책 한 권 전체를 자동으로 스캔해 전자책으로 변환
- 비디오 → 전자책 완전 자동 변환
- 연속된 비디오 촬영 후, 전체 OCR 처리 및 페이지 번호 기반 정렬/중복 제거
- 최종적으로 EPUB 자동 생성
- 디스크 높낮이 자동 조절 기능 구현
- 책 두께에 따라 디스크가 유동적으로 높이를 조절하여 항상 수평을 유지
- 좌우 비대칭으로 올라가는 페이지 문제 해결
- 페이지 고정 기능 구현
- 넘어간 페이지가 다시 돌아오지 않도록 고정
- 전체 구성 요소 업그레이드
하드웨어 구조와 내구성, 성능을 전반적으로 개선- 📷 헤드: 조명 및 카메라 각도 고정 구조 개선
- 🎥 카메라: 초점/고정성 향상
- 💡 LED 스트립: 조도 보정, 고정 장치 보강
- 🪛 넥 & 플레이트: 흔들림 최소화 구조 설계
- 🦾 암 & 암 마운트: 정확한 타이밍과 위치 제어가 가능하도록 강화
- ⚙️ 모터: 반복 동작에 강한 내구성, 위치 피드백 고려
- 🔌 회로 & 파워: 안정적이고 간단한 전원 설계
- 🧲 디스크 스트립: 마찰력 최적화 재료 테스트
- 🔩 디스크 & 디스크 마운트: 마운트 강성 강화, 탈부착 쉬운 구조 고려