Rhinoceros + Blender + Photoshop でキーボードをレンダリングする

概要

Rhinoceros は CAD としては低価格でかつ扱いやすいが,レンダリング機能が V6 でもまだ弱い.そこで,レンダリングBlender で行うことにした.現状では Rhino から Collada で書き出して Blender で読み込むのが最も操作が楽だと思われる.

f:id:lunar0:20200404143328j:plain
完成した画像.これを生産する予定は特にない

ワークフロー

モデリング

BRep で作る.この場合 Blender で後から編集するのが面倒になるが,レンダリングをするだけだと割り切れば特に問題はない.

f:id:lunar0:20200404152605p:plain

書き出し

メッシュ化して Collada で書き出すと,オブジェクトどうしの結合状態を保持したまま Blender で読み込むことができる.NURBS を選択して書き出すこともできてしまうが,メッシュ化のパラメタを制御できず,面取りのジオメトリが乱れるなどの問題がある.

マテリアル

やや青みのあるパールホワイト塗装を簡単に再現してみようと思ったので,以下のようにシェーダツリーを組み立てた.

f:id:lunar0:20200404161529p:plain
シェーダツリー

f:id:lunar0:20200404161645p:plain
プレビュー

ライティング

今回のように白背景に置く場合,室内の HDRI を使うのが楽でよい.以下のポイントをおさえた風景を使うと,簡単にさわやかな印象を演出できる.

  • 屋外に緑が見える
  • 晴天
  • 明るい色の内装

今回は HDRI Haven から以下のものをダウンロードして使用した.このシーンは外光がやや弱いので,光を受けて反射する面を窓の方向に向けると外光の質感を生かすことができる.角度がシビアなので, Eevee ビューポートで反射の様子を確認しながら角度を調整するのがよい.

hdrihaven.com

f:id:lunar0:20200404162046p:plain
右手側の天面を窓に向ける

レンダリング

特に難しいマテリアル/シーンでもないので,レンダリングは Cycles デフォルト設定のままとした.

後処理

Adobe Camera Raw で HDR → SDR 変換を行うと,白飛び部分の質感が楽かつきれいに仕上がる.今回は,以下のような処理を行った(記憶に頼って書いているので,パラメタの細部は異なるかもしれない).画像を劣化側に補正するパラメタには下線を付した.

  • 露出 -1EV
  • ホワイトバランス調整
  • コントラスト +20
  • かすみ除去 -10
  • トーンカーブ シャドウ-20 ハイライト+20
  • レンズ補正 > 周辺光量補正 -5

f:id:lunar0:20200404162537j:plain
Camera Raw で HDR→SDR 変換を行う

在宅勤務 (WFH) 環境を整える

快適な在宅勤務環境の必要な向きも多いかと思われるので,拙宅の環境を公開します.あまり広くない空間をうまく使う参考になれば.

大原則

  • そこそこの椅子,揺れない机,広いモニタを用意する.
  • モニタ等をすべて置いた状態で,何もない面を 800x500 程度確保する.これにより,画面と紙の本を同時に見ながら A4 用紙でメモや計算をすることができる.

この2点ができていると,だいぶ思考が物の欠乏によって阻害されなくなる.

f:id:lunar0:20200326205321j:plain
作業机全景

家具配置

椅子を置くスペース含め,最低 1.6m x 1.6m のスペースが必要.図の右下方向から出入りする場合,後ろにもう少し多めにスペースがあるとよい.

f:id:lunar0:20200326234000p:plain
平面図

家具の一覧

