かわいい水冷PCをつくったので自慢させてください

はじめに

GW にかわいい水冷PCをつくりました。

写真だと青っぽく写ってしまうのですが、白ベースでピンクに光る水冷PCです。Splatoonamiibo も載せてみました。かわいい。

せっかくなので、使ったパーツや組み立て過程を紹介していきます。 かわいいPCをつくりたい方の参考になれば幸いです。

要件

パーツ選びに先立って、今回作る PC で満たしたい条件を考えてみました。

まず第一は、PyTorch等のフレームワークを使ったNN学習を行えること。 これまで大学や会社でNN学習のためにGPUを回すことはあったのですが、自宅にはきちんとした環境がない状態でした。 自宅でもNN学習を気軽に試せるようにしたいので、そこそこのレベルの GPU を搭載することが第一の条件です。

もう一つ。 私が自作PCに興味をもったのは、TOKYO GAME SHOW でかっこいいゲーミングPCを見たのがきっかけでした。 水冷の管が縦横無尽に走って、ケースファンやメモリが発光しているようなPCですね。ツクモさんのブースの初音ミクコラボのPCも世界観があってかわいくて惹かれました。

f:id:beikome:20200505183022p:plain
[TGS2019]初音ミク コラボ製品が可愛すぎて憤死。欲しい!より引用

TGSの後、ゲーマーの友達にゲーミングPCのことをきいてみたのですが、彼女も自作PCを持っていてピンクのケース×ピンクのクーラントの水冷PCにしているとのことでした。素敵!

見た目にもこだわったPCを作るのって楽しそうだなと感じていたので、これを機に自分もやってみようと思いました。

というわけで、

  • NN学習に使えるそこそこのGPUを載せていて
  • 見た目がかわいい水冷PC

を目指してパーツを選定しました。

パーツ一覧

パーツ 製品名
ケース Sharkoon PURE STEEL White
マザーボード ASUS PRIME Z390-A
CPU Intel Core i7 9700K
GPU ASUS DUAL-RTX2070S-O8G-EVO
電源 CORSAIR RM750x White 2018 (CP-9020187-JP)
メモリ CORSAIR CMW32GX4M2C3200C16W
ダミーメモリ CORSAIR VENGEANCE RGB PRO Light Enhancement Kit White
SSD Crucial MX500 CT1000MX500SSD1/JP
HDD TOSHIBA MD04ACA400
ファン CORSAIR LL120 RGB 3 Fan Pack with Lighting Node Pro White
水冷Kit Thermaltake Pacific C240 DDC Soft Tube Water Cooling Kit

それぞれのパーツについて

要件に関係するものから選んでいきました。選んだ順に書いていきます。

ケース

ピンク色が好きなので、淡いピンク色のケースがいいな~と思い探してみたのですが、実店舗でもweb上でもピンクのケースはほぼ見つかりません。

小さいケースだとかわいい色のものもあるのですが、GPUをつけたり水冷することを考えると最低でもミドルタワーの大きさが必要です。 ミドルタワー以上のピンク色のケースは限定生産モデルなどでたまに販売されているみたいですが、私が探した時点ではどこも売り切れでした。

ピンクを諦めて、ある程度の数が出ていそうな白いケースを探してみると、かわいいものが見つかりました。

すっきりしたデザインで側面が強化ガラスになっており、上側にはHDDや電源などを隠せるスペースがあります。見せPC向きです。ややコンパクトなミドルタワーですが水冷用のラジエーターをつけるスペースもあり、このケースに決めました。

GPU

NN学習フレームワークNVIDIA CUDA の利用を前提としているものがほとんどです。AMDGPU でも動かないことはないらしいのですが、素直に NVIDIAGPU を選ぶことにしました。

NN学習用にGPUを揃えるとなると、TITAN シリーズや RTX 2080 Ti がいいのだとは思いますが、...お高いです...。

私の用途ではそこまで高速な学習が必要なわけではないので、一世代前の GTX 1080 Ti はどうだろうと思いましたが、こちらも人気で品薄&プレミア価格がついていました。

最終的に、GTX 1080 Ti に近い性能でコスパの良い RTX 2070 super を選びました。

www.pc-koubou.jp

ASUSGPU は直線的なデザインでかわいいですね。

余談ですが、このGPUを購入した直後にピンク色の RTX 2070 super が GALAX から発表されました。発表があとちょっと早かったら買っていたと思います...!

CPU

GPUNVIDIA なのであえて AMD にする理由もなく、Intel の CPU を選びました。core i9 までは必要ないけど core i7 は欲しくて、せっかくならcore i7 の中では最新のものがいい、ということで、Intel core i7-9700K にしました。

www.pc-koubou.jp

マザーボード

core i7-9700K に対応している Z390 チップセット搭載のATXマザーボードの中から選びました。ASUS PRIME Z390-A です。白くて光ります。

www.pc-koubou.jp

