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 ファイルをインポートする。設定はそのままで良い
2016年 07月 11日

友達がいなくても新しい言語は学べる

プログラミングが分かってる相手に気軽に挙動について訊ける機会なんてありませんね。仕事なら同僚に訊けばいいと思いますけど、同僚が暇とは限りませんし、学生ならそういった相手がいないことが普通ではないでしょうか。

ということで、独りで言語を学ぶ方法について考えます。

作りたいものを決める

大変重要なところです。どの言語でも書けて、どの言語も多少の個性が出て、そこそこ簡単なものがいいですね。

ぼくの場合は blosxom という「テキストファイルをスキャンしてHTMLにするだけのブログツール」なんですが、まぁなんでもいいと思います。ぼくはウェブエンジニアなので、ブラウザに何か表示がでるとそれだけで嬉しいというところがあります。

リファレンスをひけるようにする

どの言語も必ずどこかに言語リファレンスがあります。必ず公式のものを一式見れる状態にします。そしてできれば Chemr とか Dash みたいな瞬間的にリファレンスをひけるツールを用意します。

リファレンスは無限にひくことになるので、多少ここに時間をかけても良いところです。

書きはじめる

とりあえず Hello, World! しましょう。Hello, World! をバカにしてはいけなくて、これは print デバッグという原始的でほとんどどんな言語でも通用するデバッグ方法を習得するために必要なことです。高級なデバッガは言語ごと、エディタごとに使い勝手が異なることが多いので、デバッグが辛すぎる状況になってから考えます。

このとき、公式にチュートリアルがあるならやってみても良いです。が、どうせチュートリアル見ても Hello, World! のやりかたぐらいしか分からないので無視しても良いです。

重要構文を覚える

  • 条件分岐 (if)
  • ループ (for)
  • リテラルの表記方法 "foo" は文字列、123 は数字など

これぐらいあればベタっと動くコードを書くことができるはずです。

クラス構文とか、そういうものはとりあえず無視しましょう。Java とか C# だとエントリポイントを書くために最初っから必要になりますが、まずはできるだけ無視します。言語特有の機能はとりあえず置いておいて、動くコードにします。

設計をなおす

多少動くものが書けそうなら、その言語で「最も良い書きかた」にできるだけ全てを直します。ここではリファレンスの特に文法をよく読んで「ぼくの考える最高に読みやすい書きかた」を探ります。とはいえ、だいたい言語ごとにセオリーが決まっているので、言語公式のライブラリとかを読むとてっとり早く雰囲気をつかめます。ただ、公式ライブラリが十分綺麗に書かれているとは限らないので、できるだけリファレンスに頼ったほうがいいと思います。

このとき大事なのは「これは読みにくいぞ」とか「オレはこう書きたいんだけど」という気持ちです。そういう自分の信念と、言語ごとの雰囲気の擦り合せを行います。できるだけ言語特有の良さを出すように書きます。最終的に「このコードは(他の言語名)から来たヤツが書いてんな」みたいな田舎臭さを消滅させることを目標とします。

友達がいなくても言語は学べるか

リファレンスをひけば大丈夫です。安心しましょう。そして Google で検索すれば大抵のわからない問題は解決します。わからなかったことは公開される形で記録しつつ解決して、検索できるようにしましょう。そうすると後続の友達がいない人に優しいインターネットになります。

2016年 07月 10日

関連エントリー (画像)

スマフォ写真をLightroomでマシにするメモ

ZenFone2 を使っているけど、お世辞にも画質が良いとはいえない。後処理でなんとかする試行錯誤をしたので記録しておく。

  • 「ノイズの低減」→「カラー」を適切に設定する
    • 画質悪いカメラのノイズで一番うるさいのでカラーノイズだと思うので…
  • 「シャープ」を適切に設定する
    • 全体的にノイジーになるが、カラーノイズを消しておけばあまり気にならず、解像感が増す
  • 「効果」→「かすみの除去」を多少強めにかける
    • レンズが多少汚れていること多いけど、これだと全体的にモヤがかかった感じになってしまう。「かすみの除去」によってかなり全体的に綺麗になる

