完全自作キーボード「Voyage75」を作ってみた

はじめに

「Voyage75」、という完全自作キーボードを作ってみました。

スペック

キーキャップ Akko Silent
キースイッチ Durock Silent Linear Dolphin
配列、キー数 US配列、79個
hotswap 対応
インターフェース USB (Type-Cコネクタ)
サイズ 縦130mm x 横297 mm x 高さ23 mm
(高さはキーキャップ・スイッチは含めない)
質量 650 g

部品代、製造代諸々含め、4万円程度になりました。

打鍵音

静音リニアということもあり、実際に聴くとすごく静かです。 オフィスでも周りの目を気にせずに打てます。

なぜ作ったのか

これまで、下記の2つの自作キーボードを製作しました。 これらはKBDfans社が出しているDZ60KBD75のPCBを使用しました。

しかし、普段仕事でFnキーをよく使うために、FnキーのないDZ60で組んだキーボードは使いにくい問題がありました。 KBD75で組んだキーボードは右端列のHomeやPage up/downのキーを普段使うことがなく、誤って押してしまうこともあるため、邪魔でした。

そのため、次に自作するキーボードは自分が普段使いする必要最低限のキーで構成したものにしたく、下記の要求仕様としました。

  1. DZ60で組んだUSキーボードの最上段にFnキーの列があるもの (つまり、13インチ程度のLaptopのUSキーボード配列。こういうの)
  2. カニカルキーボード&Hotswap対応

最初はこの要求仕様を満たす市販の自作キーボードキットやPCBを探したのですが、これが全然見つからず・・・

じゃあ全部自分で作るしかないじゃん、というわけです。

ケース

ハードウェアの設計はガチ初心者なので、そんな初心者でも手が出しやすく低コストなアクリルサンド構成でケースを作りました。

アクリルサンドの構成は下図の通りです。

MXスタビライザー用の切り抜き穴の寸法はこちらを参考にしました。 アクリル板の加工は遊舎工房のレーザー加工サービスを利用しました。一部は不揃い品でのレーザー加工サービスを利用し、値段を抑えることができました。

  • 遊舎工房レーザー加工 :
    • 押出クリア, 450x300, 1.5mm, 1枚, 4,700円
    • 押出クリア, 450x300, 3.0mm, 1枚, 5,900円
  • 遊舎工房レーザー加工クリアランスセール
    • 押出クリア / 300x70 / 5mm, 1枚, 1,260円

アクリル代合計:11,860円

そのほか使用した部品は下記の通りです。

部品名 用途 個数
MXスイッチスタビライザー - 1
9mm M2 丸型スペーサ キープレート固定用 4
4mm M2 丸型スペーサ PCB固定用 4
低頭M2ネジ 5 mm キープレート固定用 4
低頭M2ネジ 3 mm PCB固定用 4
M2ネジ 5mm スペーサ固定用 1
M2ネジ 7mm スペーサ固定用 2
M2ネジ 10mm スペーサ固定用 5
M2金属ワッシャー PCB固定用 4
M2シールワッシャー PCB固定用スペーサの高さ調整用 4
ゴム足(100均) キーボード滑り止め用 4

他部品代合計(概算):3,000円

PCB

Kicadで設計し、PCB製造および部品実装の大半はJLCPCBで発注しました。

マイコンSTM32G0B1CBT6を選定しました。選定理由としてはLCSCに在庫があり安かったからです。

最低限キーボードとして動けばいいと思ったので、回路面で特徴のあるものはないです。

値段を抑えるため、基板製造数は最小の5枚、うち2枚を実装し、運送はOCSの最安プランを選びました。 家にあった部品を実装してるので総額は出せませんが、JLCPCBでの費用のみだと日本円で12,242円でした。

発注してから4日で発送され、そこから6日後に届きました。JLCPCB仕事が早くて好き。