メモリ・ダミーメモリ

CORSAIR から白くて光るメモリが出ています。CORSAIRはメモリ以外にも白いパーツが豊富で、かわいいPCを組みたい人におすすめです。

メモリは16Gが2枚あれば十分なのですが、メモリスロットは4つ埋まっていたほうが見た目が良いですよね。そういうときに便利なのがダミーメモリ。

ファン

メモリとメーカーを揃えて、CORSAIR のファンにしました。白くて光ります。

電源

こちらも CORSAIR のものです。サムネイルの写真は黒いですが、同じシリーズの白を買いました。

Corsair RM750x -2018-750W PC電源ユニット[80PLUS GOLD] PS794 CP-9020179-JP

Corsair RM750x -2018-750W PC電源ユニット[80PLUS GOLD] PS794 CP-9020179-JP

  • 発売日: 2018/04/14
  • メディア: Personal Computers

今後GPU をアップグレードしたときにも対応できるように、容量は750W。

見た目も良いのですが、残念ながら私のケースの場合はほとんど見えなくなってしまいます。ケーブルが真っ白なのが素敵です。

SSD・HDD

SSDとHDDは外から見えないところに設置するので見た目にはこだわらず、スタンダードなものを選びました。

www.pc-koubou.jp

www.pc-koubou.jp

本格水冷キット

水冷は初めてなので、ThermalTake の入門用のキットを買いました。

www.oliospec.com

CPUウォーターブロック、ラジエータ、ポンプ、リザーバー、チューブ、クーラントと本格水冷に必要なもの一式が揃います。

組み立て

こうすればよかったと思う手順

組み立て中は水冷経路の水漏れのリスクが大きいので、水冷パーツは他のパーツとは別に先に組み立てるのが良いと思います。また、PCの起動テストまでは水冷経路にテスト用の精製水を入れた状態で行うのが良いと思います。

  1. ケース内にマザーボードGPUラジエータ・リザーバーポンプを入れ、パーツの位置関係をよく確認してチューブを切る
  2. 水冷経路を組み立て、精製水を流して経路に水漏れがないかをマザーボードとは繋がずにチェックする
  3. マザーボードに必要部品と水冷経路をつなぎ、起動テストとOSインストールを行う
  4. テスト用の精製水をぬく
  5. ケースに部品を組み付け、配線を整理する
  6. クーラントを入れて、完成!

こちらのページを参考にすると良いと思います。

www.ask-corp.jp

実際の組み立てでは

水冷関連で色々とミスしてしまい、手戻りが発生したり肝を冷やしたりいろいろありました。

GPUが入らない

まず、パーツの位置関係は確認したつもりでしたが、GPU取り付けスペースを確保するのを忘れていてチューブとGPUが干渉しました。

キットのチューブが多めに入っていたので、経路を再度作り直してどうにかなりました。作業中は水がマザボにかかってしまったらどうしようとヒヤヒヤしました。

水冷経路はできるだけその他のパーツと離しておくべきだった

  • 水冷経路を組み立て、精製水を流して経路に水漏れがないかをマザーボードとは繋がずにチェックする
  • マザーボードに必要部品と水冷経路をつなぎ、起動テストとOSインストールを行う

先にマザーボードに必要部品と水冷経路をつないでしまったので、水冷経路の水漏れテストをマザーボードとつないだ状態で行うことになりました。万一のときのためにタオルでガードしながらでしたが、精神衛生上よくなかったです。

その他

水冷経路がからまないところはまずまず順調でした。

調整

水冷ポンプのモーター音

リザーバーポンプをケースに固定したところ、ポンプのモーターとケースが共振してビーンという大きな音がなるようになってしまいました。

対策するには、制振シートをはさむと良いらしいです。制振シートはうちにはなかったので、レジン工作用のシリコンマットで代用しました。小さく切ってケースとポンプの間にはさみネジ止めしたら、ビーンという音はしなくなりました。やっててよかったレジン工作。

f:id:beikome:20200505232037p:plain
レジン工作用のシリコンマットを小さく切ってはさみました

LEDの色

LEDの色、デフォルトだと激しいですよね。

LEDの色をピンクで統一したかったのですが、ここでちょっと困りました。 部品のメーカーごとにLEDの色の設定方法が違うのですが、複数のメーカーのパーツを使っていたので、それぞれに設定が必要だったり設定が干渉したりしています。(現在も一部未解決)

ラジエーターについているファン

このファン2機は ThermalTake のもので、マザーボードによってはファンのLEDをマザーボードのLED制御機能と連動させることができるようです。 ASUS PRIME Z390-Aはその機能には対応していなかったので、物理ボタンでプリセットの色を切り替える方法で設定しました。残念ながらプリセットの色にはピンクが含まれてなかったので、色合いが近い紫に設定しました。

メモリとケースファン

