改造キーボードへの沼(令和版NeXTキーボードV2)

改造キーボードへの沼(令和版NeXTキーボードV2)

この記事はあくあたん工房2023アドベントカレンダーの22日目です.

どうもomzn教授(キーボード改造学)です.
まもなくクリスマスですよ.クリスマスプレゼントに自作キーボードなんか贈ったらダメですよ.

この記事は,1週間前からの続きです.

令和版NeXTキーボード V2

実は無改造のNeXTキーボードも1台所有しているのですが,こちらはジャンク品で通電しても動かなかったものです.
こいつも改造してしまうことにしましょう.

ちなみに2023年12月時点でNeXTキーボードのeBay価格はご覧の通りです.

もったいなくてハラハラしますね…

さて,今回は以下の3点を実現します.

  • パターンカットしない
  • 物理キーを互換品に変更
  • 光らせる

キー配置

今回のキーボードは前回のものよりも,多少新しい時代に製造されたものです.(それでも1990年代前半です)キー配置も似ているのですが,Returnが逆L字になり,そのあおりを食ってバックスラッシュキーがテンキーパッドに押し出されています.

ここはちょっとどうにかしてやらないと使いづらそうなところですね.
また,刻印が昔のMacintoshっぽくなってきています.

物理キー

こちらのキーボードはALPS黒軸を採用しています.ALPS黒軸はクリーム軸の後に採用されたものですが,キーのクリック感がややマイルドになっています.

キーマトリクス解析

キーボードのマトリクスパターンを解析します.目視とテスター片手に裏面のパターンを追いかけます.今回はパターンカットをしない縛りで作っていきますので,既存のマトリクスを最大限利用することになります.また,Raspberry Pi Picoを載っける基板を作り,オリジナルのコントローラを抜いたところにはめ込んでやります.

解析結果を以下の図に示します.

近いキーがコンパクトにまとまっていて,8x10に収まりそうな感じのきれいなマトリクス・・・と思ったら,モディファイアキーだけ飛び出してしまっています.なんじゃこりゃ.よく見るとR10と書いた行はGNDです.てことは,これらのキーはマトリクスではなく,ダイレクトキーになっているってことですね.

さすがにそこまで富豪なピンがあるマイコンは使っていないので,モディファイアキーもマトリクスに統合します.GNDだったパターンを追いかけてジャンパを抜いてGNDから外して1本のバスにしてしまいます.
最終的に決定したマトリクスは以下のようになります.モディファイアをどこの列に統合するかは,今回作成するPi Pico基板の都合でPCBを作りやすいように決めています.

このマトリクスをPi Picoへ変換する基板を作ります.この基板の上だけで,モディファイアキーの列の統合も行います.そのおかげで今回はほとんどジャンパワイヤを飛ばす必要がなくなりました.


設計したらElecrowに発注.基板制作費は$1.00. 送料が$15ほどで1週間弱で届きます.バグの入り込む手配線を必死でやるよりはお金で解決した方が良かろうということです.

実装

キーの裏からLEDでキーを光らせたいと思っているので,どうにかならないかといろいろ眺めましたが,結局スイッチを全部取り替えることにしました.

基板は片面パターンなので,はんだ吸い取りは簡単にできます.
しかし,古い基板なので銅箔パターン自体がもろくなっており,簡単に剥離してきます.
細心の注意を払いながら,はんだ除去とスイッチの撤去を行います.

外して…

外して…

外して…

じゃーん

キースイッチはFILCOダイレクトさんから,Matias Click Switch Gray(タクタイル)とWhite(クリック)を入手しました.テンキーだけ,Whiteでカチャカチャ言うように作ってみます.

さらに表面のジャンパもLEDストリップが通るところは邪魔になりますので撤去して裏面に再実装します.はんだ吸い取り線の消費速度が異常です.結局実装されていた部品の9割以上は外す羽目になりました.

ついでに,Caps Lock LEDを白色LEDに変更します.

続いて,光らせるためのLEDストリップを敷設します.LEDストリップは,よく見かける10mm幅のものだとキースイッチに干渉しそう(ギリギリでなんとなならないこともない)なので,今回は5mm幅のものを入手します.制御はWS2812のドライバでできるので,安心です.

1列目…

2列目…

全列…

点灯!