分類 メーカー 品名 型番 個数 購入リンク
照明 山田照明 Zライト Z-108NW 2 Amazon
照明スタンド[任意] 山田照明 フロアベース Z-B10 1 Amazon
デスク 無印良品 無垢材デスク オーク材 61361901 1 無印良品
サイドデスク 無印良品 スタッキングシェルフ 3段2列 37263970 1 無印良品
ディスプレイアーム エルゴトロン LX デスクマウントアーム ホワイト 45-490-216 2 Amazon
ノートパソコントレイ 自作 1
ディスプレイ DELL Ultrasharp モニタ U2515H 1
椅子 ウィルクハーン ON ミドルバックアームチェア 174/7 1
  • Zライト Z-108 は2世代前の製品なので,最新型に置き換えた.2020年3月時点では1世代前の製品(Z-108LED W)も残っているようである.
  • 型番リンクは Amazon アフィリエイトなので,アフィリエイトを踏みたくない場合は型番で検索してほしい.
  • 以下については購入リンクを掲載しなかった.型番自体は例示のために書いてある.
    • ノートパソコントレイ:自作したため非掲載.
    • ディスプレイ:旧製品のため非推奨.現在は IPS パネル搭載の 4K ディスプレイが 5-6 万円程度で購入できる.
    • 椅子:体に合うものを調達すべきだと思われるので非掲載.新品を買ってもよいし,中古在庫も市中に潤沢にある.

考え方

机の寸法.机は広いほうがよいのと同時に,奥行を大きめに確保すべきである.ディスプレイを置いた状態で奥行を 500mm 確保できると,キーボードを奥に押しやった状態で,画面と紙の本を同時に見ながら A4 用紙でメモや計算をすることができる.メインの机に 800x500 程度の何もない平面を確保するため,物置としてサイドデスクを置いた.このため,サイドデスクの天面はメインの机よりも高くなることを許容した.これさえ許容できれば,選択の幅が大きく広がる.

ディスプレイアーム.ディスプレイアームは,アーム部分を机の外側に出すように設置することで,机を広く使える.ノートパソコンの下はどうせゴミ溜めになるので,ノートパソコンが机からはみ出しても特に問題はない.

照明.電気スタンドはアームの長いものがあるとよい.複数あると小物の撮影や細かい作業に役立つが,パソコンを使った作業しかしない場合は1台でも足りるだろう.写真の部屋はそこまで広くないので,電気スタンド2台で間接照明を兼ねている.

木製パームレストを作った

f:id:lunar0:20200322033546j:plain
完成したパームレスト

Polaris を買ったはよいが,どうも自分の手にはやや傾きが大きすぎるのでパームレストで緩和することにした.出来合いのものを買ってくるのも癪なので,手元にちょうどあった木材でいくつか制作してみた.

f:id:lunar0:20200322034120j:plain

材料はイチイの角材.ここからパームレストの材料を手鋸で切り出したが,手がものすごく疲れた.次に何か作ることがあれば電動工具を導入しないととてもではないが作れない.加工過程の写真を撮り忘れたので,写真はこれ一枚のみ.

f:id:lunar0:20200322034520j:plain

まずは完全に見た目重視で,天面をゆるやかな凸にしたものを作ってみた.しかし,使ってみるとどうもしっくりこない.底を削って薄くしたりと試してみたが,結果は変わらなかった.理由はいくつかありそうだが,手首の小指側の付け根あたりにある骨(豆状骨というらしい)を基準にしてタイピングする癖があり,基準にするものは凸であってはいけないという説明が一番しっくりきている.

次に Polaris 本体と同じ 7° の傾きのものを作ってみたが,これも傾きが強すぎてよくなかった.削ってしまったので写真はない.これを少しずつ削って辿りついたのが,冒頭に掲載した約3° 傾いたものだが,平面でもいいような気がなんとなくしている.

キーボードの振動を測ってみる

はじめに

キーボードの音を測ることはよく行われているが,振動を測った例はあまり見ない(というのは検索の怠慢で,reddit の keyboard science でも見ればあるかもしれない).ともかく,秋月で買った加速度計ユニットが余っていたのでキーボードに設置してタイピングしてみた.

セットアップ

今回使用したのは秋月のKXR94-2050モジュール.測定範囲は ±2G だが,水平に置いた場合は重力があるので実質 1 G の振幅までしか測れない.これではちょっと強くタイピングするとクリッピングしてしまう.仕方がないので,タオルの上に垂直に立ててタイピングした.測定治具のモデルは Github のリポジトリにある.