CORSAIR の LED 付きパーツは、iCUE というソフトから制御できます。濃いピンクと薄いピンクの二色でシフトするように設定してみました。かわいい。

f:id:beikome:20200505233610p:plain
iCUE でメモリとファンのLEDを設定

マザーボード

マザーボードも光ります。ASUS のパーツの LED は Aura というソフトで制御できるのですが、Aura と iCUE は互換性を持っているようです。一度 Aura をインストールしたら、マザーボードも iCUE から制御できるようになりました。ただ、スタンバイ状態になったときは iCUE の設定ではなく Aura のデフォルト値が優先される(?)ようで、スタンバイ状態になるとマザボだけレインボーに光ってしまいます。なぜ...。ここは未解決です。

おわりに

f:id:beikome:20200506005546j:plain

水冷の組み立て手順や、LEDパーツの規格が揃っていないことなど、細かな反省点はありますが無事に組み上がりました。

予想以上にかわいい水冷PCができて、大満足です。昨日完成したばかりなのでまだこのブログを書くのにしか使っていないのですが、今後はNN学習用途でも活躍してもらおうと思います。

Word で好きなテンプレートの docx ファイルを自動生成する

やりたいこと

テキストファイルから読み込んだ文字列を、特定のフォーマットでdocxファイルに出力したいです。

具体的には、こんな感じで小説風の縦書き文章にしたいのです。

f:id:beikome:20191228170957p:plain

この記事では、docx ファイルを操作するライブラリ python-docx を使った方法を紹介していきます。

docx ファイルの中身をある程度理解できれば縦書きにする以外の応用もできると思うので、何らかの事情で docx ファイルと格闘している皆様はよかったら読んでみてください。

やり方

docx のテンプレートを用意する

wordでドキュメントを新規作成して、縦書きのテンプレートを作ってしまいます。ここでは本文は打ち込みません。

レイアウトタブ>テキストの方向>縦書き と選択すれば縦書きになります。

用紙サイズなどを指定したい場合もここで設定してしまいましょう。

f:id:beikome:20191228231711p:plain

template.docx など適当な名前で保存します。

テンプレートを読み込み、内容を追加する

python-docx を使います。

$ pip install python-docx

以下はテンプレートを読み込んで、本文を追加するコードの例です。

#!/usr/local/bin/python
# -*- coding:utf-8 -*-


from docx import Document


def main():
    # テンプレートを読み込む
    document = Document('template.docx')

    # 最初の段落を取得
    p = document.paragraphs[0]

    # 文章を追加
    p.add_run('吾輩は猫である。')
    p.add_run('名前はまだ無い。')

    # 新しい段落をつくる
    p = document.add_paragraph()

    # 新しい段落に文章を追加
    p.add_run('こんな感じで小説風な文章を書きたい。')

    # 保存
    document.save('out.docx')


if __name__ == '__main__':
    main()

これを実行すると冒頭のファイルができます。

何をしているのか

docx ファイルの中身

docx ファイルは zip アーカイブになっています。unzipで展開すると確認することができます。

試しに、縦書きのファイルの中身をみてみます。

$ unzip sample.docx -d sample_docx
$ tree sample_docx 
sample_docx/
├── [Content_Types].xml
├── _rels
├── customXml
│   ├── _rels
│   │   └── item1.xml.rels
│   ├── item1.xml
│   └── itemProps1.xml
├── docProps
│   ├── app.xml
│   └── core.xml
└── word
    ├── _rels
    │   └── document.xml.rels
    ├── document.xml
    ├── fontTable.xml
    ├── settings.xml
    ├── styles.xml
    ├── theme
    │   └── theme1.xml
    └── webSettings.xml

本文ファイルは sample_docx/document/words.xml です。

中身は以下のようになっています。