これで基板のほうでやることは終わりなので,キースイッチをはんだづけしていきます.
キースイッチをはんだづけしてしまうと,LEDストリップには手が出せなくなるので,接触不良のダブルチェックが必要になります.実際,後述するようにキーを全部付けた後で,一部のキーの不認識というバグを出しました.

仕上げ

キースイッチをはんだづけし終わった頃に,キーマトリクス変換基板が深圳から届きました.



基板上にはI2CとWS2812用のコネクタも引き出しています.
これを使ってRaspberry Pi Picoとキーボード基板の橋渡しをします.
基板にバグさえ無ければ,ワイヤを1本も繋ぐこと無く配線作業が完了です.

試験点灯,ヨシ!

透過OLEDもI2C経由で取り付けます.
ここらはV1と全く同じなので,簡単にできます.

後は組み上げるだけです.

完成

できました!


QMKのコードは以下に置いてあります.

RGB LightingとRGB Matrix

QMKには2種類のRGB LED制御があります.RGB Lightingはws2812のようなシリアルLEDを操作するための機能,RGB Matrixはマトリクス構造になっているLEDを制御するドライバを利用するためのものです.ただ,RGB Matrixでもws2812がサポートされています.

RGB Lightingは最初からシリアルLEDを使う前提なので,設定が楽です.通し番号だけで制御できます.また,レイヤーへの対応などがサポートされています.きれいなアニメーションが用意されています.

RGB Matrixは汎用のマトリクス制御なので,LEDとキーの対応を作ってやらねばなりません.これがまあまあ面倒で,キーマトリクス→LEDマトリクスの対応表と,LEDマトリクス→物理キーの場所の対応表の2種類を作らねばなりません.アニメーションも用意されていますが,こちらはタイピングに反応したアニメーションが利用できるのが強みです.

こんなExcelを書いて,コードに落とし込んでやります.


どちらの方法でも同じことを実現はできそうですが,自分で作ること考えると出来合いのものを使いたくなりますね.

キータイプに反応して光るのはこんな感じになります.

なお,ws2812を使う場合は,これら2つの方法を共存させることはできません.

バグとか途中の失敗とか

  • 当初,メイン基板のLEDの点灯方法を勘違いしていて,5VラインをGNDだと思っていました.そのまま最初の変換基板を作ってしまったので,大幅なやり直しが必要になり,結局再注文しました.
  • LEDストリップを敷設後,キースイッチを全てはんだづけした後で,キーマトリクステストをしたら,1行分が反応無しになりました.テスターで調べていると,LEDストリップを接続したときだけ5Vと当該行がつながってしまっていました.これは,ジャンパワイヤを付け替えたときにほんの少し表に出た部分がLEDストリップの5Vと接触していたためでした.

おわりに

古いキーボードを改造して現代によみがえらせる遊びは楽しいですよ.
私自身,20年前には持っていなかった電子工作のスキルを得て再改造を試みると,できることが増えていて嬉しかったです.

1990年代のメカニカルスイッチ採用のキーボードは打鍵感も良いので,よみがえらせる価値があります.

みなさんもジャンク屋でよさげなキーボードを見つけたら即確保!

では,Merry Christmas and a happy new year!

改造キーボードへの道(令和版NeXTキーボードV1)

改造キーボードへの道(令和版NeXTキーボードV1)

この記事はあくあたん工房2023アドベントカレンダーの15日目です.

omzn教授(キーボード改造学)です.
本日は古いキーボードの再生についての講義をしましょう.

平成版NeXTキーボード

まだ若かりし頃,2000年代に古いコンピュータを改造して最新のPCに換骨奪胎するという遊びに興じていました.
NeXT cubeとか,NeXT stationとか,Macintosh LC II(だったかな),Mac G4 cubeとかを改造して,ミニPCを作る遊びです.
苦労する割には,たいした性能もだせず,熱設計が破綻しているのですぐ暴走するというろくでもない機械を生み出していました.
犠牲になった古いコンピュータには悪いことをしたと思っております.

その流れで,NeXTキーボードの改造をしていました.NeXTのキーボードはMac系のADBぽい何かでしたが,当時は単なる使えないキーボードでした.
そこで若きomznは閃きます.


「そうだ,ここに転がってるジャンクのPS/2キーボードからコントローラを取り出して移植したら使えるようになるんじゃないかな」

早速キーボードの仕組みを調べると,キーボードにはキーマトリクスデコーダが乗っていること,そして,都合の良くないことにキーマトリクスはみんなバラバラということでした.