f:id:lunar0:20200319032046j:plain
治具にセンサモジュールを取り付けたところ

f:id:lunar0:20200319011229j:plain
加速度計の取付(理想)

f:id:lunar0:20200319013345j:plain
加速度計の取付(現実)

結果

f:id:lunar0:20200319024131p:plain
Sugi 6x (アクリルサンドイッチ)と Polaris (ガスケット) の比較.ガスケットのほうが低周波成分が少ないことがわかる

1 V = 1 G. トリガがかかった時間を 0 ms としてプロットした.アクリルサンドイッチのほうが振動が大きいことがわかる.底打ち前の振動(-5 ms 付近)は恐らくキーキャップに指が触れた瞬間だろう.

議論

いいかげんな測定ではあるが,アクリルサンドイッチはやはり大きく振動していることがわかる.底面全体にフォームを貼って底全体で支えるか,振動の腹の位置にゴム足を置くことで振動の大きさを改善できる可能性はある.

一方で Polaris は振動の減衰が大きいと予想したが,今回の結果からは判断できない.振動の減衰特性について知るためには,キーを叩くのではなく,プレートを直接叩いたほうが良さそうに見える.

今後の課題

雑なプロトタイプなので課題だらけである.

測定の簡便化

現在はアナログ出力の加速度計を使用しており,オシロスコープがないと値が読めない.自作キーボード界隈には Pro Micro が普及しているので,SPI 接続の加速度計があれば誰でも安価に値が読めて便利だと思われる.データをファイルに書き出すのは面倒なので,トリガがかかったら一定時間シリアルに値を出力する程度でよいだろう.

打鍵の標準化

手で打鍵するとどうしても不均一が生じるので,これも標準化したい.試しに手元にあったペンでキーボードを叩いてみたら,見事に高域が消えてしまった.硬いもので打鍵するとキーキャップの動きが拘束されるためだろうか.

振動の減衰について知るためならば,プレートを直接叩いたほうが良いかもしれない.

f:id:lunar0:20200319024439p:plain
指(上)とペン(下)で打鍵した様子.ペンで打鍵した場合,高周波成分が消えているのがわかる

PCBマウント対応

現在の取付治具では,PCBマウントに対応できない.適当なスイッチに加速度計を接着するなどすれば対応できると思われる.

測定位置の考慮

現在は打鍵しないキースイッチの位置にセンサを置いている.場所により振動のしかたが異なる可能性があるので,センサを複数置いて測定することで打鍵感の均一さが測定できるかもしれない.

Polaris を組み立てた

f:id:lunar0:20200308034225j:plain
Polaris

人気を集めた 60% キーボードキットである Polaris が届いたので組み立ててみた.組み合わせは E-white / Tsangan / Brass plate. この塗装はややキズが付きやすいようで,キーキャップを外すときに小キズを付けてしまった.

パーツ選び

スイッチ

作りの良いキーボードは良い音がするので静音スイッチを入れるのはもったいない.せっかくなので Kailh Cream でも入れようかと思っていたが,丁度遊舎工房に在庫がなかったので Gateron Ink Red + 205g0 にした.Cream と比べていないので大したことはいえないが,結果には十分満足している.

キーキャップ

Matt3o + Drop MT3 /dev/tty を使うつもりが,当該セットは Tsangan Layout に対応していないことに届いてから気付いた.しょうがないので,最下段は Grab Bag や遊舎工房のバラ売りから取ったキーキャップを適当に並べてある. 左右の Control がウォームグレイなのは,五分もすれば気にならなくなった.最下段の低さがうれしい.

ソケット

Holtite ソケットを嵌めてみたところ,固定しないとスイッチを引き抜いたときにソケットが外れてしまうことがわかった.そこで,ソケットの柔軟性を損なわないよう,ソケットのうち1本のみを半田付けする方法で凌ぐことにした.今回は goot から出ている 0.3 mm の半田と,先の細いこて先(2BC型など)を使用した.

f:id:lunar0:20200308033628j:plain
ソケットの半田付け

初日の感想