<?xml version="2.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:cx2="http://schemas.microsoft.com/office/drawing/2015/10/21/chartex" xmlns:cx3="http://schemas.microsoft.com/office/drawing/2016/5/9/chartex" xmlns:cx4="http://schemas.microsoft.com/office/drawing/2016/5/10/chartex" xmlns:cx5="http://schemas.microsoft.com/office/drawing/2016/5/11/chartex" xmlns:cx6="http://schemas.microsoft.com/office/drawing/2016/5/12/chartex" xmlns:cx7="http://schemas.microsoft.com/office/drawing/2016/5/13/chartex" xmlns:cx8="http://schemas.microsoft.com/office/drawing/2016/5/14/chartex" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:aink="http://schemas.microsoft.com/office/drawing/2016/ink" xmlns:am3d="http://schemas.microsoft.com/office/drawing/2017/model3d" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 w16se w16cid wp14">
  <w:body>
    <w:p w:rsidR="0033710F" w:rsidRPr="0011658F" w:rsidRDefault="0033710F">
      <w:pPr>
        <w:rPr>
          <w:rFonts w:ascii="Hiragino Mincho Pro W3" w:eastAsia="Hiragino Mincho Pro W3" w:hAnsi="Hiragino Mincho Pro W3"/>
          <w:sz w:val="36"/>
          <w:szCs w:val="36"/>
        </w:rPr>
      </w:pPr>
      <w:r w:rsidRPr="0011658F">
        <w:rPr>
          <w:rFonts w:ascii="Hiragino Mincho Pro W3" w:eastAsia="Hiragino Mincho Pro W3" w:hAnsi="Hiragino Mincho Pro W3" w:hint="eastAsia"/>
          <w:sz w:val="36"/>
          <w:szCs w:val="36"/>
        </w:rPr>
        <w:t>吾輩は猫である。</w:t>
      </w:r>
      <w:r w:rsidR="00BD0058">
        <w:rPr>
          <w:rFonts w:ascii="Hiragino Mincho Pro W3" w:eastAsia="Hiragino Mincho Pro W3" w:hAnsi="Hiragino Mincho Pro W3" w:hint="eastAsia"/>
          <w:sz w:val="36"/>
          <w:szCs w:val="36"/>
        </w:rPr>
        <w:t>名前はまだ無い。</w:t>
      </w:r>
      <w:bookmarkStart w:id="0" w:name="_GoBack"/>
      <w:bookmarkEnd w:id="0"/>
    </w:p>
    <w:p w:rsidR="004919A3" w:rsidRPr="0011658F" w:rsidRDefault="004919A3">
      <w:pPr>
        <w:rPr>
          <w:rFonts w:ascii="Hiragino Mincho Pro W3" w:eastAsia="Hiragino Mincho Pro W3" w:hAnsi="Hiragino Mincho Pro W3"/>
          <w:sz w:val="36"/>
          <w:szCs w:val="36"/>
        </w:rPr>
      </w:pPr>
      <w:r w:rsidRPr="0011658F">
        <w:rPr>
          <w:rFonts w:ascii="Hiragino Mincho Pro W3" w:eastAsia="Hiragino Mincho Pro W3" w:hAnsi="Hiragino Mincho Pro W3" w:hint="eastAsia"/>
          <w:sz w:val="36"/>
          <w:szCs w:val="36"/>
        </w:rPr>
        <w:t>こんな感じで小説風な文章を書きたい。</w:t>
      </w:r>
    </w:p>
    <w:sectPr w:rsidR="004919A3" w:rsidRPr="0011658F" w:rsidSect="004919A3">
      <w:pgSz w:w="16840" w:h="11900" w:orient="landscape"/>
      <w:pgMar w:top="1701" w:right="1701" w:bottom="1701" w:left="1985" w:header="851" w:footer="992" w:gutter="0"/>
      <w:cols w:space="425"/>
      <w:textDirection w:val="tbRl"/>
      <w:docGrid w:type="lines" w:linePitch="400"/>
    </w:sectPr>
  </w:body>
</w:document>

色々書いてありますが、おおまかには以下の構造で書かれています。

f:id:beikome:20191229184203p:plain:w600

本文(body)

ユーザが編集できる本文領域のデータです。この下に段落が配置されます。

段落(paragraph)

文章の塊はparagraph要素(p)で表されます。word 内で改行すると次の段落になります。 段落ごとのプロパティはpPr要素でまとめられています。pPrにはフォントの設定などが書かれています。

ラン(run)

段落より下位の要素です。今回の例では、「吾輩は猫である。」と「名前はまだ無い。」は同じ段落に属していますが別のランになっています。また、太字にしたり色をつけた文字などはその部分だけ別のランになります。 ランのプロパティはrPr要素にまとめられていますrPrにフォントの指定などがない場合は上位の段落のpPrに書かれている内容が引き継がれます。

テキスト(text)

テキスト要素はランの下に配置されます。word で開いたときに実際に表示される文字列がここにはいります。

セクションプロパティ(sectPr)

ドキュメント全体の設定が書かれています。書字方向(縦書きか横書きかの設定)はここで指定されます。セクションプロパティの位置はbodyの直下なこともあれば段落の下にあることもあるのですが、詳しくは以下を参照してください。

python-docxでは何ができるのか

python-docx.readthedocs.io

詳細は公式のドキュメントをみてもらいたいのですが、現在 python-docx の最新バージョン0.8.10では、

  • 段落の追加
  • ランの追加
  • 図の追加
  • 表の追加

がサポートされています。また、太字にする、イタリック体にする、などのプロパティは簡単に変更できるようになっています。

一方で、細かいプロパティはサポートされていないこともあります。 例えば、縦書きをするためには sectPr 要素の textDirection 要素を書き換える必要があるのですが、これは今はサポートされていません。また、ランプロパティの中には漢字にルビを振るときの設定等もあるのですが、そのあたりも現時点ではサポートされていません。

まとめ

簡単なのは、一旦手動で所望のフォーマットの docx ファイルを作成してみて、それを xml の状態で眺めてみることです。

