2014年10月19日

みんなはどのlibusbを使っているのだろうか?

疑問系だ。

LinuxやWindowsで、あるいはMacでもかもしれないが、USBデバイスを制御したいとなるとlibusbを使うことが多いんじゃなかろうか。
デバイスドライバを作ればいいのかもしれないけど、アプリ層からUSBアクセスできるというのを知ってしまうと、もういいや、と思ってしまう。

で、libusbなのだけど、バージョンが存在する。
大きくは、0.1系と1.0系だと思っている。
0.1と1.0があれば、そりゃ1.0だよねぇ。

そう思っていたんだけど、「cygwin libusb」で検索すると、ここが先頭に出てきた。

http://sourceforge.net/p/libusb-win32/wiki/Home/

Homeって書いてあるので、メインページみたいな位置づけだろうと思う。
そしてこれは、libusb-0.1系なのだ。

1.0系は、おそらくこちらがメインページ。
http://www.libusb.org/wiki/windows_backend

libusb.orgの方が本物っぽいので、一番上のページを見た。
http://www.libusb.org/wiki
表を見ると、1.0系がtrunkで、0.1系のソースを使っている人のためにcompatibleなソースも提供している、という位置づけのようだ。


で、だ。

バージョンが新しいものをみんなが使うわけじゃ無いし、新しい方がよいというばかりでもないのはよくあることだ。
それに、たとえ新しい方が良かったとしても、使われなければ無いのに等しくなる(私は、倉庫に眠るベータのビデオデッキを思い出した)。

じゃあ、みんなはどのlibusbを使っているんだろう?が気になるのだ。
長いものに巻かれる必要はないのだが、今回みたいに「USBが扱えれば良い」というものについて、マイナーなものを選択する理由がないというだけだ。

 

なんで急にlibusbのことを言い出したかというと、AndroidのADKだ。
当時はBeagleBoardにAndroidをインストールして使っていたのと、Arduinoを持っていなかったこともあり、よくわからんけど仕様書どおりにやってみようと思って、libusbで通信してみたのだ、たしか。
もう2年半も前なので、全然記憶はない・・・。
リンク先にあったgithubのリポジトリも削除していたので、著作権的にまずいと思ったか、なんか動かないとかあったのだろう。
もちろん、手元にあるソースでNexus7にアクセスしてみたけどだめだった。

[android]Lollipopゲームが難しい

Nexus7(2013)に、Lollipop Previewをインストールした。
前回はL previewという名前だったんだけど、今回はLollipopという名前が付いている。
チュッパチャップスじゃないんだ。。
インストールして起動すると、新規立ち上げと一緒なのであれこれ設定が必要になる。
が、今回は「タップアンドゴー」というものが出てきた。
タッチアンドゴーみたいな感じがするが、NFCを使うので、少し近い気がしたけど、関係はやっぱりない。
Nexus5端末(4.4が入っている)を向かい合わせると、Bluetoothを有効にするか確認され、OKするとアカウントの移行がある程度できた。
もちろん、パスワード入力は必要だけどね。2段階認証してるけど、そっちの入力は求められなかった。
今、アプリが自動でダウンロード&インストールされているところだ。
とりあえず開発者モードにでもしておくか、といつもの手順を踏もうとした。
が、間違えてイースターエッグというのか?あっちをやったようだ。
なんか、ゲームが起動した。
image
画面をタップすると、ドロイド君が跳ね、何もしないと落ちていく。
なので、手際よくタップしつつ、現れるロリポップの間をくぐり抜けていくという、横スクロール型のゲームだ。
けっこう、難しくないかい??

アプリの同期が終わったようだ。
Nexus5のホーム画面と同じアイコン並びになっている。
まあ、タップしたのがNexus5だから仕方ないけど、タブレットとは別になってる方がうれしいかな。
  • アプリ一覧画面の背景が白くなった。
  • 「ブラウザ」が追加? Chromeがアンインストールできる。
  • 「メール」が2つある・・・片方はアンインストールできたから、ダウンロードしてきたのかな

