A certain engineer "COMPLEX"

開発メモ その94 boostを使った最小のCMakeプロジェクト その2

Introduction


前回の記事で、boostを使った簡単なクロスプラットフォームアプリを作りました。
で、それを会社でテンプレートにして手を加え、Windowsで動かしたらまったく動きませんでした。
というかビルドが通らない。

理由はlibが見つからないこと。

前回のサンプルは、libを使わず、ヘッダーだけで動作したプログラムだった模様。
なので、ちょっと修正します。
ソースは下記になります。

Explanation


まずは、CMakeLists.txt

今回の肝は、target_link_librariesの行。
コンパイラがVisual Studioなのかそうでないのかで、リンクするライブラリを変えています。

次に、main.cpp

引数で渡されたファイルが存在するかどうかを表示するだけです。

Build&Run


ビルドします。
CMakeLists.txtmain.cpが同じ階層にあるものとし、カレントディレクトリがCMakeLists.txtと同じだとします。
また、CMakeのパスは通っているものとします。

Windows

Linux

Conclusion


今度はきちんと静的リンクできています。

Source Code

https://github.com/takuya-takeuchi/Demo/tree/master/CMake2

開発メモ その93 boostを使った最小のCMakeプロジェクト

Introduction


クロスプラットフォームのアプリケーションを作成するとき、CMakeは鉄板中の鉄板ですが、魔術のようなCMakeLists.txtを書くのはうんざりします。
Visual Studioならプロパティからヘッダーの参照、ライブラリの参照、という感じでスラスラ作業できますが。

そんな中クロスプラットフォームのコンソールアプリを作る必要に駆られたのでメモ。
ソースは下記になります

といっても、ソースそのものは本質では無く、CMakeLists.txtとboostの使い方が一番の肝。
特に、boostのパスを外部から指定してビルドするのがターゲットになります。

Explanation


まずは、CMakeLists.txt

色々コメントがありますが、add_executableで実行ファイルを指定しているのと、include_directoriesでboostのパスを指定するのが肝。
特に、include_directoriesが無いと、cmakeコマンドにboostのパスを渡してもビルドに失敗します。

次に、main.cpp

円周率を表示するだけです。

Build&Run


ビルドします。
CMakeLists.txtmain.cpが同じ階層にあるものとし、カレントディレクトリがCMakeLists.txtと同じだとします。
また、CMakeのパスは通っているものとします。

上のような感じです。

Conclusion


意外とboost+CMakeの簡単なアプリという組み合わせが無くて困りました。
ましてや、boostのパスを外部から指定するタイプの完全なサンプルが無かったのです。
インストール済みのboostをfindするのはあったのですが。

Source Code

https://github.com/takuya-takeuchi/Demo/tree/master/CMake1

Bluetooth Low Energyの自作ビーコンを作る その2

Introduction


前回は、mbedのアカウント作成、ソースのコンパイルを行いました。
今回は実際にBEL Nanoにバイナリを書き込んで、動かしてみます。

Instructions


接続

BLE Nano v2をPCに接続します。
購入時は、ボードとライターが接続されていましたが、もし外したのなら、向きに注意して接続します。

ボードとライターを接続したら、PCのUSB端子に接続します。
続いて、エクスプローラーを開きます。
Macとかだと、Finderに接続したBLE Nanoがドライブとして現れるようですが...
私のWindows7はUSBハブ経由だからなのか、見つかりませんでした。

見つからない場合はmbed Windows serial port driverをインストールします。
情報はJellyWare様より。ありがとうございます。

JellyWare株式会社
人が技術を作る。技術が人の暮らしをつくる。だから、人をつなげ、何かを作り、それをまた誰かに伝えたい。JellyWareはそんな人と技術が集まるプラットフォームです。

とりあえず、Windows10はドライバ無しでも認識しました、

書き込み

いざ書き込みです。
といっても想像の通り、ドラッグアンドドロップで、前回ダウンロードしたバイナリを書き込むだけの親切設計。

実行

前回買ってきたブレッドボードに接続してみます。

そして、iPhoneあたりにBLEビーコンを検出できるアプリがあるので、それを使って検知してみます。
今回はこれを使ってみました。

Locate Beaconを App Store で
「Locate Beacon」のレビューをチェック、カスタマー評価を比較、スクリーンショットを確認、詳細情報を入手。Locate Beaconをダウンロードして iPhone、iPad、iPod tou...

UUIDは前回のmain.cppに書かれていますので、それを入力します。
そして、検知結果がこちら。

無事に動作しました。
電子工作、なかなか面白いですね。

Bluetooth Low Energyの自作ビーコンを作る その1

Introduction


IoT熱が高まってついに電子工作を始めました。

スイッチサイエンス、お世話になります。

で、何がしたいかというと、BLEビーコンを作ってみたいんですよ。
いやネット上でBLE Nanoキットを使ってサンプルは転がっているんですが、電子工作スキルなるものを習得できれば、と思います。
子供の頃はプラモデル作るのは好きでした。大丈夫でしょう。

Instructions


基本的には、JellyWare様の下記のページをなぞるだけです。

JellyWare株式会社
人が技術を作る。技術が人の暮らしをつくる。だから、人をつなげ、何かを作り、それをまた誰かに伝えたい。JellyWareはそんな人と技術が集まるプラットフォームです。

違うのは、ボリュームがない点です。
つまり、電池、コイン電池ホルダ、ジャンパワイヤ、BLE Nano v2、ブレッドボードだけを使います。
ひたすらパケットを送信するだけのビーコンです。

で、軽く記事を読むと、

  • mbed
    • ARM社のプロトタイピング用ワンボードマイコン用のプログラミング環境