python-docx のドキュメントと見比べて、サポートされている機能であれば python-docx で書けばよいです。縦書き設定のようなサポートされていない機能は、今回のようにテンプレートをつくってそれを読み込むことである程度対応できます。

テンプレートで対応しづらい機能(ルビをふるとか)は xml をゴリゴリ書いてどうにかする方法もあるのですが、、それはまたの機会に。

参考リンク

OpenSCAD でキーキャップをデザインしてみた

つくりたいもの

前回、キーキャップをレジンで複製する方法を記事にしました。

今回は複製ではなく、自分の好みの形のキーキャップをデザインしてみます。

自分でキーキャップをデザインしたい理由ですが、こういう Artisan キーキャップをつくりたいというのが大きいです。

レジンで上の画像のようなキーキャップをつくるには、パックマンや鯉を封入するためのスペースがなければいけません。この図のようなイメージです。

こういう原型が必要なのですが、普通に買えるキーキャップにはこういう形のものはなかなかないので自分でつくってみようと思います。

せっかくつくるならXDAのようなかわいい形のキーキャップにしたいので、XDAよりも背を高くしつつころんとした形のキーキャップを目指してみようと思います。

OpenSCAD

キーキャップのモデリングには OpenSCAD を使いました。

OpenSCAD は、3Dモデリングをするためのプログラミング言語です。

引用元:OpenSCAD github

一般のプログラミング言語のように変数を使えるので、主要なパラメータを変数にしておいて後から変更可能にできます。 たとえばキーの高さや幅などのパラメータを変数にしておけば軸のスケールは変えずに高さや幅だけを変更したりすることが簡単にできます。

また、今回つくるキーキャップでは側面の丸みにこだわりたいのですが、OpenSCAD では数式で表現したカーブに沿って面を作ることなどもできるのでその点でも便利です。

OpenSCADでキーキャップをモデリングする方法については@zk_phiさんが記事にされています。

qiita.com

キーキャップをモデリングする方法が順を追って書かれていて大変勉強になりました。OpenSCADの文法の解説を交えながら基本的なキーキャップの形の作り方、キートップの凹みの作り方や、モデリング後にDMM.makeに発注するときの注意点まで丁寧にかかれているので、これからキーキャップをデザインしようと思っている人はまずはこちらの記事を読むのがおすすめです。

OpenSCADでできることを一通り勉強したい場合にはドットインストールに入門講座もあるので、しゅっと入門してしまいましょう。 

ドットインストール OpenSCAD 入門

書いてみた

ここからはOpenSCADのコードを交えて、どういう手順でモデリングしたかを紹介していきます。

この記事ではOpenSCADの文法の解説はしないのですが、OpenSCAD 使うとこういうことができるんだなーというイメージを持っていただければ幸いです。

Charry MX 軸

軸は円筒をベースにして十字部分を抜くことでつくります。

f:id:beikome:20190602004016p:plain

SCADのコードは以下のようになります。

module cherry_stem(stem_height) {
    // 軸の外径と十字の大きさを指定
    stem_outer_size = 5.5;
    stem_cross_length = 4.0;
    stem_cross_h = 1.25;
    stem_cross_v = 1.10;

    // 円筒と十字の差をとる
    difference() {
        // 円筒
        cylinder(d = stem_outer_size, h = stem_height);

        // 立方体を2つ組み合わせた十字形
        translate([- stem_cross_h / 2, - stem_cross_length / 2, 0]) {
            cube([stem_cross_h, stem_cross_length, stem_height]);
        }
        translate([- stem_cross_length / 2, - stem_cross_v / 2, 0]) {
            cube([stem_cross_length, stem_cross_v, stem_height]);
        }
    }
}

丸っこい形

土台

まずはシンプルな土台をつくってみます。

f:id:beikome:20190602005542p:plain

底面と天面を薄い立方体でつくり、その凸包をとりました。

key_bottom_size = 18;
key_top_size = 14;
key_top_height = 14;

 // hull() は3次元のオブジェクトの凸包を取るコマンド
 hull() {
     // キーキャップの底面
     translate([0, 0, 0]) {
         cube([key_bottom_size, key_bottom_size, 0.01], center=true);
     }
    // キーキャップの天面
     translate([0, 0, key_top_height]) {
         cube([key_top_size, key_top_size, 0.01], center=true);
     }
 }

まだカクカクです。

側面の丸み

丸っこい形にするために、底面から天面にかけてゆるやかにカーブを描くようにつなげたいと思います。

側面のカーブが円弧の一部になるように設計します。こういうイメージです。

天面の辺の長さを t 、底面の辺の長さを b , 高さを h とおき、円の半径 r と天面に対応する角度 {\theta}_{max} を求めます。

r \sin ( {\theta}_{max} ) = h
r \cos ( {\theta}_{max} ) = r - ( \dfrac {b} {2} - \dfrac {t} {2} )