Lollipopとは関係ないのだけど、写真とかのバックアップ機能が良くわからない。
4つくらいGoogleアカウントがあり、メールを読むためだけにアカウント登録してるのだけど、どのアカウントがいつ使われているのかがわかっていないのだ。
よく読めばわかるのかねぇ。

[勉強会]スマホ連動の講義に参加した

「はじめてのスマホ連動」という講義に参加した。
http://hslinkup.doorkeeper.jp/events/15299

出不精の私にしてみれば珍しいのだが、講師の栗元さんにお会いしたことがあることと、内容に興味があることから参加させていただいた。
それと、私が今使っているBLEのモジュール、BVMCN51を製造・販売しているBraveridge社の小橋CTOが講義されるということもあり、気分が盛り上がって参加したのだ。
今でこそフリーランスになっているが、そのちょっと前までは「Braveridge社って面白そうだな」とか思っていたこともあったので、就職の面接をお願いしようかどうしようかと調べたりしててね。

ふっ、今では過ぎた話よ。


一番前の席でかぶりつきになっていたこともあり、どういう方々が参加しているかがあまりわかってない。。。
「Arduino使ったことありますか」の挙手にけっこう手が上がっていたようだったので、そういう参加状況だったのだろうと思う。

内容は、

  • 講義
  • 実習
  • Braveridge社小橋さんの講演

の3本。
詳細は省略するが、いろいろ聞けて満足。
ADKは今まで使ったことが無かったこともあり、どういう動きをするのか確認できたのが良かった。

ADKは、2年前に調べていたみたいだ。
http://hiro99ma.blogspot.com/2012/05/adk_31.html
そうだ、手近でUSB Hostできる基板があったので、USBドライバを書いてADKしてみようとしたんだった。
途中まで認識したけど、よくわからんがダメだった、で終わっている。
あれから知識が付いた今なら、もうちょっとできるだろうか?

 

小橋CTOの話も面白かった。
面白いと書くとあれだが、内容が興味深かった。
ちょっと前に、福岡が起業特区になったことを書いたけど、考えてる人は考えてますな。
特にCTOという現場で見た福岡という観点が、ね。


さて、家に帰ってきたので反省会(単なる家飲み)だ。

まず、多少二日酔い気味であったことを告白せねばなるまい。
前日が職場の歓迎会で、しかも3時くらいまで飲むなんて想定してなかったよ。。。
酒臭いってことはなかったと思うが、ちょっと鈍っていたことは否めない。

 

買ったばかりのNexus5が、役に立った。
主に、地理的なところで。。。
高校生の頃は近くに通っていたんだけど、もう20年以上前だしね。
Googleマップを見ながら移動できたので、安心であった。
Nexus7とかだと、見ながら移動するってのはちょっと難しいです。
あ、実習でデバイスドライバのインストールがうまく行ってるかどうかの確認にも役立った。

 

WindowsでのADBドライバ問題。
問題というか、端末ごとにドライバのインストールが必要になってくる。
あまりドライバを触ったことがないので推測になるが、Windowsの場合はINFファイルにUSBデバイスのVID(ベンダIDで、製造メーカーごとのIDだろう)/PID(プロダクトIDで、商品ごとのIDだろう)が書かれているので、INFファイルありきで機器を認識することになるんじゃなかろうか。
なので、INFファイルにないデバイスを接続したときには大騒ぎになる。さらにWindows Updateにドライバを探しに行く動作がデフォルトになっているため、てんやわんやだ。
たぶんだけど、LinuxやMacではlibusbのようなアプリ層で動けるようなしくみになっているから、そんなに困らないのではなかろうかね。

 

今のADKは、さらに進んでいるのか。。。
http://developer.android.com/tools/adk/adk2.html
Cortex-M3ベースみたいだ。
Bluetooth接続なんかもあるらしい。
接続がいろいろできるのはありがたいが、Bluetooth接続にするんだったら、最初からBLEを前提に検討するだろうな。
まあ、そこは使い方次第だ。

 

