2016年 07月 31日

OS X で KiCAD を使う際の注意点

前提

どのOSでもレンダリングは遅くて、多少乱れるので、OS X だから遅いのかな〜とか考える必要はない。

OS X 固有の話

  • pcbnew / eeschema は一定の大きさまでウィンドウを広げると刺さります
    • GPU のメモリとかに左右されるかもしれません
    • 自分の環境で「ギリギリまで広げられる範囲」を見つける必要があります
    • Retina だとちょっと広げただけで刺さるので、Retina ではない外部ディスプレイを使いましょう。内蔵Retina に限らず、ppi 高いディスプレイだと使いにくいのでダメです……
  • pcbnew を起動したときOpenGL ビューの初期化に失敗します
    • 気にしないで起動してから OpenGL ビューに変えれば普通に動きます
    • または標準ビューにしましょう
  • pcbnew はズームレベルを広げすぎる(俯瞰にしすぎる)と刺さります
    • うっかりマウスホイールを回転しすぎないようにしましょう
    • これが一番困ります

eeschema / pcbnew 共通の罠

  • ホイール使うとポインタが飛ぶ!!
    • 「設定」から「拡大縮小時にカーソルを中心へ移動」のチェックを外します
  • 中クリックしながらドラッグでパンする機能が動かない
    • 「設定」から「画面のパンにマウスの中ボタンを使用」にチェックを入れます
    • 一回ウィンドウの内側を左クリックすると動いたりします
  • フットプリントの関連づけに自分の部品がでない
    • 既存ライブラリにある部品名とかぶっていると出ないことがあります (優先順位による)

pcbnew の罠

  • 描画モードによって機能が変わります
    • 部品を一括で並べかえる機能はデフォルトのビューじゃないと使えません
    • おしのけ配線は OpenGL のビューじゃないと使えません
  • 部品を一括で並べかえる機能は基板外形がないと機能しません
    • チュートリアル的なPDFだと外形なしでやってる風なんですが、できません
  • 配線の undo できない
    • 配線ツールを選択している状態だと undo できないので ESC 連打して通常の選択ツールにします。するとなんと undo できます。
  • 全配線の ripup
    • 標準描画モードにして、全体を選択する。このとき選択対象にワイヤーとviaを入れる。選択されたら削除する
  • 配線を維持してコンポーネントの移動
    • OpenGL ビューだとできません
    • 標準ビューだと回路図エディタと同様に G でできる
  • ここにさらに追記されます

OS X で KiCAD を使う際の注意点

前提

どのOSでもレンダリングは遅くて、多少乱れるので、OS X だから遅いのかな〜とか考える必要はない。

OS X 固有の話

  • pcbnew / eeschema は一定の大きさまでウィンドウを広げると刺さります
    • GPU のメモリとかに左右されるかもしれません
    • 自分の環境で「ギリギリまで広げられる範囲」を見つける必要があります
    • Retina だとちょっと広げただけで刺さるので、Retina ではない外部ディスプレイを使いましょう。内蔵Retina に限らず、ppi 高いディスプレイだと使いにくいのでダメです……
  • pcbnew を起動したときOpenGL ビューの初期化に失敗します
    • 気にしないで起動してから OpenGL ビューに変えれば普通に動きます
    • または標準ビューにしましょう
  • pcbnew はズームレベルを広げすぎる(俯瞰にしすぎる)と刺さります
    • うっかりマウスホイールを回転しすぎないようにしましょう
    • これが一番困ります

eeschema / pcbnew 共通の罠

  • ホイール使うとポインタが飛ぶ!!
    • 「設定」から「拡大縮小時にカーソルを中心へ移動」のチェックを外します
  • 中クリックしながらドラッグでパンする機能が動かない
    • 「設定」から「画面のパンにマウスの中ボタンを使用」にチェックを入れます
    • 一回ウィンドウの内側を左クリックすると動いたりします
  • フットプリントの関連づけに自分の部品がでない
    • 既存ライブラリにある部品名とかぶっていると出ないことがあります (優先順位による)

pcbnew の罠

  • 描画モードによって機能が変わります
    • 部品を一括で並べかえる機能はデフォルトのビューじゃないと使えません
    • おしのけ配線は OpenGL のビューじゃないと使えません
  • 部品を一括で並べかえる機能は基板外形がないと機能しません
    • チュートリアル的なPDFだと外形なしでやってる風なんですが、できません
  • 配線の undo できない
    • 配線ツールを選択している状態だと undo できないので ESC 連打して通常の選択ツールにします。するとなんと undo できます。
  • 全配線の ripup
    • 標準描画モードにして、全体を選択する。このとき選択対象にワイヤーとviaを入れる。選択されたら削除する
  • 配線を維持してコンポーネントの移動
    • OpenGL ビューだとできません
    • 標準ビューだと回路図エディタと同様に G でできる
  • ここにさらに追記されます