が成り立ちます。

これを  r {\theta}_{max} について解いて、

 r = \dfrac {h ^ 2} {( b - t )} + \dfrac {(b - t)} {4}
 {\theta}_{max} = {\arcsin} ( \dfrac {h} {r} )

角度が  {\theta} のときの辺の長さ x は以下のように求められます。

 x = b - 2 r (1 - cos((\theta)))

急に高校数学みたいになりました。

以上の式をそのままコードにしていきます。

n = 20; // 底面から天面までの分割数

b = key_bottom_size;
t = key_top_size;
h = key_top_height;

r = h * h / (b - t) + (b - t)  / 4;
theta_max = asin(h / r);

hull() {
    // 底面から theta_max / n ずつ角度を変えて面を作成
    for (i = [0 : n]) {
        translate([0, 0, r * sin(theta_max * i / n) ]) {
            x = b - 2 * r * (1 - cos(theta_max * i / n));
            cube([x, x, 0.01], center=true);
        }
    }
}

f:id:beikome:20190602151839p:plain

辺の丸み

まだ側面の辺がカクカクしているのでこれをなめらかにしていきます。

ここまではcubeを積み重ねて形をつくっていましたが、これを角丸のものに置き換えてみます。

角丸の立方体をこのように定義しておきます。

module rounded_cube(size, r) {
    h = 0.0001;
    minkowski() {
        cube([size[0] - r * 2, size[1] - r * 2, size[2] - h], center = true);
        cylinder(r = r, h = h);
    }
}
rounded_cube([14, 14, 0.01], 3);

f:id:beikome:20190602164906p:plain

cube() をこの rounded_cube() で置き換えるとこんな感じになります。下から上にむかってだんだん丸く変化するようにしてみました。

round = 3; // 角丸の半径

hull() {
    for (i = [0 : n]) {
        translate([0, 0, r * sin(theta_max * i / n) ]) {
            x = b - 2 * r * (1 - cos(theta_max * i / n));
            rounded_cube([x, x, 0.01], round * i / n);  // cubeを置き換え 
        }
    }
}

f:id:beikome:20190602165716p:plain

だいぶ丸っこくかわいくなりました。

天面の丸み

仕上げに、天面に指をのせたときにぴったりくるようにカーブをつくります。

このあたりの操作は @zk_phiさんの記事 に詳しい解説がありますので、そちらを参照してください。

function dish_r(w, d) = (w * w + 4 * d * d) / (8 * d);

module keycap_dish(key_top_size, key_top_size, dish_depth) {
    translate([0, 0, key_top_height + dish_r(key_top_size * sqrt(2), dish_depth) - dish_depth]) {
        sphere(dish_r(key_top_size * sqrt(2), dish_depth));
    }
}

difference() {
    keycap_round_base(key_bottom_size, key_top_size, key_top_height, r);
    keycap_dish(key_top_size, key_top_height, dish_depth);
}

f:id:beikome:20190602171111p:plain

完成形

ここまでで作った外形の中をくりぬいて、軸と組み合わせて完成です。

module keycap(key_bottom_size, key_top_size, key_top_height, r = 3, dish_depth = 1) {
    key_inner_height = 5;
    thickness = 1.5;

    // 軸
    cherry_stem(key_inner_height);

    // キーキャップの中をくり抜く
    difference() {
        keycap_outer_shape(key_bottom_size, key_top_size, key_top_height, r, dish_depth);
        keycap_outer_shape(key_bottom_size - 2 * thickness, key_top_size, key_inner_height, r, 0);
    }
}

最終的な形はこうなりました。

f:id:beikome:20190603210212p:plain

f:id:beikome:20190603205952p:plain

各パラメータが変数になっているので、高さや大きさを変えるときもすぐ対応できます。

丸っこさはそのままに背だけを低くするとこんな感じになります。XDAっぽい。

f:id:beikome:20190604224921p:plain

完成形のコードとモデルはこちらに置きました。

github.com

印刷

作ったモデルを光造形3Dプリンターで印刷したものがこちらです。

印刷したままでは積層痕が目立つので磨いてみました。

f:id:beikome:20190603210915p:plain

ころんとしたキーキャップができました!

レジン複製

色付きレジンで複製してみました。

🍺大好きなので🍺のキーキャップもつくってみました。

泡が入っててもキニシナイ。🍺なので。

まとめ

OpenSCAD でキーキャップをデザインできるようになりました。

ころっとした形が実現できたし、レジンの層を厚くつくったので二色成形もできるようになり、つくれるものの幅がひろがって楽しいです。

レジンの中にものを封入するのもこれから実験していきたいと思います!

 

キーキャップを自作してみた

はじめに

最近自作キーボードにはまっています。特にかわいいキーキャップを集めるのにはまっています。

直近では Canvas や Baby Miami Backlit のセットを買いました。持っているキーボードの数よりもキーキャップセットの数の方が多くなってしまいました。