「せっかく分解したPS/2キーボードを何とか活かしたいな…」

ここでomznはまた閃きます.

「そっか,このPS/2キーボードに合わせてNeXT側を配線し直してやればいいんだ」

こうして魔改造されて生まれたのが平成版NeXTキーボードでした.



当時の標準規格だったPS/2にしておけば大丈夫だろうと思っていたのですが,時代はすぐにUSB全盛になり,NeXTキーボードはUSB変換をかまされたまま20年近く利用されました.ただ,元々PC/AT用のキーボードだったため,Macとの相性はあまり良くなく,キー入れ替えソフトが必須の状態で使うことになりました.また,ファンクションキーへのアクセス手段がないので,時々大変困ることになっていました.

そのため,20年の間,「いつかは今風のキーボードに作り直したい…」という思いを引きずっていたのでした.

令和版NeXTキーボード V1

2023年秋,ゆゆ君がキーボードを自作したのを見せてくれたので心に火が付き,自作キーボード化への完全移行を目指すようになります.

基本的にやることは以前と同じで,物理マトリクスに合わせたマトリクスデコーダを作ることになります.これが簡単にできる仕組みを提供してくれているのが,QMKです.

レイアウト

Fキーがないことを除けば,普通のキーボードに見えます.Backquoteがテンキーパッドにありますが,まあご愛敬.

物理スイッチ

NeXTキーボードではALPSクリーム軸を採用しています.軽やかなクリック感がクセになります.
(ALPS軸についてはこちらのサイトが非常に詳しいです.また,こちらの記事も大変興味深いものです.)

マトリクス解析

以下の図の上は,20年前に私がWebページに載せていたPS/2キーボードのマトリクスです.
非常に贅沢にマトリクスを構成していたので,このままだとマトリクスのピンが25本も必要です.
カラムのORをとってもキーコードがかち合わない場所は単純に統合可能なので,3つのカラムを減らすことができました.(図の下)

これでもまだ22本のGPIOが必要です.
一般的なPro MicroですとGPIOが18本しか使えないので,今回はRaspberry Pi Picoを使用します.Raspberry Pi Picoは26本のGPIOを利用できますので,今回の用途に使ってもまだ4本のGPIOが余ります.そこをLEDの駆動やI2Cに割り当てることで,さらに機能を増やすことができます.

ハードウェア作成

Raspberry Pi Picoを載せる

これまでPS/2コントローラに接続されていたすだれケーブルを切断して,Pi PicoのGPIOに繋いでいきます.
今回は初回の試作だったので,そのままはんだづけしましたが,ソケットで取り外し可能にするのがベターですね.


USBの端子を設置する

3Dプリントで土台を作成して,USBの口を作ります.写真では試作時なので赤で作っていますが,最終形は黒にしています.


最終的にはこんな感じになります.改造前に比べると余計な基板が無くなってすっきりしました.



QMKの設定

キーボードの設定

  • このキーボードのように,ダイオードが実装されていないマトリクスではMATRIX_HAS_GHOSTをdefineします.
  • CapsLockのLEDをGP0で制御します.


キーマップ

先ほどのマトリクスに忠実にキーマップを書いて行きます.

  • NeXTのPowerキーをFnキーとして利用
  • Volume up, Volume downをPage up, Page down (Fn押下で本来の機能)
  • Brightness up, Brightness downをHome, End (Fn押下で本来の機能)
  • 「Fn + 数字」で 「F1~F10」
  • 左Commandキー単独で「英数」,右Commandキー単独で「かな」