2016年 07月 25日

KiCAD で複数ボードプロジェクトを運用する

背景

KiCAD は1つのプロジェクトにつき1つのボードしか作れない。小さな基板であれば1つの基板にVカットを入れるでいいが、どうしても複数ボードとして設計したい場合に困る。

複数プロジェクトにして回路図をわけると、今度はこの回路図間でコピペが動かないという問題が発生する。KiCAD はプロジェクト間のブロックコピー・ペーストができない。

階層シート

KiCAD は階層シートという、回路図については複数ページに分けて書く機能をサポートする。これは部分的に別の .sch 回路図ファイルとして分離して、プロジェクトルートの回路図から参照するという形をとる。名前の通り、これはツリー上にすることができる。

考えたやりかた

考えかた

  • 全体を管理するプロジェクトとルート回路図を作る
  • 各基板ごとに階層シートとして回路図ファイルを分離する
  • 各基板ごとに別のプロジェクトとルート回路図を作る
  • 各基板のルート回路図から全体を管理するプロジェクトの階層シートを参照する

これで原理的には全体を管理するプロジェクトのルート回路図を開いて各階層シート(モジュール)に入ったり出たりして図を書け、各基板ごとのプロジェクトのルート回路図を開けば各基板ごとだけのネットリストを吐ける。

実際のオペレーション

ルートに何も置かず、それぞれのボードごとに階層シートとして、まず全て設計する。このとき作る回路図を Root.sch とする。階層シートはそれぞれ _module_a.sch とか、あとあと被らないような命名にしておく。

全体ができたら (できる前でもいいけど)、Root.sch をモジュール数分だけコピーする。これは KiCAD 上ではできないので適当にターミナルとかでやる

$ cp Root.sch ModuleA.sch
$ cp Root-cache.lib ModuleA-cache.lib

cache.lib もコピーしないとダメ。

この状態で KiCAD のプロジェクトビューを更新すると、コピーした回路図が見えるので開く。開いてから保存すると勝手に ModuleA.pro が作られて別プロジェクトとなる。ModuleA.sch ではボードに実装したい階層シート以外を削除する。ModuleA.sch はこれで1つのボードに対応する回路図となる。

他のモジュールも同じようにコピーして必要な階層シートだけを残す。

結果的にできる構造

Root.sch
  _module_a.sch
  _module_b.sch
 
ModuleA.sch
  _module_a.sch

ModuleB.sch
  _module_b.sch

それぞれキャメルケースのファイル名の回路図がルート回路図で、_ から始まるスネークケースのファイル名の回路図が階層化回路図になっていて、上記のような参照関係になる。

こうすると、Root.sch で全体を見ながら各階層化回路図に変更をかけたことが、個々のモジュール用回路図にも反映される。ネットリストはモジュールごとの回路図から生成するので、これでボードごとのネットリスト出力ができる (Root.sch に対応する kicad_pcb ファイルは作らない)。

ワークフロー

基本的に Root.sch 開いた状態で階層化回路図を編集する。

これで保存をして閉じて、ModuleA.sch を開くと、編集が反映された状態になっている。この状態でフットプリントの関連付け、及びネットリスト出力をして pcbnew すると、該当する基板の部品だけを出せる。

ネットリスト・pcbnew した後は以下のようになる

Root.sch はあくまで全体管理用なのでネットリストとかは出さない。

.sch 間のコピペ

コピペ対象の回路図が階層化回路図になっていなければならない。なので、全体を見ながらモジュールの構成をしたいときは Root.sch を開いてそれぞれコピペ(ブロックを保存)することになる。

他に方法はないのか

わかりません。普通に全部を吐きだしたネットリストから、うまいこと各階層シートごとのネットリストだけ分離するようなスクリプトを書けばもっと楽に管理できるかもしれません。

標準のネットリストファイルはS式なんですが、ちょっと見た感じだと簡単にはできない気がしました。

2016年 07月 20日

HHKB を左右分割エルゴノミクスキーボードにする (OSX)

標題の通りですが HHKB を半分に割ってブチ壊すみたいな話ではないのでご安心ください。

  1. HHKBを2台用意します。
  2. HHKB 2台を横に並べます
  3. Karabiner を入れます
  4. 完成です