https://massdrop-s3.imgix.net/product-images/massdrop-x-mito-canvas-xda-custom-keycap-set/FP/B4up2Tb4Qnag2tkWgNmY_CB5A9231-copy.jpg?auto=format&fm=jpg&fit=crop&w=473&bg=f0f0f0&dpr=2 https://massdrop-s3.imgix.net/product-images/tai-hao-paradise-pbt-backlit-keycap-set/FP/57Udd8RGTLuVbchjNTGw_Page%20Image.jpg?auto=format&fm=jpg&fit=crop&w=955&bg=f0f0f0&dpr=2

はーかわいいです。

ただ、キーキャップセットは少量しか生産されていないことも多く、欲しいものがなかなか手に入らなかったりします。 下の写真の Rainbow POM Jelly は2013年頃?に販売されたものらしいのですが、少数しか製造されなかったのか今はどこを探しても売っていません。

http://dchpra.dm1.livefilestore.com/y2pD8bhKAKMndWBEV_5_dv8Tn3ef0xQofIC9MnJ9eh5QBR2XKVnChDb8D3fVnA1MMRy5hU_ZMunhqlZcfn4dF9m2JzWgpyo_G5dVEZkw1d5hPk/20130907_5.jpg?psid=1

なかなか手に入らないなら自分で作ってしまえばいいのでは?と思い、キーキャップ作りを始めてみました。 何度か失敗しましたが、4回目でかわいいキーキャップができました。

これからキーキャップ作りを始めたい人の参考になるかもしれないので、うまくいかなかった部分も含めて記録を残しておこうと思います。

作り方の概要

今回はこのキーキャップの複製をつくることを目標にしました。XDAプロファイル、ころんとしていてかわいいです。

シリコンなどでキーキャップの型をとり、型にレジンを流し込んで固めて複製します。下の図のようなイメージです。

f:id:beikome:20190325231329p:plain

用意したもの

  • キーキャップ
  • UVレジン
  • UVライト
  • おゆまる(お湯でやわらかくなる粘土)
  • シリコン
  • 竹串 or 楊枝
  • ボンド
  • レゴブロック
  • ワセリン
  • 絵筆

キーキャップの素材には紫外線で固まるUVレジンを使いました。UVレジンはダイソーのハンドメイドコーナーに手芸用品などと並んで売っています。硬さや色がいろいろあるのですが、どれがうまくいくか試すためにいろいろ買ってみました。

UVレジンは晴れた日に日光があたるところに置いておけば30分くらいで固まるのですが、効率化のためにUVライトを買いました。ネイルアートに使うものです。

私が買ったのは5Wの小型のもので、magic mouse とほぼ大きさで場所をとりません。UVライトは36Wか9Wのものが一般的なので5Wはかなり低出力な方ですが、キーキャップなら5分もあれば固まりました。

シリコンはこちらのものを使いました。6時間ほどで固まるタイプです。

その他の材料は家にあったものを使ったり100均で購入したりしました。

型とり&成形

1. シリコン型

キーキャップをつくっている方のブログを参考にして、シリコンでキーキャップの型をとってみることにしました。

mob-gadget.hateblo.jp

レゴブロックで枠をつくり、シリコン→キーキャップ→シリコンの順で入れます。軸に楊枝をボンドで軽く接着して、空気穴をつくっておきます。

f:id:beikome:20190326235441j:plain

固まった状態のものがこちら。寒天ゼリーみたいでおいしそうです。

f:id:beikome:20190326235726j:plain

キーキャップを型から取り出すためにキーキャップの軸側にL字の切り込みをいれて、シリコンをぐにゃっと曲げながらキーキャップを取り出しました。 (このあたりは作業に必死だったので写真が残っていません。)

レジンの注入口は確保していなかったので、キーキャップを取り出すときに作った切り込みからレジンを流し込みます。 切り込みにレジンのチューブの先をいれ、えいやとレジンを出して固めたものがこちらです。

レジンを流し込んだときに大きな気泡をつくってしまい、穴あきキーキャップになってしまいました。片手でシリコン型を広げながら片手でレジンを注入したのですが、レジンがどのくらいはいっているのか見えなくて難しかったです。注入口はあらかじめ確保したほうがよいですね。

2. おゆまる型

自作キーボード仲間のだんごさん(@dango_shippo)がキーキャップの作り方の動画を上げてくれていました。

この動画でおゆまるくんの存在を初めて知りました。 氷水で冷やすだけで固まるのでシリコンより手軽でいいな〜と思い、おゆまるを買ってきて動画の真似をして作ってみました。

そしてできたのがこちら。

f:id:beikome:20190327230223j:plain

だんごさんのとぜんぜん違う(笑)