創業特区。
福岡に産業がないことを嘆いておられたのが新鮮だった。
仕事ないよねー、とは思っていたけど、やはりそうなんだ。
どこかに閾値があって、あるラインを越したら一斉に引いていくんかね。


めったにお外に出ないので、外の環境に触れただけですごく勉強した気になってしまう。
しかし、それだけではダメだ。
まあ、ダメって事はないだろうが、世の中としてはもうちょっと役割を演じることを期待されてるだろう。
そこら辺ですかなぁ。

2014年10月17日

[nrf51]softdevice_sys_evt_handler_set()は、何だ? - (2)

つづき。

softdevice_sys_evt_handler_set()は、nRF51 SDKのドキュメントに説明がある。
あるのだけど・・・正直なところ、なんだかよくわからない。

  • SoftDeviceからのSoCイベントを登録する関数(イベントハンドラってことかな)
  • これを呼ばなかったら、フェッチされない
  • 一度呼んだら、もうキャンセルすることはできないが、関数を差し替えることは可能

このくらい。
SoCイベントがどういうものだとか、何したらいいのかよくわからん。


よくよくドキュメントを見ていくと、「SoftDevice Handler Library」という章があり、そこに説明があるとのこと。

・・・読みつつあるが、何が言いたいのかわからん。
SoftDevice Handler Libraryは、アプリがSoftDeviceイベントを正しく取り出す(フェッチする)のを補助するAPIとのこと。
例として、S110ではBLEイベントをsd_ble_evt_get()で、SoCイベントをsd_evt_get()で取ってくる、と。しかしS210では違うのだと。

うーん、ということは、アプリにシステムから「イベントが来たよ」と通知が来ても、どのAPIを使って取得したらよいかわからないだろうから、SoftDevice Handler LibraryのAPIで呼び出してほしいコールバック関数を登録する方式にして、アプリからフェッチしなくてもよいようにしましょう、というくらいの考え方で良いのかな。

 

でも・・・でもだ。
それがble_stack_init()に入っているのは、あんまり納得できてない。
SOFTDEVICE_HANDLER_INIT()もここだし。
それなら、softdevice_init()みたいな名前にしておいて、一緒にBLEスタックの初期化も入っている方がすっきりするんじゃないかと思うのだ。

もうちょっと、自分の理解度を進めながら、スケルトンを整理していきたいな。

2014年10月15日

[nrf51]softdevice_sys_evt_handler_set()は、何だ? - (1)

 人「最近、家でなにを開発してるんですか?」(私が家でごにょごにょやってることを知ってる人)
 私「び、Bluetooth関係とか」

といってしまったので、もうちょっとちゃんと開発しよう。


ちまちまと進めているのは、以前作ったInputとOutputのサービスを持つアプリについての読解。
サービスの実装についてはなんとなくわかったんだけど、アプリについてはほとんどサンプルを使い回しているだけなので、何をやっているか把握できていないのだ。
BLEとは直接関係ないのだけど、BLEでなにかPeripheralを作ろうと考えたとき、BLE自身は多くても3~4割くらいで、残りはアプリの制御になると思っている(もちろん、BLEのプロトコルスタックはできあがっている上でだ)。

サンプルでは、BLEを使うときにble_stack_init()という関数を作り、そこに初期化をまとめているようだ。
以前はまった内蔵クロックの初期化とか、BLEスタックを死傷するためにsd_ble_enable()というAPIを呼び出したりしている。
BLEイベントのディスパッチをするsoftdevice_ble_evt_handler_set()を呼び出したりもする。

そういうのはわかるのだが、softdevice_sys_evt_handler_set()もここで呼び出している。
このAPIはBLEイベントのディスパッチャー登録と同じように、システムイベントのディスパッチャー登録をするAPIのようだ。
疑問は2つ。

  • システムイベントって、なに?
  • なんでBLEスタック初期化の中で呼び出しているの?

プレフィクスにsoftdevice_とついているので、これはSoftDeviceを使う機能全般のものじゃなかろうか。
じゃあ、BLEスタックとは切り離されてもいいんじゃないの?
なんでここで呼ぶの??