通常、キーボードを複数繋いでも、修飾キーは各キーボードごとに独立して管理されます。なので、2台キーボードを繋いで並べたとしても右のキーボードでShiftを押しながら左のキーボードのaを押してAを入力するみたいなことができません。

Karabiner を入れるとこの問題が解決します。インストールするだけで、全てのキーボードで修飾キーが共有されるようになり、同一のキーボード2台があれば左右分割のエルゴノミクスキーボードっぽく使うことができるようになります。

 -

5.0 / 5.0


背景

ErgoDox を見てから左右分割キーボードに対して興味が沸いたので、簡単に試せる方法を探していました。Karabiner の機能ページを見てみたら修飾キーを共有する機能が書いてあったので「これでできるやん」と思いやってみました。HHKB は自宅用と会社用とかで2台持っている人も多いと思うので、意外と試しやすいのではないでしょうか?

あと ErgoDox って結構高価なので、不安なら価値が安定しているHHKB2台買っても良いのではないしょうか。僕は1台は貰いものなので他人のこと言えませんが……

感想

最初の5分ぐらいは同じキー配列にも関わらず、ちょっと頭が混乱していてうまく打てませんでした。少ししたら全く問題なく打てるようにはなりました。しかしパスワードはかなり複雑で特殊な打ちかたをしていたのでうまく打てません。

とりあえず使うにはこれでもいいんですが、使い続けようと思うと会社用と家用に2台ずつHHKBが必要になって大変コスパが悪そうです。また、修飾キー共有をソフトウェアに頼っているので環境が限定されます。

左右分割すればエルゴノミクスなのか?

知るかよ

BLE Nano + mbed の Serial の実装がつらい感じだった

I2C がうまく動かなくて調べていたら、どうやら UART を使おうとすると競合するようでした。確かにピン配置を見ると CTS/RTS と SDA/SCL はかぶっています。これは事前に知っていましたが、RXD と TXD とはかぶっていないので、問題なく使えると思っていました。

しかし実際は Serial を使おうとすると問答無用で該当ピンが CTS/RTS が設定されるコードがハードコードされています。

serial_api.c

TXD/RXD は外部から渡せるようになっているのに、CTS/RTS は決め打ちで勝手に機能割当されます。なんやねん。

解決方法

Serial を初期化したあと、CTS/RTS の機能割当をはずせば良いようです。すなわち

NRF_UART0->PSELRTS = 0xFFFFFFFFUL;
NRF_UART0->PSELCTS = 0xFFFFFFFFUL;

というようなコードを main を最初あたりに入れておけば良いです。0xFFFFFFFFUL は Disconnected を表す定数です (NC という定数になっていますが型が違うのでリテラルで書いてます)

2016年 07月 19日

sdkman を自分で入れておいて…

.zshrc に勝手に sdkman とやらの設定が入っていて、コワッと思った。しかし sdkman は gradle をインストールするときに確かに自分で入れたのであった。

しかし名前がひどい。Java 関係のツールを簡単に入れれるツールという感じだけど名前に Java 感が一切ない。つらい。

2016年 07月 18日

BLE Nano の開発 - ブレッドボード配線

BLE Nano とは

http://redbearlab.com/blenano/

技適が通ってる小さい BLE 組込みの ARM SOC です。

開発環境

とりあえず mbed のオンラインコンパイラを使っています。というのもライブラリのリンクとかでハマるのが嫌だったからです。が、そのうち platformio で gcc ベースの開発はしたいところです。

BLE Nano + ブレッドボード

(この写真は MK20 のピンヘッダのうち、USBコネクタ側のピン2つが立っておらずスルーホールのままなので見間違えないように気をつける必要があります。MK20 + BLE Nano のセットを買ったら最初からピンヘッダはんだ付け済みでこうなっていたので、セットで買ってる限りは問題ないと思いますが…)

MK20 という書きこみ装置に亀の子的に挿して開発ができるんですが、これだと単に書きこめるってだけで周辺回路が作れないので、ブレッドボードに接続します。

必要な接続がいまいちわかりにくいですが、以下を接続すれば良さそうです。

  • SWCLK
  • SWDIO
  • VDD または VIN
  • GND

加えて、デバッグするなら

  • TXD
  • RXD

VDD は 1.8〜3.3V、VIN には 3.3V〜13V となっています。要は VIN にはレギュレータがついていて、VDD は直接入力になっているようです。

GPIO の入力範囲は?