バリが多いのもそうですが、全体的に形が歪んでしまいました。型とりの作業しているうちにおゆまるが冷えて固まってきてしまい、力をかけながらキーキャップを包んだのですが、そのときの歪みが型に残ってしまったのかもしれないです。おゆまるをよく柔らかくしておいて手早くやるのが大事そうです。

3. おゆまる分割型

キートップ側の形もしっかり作りたいので、次はキートップ側と軸側でわけて型をとってみることにしました。

まずキートップ側だけおゆまるで包みます。手早く!

f:id:beikome:20190329001458j:plain

とれた型はこんな感じ。 f:id:beikome:20190329001742j:plain

軸側の型もおゆまるで取ります。 f:id:beikome:20190329001933j:plain

ワンタンのようでおいしそうです。

そしてできた上下の型がこちらです。いい感じ。

f:id:beikome:20190329001958j:plain

軸の部分だけ先にレジンを流し込み、一旦ライトで固めます。

f:id:beikome:20190329002043j:plain

キートップ側にもレジンを流し込み、上下の型を重ねて型全体にレジンをいきわたらせます。

f:id:beikome:20190329002106j:plain

ここで気づいたのですが、上下の型の位置合わせのことを考えていませんでした。

位置合わせができないので軸がキーの真ん中にきているか怪しいですが...えいやと固めてみました。

f:id:beikome:20190329003023j:plain

f:id:beikome:20190329003033j:plain

軸、真ん中にきませんでした。側面も片側が厚く、片側が薄くなってしまっていますね。

型を上下にわけて作る作戦自体はよさそうです。キートップも軸もきれいに複製できているので、あとは位置合わせさえちゃんとできればうまくいきそう。

4. シリコン分割型

hdbx.hateblo.jp

id:hdbx さんが上下分割型を使ってキーキャップを複製されていました。こちらのブログ記事では、LEGO to Keycap (L2K) ADAPTERS という治具を使い、レゴの凸凹を利用して位置合わせができるように型をつくっているようです。

L2K ADAPTERS すごい、私もほしい!と思ったのですが、

入手方法ですが、今のところは公式サイトのリンク先にあるShapewaysで3Dプリントをオーダーして購入する方法しかありません。私が注文したときは、オランダからの送料が$26くらいかかったのでTwitter共同購入を持ちかけて購入しました。

だそうです。うーん。

しばらく考えて、レゴの凸凹を利用して位置合わせをするだけならL2Kがなくてもできるのでは?と思いついて試してみることにしました。

まず、キーキャップの軸におゆまるの塊をつけて、レゴのプレートに固定します。キーキャップの下がプレートにぴったりとつくようにします。

f:id:beikome:20190329003100j:plain

キーキャップの周りに枠をつくり、そこにシリコンを流し込みます。固まった状態でプレートからはがしたものがこちら。

f:id:beikome:20190330182030j:plain

これでキートップ側の型がとれました。キーキャップのまわりにレゴの凸部分の型もとれています。 次にこれをひっくり返して軸側の型をつくります。シリコン同士がくっつかないようにするために、シリコンの表面にワセリンを塗ります。

f:id:beikome:20190329003135j:plain

凹の部分にもワセリンがつくように絵筆でしっかり塗り込みました。

空気穴とレジンの注入口をつくるために、キーキャップの四隅と軸の上に棒をつけます。 竹串を短く切ったものを木工用ボンドではりつけました。

f:id:beikome:20190329003158j:plain

シリコンを流し込みます。

f:id:beikome:20190329003212j:plain

シリコンを流し込んだときに竹串が一本はずれました。

できあがった型がこちらです。ワセリンを塗っていた面がきれいにはがれました。レゴの凹凸も複製できています。

f:id:beikome:20190329003234j:plain

凹凸がはまるように上下の型を組み合わせて、穴からレジンを注ぎ込みます。

f:id:beikome:20190330215127j:plain

UVライトにあてて、とりだしたものがこちら。

f:id:beikome:20190330215150j:plain

おお!できている!?

ばりをとったら良い感じになりました。

f:id:beikome:20190330215231j:plain

よくみると細かい泡が入っていたりはしますが、ついにかわいいキーキャップができました。

他の色のレジンでも試してみました。

f:id:beikome:20190330220042j:plain

ミルキーカラーは粉末色素が混ざっているのですが、なぜか小さな気泡が発生しやすく、よくみるとところどころ泡が残っています。 クリアカラーの方が気泡が発生しづらくきれいにできました。

まとめ

レジンでキーキャップを複製することができるようになりました。

f:id:beikome:20190329003334j:plain

第1弾から第4弾まで並べてみると、ずいぶんと進歩しました。

ミルキーカラーでも気泡をいれずに作れるようになりたいなとか、強度がもうちょっと欲しいなとか、慣れたら複製じゃなくて犬やうさぎモチーフのキーキャップがつくりたいなとかの野望もあるので、今後もいろいろ試してみようと思います。

以上、レジンを使ったキーキャップの複製方法でした!