| [개요] |
Thinkpad 10 Tablet의 Docking 단자의 고장으로 Ultrabook Keyboard의 Pogo Pin에 USB Cable을 연장하는 과정을 지난 19년도에 포스팅[1]으로 다뤄보았습니다.

Thinkpad 10 Ultrabook Docking Keyboard는 작은 사이즈와 만족스러운 타건감 그리고 트랙패드의 존재로 굉장히 매력적인 제품인 데다가 정상 동작하는데 폐기하기에는 아까웠고 다만 지난번에 Tuning을 통해 유선으로 만들어서 사용하였지만 노트북에 USB Port를 하나 점유하는 부분이 아쉬움이 남아 무선 Bluetooth Keyboard로 개조 작업을 진행하게 되었습니다.
이번 DIY는 USB to Bluetooth로 변환하는 과정이 핵심이며 AI가 없던 시절에는 엄청나게 많은 시간과 노력을 들여 가능했던 DIY가 현재는 Vibe Coding 방식으로 완성도는 다소 떨어지더라도 원했던 동작이 가능한 수준까지 빠른 시일내에 만들어 볼 수 있었고 이제 그 과정을 남겨보고자 합니다.
- 완성된 Bluetooth Keyboard
지난번에 Function Generator를 만들었을 때처럼 우선 결론부터 이야기하면 Keyboard랑 Trackpad 모두 정상적으로 동작합니다.

| [본문] |
1. Hardware Design
1.1 Hardware 구성 설명

상기 그림과 같이 Thinkpad Keyboard와 PC(Host)로 직접 연결되는 방식에서 중간에 별도의 Host가 Keyboad의 정보를 가져오고 이를 Bluetooth HID 로 변환하여 PC로 전송하는 기능이 추가되어야 함을 알 수 있습니다.
지금까지 사용해봤던 MCU들은 USB Device는 가능하나 Host 기능은 지원하지 않는데 이번 DIY는 USB Host 기능과 Bluetooth 기능이 요구되었고 이 기능을 모두 가지고 있는 Espressif 社의 IoT용 Microcontroller인 ESP32 Board를 알게되어 사용하게 되었습니다.
1.2 ESP32-S3-DevKitC-1 (1st Prototype)
앞서 설명한대로 현재 USB Host 기능과 BLE(Bluetooth) 기능을 모두 지원하는 Espressif Systems 社의 ESP32 Series를 사용하고자 합니다.
구매 진행한 개발보드는 ESP32-S3-DevKitC-1[2]이며 산업용 IoT에 특화된 제품으로 Wi-Fi, Bluetooth 5(LE) 무선 통신 기능이 내장 240Mhz로 동작하는 듀얼 코어 MCU가 적용되었다고 합니다.

기능 구현 단계에서는 동작 확인이 주목적이므로 간단하게 5V를 Keyboard와 ESP32-S3-DevKitC-1 Board에 병렬로 전원을 공급하였습니다.
1.3 Battery 용량 검토
또한 무선으로 사용해야 하므로 Battery 및 Battery 충전 Module 또한 필요하므로 1차적으로 Prototype을 만들어서 대략적인 소비전력과 Keyboard의 외관을 최대한 유지할 수 있도록 배터리의 형태 및 용량을 선정하였습니다.
번외로 nRF52840 + TinyUSB + ZMK로 구성하면 저전력으로 구성할 수 있다고 하나 최대한 적은 시간으로 동작이 가능한 DIY를 하고 싶은 상황이어서 쉬운 길을 택하게 되었습니다.
상기 영상은 ESP32-S3 DevKitC-1과 Thinkpad Keyboard에 병렬로 연결한 후 Power Supply로 5V를 인가한 후 동작을 확인한 영상[3]이며 Power Supply에 현시된 전류를 기준으로 아래와 같은 결과가 나왔습니다.
| Thinkpad 10 Keyboard 단독 동작 |
ESP32-S3 DevKitC-1 BLE, Typing 동작 |
ESP32-S3 DevKitC-1 BLE, Trackpad 동작 |
Unit |
| 20 | 100 | 110 | mA |
Thinkpad Keyboard에서 기본적으로 소모하는 전류가 20mA
Bluetooth 기능을 활성화하고 실제 Keyboard 인식 및 Typing 동작시 전류는 약 100mA
Trackpad로 Cursor를 움직이고 Click하고 Two point Scroll 동작시에 최대 전류는 약 110mA
따라서 결론적으로는 Keyboard Typing 동작에는 최대 0.5Wh 가 요구되는 것을 확인했습니다. (5V 기준 약 100mA)
소비 전력이 예상했던 것보다 다소 높다고 판단되어 낮출 수 있는 방안을 생각해보았고 Default로 적용된 160Mhz Clock을 80Mhz로 낮춰보았으나 소비 전류가 줄어들진 않았습니다.
충전 Module은 TP4056 리튬폴리머 배터리 충전 모듀 3.7V 1A 1S을 사용했습니다.

