索引:
前言:
由於個人長期使用 hotswap_pcb_generator 來建構鍵盤,近期也將之前撰寫的一些功能整合到原本的程式中,並且成功的改寫 PCB.scad 程式,建立出PCB板曲面鍵盤(不是之前UC36 Wing的分拆形式),因此覺得應該要寫個作業流程,讓有興趣的人也能依樣畫葫蘆,並且依照自己的需求,打造出心中理想的鍵盤。
hotswap_pcb_generator 是由 50an6xy06r6n (Gareth Chen) 撰寫的OpenSCAD程式,目的是讓 KLE 上編輯的鍵盤Layout資訊,能夠轉換成可3D列印的實體鍵盤,並且透過手拉電線的方式,達到免焊接且有熱插拔功能的鍵盤,原作者的程式包含了PCB、定位板、底板、外殼、tenting等部分,而重點還是在PCB的設計,而本篇則完全以 PCB.scad 程式,建構出完整鍵盤,省略了其他部分。
由於我手邊有比較多的廢棄網路線,所以我改用網路線內芯線來進行佈線,並依照內芯線的尺寸,修改了相關設計,並加上其他各種軸體的支援。後來習慣使用Kailh Choc矮軸,所以就專注地針對它進行設計與開發。
這個程式產生出來的鍵盤PCB板,與我們常見的PCB板不同,它沒有金屬導體,需要自行拉金屬線,需要跟平口鉗、老虎鉗、剝線器、IDC接頭壓鉗等工具打交道,也需要準備3D印表機進行列印(或者送印也可以),還有二極體、網路線(或24AWG單芯線)、MCU、IDC接頭(或耳機座)、軸體、鍵帽,這不是一般的鍵盤組裝,而是以手工藝來看待。
建構它,會消耗的時間,遠比直接買現成零件來焊接來的多,但如果以手工藝來看待,過程會是非常有趣,如果有興趣,請往下閱讀。
↩
一、軟體準備工作:
1、系統需求:
建議使用Windows 10以上作業系統,或者可以安裝 node.js 與OpenSCAD的作業系統
需要把這兩套軟體都裝好,OpenSCAD 建議安裝 Development Snapshots 內的最新版本,網路有很多教學,這裡就不贅述,裝好後再繼續下一步。
2、下載 hotswap_pcb_generator 程式:
將上述兩個套軟體備齊後,即可下載 hotswap_pcb_generator 程式使用
我的Github: https://github.com/AndyChiu/hotswap_pcb_generator
連上後下載zip檔案,或者依照自己的習慣做法clone下來
此範例將壓縮檔解開至D槽:
3、安裝轉檔依存程式
我們需要使用 indxe.js 此node.js script程式,將鍵盤的layout檔案(.json)轉成後續要使用的格式(layout.scad),這裡需要先安裝此轉檔程式的node.js依存程式。
開啟檔案總管,以下路徑,然後點選網址列
之後會開啟命令列視窗
然後執行 install.bat 批次檔
這邊會呼叫npm去安裝轉檔程式與相關元件,需要等候一些時間
這個目錄內的程式,就是用來轉換由KLE下載的JSON檔案,解析並且產生 Layout.scad 檔案,讓我們使用。
已完成,剛好npm程式有更新,一起用 npm audit fix 來更新 npm
完成
↩二、準備鍵盤layout JSON:
1、建構/下載鍵盤layout JSON檔案
前往
KLE (http://www.keyboard-layout-editor.com)網站,建立自己的鍵盤Layout,或者也可以下載我這邊的範例鍵盤,Willows Layout 的 W36 V2鍵盤:
我們以右手為例子,開啟網頁:
之後點左上角的Download,然後點選 Download JSON 下載 JSON 檔案
之後存到 script_UTP 目錄中
路徑為 D:\hotswap_pcb_generator\script_UTP
2、執行轉檔程式
執行 node index.js "willow-3x6+esrille-thumb-3x1-(v2)-r.json" 來轉JSON檔案
沒錯誤發生,就不會顯示任何文字:
PS: 這個執行的動作需要特別注意,如果scad_UTP內有 layout.scad 檔案,轉檔時並不會警告而是直接覆蓋,如果有處理中的檔案,記得先改檔名或者備份到其他目錄。
執行完成後,檔案總管切換到 D:\hotswap_pcb_generator\scad_UTP 資料夾,依照修改日期排序,就可以找到轉完後的 layout.scad 檔。
趁著命令列視窗還沒關,順便教一下,如何把KLE JSON數據轉成.CSV格式。
這裡可以執行 node Convert2csv.js "willow-3x6+esrille-thumb-3x1-(v2)-r.json" 來進行轉換
老樣子,轉成功依然沒有任何回應
開啟檔案總管,D:\hotswap_pcb_generator\script_UTP 資料夾,可以找到我們剛轉出來的.CSV檔案。
裡面記載了每個按鍵的相關設定,轉出的資料,可以依照自已需求做其他的應用
↩三、layout.scad 內容說明
回到 scad_UTP 資料夾,我們開啟剛剛轉出的 layout.scad 檔案,我這先說明各區塊內容,然後在來實做。
第4行會記載這個檔案的layout布局來源是哪個檔案,建議可以放把該檔案一起存放,未來有需要可以便於參考。
OpenSCAD程式中,大範圍註解用的是 /* 註解內容 */ 的方式,如果有要記載關於此layout的內容,也可以紀錄存到這邊。
第7至23行,主要說明Layout值所紀載的格式,主要就是 [位置, 邊緣, 額外資料]
位置(Location),裡面還細分了 [x軸位置,y軸位置 ], [軸寬,軸高],[旋轉角度,旋轉x軸,旋轉y軸]
邊界(Border),裡面還細分了 上邊, 下邊, 左邊, 右邊
額外資料(extra_data), 依照不同的項目,有不同的儲存內容格式
第25至42行,主要說明 Key switch 的 extra_data 格式,裡面記載了
[是否旋轉列,軸體類型,軸角度資訊,軸體說明]
- 是否旋轉列(totate_column): 是否旋轉列線通道,這部份我的版本暫時不適用。
- 軸體類型(switch_type): 預設是使用 parameters.scad 檔案提供的 switch_type 參數,如果需要單獨變更該軸的軸體類型,可以直接用雙引號標記該位置使用的軸體,例如: "choc"。
- 軸座角度與高度資訊(switch angle and height data),這裡轉檔後,預設的是 ["N",0,0,0,1,h_unit,v_unit,"C"] ,可以依照需求進行調整。
- 鍵帽標示(keycap legend),用來識別該軸體的用途,輸入的內容,於設計模式可以呈現在預覽畫面。
base_switch_layout 存放了軸體設定
這邊存放了各個軸的相關資訊,資料排列方式,就如前面的說明。
位置(Location)與邊界(Border)是從原始的.json檔案轉入,額外資料(extra_data)則是我們依照需求自行調整。
針對額外資料(extra_data)的軸座角度與高度資訊(switch angle and height data)內容,預設內容為 ["N",0,0,0,1,h_unit,v_unit,"C"] 分別對應了:
- srp:預設為"N",軸體仰起位置,有 LU,L,LD,U,N,D,RU,R,RD,LU=左上、RD=右下、N=無,其他依此類推,LU表示該軸體往左邊上面翹,翹起來的角度,依照rx與ry角度調整。
- rx:X軸角度,預設0
- ry:Y軸角度,預設0
- h:軸座增加高度,預設0
- w:軸座牆面厚度,預設1
- bx:X軸座尺寸,預設為 h_unit
- by:Y軸座尺寸,預設為 v_unit
- bod:預設為"C",基底偏移方向,可設定 C,U,D,L,R,LU,LD,RU,RD,C=中央,U=上,D=下,L=左,R=右, LU=左上, RD=右下..等依此類推
以下展示設定範例與實際效果,可以更快的比較出差異
srp(軸體仰起位置)的設定差異:
 |
都設定15度角的情況下,從不同位置抬起軸座 |
h(軸座高度)的設定差異:
 |
高度設定的部份,可以抬高軸座 |
w(牆的厚度)預設值為1,如有特殊需求可以自行調整
 |
由左至右牆厚設定為1、2、3 |
 |
可以看出牆厚差異,會擠壓內部空間 |
bod(基底偏移方向) 的設定,可以將凸起軸座增加尺寸的部分,朝指定方向延伸:
 |
基底偏移方向 |
往下瀏覽,可以看到這邊存放了軸以外其他零件的設定,例如MCU、TRRS等
這邊開始,就是PCB鍵盤化設計的相關設定這裡的格式,與前面所述的格式不同,因用於PCB外觀設計,所以是以mm為單位,而前面那些設定,大多是以軸體大小為一個單位,例如軸體大小設成了19mm那1就是19mm,而不是1mm。
前面會需要設定最初使用的軸體大小,也就是parameters.scad內的設定
 |
layout.scad 的設定 |
 |
parameters.scad內的設定 |
當
layout.scad 記錄下來後,未來如果 parameters.scad 數值有改變,PCB外觀設計,也可以依照比例進行調整,因此這部分很重要,需要先定義清楚。
顏色標記說明,在之後的設定,很多地方可以用到顏色進行標記,可以讓建構時,更容易看到設定的結果,已先列出的常用顏色,以便複製取用
OpenSCAD有一個
Hull的功能,可以把兩個以上的物件,將各物定為最大範圍,然後包圍起來,合併成一個物件。
我們把PCB當作一般鍵盤使用時,也希望它長的討喜些,因此製作好看的底板是不可少的,我們使用多個群組方式,標記出外框位置,最後產生鍵盤底板的形狀。
每個外框的點,都可以設定位置、直徑大小、檢視用顏色、檢視用索引文字。
在 parameters.scad 內有個 base_pcb_layout_outer_DesignMode 設定,預設為false,會直接產生hull的結果,改成true後,會取消hull,只帶出有檢視顏色的圓圈與檢視用文字,以便快速檢視設定後的效果,如果設成 "DontShow" (需要有雙引號),則連圓圈也不顯示,這裡是當物件很多時,可以先暫時關閉檢視,以便確認其他物件設定。
 |
parameters.scad 內的切換設定 |
外框邊緣設定,我們可以設定讓PCB外緣它向外延伸,並且提高,這裡可以設定X軸、Y軸與高度,可以依照自己的喜好調整。
 |
凸起邊緣的設定 |
如果不需要這個凸起的外框,可以由 parameters.scad 將這設定改成false。
 |
parameters.scad 內的切換設定 |
圓形自黏膠墊凹槽,這裡可以於底部建立圓圈凹槽,供黏貼膠墊時使用,可以設定位置、直徑大小、內凹高度、檢視用顏色、檢視用索引文字。
當設計時,可以把設計模式打開,以便呈現出設定的顏色與索引文字,以便快速查看與調整設計。
有凸起的外框時,會需要將外框開孔,以便讓接頭能順利突出使用,這裡使用 base_pcb_layout_IDC_Hole 來設定,可以設定位置、旋轉、外型、檢視顏色。
挖出的空間,我們在擺放上IDC接頭,這裡可以設定位置、旋轉、檢視顏色。
如果軸座為立體化設計,可以使用以下設定將軸座間挖洞相互連接:
板子上也可以寫一些文字,讓鍵盤有歸屬感,可以用凸起、凹陷文字兩種方式來呈現,可以設定的有位置、旋轉、延伸尺寸、文字內容、字體、文字尺寸、檢視顏色。
虛擬軸體與鍵帽尺寸設定,由於鍵盤軸體可以變更角度,因此轉的角度較大時,有可能會干擾到其他按鍵,為了確可行性,藉由設定虛擬軸體與鍵帽來進行判斷,以便排除干擾問題。
這裡可以設定軸體尺寸,以及鍵帽尺寸、顏色與透明度。
在 parameters.scad 內有一系列切換功能,這裡還有是否檢視軸體對應按鍵文字,以及擺放的高度。
我們開啟此檔案,並將這些功能開啟。
開啟 pcb.scad 程式,先用F5來預覽 layout,完成後,可以用這兩個按鈕,將畫面調整到完整顯示,並且以上方方向檢視。
這時候如果拉動畫面,在CPU不夠強的電腦,拉動時會非常的卡頓
這時候,開啟 parameters.scad 進行變更,將base_pcb_layout_DesignMode設定為true。
然後回到 pcb.scad ,再點一次F5執行預覽,這次執行時,軸座的細節會省略不繪製,這個時候操作就會順暢很多。
2、進行設定
A、設定軸體類型:
可以先由 parameters.scad 設定預設軸體類型,目前針Choc V1軸座建構的最齊全,本篇也以此作為範例:
軸體扣夾預設也是開啟,除非列印有問題,不然是建議開啟,軸體會較為穩固,不會撞到就掉。夾扣支撐是如果怕夾扣斷掉,可以開啟,如果材料夠堅固,那沒開應該也是還好。
軸間距設定也是非常重要的,如果是用MX軸,建議改成19.05,如果是Choc V1則依照以下設定,而 layout.scad 也是要改,如果layout.scad內的部分都設定好了,之後有調整間距的話,鍵盤外框大小也會跟著調整。
 |
parameters.scad 內的設定 |
 |
layout.scad 內的設定
|
C、設定PCB板外框位置:
於layout.scad的 base_pcb_layout_outer 內,我們可以針對外框位置進行設定,但要怎麼知道哪邊要設定多少呢?這只能多嘗試與繪製,調整出心目中的結果。
開啟parameters.scad,我們將以下設定進行修改以利於後面說明。這裡我們讓畫面顯示設定PCB板範圍的設定點,而非設定後產生合併的畫面,另外也把虛擬軸體、虛擬鍵帽與按鍵文字關閉,讓畫面乾淨些,以便於使用。
設定完後,於pcb.scad上,F5重整一下預覽畫面,接下來開始尋找外框的外圍突出點,於外框突出點,例如紅色圓圈位置,於該位置,我們點滑鼠左鍵兩下,此時十字座標軸,就會跑到點的位置。
然後查看視窗右下角,會有十字座標軸的[x,y,z]數值,我們需要x,y座標,以此為例,我們得到了48.17, -8.67的數值。
以此座標值,我們於layout.scad上輸入以下內容,圓圈大小、索引顏色與索引描述可以依照個人喜好調整,輸入完後Ctrl+S儲存內容。
回到pcb.scad上,用F5更新預覽畫面,此時就會出現剛剛設定的點,這邊會呈現橢圓,因為邊框設定的比例不同造成的。
layout.scad上的PCB 邊緣框設定,目前x與y的值不同,這導致上述位置出現橢圓,我們先將x改成4,輸入完後Ctrl+S儲存內容。
回到pcb.scad上,用F5更新預覽畫面,此時就可以看到差異。
接下來,我們依序的把邊框位置點出來,可以得到此畫面,由於我們需要鍵盤中間下方的內凹處,也有內凹的形狀,因此分了不同的hull群組,以達到我們要的效果。
於parameters.scad,將此設定關閉,然後存檔回到回到pcb.scad上,用F5更新預覽畫面
此時會得到這樣的結果,看的不是很清楚
可以把畫面挪動一下,查看效果
如果要讓顏色有區隔,可以於parameters.scad內,修改以下內容,將"None"改成"Group",這邊會以群組來呈現不同的區塊顏色,顏色會選用該群組的第一個點設定的顏色。
然後,我們逐一的建立外圍資料,透過不同的顏色區隔,有助於進行調整
最後出來的效果如下:
如果希望指定顏色,不要這樣花花綠綠,可以於parameters.scad內,指定需要的顏色,這裡我們以 LightYellow 為例:
layout.scad上的PCB 邊緣框設定,可將剛剛x改回8,或者依照喜好去調整。
 |
x=8 |
 |
x=12 可以看到邊框左右更粗,上下則維持較細 |
另外,邊框可以選擇是否圓角:
D、設置MCU放置位置
從 layout.scad 檔案裡,我們可以存這裡設定MCU的放置位置,其實這裡跟上述的外框設定是相輔相成,設計上可以起作業,我們在這裡把設定加上去,位置的部分需要去看放置在幾U的位置,而非X軸、Y軸的數值。
由於我的設計是儘量減少浪費,因此分離式鍵盤使用兩個MCU控制,個人就不是那麼喜歡,因此我設計的鍵盤,是盡量走IDC接線的方式,讓一個MCU即可控制整個鍵盤。
從 layout.scad 檔案裡,我們可以由這裡設定IDC放置的位置。
但這邊我們可以看到,外圍的部分會擋住接頭出口,因此我們必須設定另一個參數。
由這邊,我們將挖開接口與底板,讓IDC座直接嵌入板中。
因為IDC接頭的設計有腰身,所以造成底板會有開口,這部分影響不大,且未來可能還可以拿來做其他用途,我這裡就沒再另外填平兩個洞。
底板的部分,為了讓它不那麼光滑,造成打字時鍵盤被推走的問題,所以建議貼幾個橡膠圓墊。
這邊建立的方式,也跟建立底板一樣,把需要凹槽的位置點兩下,查看x,y數據,然後建立資料,只是要建立前,我們要先把底板翻到背面,可以使用此按鈕來轉面。
轉完後,可以看到背面的情況,從這狀態下,再去點選要放置的位置。
建立後如下,這邊的直徑(Diameter),需要依照實際自黏膠墊的尺寸填寫,如果有多種尺寸,就依照該位置要放的尺寸:
G、立體化的軸座
最近最大的改良,就是把軸座給立體化,原本設計僅為平面,後來幾經修改後,達成立體化的效果,不過要立體化的使用,所有接線都要由上面走線,目前Choc V1與MX軸座設計已改為僅上方走線。
在 layout.scad 中,每個軸都是可以設定 x,y 仰角、仰角位置、增加高度、長寬尺寸、軸座偏移方向,預設值為["N",0,0,0,1,h_unit,v_unit,"C"],"N"為無仰角,"C"是凸起的軸座無偏移。
接下來介紹,如何讓平面鍵盤變的立體。
我們先來調整相關設定。調整虛擬軸體與虛擬鍵帽的尺寸,以便調整時,可以檢查是否有干擾到,這裡需要依照實際使用時要使用的鍵帽,由於我都是自製小鍵帽,所以兩軸彎折時,角度小沒什麼問題,但角度太大時,還是會干擾到。
但這裡的檢視用的鍵帽樣式僅方形,如果您鍵帽樣式不是方方正正,而是側面彎曲,邊緣較窄,中間較寬,這個對角落干擾就小一些,所以實際還是得再觀察自己鍵帽樣式,才能進行綜合判斷。
於 parameters.scad 內的設定開啟虛擬軸體、虛擬鍵帽與文字
回pcb.scad後F5,即可看到虛擬軸體與鍵帽出現了
在 layout.scad 中,可以先把軸座順序整理一下,依照自己的習慣順序排序下去,因為轉檔時,它是依照JSON檔案內的順序,而不是依照我們習慣的順序排列,目前畫面已呈現鍵盤佈局,可以依照自己習慣,把 layout.scad 內容整理一下。
 |
將雜亂的順序進行調整,以便於未來調整時較不易搞錯。 |
 |
依照畫面順序與習慣整理下來 |
順序調整完成後,我們來逐一建構立體鍵盤。
我們先將拇指區的軸進行調整,我希望依照Fn6-Fn5-Fn4的順序,軸座逐漸升高,然後軸也逐漸傾斜。
在未設定的情況如下:
由於我希望,軸是往右上傾斜,而非純右邊傾斜,所以我先把"N"(無)改成"RU"(右上),角度的部分,我先把x,y都填寫7。
執行F5後,可以看到結果:
我們發現Fn5與Fn4需要更傾斜,且要提升高度,以便讓鍵帽可以相互銜接,而不是有斷層感。我們把Fn5的角度改成10度,Fn4改成15度,高度一個上升1mm另一個上升3mm。
接下來字母區,我們希望鍵盤都是左翹,且有階梯狀的往小指降低。
我們先以YHN為例子:
 |
尚未調整時 |
 |
調整後,翹起位置分別為左上(LU)、左(L)、左下(LD),角度為10,高度3,LD的x軸角度僅為5,也就是往下壓時,角度沒那麼大,往上的時候較大 |
檢查一下,有部分干擾,不過由於我的自製鍵帽角落較窄,尚可避開此干擾,如果鍵帽會干擾到,則可以修改 base_switch_layout 中,該軸體「位置(Location)」的資訊來進行調整。
我們接下來處理其他column的設定,逐行減少角度,並降低高度
如果不想使用這些仰角與高度設定,可以於 parameters.scad 內,將這個參數關閉。
H、軸座的間的融合
前面教學的部分都完成後,可以使用F6來進行渲染,目前程式設定是渲染時不顯示虛擬鍵帽與虛擬軸體,較容易觀察到鍵盤表面的細節。
渲染後我們可以發現,目前軸座凸起後,內部的空隙是獨立的,都有牆隔著,從後面可以清楚的看到:

而正面軸體間也都有空隙:
我們可以使用增加軸座尺寸來達成融合軸座的目的,以下是我們新增上去:
Fn6與Fn4都各加了2,然後往中間Fn5的軸移動,而Fn5則還是置中,多出來的往左右邊移動
這樣設定後,軸座間就融合在一起,而底部空間也都打通:


另外,軸座樣式可以在 parameters.scad 中找到,可以使用基本與圓角兩種:
圓角的較為美觀,但需要注意 Borders 的設定,因預設為[1,1,1,1],而凸起的圓角軸座有削掉一些空間,平面軸座貼合上去時,會突出多餘的部分,即使是基本樣式,上方邊緣也是有凸出一些,因此建議改成[0,0,0,0],這樣就不會凸出來,以下Fn6的軸座有改,其餘的還沒改,可以看出差異:
建議可以用取代功能來批次取代掉:
圓角的底部空間,也會變成圓弧形:
如果我希望表面上,軸座間沒有空隙,但是底部翻過來看時,裡面每個軸體間還是有隔開,那該如何處理?這時候指需要修改 parameters.scad 中找到 base_pcb_layout_NoIncreaseInInternalCavity 設定,並改成 true 後,即可達到此效果:
修改前,base_pcb_layout_NoIncreaseInInternalCavity 為 false 的狀態:
修改後,base_pcb_layout_NoIncreaseInInternalCavity 為 true 的狀態:
I、軸座的間打洞
我之前一直在想,是否能利用內空間來拉線,理論上可行,但實際操作有點費工,不過既然有這樣的想法,還是看能做點什麼,如果凸起軸座間,內部空間沒有相連,就沒辦法從內部拉線,除了使用 base_pcb_layout_NoIncreaseInInternalCavity = false 讓牆拆掉外,我也增加了打洞的功能,從 layout.scad 中,找到 base_pcb_layout_Cable_Hole,然後增加相關資訊,即可將牆打洞,連通軸座內部:
 |
位置取得的方法,可參考前面「C、設定PCB板外框位置」內容 |
 |
F5預覽時,可以看到紅色管路與文字標記 |
 |
F6渲染時則可以看到挖通後的孔內,顯示自己定義的顏色。 |
 |
對外的部份我也開孔,可以透過這拉線到IDC座與MCU座。 |
即使使用 base_pcb_layout_NoIncreaseInInternalCavity = false 讓牆拆掉,也可以用此方式,打通連外的通道,依自己需求開孔。
這裡可以讓PCB板上撰寫浮雕或凹陷字體,位置尋找也是跟建立底板一樣,其中調整角度、字體大小等,則需要反覆測試
 |
凹陷字體 |
 |
浮雕字體 |
如果產生出來的STL檔案,是要給FDM類型的3D列印機印製,建議可以把文字、橡膠墊凹槽給關閉,圓角也改成基本,因為效果通常不是很好,如果是用SLA(Resin),精度也夠高的話,就可以保留使用,否則建議關閉。
另外,要產生平面或者立體鍵盤,可以從這裡調整:
 |
設定成 true 是立體鍵盤 |
 |
設定成 false 是平面鍵盤 |
斜視角可以感覺更多差異:
F5預覽的差異:
修改檔案名稱,以便跟其他檔案進行區隔。
使用教學就先到這邊,使用上有什麼問題,可以再跟我聯繫。
修改日誌:
2025/6/5 增加圓角等相關設定與說明,修改部分步驟說明與抓圖、描述
2025/6/6 增加 base_pcb_layout_NoIncreaseInInternalCavity 屬性,增加base_pcb_layout_Cable_Hole功能與介紹,增加軸座角度與高度資訊(switch angle and height data)說明與範例
↩
留言