ただ一部の部品は未実装状態で発注したため、それらは手半田で実装しました。 特に1005サイズの部品の実装は不器用な私にとって何もメリットがありませんでした。 素直に全部品LCSCで選定し、JLCPCBで実装してもらえばよかったと後悔しています。

FW

一般的に自作キーボードといえばQMK firmwareを使うことが多いですが、自称組み込み園児にあなので自分で作った回路のFWは自分で作ったほうが早いなと思い、QMK firmwareは使いませんでした。

USB HIDの実装はこちらの記事を参考に、STM32CubeIDEのCustomHIDを使うことで簡単にできました。

ただ、実装し始めたときはG0のHALドライバのバージョンが古いものを使っていたため、このバグにハマってしまい、USBデバイスとして認識されない問題に悩まされました。

既に修正済みのライブラリがリリースされていたため、最新に更新することで解決しました。

また、今回作成した基板はBOOT0ピンを使ってスイッチによりBootモードを切り替えられるようにしましたが、STM32G0のOption bytesのnBOOT_SELがデフォルトでチェックが入っていたために、最初はBootモードの切り替えができずST-Link経由しかFWを書き込むことができませんでした。

チェックを外すことで正常にDFU経由でFWの書き込みもできるようになりました。

反省点

PCBの固定を考慮できてなかった

なぜ設計のときに気づかなかったのか、当時の自分を恨みます。

PCBの四隅以外の穴径をネジ穴サイズにするつもりが、誤ってスペーサを貫通するサイズにしてしまいました。

組立時にこの問題に気づき、急遽ボトムプレートーPCB間にL4 mmのスペーサとワッシャーを入れてPCBを固定するように対応しました。

スタビライザーの高さを考慮できていなかった

最初はキープレートの厚さを3 mmで設計・発注してましたが、設計時にスタビライザーの高さを考慮できておらず、実際に組み立てるとスタビライザー付近のスイッチがPCBから外れる状態になっていました。

マウントプレートの厚さ変更と使用するスペーサのサイズ変更だけの修正で済んだのが救いでした。

その代わり6,000円失いました。

固定穴が足りず、キープレート・PCBが撓む

KBD75で組んだキーボードは、PCBの固定箇所が8個ありました。

一方製作したものはキープレートの固定が四隅の4個、PCBの固定が4個ですが、実際に組み立てると想像していたよりも固定が甘く、PCBが撓んでいました。

使用上は特に問題ないですが、側面からの見た目が少しダサくなってしまいました。

角が思っていたより痛い

R1.0 mmは普通に指に刺さって痛いです。

おわりに

一部設計ミスはありましたが、普段使いできる理想的なキー配列のキーボードを0から作ることができました。

ただ面白みに欠けるものになってしまったので、次回作では色々なデバイスを載せたいと思います。

Jetson nanoにDualshock3を無線接続する

はじめに

Jetson nanoを秋月で買いました.

f:id:FMR_CHN:20190629085115j:plain:w300

akizukidenshi.com

Jetson nanoにDualshock3を無線接続してROSで使えるようにします.

Jetson nanoにはBluetoothが搭載されていないため,以下のようなドングルを用意する必要があります.

PLANEX Bluetooth USBアダプター Ver.4.0+EDR/LE(省エネ設計)対応 BT-Micro4

PLANEX Bluetooth USBアダプター Ver.4.0+EDR/LE(省エネ設計)対応 BT-Micro4

上記のドングルをJetson nanoに挿しましたが,特に設定をする必要もなく使えてます.

Jetson nanoへのROSのインストールは以下の記事を参考にしました.特に問題なく正常にインストールできました.

www.stereolabs.com

必要なパッケージのインストール

USBとBluetoothの開発をするためのパッケージを以下のコマンドでインストールします.

sudo apt install libusb-dev libbluetooth-dev

sixpair

次に,BluetoothドングルとDualshock3をペアリングするためのツールをダウンロードし,ビルドします.

ソースコードをダウンロード

