<h1>๋งคํฌ๋ก ํคํจ๋</h1> <p>์๋ฆฌ์ต์คํ๋ ์ค์์ 5์ฒ์๋ง ์ฃผ๋ฉด ์๋์ ๊ฐ์ ๋งคํฌ๋ก ํคํจ๋๋ฅผ ์ด ์ ์๋ค.</p> <img src="https://blog.atj.sh/post-attachments/v/0194e4fa-5717-7cd0-9c14-bc9d94000b76" width="100%" /> <p><a href="https://ko.aliexpress.com/item/1005005419376722.html?spm=a2g0o.order_list.order_list_main.5.528e140fFFwWmV&gatewayAdapt=glo2kor">์๋ฆฌ์ต์คํ๋ ์ค ์ํ ํ์ด์ง</a> - ์ด๊ฒ ์ฌ๋๋ง๋ค ๋ค๋ฅด๊ฒ ๊ฐ๊ฒฉ์ด ํ์๋๋ ๊ฒ ๊ฐ๋ค. ์ํฌ๋ฆฟ ํญ์์ ํ์ธํด๋ณด๋ ์ต์ ๊ฐ๊ฐ 2,860์์ด๋ผ๊ณ ํ์๋๋ ์ค์ด๋ค.</p> <p> ์ค์ ๋ก ๋ฐ์์ ์จ๋ณด๋ฉด ์๊ฐ๋ณด๋ค ์ ์๋ํ๋ค. ์ค์์น๋ ๊ต์ฒด ๊ฐ๋ฅํ๊ณ ๋ ธ๋ธ๋ ๋ถ๋๋ฌ์์ ๋์์ง ์๋ค. ๋๋ ์ด ํคํจ๋์ ๋ฏธ๋์ด ์ปจํธ๋กค ํค๋ฅผ ํ ๋นํ์ฌ ์ฌ์ฉ ์ค์ด๋ค. 3๊ฐ์ ํค์ ์ด์ ๊ณก, ์ฌ์/์ผ์์ ์ง, ๋ค์ ๊ณก ๊ธฐ๋ฅ์ ํ ๋นํ๊ณ , ๋ ธ๋ธ์ ์๋ ์กฐ์ ๊ธฐ๋ฅ์, ๋ ธ๋ธ๊ฐ ํด๋ฆญ๋ ๋๋ ์์๊ฑฐ๋๋๋ก ๊ธฐ๋ฅ์ ํ ๋นํ๋๋ฐ ์ ๋ง ์ ์๋ํ๋ค. </p> <p>๋ฌธ์ ๋ ๋งคํฌ๋ก ํคํจ๋๋ฅผ ์ค์ ํ๋ ๋ฐ์์ ์จ๋ค. </p> <ul> <li> ๋งคํฌ๋ก ํคํจ๋๋ฅผ ์ฒ์ ๋ฐ๊ณ ์ค์ ํ๋ ค๋ฉด ์ค์ ํ๋ก๊ทธ๋จ์ ๋ค์ด๋ฐ์ ์ค์ ์ ์งํํด์ผ ํ๋๋ฐ, ์ด ์ค์ ํ๋ก๊ทธ๋จ์ด EXE๋ก๋ง ์ ๊ณต๋๋ค. ์ฆ, ๋ฆฌ๋ ์ค ํ๊ฒฝ ๋๋ ๋งฅ๋ถ์์๋ ์ค์ ์ด ๋ถ๊ฐํ๊ณ ๋ฌด์กฐ๊ฑด ์๋์ฐ PC์์ ์งํํด์ผ ํ๋ค. </li> <li> ์ค์ ํ๋ก๊ทธ๋จ ์์ฒด๋ ์ข ์์ฌ์ค๋ฝ๋ค. ๋ฐ์ด๋ฌ์ค๊ฐ ๋ค์ด์์ง ์์์ง ํ์ ํ ์ ์๋ค. </li> <li> ๋ณต์กํ ๋งคํฌ๋ก๋ฅผ ์ค์ ํ๋ค๋๊ฐ ํ๋ ๊ฑด ๊ธฐ๋ํ ์ ์๋ค. </li> </ul> <p>์ด๋ฐ ์ ์ ํด๊ฒฐํ๋ ค๊ณ ๋๋ ์ด ํคํจ๋์ ์ปค์คํ ํ์จ์ด๋ฅผ ์ค์นํ๊ธฐ๋ก ๊ฒฐ์ฌํ๋ค.</p> <h1>ํคํจ๋ ํ๋์จ์ด ๋ถ์</h1> <p>์ด ํคํจ๋๋ ์๋ฆฌ์ต์คํ๋ ์ค์์ ๊ฝค ์ธ๊ธฐ์๋ ์ํ์ธ ํธ์ด๋ค. ์๋ง ๋ฎ์ ๊ฐ๊ฒฉ ๋๋ฌธ์ผ ๊ฒ์ด๋ค. ์ด๋ฏธ ํด์ธ์ ๋ง์ ์ ์ ๋ค์ด ์ฌ์ฉํ๊ณ ์์๊ณ , ์ด๋ฃจ์ด์ง ์ฐ๊ตฌ๋ ์๋ ํธ์ด์๋ค.</p> <p>์ง์ ์์๋ธ ์ ๋ณด๋ ์๋์ ๊ฐ๋ค.</p> <ul> <li> ์นฉ: CH552G </li> <li> ๋ถํธ๋ก๋ ํ์จ์ด: 2.40 </li> <li> ์ฌ์ฉ๋ ํ <ul> <li>LED (NeoPixel) - P3.4</li> <li>์ฒซ๋ฒ์งธ ํค (๋ ธ๋ธ์์ ๊ฐ์ฅ ๋จผ ํค) - P1.1</li> <li>๋๋ฒ์งธ ํค - P1.7</li> <li>์ธ๋ฒ์งธ ํค - P1.6</li> <li>๋ ธ๋ธ ํด๋ฆญ - P3.3</li> <li>๋ ธ๋ธ A - P3.1</li> <li>๋ ธ๋ธ B - P3.0</li> </ul> </li> </ul> <h1> ํคํจ๋ ์ํํธ์จ์ด ๋ถ์ </h1> <p>์ฌ์ค ๋ง์ด ์งํํ ๋ฐ๋ ์๋ค. ํคํจ๋์ ๋ด์ฅ๋ ํ์จ์ด๋ฅผ ์ฝ์ด์ ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง์ ํด๋ณด๋ ค๊ณ ํ๋๋ฐ, ํ์ฌ ์ค์น๋ ๋ถํธ๋ก๋ ํ์จ์ด๋ก๋ ์ด ๋ฐฉ๋ฒ์ด ๋ถ๊ฐํ ๊ฒ ๊ฐ๋ค. ๋ํ ์ค์ ํ๋ก๊ทธ๋จ์ ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋งํด๋ณด๋ ๊ฒ๋ ๊ณ ๋ คํ์๋ค. ํ๋ก๊ทธ๋จ์ด .Net ํ๋ ์์ํฌ ๊ธฐ๋ฐ ์๋์ฐ ์ฑ์ผ๋ก ๋ณด์๋๋ฐ, ๋๋ฒ๊ทธ ์ ๋ณด๋ ๊ฐ์ด ๋ฐฐํฌ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์๋ค. ํ์ง๋ง ๋ .Net ํ๋ ์์ํฌ ๊ฐ๋ฐ์ ์งํํด๋ณธ ์ ์ด ์์์ด์ ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง์ ํ ์ ์์๋ค. </p> <p>์ค์ ํ๋ก๊ทธ๋จ์ ์ฌ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฅธ ์ฌ๋์ด ์ด๋ฏธ ์งํํ ๋ฐ ์๋ค. ๋ค์ ๋งํฌ์์ ํ์ธ ๊ฐ๋ฅํ๋ค. <a href="https://www.reddit.com/r/MechanicalKeyboards/comments/17j27ic/i_wrote_a_new_app_for_chinese_macro_keypads/">reddit.com - I wrote a new app for chinese macro keypads</a></p> <p>๋๋ ์ด ์ค์ ํ๋ก๊ทธ๋จ์ ์ฌ๊ตฌํํ๋ ๋์ , ํคํจ๋์ ํ์จ์ด๋ฅผ ์ฒ์๋ถํฐ ์๋ก ์์ฑํ๊ณ ์ ๋ง์๋จน์๋ค.</p> <h1> ์ปค์คํ ํ์จ์ด </h1> <p>ํ์จ์ด๋ ์ฅ์น์ ๋ด์ฅ๋๋ ํ๋ก๊ทธ๋จ์ ๋ปํ๋ค. ์ด ๋งคํฌ๋ก ํคํจ๋์ ๊ฒฝ์ฐ์, ๊ฐ ํค/๋ ธ๋ธ๊ฐ ๋๋ฆฌ๊ณ ์์ง์์ ๋ ์ด๋ป๊ฒ ์๋ํ ์ง๋ฅผ ์ ์ํ๋ ๊ฒ์ด ํ์จ์ด์ด์. </p> <p>์ฐ์ ์ด๋ฏธ ๊ตฌํ๋ ์ปค์คํ ํ์จ์ด๊ฐ ์๋์ง ์กฐ์ฌํ๋ค. ๋คํํ๋ biemster๋ผ๋ ์ฌ๋์ด ์ง์ ์ปค์คํ ํ์จ์ด๋ฅผ ๊ฐ๋ฐํ๋ฉฐ ๋จ๊ธด ๊ธฐ๋ก์ ํ์ธํ ์ ์์๋ค. <a href="https://hackaday.io/project/189914-rgb-macropad-custom-firmware">Hackaday - RGB macropad custom firmware </a> ๋๋ "์ด๊ฑฐ๋ค" ์ถ์๋ค.</p> <p><a href="https://github.com/biemster/3keys_1knob">GitHub ๋ฆฌํฌ์งํ ๋ฆฌ</a>์์ ๊ทธ ์ฌ๋์ด ์์ฑํ ์ปค์คํ ํ์จ์ด ์์ค์ฝ๋๋ฅผ ํ์ธํ ์ ์์๋ค. ๋๋ ์ด ์ฝ๋๋ก ๋ด ๋ฒ์ ์ ์ปค์คํ ํ์จ์ด๋ฅผ ์์ฑํ๊ธฐ๋ก ํ๋ค.</p> <h2> ํด์ฒด์ธ </h2> <p>๊ทธ ํ์จ์ด๋ฅผ ๋ฐ๋ก ํคํจ๋์ ์ ๋ก๋ํด๋ณด๋ ค๊ณ ํ๋๋ฐ, ์๋ฌด๋๋ ๋ด ์ปดํจํฐ์ ์ด๋ฐ ์๋ฒ ๋๋ ๊ฐ๋ฐ ํ๊ฒฝ์ด ๊ตฌ์ถ๋์ด ์์ง ์๋ค ๋ณด๋ ํด์ฒด์ธ์ ๊ตฌ์ฑํด์ผ ํ๋ค.</p> <p>์น๊ฐ๋ฐ์์ธ ๋๋ก์จ๋ ์ฒ์ ๋ณด๋ ํด๋ค์ ์ ํ๋ค. macOS ํ๊ฒฝ์์ ์๊ตฌ๋๋ ํด์ฒด์ธ์ ์๋์ ๊ฐ๋ค.</p> <ul> <li>Python 3 - ๊ทธ๋ฅ ์ ๋ฐ์ ์ผ๋ก ํ์.</li> <li><a href="https://formulae.brew.sh/formula/binutils">binutils</a> - C๋ก ์์ฑ๋ ์ปค์คํ ํ์จ์ด๋ฅผ ๋น๋ํ๊ธฐ ์ํด ํ์ํ๋ค.</li> <li><a href="https://pypi.org/project/ch55xtool/">ch55xtool</a> - ํคํจ๋์ EEPROM์ ์ปดํจํฐ์์ ์ฝ๊ณ ์ฐ๋ ๋ฐ ํ์ํ๋ค.</li> <li><a href="https://formulae.brew.sh/formula/libusb">libusb</a> - USB์ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ ํฌํจํ๋ C ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์ปค์คํ ํ์จ์ด๋ฅผ ๋น๋ํ๊ธฐ ์ํด ํ์ํ๋ค.</li> <li>EEPROM ๋ฐ์ดํฐ ์์ ์ ์ํด์๋ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ํธ์ง ํด์ด ํ์ํ๋ค. ๋๋ VSCode ํ์ฅ ํ๋ก๊ทธ๋จ์ธ <a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.hexeditor">Hex Editor</a>๋ฅผ ์ฌ์ฉํ๋ค.</li> </ul> <h2>๋น๋ & ์ ๋ก๋</h2> <p>์ฐ์ ํคํจ๋๋ฅผ ๋ถํธ๋ก๋์ ์ง์ ์์ผ์ผ ํ์จ์ด ์ ๋ก๋๊ฐ ๊ฐ๋ฅํ๋ค. ํคํจ๋์ ๋์ฌ๋ฅผ ํผ ํ, ๋ทํ์ ์ ํญ&์บํผ์ํฐ๊ฐ ๋ฐฐ์น๋ ๋ถ๋ถ์ ๋ณด๋ฉด ๋น ํจ๋ 2๊ฐ๊ฐ ์์ ๊ฒ์ด๋ค. ์ด ํจ๋ 2๊ฐ๋ฅผ ํด๋ฆฝ ๊ฐ์ ๊ฒ์ผ๋ก ์ฐ๊ฒฐ์ํจ ํ ์ปดํจํฐ์ ์ฐ๊ฒฐํ๋ฉด ๋ถํธ๋ก๋์ ์ง์ ๋ ๊ฒ์ด๋ค. </p> <p>๊ทธ๋ฆฌ๊ณ ์ปค์คํ ํ์จ์ด๋ฅผ ๋น๋ํด์ผ ํ๋ค. <a href="https://github.com/atjsh/3keys_1knob/">๋ด๊ฐ ์์ฑํ ์ปค์คํ ํ์จ์ด</a> ์์ค์ฝ๋๋ฅผ ํด๋ก ๋ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ด์ฌ ๊ฐ์ํ๊ฒฝ์ ํ๋ ์์ฑํ ํ, <a href="https://pypi.org/project/pyusb/">pyusb</a> ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๋ค.</p> <p>์ปค์คํ ํ์จ์ด ๋น๋๋ `make bin`, ์ ๋ก๋๋ `make build`๋ก ์งํํ๋ค. ๋ง์ฝ libusb, binutils, pyusb ๋ชจ๋ ์ค๋น๋ ์ํ๋ผ๋ฉด ์๋ฌด ๋ฌธ์ ์์ด ์ ๋ก๋๊น์ง ์งํ๋ ๊ฒ์ด๋ค.</p> <h2>๊ธฐ๋ฅ</h2> <p>์นฉ์ ๋ด์ฅ๋ EEPROM์ ๊ฐ ํค/๋ ธ๋ธ์ ๊ธฐ๋ฅ์ ์ ์ฅํ๋๋ก ํ๋ค. ๊ฐ ํค/๋ ธ๋ธ ์ ๋ณด๋ 3๋ฐ์ดํธ์ ๊ฑธ์ณ ์ ์ฅ๋๋๋ฐ, ์ฒซ ๋ฐ์ดํธ๋ Modifier ํค๊ฐ, ๋๋ฒ์งธ ํค๋ ๋ฏธ๋์ด ํค ์ฌ๋ถ, ์ธ๋ฒ์งธ ํค๋ ์ค์ ์ ๋ ฅํ ํค์ ์ฝ๋์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด 6๊ฐ์ ์ ๋ ฅ์ด ์กด์ฌํ๋ฏ๋ก 18๋ฐ์ดํธ์ EEPROM์ด ์ฌ์ฉ๋๋ ์ ์ด๋ค.</p> <p>EEPROM ํธ์ง์ ch55xtool๋ฅผ ์ฌ์ฉํ์ฌ ์งํํ ์ ์๋ค. `ch55xtool -d` ๋ช ๋ น์ด๋ก EEPROM์ ๋ฎ์ด์ฐ๊ณ , `ch55xtool -g` ๋ช ๋ น์ด๋ก EEPROM์ ์ฝ์ด์ฌ ์ ์๋ค. ์ฝ์ด์จ EEPROM์ VSCode Hex Editor ํ์ฅ ํ๋ก๊ทธ๋จ์ ํตํด ํ ์ ์๋ค.</p> <p>3๊ฐ์ ํค ์์ ์ฅ์ฐฉ๋ RGB LED๋ ํ๋ก๊ทธ๋จํ ์ ์์๋๋ฐ, LED๊ฐ ๋๋ฌด ๋ฐ์์ ๋ ๊ทธ๋ฅ ์ปดํจํฐ์ ์ฐ๊ฒฐ๋์ ๋๋ง ๋น๋๊ฒ ํ๊ณ , ๊ทธ ํ์๋ ๊บผ์ ธ ์๋๋ก ์์ฑํ๋ค.</p> <h2>๋ ๋จ์ ๊ฒ</h2> <p>์ฐ์ GUI๋ก ์ค์ ํ๋ก๊ทธ๋จ์ ์์ฑํ๊ณ ์ถ๋ค. EEPROM์ ์ ๋ก๋ํ๋ ๊ฒ๋ง ๊ตฌํํ๋ฉด ๋ ๊ฒ์ด๋ค.</p> <p>๊ทธ๋ฆฌ๊ณ ์ด ์ปค์คํ ํ์จ์ด๋ฅผ ์ค์นํ๋ ๊ณผ์ ์ ๋ ์ฝ๊ฒ ๋ง๋ค๊ณ ์ถ๋ค. ์ง๊ธ์ ํ์จ์ด๋ฅผ ์ง์ ๋น๋ํ๊ณ ์ ๋ก๋๊น์ง CLI๋ฅผ ํตํด ์งํํด์ผ ํ๋๋ฐ, ์๊ตฌ๋๋ ํด์ฒด์ธ์ด ๋๋ฌด ๋ณต์กํ๋ค๋ ์๊ฐ์ด ๋ ๋ค. ์ด ์ปค์คํ ํ์จ์ด ์ ๋ก๋ ์์ ๋ํ GUI ์ค์ ํ๋ก๊ทธ๋จ์ ๋ด์ฅ๋์ด ์์ผ๋ฉด ์ต๊ณ ์ผ ๊ฒ์ด๋ค.</p> <p>๋ง์ฝ ๊ทธ๋ ๊ฒ๊น์ง ๋๋ค๋ฉด, ์ด ์๋ฆฌ์ต์คํ๋ ์ค์ฐ ๋งคํฌ๋ก ํคํจ๋๋ฅผ ๊ตฌ๋งคํ๋ ์ฌ๋๋ค์ ๋ ์์ ๋กญ๊ณ ํธ๋ฆฌํ๊ฒ ๊ธฐ๋ฅ์ ์ปค์คํฐ๋ง์ด์งํ๊ณ ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๋ค.</p> <h1> ์ดํ </h1> <p>๋๋ฌด ์ ๋ ดํ ์ ํ์ด๋ผ ๋ ํธํ ๋ง์์ผ๋ก ์ปค์คํ ํ์จ์ด ์ ์์ ๋์ ํ ์ ์์๋ ๊ฒ ๊ฐ๋ค. ์ฅ์น๊ฐ ๋ ๋น์๋ค๋ฉด ๋ ์ด๋ ค์ ์ ๊ฒ์ด๋ค (์๊น์์). ์๋ฒ ๋๋ ํ๋ก๊ทธ๋จ์ ๋น๋ํด๋ณธ ๊ฒ๋ ์ฒ์์ด๋ผ ์ ์ ํ๋ค. ์ง๊ธ์ ์ด ์ ๋์์ ๋ง์น์ง๋ง ๋ ๋ฐ์ ์ํจ ํ์ ๊ธฐ๋ฅ์ด ๋ ์ถ๊ฐ๋ ์ปค์คํ ํ์จ์ด๋ฅผ ๊ณต์ ํ ์ ์์ผ๋ฉด ์ข๊ฒ ๋ค.</p>