等の機能を追加しています.
Esc周りはやや特殊で,単押しでEsc, Shift + Escで「〜」, Shift + Alt + Escで「`」が出るようになっています.


利用するGPIOとマトリクスの対応はinfo.jsonに書きます.


KLE でグラフィカルなキー配置を作成する

VIAやRemapでキー配置を変更する時のGUI用に,KLEでレイアウトを作ります.



ここでハマりましたが,肝はキートップのLegendにマトリクスの座標を書いてやることです.
PS/2コントローラのマトリクスが物理配列と全く合っていないので,この図では座標がバラバラになっています.

VIAの設定

via.jsonを作ります.これは,RemapなどのツールでキーマップをGUI的に変更するときに使います.
中身は,KLEで作成したキー配置のデータと,キーボードの名前,Vender ID, Product ID,matrixの行列を記したものになります.


できあがり!

ここまでで,一旦キーボードはできあがりです.

ファームウェアを焼いてやれば,キーボードが使えるようになるはずです.

qmk flash -kb next_keyboard_v1 -km via


ソースコードは GitHub に置いています.

(おまけ)OLEDパネルを追加する

キーボード単体だとちょっと寂しかったので,透過OLEDを使ってHUD風ディスプレイを付けて見ました.蛇足感が酷いです.



実はここまでの話は前座に過ぎなかったのです.
長くなるので本編は次の記事で..

ヒョウモントカゲモドキの孵卵器を自作する

ヒョウモントカゲモドキの孵卵器を自作する

この記事は あくあたん工房2023アドベントカレンダー の8日目です.

こんにちは.トカゲ教授omznです.

昨年から飼い始めたヒョウモントカゲモドキ(Leopard Gecko)ですが,あくあたんシステムの一部を間借りして管理していたのですが,今のところ下の図に示すようになっています.(クリックで拡大)いまや,水槽よりもこっちの方が遙かに大きいシステムになってしまいました.


そもそもトカゲ用のケージが4つもありますからね…


今回の記事

今年はヒョウモントカゲモドキが産卵するようになったので,試行錯誤を重ねて孵卵器を作成しました.
このたび,自作孵卵器で最初の卵が孵化しましたので,ここに記録しておきます.

ヒョウモントカゲモドキの卵

ヒョウモントカゲモドキは一般的に1度の産卵で2個の卵を産みます.
ケージ内の底床を掘って作った産卵場所に産んだ後,埋め戻しますので,掘り出して孵化器に移します.産んだメスは卵を回収された後も,けなげに産んだ場所に土をかけたりして隠そうとしていますが,無駄な努力なのだよ….


卵は柔らかい卵殻になっていて,さわるとふわふわします.誤って転がしたり落としたりすると卵は死んでしまいますので,掘り出した時に上側だったところにマジックで印を付けておきます.以後,必ずこの印が上になるようにして保管します.
保管場所はタッパーなどに水苔を敷いたものを準備して,これを孵卵器の中に入れておきます.時々,水苔が保湿されているかは手動で確認します.


ヒョウモントカゲモドキの卵の管理

ヒョウモントカゲモドキの卵は,温度26℃〜34℃,湿度80%〜90%で管理するとよいとされています.また,温度にも依りますが,40日〜70日で孵化すると言われています.
結構長丁場なので,静かに温度湿度が安定した場所に置くのが良いようです.なお,今回の卵は,28℃で管理し続けたところ,53日で孵化しました.その後も53日前後で2つの卵が孵りました.


湿度

湿度が十分でないと,卵が乾燥してしまい死んでしまうことになります.また,高すぎてもカビが生えたりするようなので,あんまりびしょびしょなのも良くなさそうです.
そこで,孵卵器内部を常に一定の湿度に保ちたいと思います.加湿については,特に何もしなくても孵卵器内部に水分を含んだもの(水苔とか)を置いておけば勝手に加湿されますので,上がりすぎた湿度を下げる方針で孵卵器を作ります.

温度

温度依存性決定(TSD)により,孵卵中の温度によって性別が決定されます[1].
(なお,孵卵温度を28℃以下にしておくとほぼ100%メスになります.)
そのため,性別を固定するのであれば,温度の管理は必須になります.

ヒョウモントカゲモドキの温度依存性決定([1]より引用)

性別に関わらず,26℃以下にしないほうが良いので,何らかの保温装置が必要です.ここではシートヒーターを使って温度を上げる方に保ちます.私の飼育環境では24時間全館冷暖房が効いているため,室温は常に26℃前後になっています.そのため,室温が高すぎて冷却が必要な環境では,冷却についても考慮してやらねばなりません.

孵卵器の実装

上記の管理方針に従って,孵卵器内の温度・湿度を調整する機構を作ります.
必要とする部品は以下の通りです.

  • M5 HUB Switch D (2チャンネルAC100Vリレー)
  • M5ATOM Lite (M5 ATOM S3, M5 ATOM S3 Lite等,何でも可)
  • DCファン (5V駆動)
  • ENV III Unit (SHT30温湿度センサ)
  • MOSFET (2SK4017)
  • 10kΩ抵抗 x 2
  • シートヒーター
  • ダイソーのシューズケース

孵卵器本体は,ダイソーのシューズケース(小型)を使っています.普通の大きさのシューズケースでも構わないですが,ちょっと広すぎて持て余すかもしれません.また,小型は大きめのダイソーにしか置いてないことがあります.卵が10個ぐらいまでは小型でいけるのではないかと思います.100円なので加工をするのにもためらいがなく,とても良い素材です.



湿度の管理のためにはファンを実装します.



M5ATOM Liteの25番ピンを通じてMOSFETにPWMを送り,0〜255段階でファンを回します.(実際には起電力が必要なので,PWMは65ぐらいからにしないとファンが回りません.)
ファンは孵卵器の蓋に開けた穴に設置し,内部の水分を外部に放出する方向にファンを回します.
湿度自体はENV III UnitのSHT30で計測します.温湿度センサなので簡単に温度と湿度を得ることができます.
ファンは湿度を入力とするPID制御を採用して駆動させます.ファンを動作させると湿度は敏感に反応するので,湿度取得間隔は2秒程度と短くしています.実際は閾値でON, OFFするだけでも良いと思われますが,そこは勉強も兼ねて次のようなコードで実装しています.

int Fan::manageByHumid(float h) {
  const float dt = 2;
  const float kp = 10, ki = 1, kd = 10;

  static float diff_p = 0, diff_c = 0, integral = 0;
  float p, i, d;
  int prev_power = fan();

  diff_p = diff_c;          // 湿度の差 (%)
  diff_c = h - _target_humid;  // 湿度の差 (%)
  integral += (diff_c + diff_p) / 2.0 * dt;
  integral = integral > 50 ? 50 : (integral < -50 ? -50 : integral);

  p = kp * diff_c * (diff_c < 0 ? 5 : 1); // 1 % で pwm 10 :負の時は x 5
  i = ki * integral;                //
  d = kd * (diff_c - diff_p) / dt;  // 1% で pwm 10
  float power = p + i + d;
  int ipower = constrain((int)power, 0, 255);
  DPRINTF("humid: %.1f, target: %.1f, power: %.1f (%3d)\n", h, _target_humid, power, ipower);
  fan(ipower);
  return (ipower && !prev_power || !ipower && prev_power);
}

温度の管理はシートヒーターをACリレーで駆動します.
M5 HUB Switch Dを使うと,100V電源でATOM Liteを動かせるので,余計な配線が不要になります.
また,M5 HUB Switch Dの本体にある2つめのGROVEコネクタは25番ピンを引き出していますので,上述のファンの回路をこのGROVEコネクタの先に作ればよいことになります.温度変化は湿度ほど短時間ではありませんので,こちらは上限下限の閾値を定めてON, OFFを制御します.

最終的な見た目はこんな感じになります.


ソフトウェアは,自身で作成中の汎用環境センサシステムを使います.利用するモジュールのみをソフトウェアで有効化できるので,重宝しています.また,Raspberry Piにより温湿度等を記録するサーバを作っています.

孵卵器モニター

温湿度の現状,これまでの履歴,そして卵の孵卵日数を記録するための孵卵器モニターも作成しています.



1つ目の卵は初めてでしたので,リビングのトカゲケージ横で見守りました.2つ目以降は納戸にシステムごと移しましたが,納戸のほうが人間の活動が無い分,湿度が安定することが分かりました.


幼体も飼えます.

ヒョウモントカゲモドキの幼体は親に比べて高温・高湿度環境が必要なので,幼体飼育ケージにも全く同じシステムを流用できます.幼体ケージもダイソーのシューズケースで作っています.
幼体は湿度をおよそ70%〜80%でキープするように設定し,M5 ATOM S3の液晶に現在の状態を表示させています.


コオロギも飼えます.

同じシステムを流用するとコオロギの維持管理にも使えます.今年はこれを使うことでフタホシコオロギを3世代に渡って飼育を続けることができています.(現在進行形)
コオロギは湿度60%ぐらいをキープなのですが,それでもうまいこと維持できています.
今年はコオロギ牧場が続くといいな…



参考文献

[1] J. M. Hall, Temperature dependent sex_determination in reptiles, Herpetoculture Magazine, isseue 17, March 2021, https://www.researchgate.net/publication/349718375_Temperature-dependent_sex_determination_in_reptiles