wget "http://www.pabr.org/sixlinux/sixpair.c" -O sixpair.c

ビルド

gcc -o sixpair sixpair.c -lusb

sixad

次に,Dualshock3を使えるようにするためのツールをインストールします.
sixadは以下のUbuntuPC用のdebパッケージが用意されていますが,Jetson nano(TK1やRaspberryPiなども含む)のようなARM系ではインストールできません.

Sixaxis - Community Help Wiki

sixpair同様,ソースコードをダウンロードしてビルドします.
他の方のブログにも方法が記載されていますが,Jetson nano上でビルドした時に一発で成功したものを紹介します.

GitHubにあるレポジトリをクローンしてビルドします.これでsixadコマンドが使えるようになります.

git clone https://github.com/falkTX/qtsixa
cd qtsixa/sixad
make
sudo make install

動作確認

まず以下のコマンドでペアリングをします.この時,Dualshock3をUSBケーブルでJetson nanoに接続してください.

sudo ./sixpair

これでドングルとDualshock3のアドレスが表示されれば,ペアリング完了です.USBケーブルを抜いても問題ありません.
1回目の実行ではドングルとDualshock3が違うアドレスが表示されると思いますが,ペアリングできています.
心配な方はもう一度コマンドを実行し,両者のアドレスが一致していることを確認してください.

次にsixadコマンドでDualshock3を無線接続します.

sixad --start

「sixad started, press the PS button now」と表示されれば,Dualshock3の真ん中のPSボタンを押してください.
Dualshock3が振動すれば接続成功です!

ボタン情報を正しく読み取れているかを確認するためのツール(jstest-gtk)をインストールします.

sudo apt install jstest-gtk

インストールが完了したら,デスクトップ左上のActivitiesをクリックし,jstest-gtkを検索してください. ツールを起動すると,接続したDualshock3のボタン情報を確認することができます. Dualshock3内蔵の加速度センサやボタンの圧力の値が正常に読み取れていると思います.

接続を終了する際は,sixadコマンドを実行したターミナルでCtrl+Cで強制終了します. Dualshock3が少し振動し,ターミナルに「Force disconnect of (アドレス)」と表示されれば,接続終了となります.

おわりに

以上の方法でJetson nanoにDualshock3を無線接続できるようになりました. あとはROSのjoyパッケージをインストールすれば,ROSでDualshock3を使えるようになります.

qiita.com

CoolTermにボーレートを追加する

はじめに

私はMacでシリアル通信ターミナルソフトのCoolTermを使用しています.

f:id:FMR_CHN:20190623111231p:plain:w100

freeware.the-meiers.org

過去にマイコンとPC間でUART通信させていた際,ボーレートを921600 bpsまであげたくなりました.
ですが,デフォルトのCoolTermではボーレートが230400 bpsまでしか選べないようになってます.
そこで,CoolTermにボーレートを追加してみました.

追加方法

最初はこちらの方の記事を参考に設定してみました.

d.hatena.ne.jp

ですが,私の環境ではApplicationsフォルダのCoolTermフォルダにファイルを保存しても,ボーレートは追加されませんでした.

私の行った追加方法は以下の通りです.保存場所が変わっていることに注意してください.

  1. 「baudrates.ini」というファイルを作成する.
  2. 作成したファイルに追加したいボーレートを記述する.このとき各ボーレート値で改行する.
  3. 作成したファイルをアプリケーションフォルダに保存する.

baudrates.iniの作成例です.今回は460800 bpsと921600 bpsを追加しました. f:id:FMR_CHN:20190623105505p:plain:w400

作成したファイルをApplicationsフォルダに保存し,CoolTermを起動すると,以下のようにボーレートが追加されました. f:id:FMR_CHN:20190623105205p:plain:w500

STM32F103C8T6 USB CDC編

はじめに

昨日貰ったSTM32F103C8T6ボードにUSB通信用のmicroUSBがあるのと,前々からSTM32のUSB通信を試してみたかったので,簡単な動作確認をしてみました.