では、softdevice_sys_evt_handler_set()についてしらべようじゃないか。


と、書いているところにNordicのMLが来た。

SoftDevice S110-SD-v7が、7.1.0にバージョンアップ!
しかも、これ以前の7.x.x系はdeprecatedになるんだと。
LDCD(てきとう)もサポートすると書いてあるし。。。

そっちを先にやりましょうかね。

2014年10月11日

[nrf51]Keilを使ってみる

KeilでnRF51のs110/ble_app_hrsサンプルプロジェクトが開けたので、使ってみよう。

ツールバーはこんな感じだ。
image

左下の、箱を上から押さえつけるようなアイコンでビルド。

焼くのはその隣のLOADアイコンだと思うが、デバッグしたいときは右上のdアイコンなのかな?
main()の先頭にブレークポイントを設定してからdアイコンをクリックしてみると、nRF Toolsをアップデートした直後だったためかSEGGERのファームウェア更新が行われた。

続けて、このダイアログが出てきた。
image

OKすると、ブレークポイントに止まってくれた。
こりゃ楽じゃわい!
image

なお、ブレークポイントを設定しなくても、デバッグの開始時にはmain()で止まってくれるようだ。

 

gdb + eclipseでブレークポイントに止まらず悩んでいたことを考えると、Keilを使って開発に慣れて、バイナリのサイズが32KBじゃ足りなくなってからgccにするというのがよいような気がするな。
SoftDeviceが別バイナリだし、コンパイラがARM謹製ならサイズも小さくなりそうな気がするので、少々じゃ32KBで足りなくなるって事がなさそうだしね。

[nrf51]Keil v5でプロジェクトが開けなかった (2)

プロジェクトが開けなかった件について、コメントをいただいた。
http://hiro99ma.blogspot.com/2014/10/nrf51keil-v5-1.html?showComment=1412899880719#c7654399720798830608

Packの中にあるNordicフォルダを探し、そこからファイルを編集すればいけるらしい。
が・・・うちのKeilにはPackの中がほどんど空だった。
どうやって、これをインストールしたらいいんだ?

 

と検索すると、どうやらKeilをインストールした後でnRF51 SDKのインストーラでインストールすると、Packをインストールできるらしい。
最近はZIPファイルを解凍しているだけだったので、気付かなかったよ・・・。

msiファイルを立ち上げると、確かに候補が出てきた。
そして、インストール後にプロジェクトファイルを開くと、特にエラーも無く立ち上がった。
うーん、気付かなかったですわ・・・。

2014年10月10日

[nrf51]Keil v5でプロジェクトが開けなかった (1)

Keilを使うと比較的楽にnRF51822の開発などができる、ということだったので、インストールしてみた。
mdk512.exeだった。

あまり調べず、nRF51 SDKをインストールしたときのs110/ble_app_hrs/arm/ble_app_hrs.uvprojxを開いてみた。
うん、だめだ。

image

Packをインストールすれば良いように見えるけど、クリックしても404エラー。
その下のリンクを見たが、このサイトにはNordicが出てこない。
うーむ。

 

Legacy Support、というページがあるとのこと。
v5に対応しきれていないものをサポートするってことかな?
インストールしているが、本体と同じくらい時間がかかってる。

そして、それをインストールしてもだめだった。
とにかく、Packが入っていないのだ。
いっそのこと、v4をインストールし直そうか、というところになってきている。

2014年10月8日

[nrf51]スケジューラは結局なんなんだ? - (2)

スケジューラとタイマの関係がよくわからないので、あれこれ考えたが、動かしてみることにした。
理詰めも大切だけど、わからんことを考えても面白くない。

nRF51のテンプレートにありがちなmain()を、こう書き換えた。
timersをコメントアウトだ。

    // 初期化
    leds_init();
    //timers_init();
    gpiote_init();
    buttons_init();
    ble_stack_init();
    scheduler_init();
    gap_params_init();
    services_init();
    advertising_init();
    conn_params_init();
    sec_params_init();
    // 処理開始
    //timers_start();
    advertising_start();
    while (1) {
        //スケジュール済みイベントの実行(mainloop内で呼び出す)
        app_sched_execute();
        uint32_t err_code = sd_app_evt_wait();
        APP_ERROR_CHECK(err_code);
    }

 