今まで使っていたものと比較すると圧倒的に感触が良い.感触のよさはガスケットマウントによるものか,底突き時に余計な振動がないことによるものか,音の心地良さによるものか,時間があればもう少し追求してみたい.

いっぽうで,自分の手とMT3との相性があまり良くない気もしている.タイピングするたびに指先を削られるような感覚がある.理由はいくつか考えられるが,彫りが深い(曲率が大きい)ことや,表面のシボが粗いことなどだろう.いずれにせよ,何か代替品を探す必要がある.

キースイッチテスターを作った

概要

Demo: https://kymok.github.io/keyswitch-tester/

  • 12__はスペース)とタイプすると,専用キーボードの1行2列目にあるスイッチが表示される
  • ランダムボタンを押すと,登録されている中からスイッチをランダムに表示する

f:id:lunar0:20200222030716j:plain
完成したスイッチテスターとサーマルプリンタ

Tsukuba Mini Maker Faire (TMMF) の Self Made Keyboard in Japan (SMKiJ) 展示の一環として,キースイッチテスターを出展した.元ネタは遊舎工房の店頭にあるものだが,TMMF会場では店舗と異なり,気に入ったスイッチが見つかってもその場でスイッチを買えない.そこで,名前のメモを取ったりするかわりにサーマルプリンタでメモを出力する装置を作った.

システムの構成

f:id:lunar0:20200222043157p:plain
ハードウェア構成

  • ハードウェア:
    • デモ用パソコン
    • 専用キーボード(USB)
    • サーマルプリンタ(USB-シリアル変換器経由)
  • ソフトウェア:
    • フロントエンド(押されたキースイッチの表示,キースイッチリストのフォーマット,バックエンドへの送信)
    • バックエンド(http/JSON で受け取った文字列をシリアルポートに流す)

キーボード側

構造

基板を 5mm のアクリルプレートに直接ネジ留めした.これだけだと工夫が何もないので,底面のアクリルプレートに皿ザグリを施すことで,見た目をすっきりさせた.各キーには上からLEDを挿せるようになっており,頑張れば WebHID などを使って作者おすすめのキースイッチを光らせるなども可能だろう.

16x4 を一体で作らずに分割した理由は,基板を安価に作るため.深圳には Web から入稿・注文できる小ロット試作に対応する基板メーカーがいくつかあり,ほとんどの店舗では 100mm 角以内なら 5 ドル程度で基板が 10 枚作れる.サイズが大きくなると途端に高くなる.

f:id:lunar0:20200222032954j:plain
キーボードの全体像

回路

4x4 のキーパッドが4個 IIC で ATMEGA32u4 にぶらさがっている.昔作った細い基板が余っていたので,それを利用した. IOエキスパンダは MCP23017 .これは秋月で DIP 品が買えるので回路の試作がしやすいとともに,1ポート 25 mA まで扱えて LED 直結で動かすのに便利.

ファームウェア

開発には QMK Firmware を利用した.各キーにはマクロが設定してあり,00_ - f4__はスペース,f4はf行4列)までの文字列を送信する.単一のキーコード(aなど)を送る方式と比較して,利点は次の通り.

  • 理論上は際限なくキーが増やせる*1ので,ルブの有無などのバリエーションも画面上に表示させることが可能.
  • モディファイヤキーを送らずに済み,本体のキーボードと共存しても安全.
  • キーマップの入力がファームウェア,フロントエンドともに楽.

逆に,単一キーコードを送る方式の利点は次の通り.

  • 最初のキーの keydown だけ見ればよいので,反応が速い.
  • 実装がシンプル.

今後何かあるたびに使い回すとすれば,キーマップが柔軟に変えられたほうが良いだろうと考え,前者の方式を採用した.

本体側(デモ用パソコン)

フロントエンド

f:id:lunar0:20200222032015p:plain
ユーザインタフェース

ちょうどいい規模のプロジェクトかなと思って付け焼刃の React で書いてみた.勉強という大義名分のもと React + Redux + Redux-Saga という大所帯になったうえ,キーボード入力を読んで該当するデータを表示する部分も自前実装してある(このせいで当日までに物理印刷ボタンを付けられなかった).