VDD + 0.3 が絶対定格。5V トレラントとかではないので注意が必要そう。MK20 は裏面のジャンパで 1.8V モードにできる。低い外部電圧を使いつつ開発したい場合は 1.8V モードにする必要がある。

定格とかはnRF51822のダウンロードページから、nRF51822-PS (nRF51822 Product Specification) をダウンロードして見ればわかる。

レジスタ一覧とかは同じくnRF51822のダウンロードページから、nRF51 RM (nRF51 Series Reference Manual) を見れば書いてある。

オンラインコンパイラでもvimで開発したい

moco 使うといいです!!! https://github.com/hotchpotch/moco

以下のようにするとよさそう

  • ~/.mocorc に mbed のアカウント情報を書いておく
  • mbed オンラインコンパイラでプロジェクトの雛形を作ってpublish
  • hg 経由で手元にもってくる
  • プロジェクトルートに .mocorc を置いて、platform とかを指定する

OSX + BLE で HID over GATT でペアリング(bonding)ができなくてハマった

BLE Nano + mbed で HID over GATT しようとして1日ハマっていたので記録しておきます。HID の問題というよりペアリングの問題です。

前提

OS X El Capitan 10.11.5(15F34)

HID over GATT は Battery Service と DeviceInformationService と HIDService を提供します。

Battery Service と DeviceInformationService は mbed の BLE_API に含まれています。これはどちらのどの characteristics も open link (ペアリングなしで全ての情報を得られる) で公開しています。

HIDService は BLE_HID というライブラリに含まれています。これの characteristics は暗号化必須になっています。

問題

OS X でどうしてもペアリングが行なわれず、HID サービスが全く見えない状態でした。

Anrdoid や Windows 10 では問題なくペアリングできました。

OS X での挙動を詳細にすると

  • Bluetooth 機器一覧にでる
  • 「ペアリング」ボタンがでる
  • デバイスとの接続はできる
  • 「接続中」のまま止まり、パスコードなどを訊かれない

デバイス側のデバッグログ的には

  • onConnect は呼ばれる
  • セキュリティ関係のコールバックは一切呼ばれない

で、かなりお手上げでした。

解明と解決

OSX ではどうやら、何らかの条件で open link な characteristics があると bonding を行おうせず限定的なアクセスになり、HID サービスが見えないようでした。

仕方ないので BatteryService.h と DeviceInformationService.h をコピーして中身を書きかえて、requireSecurity(SecurityManager::SECURITY_MODE_ENCRYPTION_NO_MITM) するように変えました。外部から変えるAPIがないので辛い感じです。

BLE Nano + mbed の ADC の基準電圧

BLE Nano + mbed での ADC の基準電圧は VDD の 1/3 になっています。当然ながら VDD が変動するケースではこの基準は受け入れられません。BLE Nano は性質的に電池駆動するケースも多々あるでしょうから、デフォルトでVDD基準なのは解せない仕様です。

mbed には基準を変更する API などがないので、自力で設定します。BLE Nano には内部バンドギャップリファレンスの 1.2V もあるので、これを使うようにします。

	NRF_ADC->CONFIG =
		(ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
		(ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
		(ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) |
		(ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos);

ADC_CONFIG_REFSEL_VBG がバンドギャップリファレンスを使うようにする部分です。あとの部分は元のままです。なお、アナログ入力側には1/3の分圧が入っています。

mbed のライブラリ側ではこれらのオプションを保持して ADC を行うようなコードに(今のところは)なっているので、AnalogIn 初期化後に一度設定すればずっと有効です。

備考:VDD の電圧を測りたい場合

VDD の電圧をADCしたい場合は、外部接続しなくとも INPSEL を ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling にすればできそうです。mbed 側では対応していませんが、現状の実装だと、CONFIG を書きかえてから、AnalogIn (なんでもいい) を read すればいけそうな雰囲気です。

備考:mbed 側の実装

TARGET_MCU_NRF51822 の analogin_api.c に実装があります。

    NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
                      (ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
                      (ADC_CONFIG_REFSEL_SupplyOneThirdPrescaling << ADC_CONFIG_REFSEL_Pos) |
                      (analogInputPin << ADC_CONFIG_PSEL_Pos) |
2016年 07月 17日

Inkscape で作図したファイルを KiCAD の pcbnew で読みこむ

  • Inkscape 側で Save a Copy... の画面で Desktop Cutting Plotter (AutoCAD DXF R14) (*.dxf) を選択する。
  • このとき Base unit を mm にしておく
  • KiCAD pcbnew 側で DXF ファイルをインポートする。設定はそのままで良い