위와 같이 최종적으로 적용된 Battery는 1200mAh 입니다. (상기 Battery 사진 정보 및 구매처 : [4])
DTP951765 (Height : 9.5, Horizontal : 65, Vertical : 17[mm]) 사이즈로 Keyboard의 외관을 손상시키지 않고 적용가능한 기성품중에서 가장 큰 용량이었습니다.
따라서 최대 0.5Wh 소비 전력 기준으로 3.7V를 적용하면 135mA정도가 예상되는데 1200mAh 기준으로 8~9시간 정도 사용이 가능하다고 판단되며 실제 Battery 전압은 초기 완충시 약 4.2V에서 점점 낮아지는 비선형 특성을 가지고 있으므로 상기에 단순 계산으로 도출된 8~9시간 보다는 더 사용이 가능할 것으로 판단됩니다.
추가적으로 이후에 소개할 내용의 ESP32-S3 Super Mini로 변경 및 불필요한 Code 최적화 (Debugging을 위해 Serial 통신으로 전송하는 Log Data 부분 삭제) 한 후에 약 20mA 정도 감소되어 최종적으로는 기본동작이 5V / 80mA 정도로 확인되었습니다.
1.4 Thinkpad 10 Keyboard 내부 공간 확보(기구 측면)

이제 동작 확인은 완료된 상태이므로 기존 Thinkpad Keyboard 안에 넣는 작업이 남았습니다.
우선 Thinkpad keyboard 에 적용되어있던 Wacom pen holder를 전체적으로 탈거하고 지지대 같은 부분을 전부 잘라내고 거친 부분은 줄로 갈아내서 마감했습니다.
대략적으로 가 조립을 해보았는데 문제는 ESP32-S3-DevKitC-1 Board 사이즈가 너무 커서 공간이 부족해 Housing을 뚫고 확장 작업 및 외부 돌출 형태가 될 수 밖에 없는 상황이었습니다.
1.5 ESP32-S3 Super Mini (2nd)
사이즈로 인해 기구부를 어떻게 해야 외관상 최소한의 수정으로 이쁘게 만들수 있을까 고민하던 찰나에 동일한 ESP32-S3 Series 중에 Super Mini 라는 Board가 있는 걸 알게되었습니다.
마침 이번 프로젝트에 필요한 Bluetooth HID와 USB Host 기능은 그대로 적용이 가능했습니다.
다만 CP2102 Driver가 없는 모델이고 Program download와 serial monitor 기능을 이용한 debugger mode로 사용하는 Port가 서로 다릅니다.
따라서 Program download 및 최종적으로 Keyboard로 연결되는 Port는 USB-C Port이고 Serial Monitor로 Debugging을 하기위해서는 UART0 Port (TX, RX) 위치에 FT232 USB to UART Converter를 이용해서 Debugging을 해야 합니다.

만약 Download Mode 상태에서 Debugger Mode(Serial Monitor)로 연결할 때 장치 관리자의 COM Port가 제대로 인식되지 않고 계속 Reboot이 되는거 같은 느낌이 들때는 아래와 같이 조치합니다.
1. BOOT Switch 누른 상태 유지
2. RST Switch 한 번 눌렀다 떼기
3. BOOT Switch 떼기
4. 위와 같이 조치한 후 Port Number 확인하는 명령어 : python -m serial.tools.list_ports
1.6 전체 완성 구성

최종 구성은 위 사진과 같으며 집에 보유중인 자재들을 최대한 활용하여 비용을 아껴보고자 DC-Jack, USB OTG까지도 사용하였습니다. ㅎ

2. Firmware 개발 환경 구성
- IDE : VS Code (Visual Studio Code)
- ESK : ESP-IDF
- Programming Language : Python
2.1 USB to UART driver install
ESP32-S3-DevKitC-1 Board를 연결하기 위해서는 CP2102 USB to UART Bridge Driver [5]설치가 필요합니다.

Driver 설치가 완료되면 COM Port가 인식됩니다.
2.2 ESP_IDF Install Guide
다음은 VS Code에서 ESP-IDF 를 설치해야 합니다. Extensions Market에서 ESP-IDF를 검색하고 설치 진행하는데 문제는 우측 하단에 뭔가 Pop-up이 여러개 떳었는데 잘 읽어보고 승인해야 할 것이 있었습니다...


중간 과정은 생략되었으나 처음에는 ESP-IDF v6.0.1을 설치했었고 컴파일 시도 과정에서 우여곡절이 있었고 컴파일러 버전문제인지 경로 문제인지 설정 문제(json) 무엇이 문제인지를 확인하기 위해서 다양한 시도 끝에 결론적으로는 v6.0.1은 삭제했고 v5.5.4로 정착했음
- ESP-IDF의 다른 Version을 설치하는 방법은 다음과 같음
- VS Code에서 Ctrl + Shift + P 단축키로 명령어 팔레트 창을 띄우고 ESP-IDF : Open ESP-IDF Installation Manager를 누르면 아래와 같은 창이 Pop-Up 됨