キーボード入力を読んで該当するデータを表示する部分では,次のような実装をしている.

  • キーボード入力の履歴を蓄えておく配列を用意する.
  • 新しい入力を配列の末尾に付け加える.
  • 入力があらかじめ用意したパターンと一致したらアクションを発行し,入力履歴をクリアする.

ローカルで動作すればよいので,キースイッチ・キー配列のデータは JSON ファイルを直接読む形式とした.

ソースコードkymok/keyswitch-tester にある.また,元ネタにした遊舎工房店頭にあるキースイッチテスターのものは adeonhy/switch-tester-web にある.

バックエンド

今回利用したサーマルプリンタは Maker には有名なもので, PyPI に専用のライブラリまである.これに Flask で薄いラッパーをかぶせて使った.Python の既製品を組み合わせただけで,ほぼ何もしていないに等しいが,ソースコードはこちら:kymok/thermal-printer-server

反省

  • Amazon で買える安いスペーサを使ったら基板に不陸が生じた.急ぐにしても,レーザーカッタでアクリル板から切り出すなど,より精度よく作る方法はあったはずである.
  • UIについて,アイテムを画面上のリストに入れて,さらに印刷ボタンを押すのは手数が多すぎた.印刷キーを付けて,押すたびに直前に選択したスイッチが印刷される程度に単純なほうが良かっただろうと思われた.TMMF のゆったりした人通りですらこれなので,混雑したイベントでは使い物にならなかった可能性が高い.
  • ちょっとした記念品になるといいなと思ったが,主にプリンタからモノが出てくるということ自体が子供ウケしていた.
  • Web 技術で作ると UI の修正などをその場でデプロイできて便利.

*1:実際はスキャン頻度に響くので限界はある/計算はしていない

キースイッチを撮影する

f:id:lunar0:20200221003649j:plain
撮影したスイッチ (Kailh Pro Light Green)

機材

今回の倍率は大体 1/2 倍付近なので,市販のマクロレンズでも十分にこなせるはずだが,せっかくなのでベローズと引き伸ばしレンズを用いたマクロ撮影を試してみた.ベローズは程度のよいものが1万円程度,引き伸ばしレンズは2-3000円程度で購入できる.引き伸ばしレンズは絞り値の表示窓から光が漏れるものがあるので,黒テープでふさぐ必要があるかもしれない.

カメラ

  • Sigma fp
  • ASAHI PENTAX ベローズユニット II
  • Rafcamera M42→L マウントアダプタ*1
  • FUJINAR-E 75mm F4.5
  • Leofoto ポケット三脚 MT-03

照明

  • 2x 電気スタンド
  • 台座(乳白アクリル板 t=2 スイッチを定位置に置くための治具つき)
  • 1x コピー用紙

セットアップ

  • 台座を壁の付近に置く.
  • 電気スタンドを天井に当ててフィルライトを作る.
  • もう1台の電気スタンドを直後の壁に当ててバックライトにする.
  • 絞りは F8 とした.*2

f:id:lunar0:20200221023139p:plain

評価

  • ベローズの使い心地は思ったほど悪くない.Lマウントは口径が大きいのが利点だが,M42マウントの内径が小さいこともあり結局四隅はケラレる.これを改善するためには大判カメラにアダプタを付けて撮影するなどが考えられるが,画面の四隅まできっちり使う撮影をする予定はないので今のところはこのまま.
  • Leofoto MT-03 は良くできている.そこまで厳密さを求められない小物の撮影なら,ミニ三脚で手軽に撮ってしまっても良いかもしれない.
  • 照明位置の再現性が落ちそうなのが唯一の問題.ミニスタジオ等を使うなどの改善策が考えられる.

*1:最初 Sigma fp に合わなかったので,こちらで寸法を測定して代替品を送ってもらった

*2:パンフォーカスにしても良かったが,多少開けぎみのほうが軸の形が際立つと判断した.フォーカススタッキングは面倒なのでパス