「明瞭度」はシーンによって上げたり下げたりする。

MCD-ST Liberty SW License Agreement V2 はフリーなライセンスか?

STM32CubeMX でジェネレートされるコードは MCD-ST Liberty SW License Agreement V2 というライセンスになっています。これはコード上で以下にリンクしています。

http://www.st.com/software_license_agreement_liberty_v2

Copyright � 2015 STMicroelectronics International N.V.. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted, provided that the following conditions are met:

1. Redistribution of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
3. Neither the name of STMicroelectronics nor the names of other contributors to this software may be used to endorse or promote products derived from this software without specific written permission.
4. This software, including modifications and/or derivative works of this software, must execute solely and exclusively on microcontroller or microprocessor devices manufactured by or for STMicroelectronics.
5. Redistribution and use of this software other than as permitted under this license is void and will automatically terminate your rights under this license.


THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

  • 1はライセンス表示をそのまま残せといってるやつです
  • 2はバイナリ配布する場合もライセンス表示をどこかに表示しろという話です
  • 3はライセンス表示の名前について商標とかを気にしなくてよいという話だと思います
  • 4はこのソースコード及び派生物についてはSTマイクロのハードウェアだけで動かせということです
  • 5は許可外のことをすると権利失効しますという話です

大文字の部分は免責事項です。

基本的にSTMのデバイスで使う限りは広い使用が認められているように見えます。が、ハードを制限しているのでちゃんとフリーとはいえなそうです。

2016年 07月 09日

博多に行く機会があったので、合間を縫って周辺神社に行ってきました。それほど時間が余ると思っていなかったので、まともなカメラを持っていかず、全部スマフォ写真です。

住吉神社


博多駅から近い。歩いて15分ぐらい。それにしては境内が広くて気持ちがいい。住吉神社という通り本殿は住吉造り。ただ、本殿以外に住吉造りはない。三大住吉の一つらしい。筑前国一宮。

太宰府天満宮

いうまでもないぐらい有名なところ。菅原道真が主祭神。

境内は広いけど、本殿は案外こじんまりしている。

17時ごろに行ったけど、人が全然いなくてものすごく良かった。境内までの道にある店もすべて閉まっていた。

奥の方の山にある稲荷神社(天開稲荷社)にもいった。そこそこ登る必要がある。

本殿の裏側に梅が結構植えてあって、梅の季節は良さそう。

山のぼるときテンションが異常で、走って登ってしまった。おれの幸福はノスタルジーと孤独の中にあるのだと思った。夏の神社は最高だ。

宗像大社

東郷駅からのバスが1時間に1本あるかないかって感じで厳しい。駅前にタクシーは数台あった。

宗像大社は沖津宮・中津宮・辺津宮と三カ所に分散していて、そのうち一般に参拝可能なのが中津宮・辺津宮の二カ所、中津宮は大島という離島にあって、時間が足りないので、辺津宮だけ行った。

境内がすごく広い。17時30分ごろに着いたので、本殿は閉門していた。残念。しかし本殿が見れなくても神社は割といろいろ見ることができて良い。

高宮祭場という、神籬の木と、それを囲う石垣だけがある神域があってとても良い感じ。沖津宮がある沖ノ島は島自体がご神体であるという神奈備だったりするし、古い形が残ってる数少ない例。沖ノ島は今も厳しい神奈備のルールが適用されていて、自由な立ち入りができない。

第二宮、第三宮があるところは、入ってみるとかなりのデジャヴを感じることができる。というのも、伊勢神宮別宮の月讀宮 (ref. 神宮参り - 氾濫原 )とほとんど同じ構成になっているからで、実はこれ実際に月讀宮にあった伊佐奈岐宮と伊佐奈弥宮を移築したものという由緒がある。

交通安全で有名。交通安全祈願とは神前で交通ルールを守ることを誓うことを含むというのが面白かった。

2016年 07月 06日

関連エントリー (画像)