여기서 New Installation을 누르면 원하는 Version의 ESP-IDF를 선택할 수 있습니다.

ESP-IDF를 설치하면 바탕화면에 아래와 같은 Icon이 생성됨

2.3 Python 기본 명령어
이번에 ESP32를 사용하면서 Python Compile 명령어를 알게된 부분이 있어 핵심만 정리하면 아래와 같습니다.
| 설명 | 명령어 |
| (venv)를 탈출 | deactivate |
| Python의 경로를 확인 | where.exe python |
| 재부팅 후 ESP-IDF Path 설정 | C:\esp\v5.5.4\esp-idf\export.ps1 |
| Build Target 설정 | idf.py set-target esp32s3 |
| Build | idf.py build |
| Program Flash Download | idf.py -p COM3 flash |
| COM Port Search | idf.py monitor |
| Program Monitoring | idf.py -p COM3 monitor |
| Monitoring을 멈추는 방법 | Ctrl + ] |
| Project Folder를 Clean 하는 방법 (Build clean) | idf.py fullclean |
- Program Flash Download 시에는 장치 관리자에서 찾은 Device COM Port Number를 적용해야 합니다.
2.4 Example Code Merge로 만든 최종 Test Firmware
결과적으로는 ESP-IDF를 설치하면 Example Code를 제공하며 예를 들면 하기 경로에
HID Host 관련 예제 : C:\esp\v5.5.4\esp-idf\examples\peripherals\usb\host\hid\main
Bluetooth HID 관련 예제 : C:\esp\v5.5.4\esp-idf\examples\bluetooth\bluedroid\ble\ble_hid_device_demo\main
상기 예제들을 조합하고 Code 분석 및 방향성은 GPT를 이용해 Vibe Coding 방식으로 완성하였습니다.
| [결론] |
현재 1주일간 노트북에 연동해서 사용해본 결과 처음에 Power Switch를 On 하고 약 2~3초 후부터 정상적으로 동작되며 Keyboard 전원은 켜둔 후 노트북만 다른 장소로 이동한 후 돌아왔을때는 Keyboard가 바로 Bluetooth 연결이 잡히지 않는 문제가 있었습니다. (개선 필요) 다시 Power Switch를 Off, On 해야 정상적으로 동작함을 확인했습니다.
하루 평균 12 ~ 12.5시간 정도 사용했었고 중간에 배터리 부족으로 꺼지는 현상은 없었습니다.
소비전력이 너무 높아 장시간 사용이 불가한 가장 큰 단점이 존재하지만 Vibe Coding을 통해 짧은 시간을 투자해서 동작 가능한 Bluetooth Keyboard를 얻어 매우 재밌는 diy 였습니다. ㅎ
| [참고자료] |
[1] : https://marasca.tistory.com/8
[Repair] Thinkpad 10 Ultrabook keyboard 고장 진단
1. Thinkpad 10 Ultrabook Keyboard 고장 및 A/S 판단 불가2015년 6월 28일에 Lenovo 공식 홈페이지에서 주문했었던 Thinkpad10 과 docking Keyboard가 도착하여 잘 사용하였었다. 그러다 작년 봄쯤 어느날 갑자기 keyboar
marasca.tistory.com
[2] :
https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32s3/esp32-s3-devkitc-1/index.html
ESP32-S3-DevKitC-1 - ESP32-S3 - — esp-dev-kits latest documentation
ESP32-S3-DevKitC-1 [中文] The ESP32-S3-DevKitC-1 is an entry-level development board equipped with ESP32-S3-WROOM-1, ESP32-S3-WROOM-1U, or ESP32-S3-WROOM-2, a general-purpose Wi-Fi + Bluetooth® Low Energy MCU module that integrates complete Wi-Fi and Bl
docs.espressif.com
[3] : https://youtube.com/shorts/13XD8b6mJaU
[4] :
https://www.eleparts.co.kr/goods/view?no=11235136
리튬폴리머 배터리 DTP951765 3.7V 1200mAh
충전지 3.7V 1200mAh 사이즈 17x65x0.95mm(T)
www.eleparts.co.kr
[5] :
https://www.silabs.com/software-and-tools/usb-to-uart-bridge-vcp-drivers?tab=downloads
CP210x USB to UART Bridge VCP Drivers - Silicon Labs
The CP210x USB to UART Bridge Virtual COM Port (VCP) drivers are required for device operation as a Virtual COM Port to facilitate host communication with CP210x products. These devices can also interface to a host using the direct access driver.
www.silabs.com
'DIY & Repair' 카테고리의 다른 글
| [Repair] Microsoft Sculpt Comfort Mouse 스위치 교체 (0) | 2022.11.06 |
|---|---|
| [Repair] Thinkpad 10 Ultrabook keyboard 고장 진단 (0) | 2019.09.15 |


