動かすと・・・、はい、assertしました。
予想してなかったけど、buttons_init()でapp_error_handler()が呼ばれていた。

エラーコードは8で、発生はAPP_BUTTON_INIT()の行らしい。
8はNRF_ERROR_INVALID_STATE。

マクロをひもとくと、app_button_init()がapp_timer_create()を呼び出しているのだが、app_timer_init()を呼び出していないと設定されないmp_nodesという変数がNULLなのでエラーになっている、ということらしい。
このmp_nodesは、app_timer_init()の第4引数だ。
第4引数は、APP_TIMER_INIT()マクロを使ったときに定義されるstatic変数だ(自分でやっても良いけどね)。

そんなわけで、ボタンを使う場合には、タイマの初期化も必要だし、開始も必要と思われる。


じゃあ、結果が見えているのだけど、ボタンの処理を外してみよう。

・・・はい、assert()。
今度は、ble_conn_params_init()。
罪状は8なので、もう追うまい。


ひとまず、スケジューラというか、タイマを使うかどうかについて1つの結論が出たことになる。

  • ボタンを使う場合には、タイマも使う。
  • BLEを使う場合にも、タイマを使う。
  • そしてタイマの初期化は、それよりも先に済ませておかないといけない。

ボタンを使わないことはあると思うが、nRF51822を使っているのにBLEを使わないことは無いだろう(用途として)。
だから、基本的にタイマは初期化しておくことになると思って良かろう。

 

なんか、スケジューラの話をしていたのにこんな結論で終わったのは寂しいが、まあそういうこともあるさ。

2014年10月4日

[nrf51]スケジューラは結局なんなんだ? - (1)

またnRF51822のスケジューラで悩んでいる。
前回は、こちら。

[ble][nrf51]スケジューラーって、何よ?
http://hiro99ma.blogspot.com/2014/07/blenrf51_17.html

以前は省電力のためにwfiで待ち状態にするために使ってるんだろう、みたいなことを書いたけど、よく考えるとあれはスケジューラじゃなくてsd_app_evt_wait()だ。
ドキュメントに、スケジューラの有無でのシーケンスが書いてあるのだが、BLE Stackとアプリの間にスケジューラが挟まっているだけだ。
うーむ。


何度かシーケンスを見比べていて気付いたが、スケジューラが挟まっていない場合はBLE Stackなどの各ユニットが直接アプリとやりとりをするのだが、スケジュールが入っている場合は各ユニットではなくスケジューラがアプリとやりとりをしている。
つまり、各ユニットの占有時間が減るということだ。
この利点は、割込コンテキストで動作する時間を減らせるので、割込の取りこぼしが少なくなるとか、そういうことじゃなかろうか。
スケジューラを使えないようにできるのは、アプリのサイズを小さくしたかったり、アプリの応答性を優先させたいとかの判断があったりとか、そういうことなんかね。


もしそういう存在理由なら、スケジューラを使うからといってタイマユニットを使わないといけない、ということはないはずだ。
いや、ドキュメントのどこにもそんなことは書いてないのだけど、テンプレートでタイマの初期化だけしてあったし、スケジュールっていうと時間が関係しそうだから必須かもしれない、と思っていたのだ。

では、はずしてビルドしてみればわかるだろう。
make・・・リンクエラーだ。
そうか、ボタンのチャタリング防止(なんか単語があったが忘れた…)とか、BLEの時間制御もこれを使っているんだ。
じゃあ、BLE使うんだったらapp_timer.cが必要になるのか。
リンクするのは良いとして、初期化はアプリでやってやらんといかんのかな?

それに、今スケジューラの初期化を見て気付いたのだが、スケジューライベントの最大値をsizeof(app_timer_event_t)で与えているのだ。
理由はわからんが、やはりスケジューラにはタイマが必要ってことかい??