fmr-chn.hatenablog.com

USB CDC

CDCはCommunication Device Classの略です.
仮想COMポートを開き,マイコンとのシリアル通信がUSB経由で可能です.

開発環境

PC:MacBookPro
OS:macOS High Sierra
開発ソフト:SW4STM32,STM32CubeMX

Windowsの方はVCPドライバーが必要になるので,ST社などのドライバーをインストールしてください.

www.st.com

STM32CubeMX

CubeMX側でUSB CDCの設定をします.手順は以下の通りです.

Pinout

  1. USBのDevice(FS)にチェックを入れる.
  2. RCCのHigh Speed Clock(HSE)をCrystal/Ceramic Resonatorにする.
  3. USB DeviceのClass For FS IPをCommunication Device Classにする.

f:id:FMR_CHN:20180904121730p:plain:w700

Clock Configuration

To USB(MHz)が48MHzになるようにHCLKの値を決めます.
今回は最高速の72MHzにしました.

f:id:FMR_CHN:20180904122552p:plain

CubeMX側の設定は以上です.コード生成をしてSW4STM32に移ります.

SW4STM32

文字列送信のコードをmain.cに追加します.

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USB_DEVICE_Init();

  /* USER CODE BEGIN 2 */
  uint8_t *buffer = "Hello\n";
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
     CDC_Transmit_FS(buffer,strlen(buffer));
     HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_12);
     HAL_Delay(500);
  }
  /* USER CODE END 3 */

動作確認

microUSBをPCにつなぎ,CoolTermで動作確認をしました.
ボーレートはデフォルトの115200 bpsです.
通信中にリセットしまうとCOMポートが閉じられ,再接続が必要となるので注意してください.
f:id:FMR_CHN:20180904123010p:plain:w500

おわりに

STM32F103C8T6でUSB CDCの動作確認ができました.
次はUSB HIDなどを試してみたいです.

STM32F103C8T6 書き込み編

はじめに

友人からAliexpressで5枚入り$10.20で販売している怪しげなSTM32ボードを貰いました.

ja.aliexpress.com

その友人がレビューした記事がこちら. masa-flyu.hatenablog.com

MCUはSTM32F103C8T6.
micro-USBが付いてるけどST-Linkは未搭載.

下の記事の方はこれをArduino化するために,ブートローダー「STM32duino」を導入しています. ht-deko.com

ですがArduinoはちょっと体に合わないので,STM32として開発します.

開発環境

PC:MacBookPro
OS:macOS High Sierra
開発ソフト:SW4STM32,STM32CubeMX
ST-Link:Nucleo-64付属のもの

配線

このボードにはST-Linkが未搭載なので,ST-Linkを繋げます.
配線は以下のようにします.

STM32F103 ST-LInk
G GND
V3 3.3V
CLK SWCLK
IO SWDIO
RST NRST

書き込みと動作確認

とりあえずボード上の青LEDでLチカを試してみます.
ピンはPB12です.

CubeMXでプロジェクトを作成し,PB12を出力ピンとして設定します.

f:id:FMR_CHN:20180903195138p:plain:w500

コード生成の前に,F1のパッケージをインストールします.
Help → Manage embedded software package を開き,最新パッケージをインストールします.
ネット環境が必要なので注意してください.

f:id:FMR_CHN:20180903195539p:plain

コード生成の設定画面に行き,Toolchain / IDEをSW4STM32に設定して,generate codeを実行します.

SW4STM32の方でプロジェクトを開き,Lチカのコードをmain文に記述します.

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */
  /* USER CODE BEGIN 3 */
      HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_12);
      HAL_Delay(500);
  }
  /* USER CODE END 3 */

あとは書き込み!
青LEDがチカチカしたら成功です.

おわりに

怪しげなSTM32ボードに無事書き込みができました.
一枚あたり250円で手に入り,フツーに使えそうなので色々試していきたいです.