が必要とのこと。Visual Studioで出来ないの?と温いことを思いますが、郷に入っては郷に従うの精神で行きます。

mbedのアカウント取得

無料出来る模様。どうやってマネタイズしているのか。
アカウント作成はここから。


Log In/Sign upを選択


Sign upを選択


メールアドレス、ユーザ名、パスワード、名前、名字、国名を入力

以上で完了です。
完了後、メールが届いて最終確認後、Sing Inできます。


Compilerを押して作業開始!!

BLE Nanoを動かす下準備

mbedはブラウザ上で作業が完結する模様。
なので、ブラウザ上でソース編集、デバイスに書き込みという往復作業になります。

まず、先の画面でCompilerをクリックすると、下記のような画面に遷移します。

ここで、右上のデバイス未選択をクリック。


表示されるダイアログの左下のAdd Platformをクリック

別ウィンドウで開発ボードの一覧がリストアップされます。


RedBearLab BLE Nanoを選択

続いて、BLE Nanoの詳細に移動しますので、画面右側中央のAdd to your Mbed Compilerをクリック


成功しました。

サンプルのインポート

次にサンプルソースをインポートします。
BLE_iBeaconというサンプルがありますので、これを自分の環境にインポートします。

画面左上のインポートをクリックします。


Source URLに先ほどのBLE_iBeaconのurlを入力し、Importを実行


成功するとプロジェクト一式が画面に表示されます

おもむろに、main.cppを見てみます。

すごくシンプルです。
main関数内で、おまじないした後は、全ての処理がbleInitComplete関数内に書いてあります。
サンプルは1秒毎にアドバタイジングパケットを送信する模様。
とりあえず、これをコンパイルします。


画面左上のコンパイルをクリック


コンパイルが始まります

が、エラーと警告。

  • Warning: #warning directive: toolchain.h has been replaced by mbed_toolchain.h, please update to mbed_toolchain.h [since mbed-os-5.3] in "extras/mbed_e7ca05fa8600/platform/toolchain.h", Line: 23, Col: 3
  • Error: Cannot open source input file "core_cmInstr.h": No such file or directory in "BLE_API/ble/services/iBeacon.h", Line: 19, Col: 27

とりあえず警告は無視して、エラーを直します。エラー行右のFix it!をクリック。

なんとライブラリを探してきて、候補を提示してくれます。
ただ、どれを選べば良いのか見当もつきません。

ということで調べてみると、

BLE Nano を mbed で iBeacon 化する - Tech Blog by Akanuma Hiroaki
前回 BLE Nano で Lチカまでやったので、今回は BLE Nano を iBeacon 化して、iOS アプリから検知してみたいと思います。 また、開発環境としては前回の記事で、 Vagran...

という記事が。
記事によれば、

ですがこのビルドを指定すると下記のようなエラーになってしまったので、 4eea097334d6 で実行しています。

とのこと。どうもインポート時に最新ビルドを持ってくるようにしたのが不味かった模様。
なので、プロジェクトを削除してもう一度インポートします。


Update all libraries to the latest revisionのチェックを外します。

警告は出ますが、コンパイルに成功し、バイナリをダウンロードできるようになりました。

まずはコンパイルとバイナリ生成が完了。

Windows 10 IoT Core での新規プロジェクト作成

Introduction


Visual Studio上で、しかもC#を使って、IoTデバイス上で動作できるアプリが簡単に作れる!!っていうのが、Microsoftのエコシステムの強みなんですけど、Visual Studioのどこから作成できるのかがわかりにくいのでメモ。

Instructions


Application Types

まず前提として、IoTデバイス上で動作するアプリは

  • GUIあり (UWP)
    • Foreground Apps
  • GUIなし(UWP)
    • Background Apps
  • 非UWP (C++のみ)
    • Non-UWP Apps

の3種になります。
パフォーマンスとか考えると、C++の非UWPって気もしますが、そもそもパフォーマンス云々ならWindows IoTなんか選択しません。

Windows IoTを選ぶのは、開発効率の高さ、既存資産の流用、多数の言語サポートなのですから。

Foreground Apps

で、前述の通り、GUIなら選択肢はForeground Appsしかないといっています。
Developing foreground applicationsによれば、

All of the standard UWP languages and project templates are fully supported on IoT Core.

訳: 全ての基本的なUWPの言語及びプロジェクトテンプレートはIoTコア上で完全にサポートされます。

とあるので、普通にUWPアプリを作ればそれで動くはずです。

Background Apps

問題は、GUIを使わないタイプ。
Background Appとよばれる、このタイプはコンソールアプリなのですが、従来のMainメソッドから構成されるものとは異なり、どちらかといえばサービスアプリケーションに近い印象を受けます。そもそもコンソール画面は表示されないので、コンソールアプリとも言えませんが。

Background Appsを作成するには、Windows.ApplicationModel.Background.IBackgroundTask インターフェイスを継承したクラスを作成するだけです。
そのクラスはタスクとして扱われ、バックグラウンドで実行されるという仕組みです。

サンプルを見る限りは非常に簡単ですが、ここはテンプレートを利用しましょう。
というか、MSDNにもそう書いてあります。
でも、Visual Studioをインストールしてもテンプレートは存在せず、Visual Studio Marketplaceから入手せよとのこと。えぇ...

入手したインストーラを実行し、新しいプロジェクトを開くと、Windows IoT Coreが追加されます。


ターゲットのWindows 10のビルドを選択します。

作成されたプロジェクトは、StartupTask.csというソースが一つ(+他の細々したもの)というシンプルなものです。

これを元に作成していけば、アイデアを形に出来るでしょう。きっと。