IoT システム開発スタートアップを読んで手を動かしてみたときのメモ

Published on Thursday, January 11, 2018

先月「IoT システム開発スタートアップ-プロトタイプで全レイヤをつなぐ」を読んだときのメモ。

BLESerial3 を使う

本では BLESerial2 を使っていたがすでに生産が停止されているようで手に入らなかったので BLESerial3 を使った。BLESerial2 と BLESerial3 ではマイコンとの接続方法が微妙に異なる。前者は マイコンの TX は モジュールの TX、RX は RX に接続するが、後者の場合は TX は RX、RX は TX に接続する。 なので BLESerial3 を使う場合は本の通りに接続しても期待通りに動かない。「BLEモジュール BLESerial3 の紹介」の「3.3V系マイコンとの接続例」を参考にした。

ゲートウェイ(BLE Central)のプログラム

BLESerail3 が送信したデータを Raspberry Pi 上の Windows 10 IoT で受信するためのコードを書く必要があるが、本にあるコードでは上手くいかなかった。代わりに下記のコードでとりあえず動いた。UWP の Bluetooth GATT Client 用 API のドキュメント を参考にした。

private async void HookGattCharacteristicAsync()
{
    // 結局デバイスの名前指定して取ることにした。
    deviceInfos = await DeviceInformation.FindAllAsync(
        BluetoothLEDevice.GetDeviceSelectorFromDeviceName("BLESerial_0")
        );

    if (deviceInfos == null || deviceInfos.Count != 1) return;

    BluetoothLEDevice bleDevice = await BluetoothLEDevice.FromIdAsync(deviceInfos.First().Id);

    GattDeviceServicesResult gattDeviceServices = await bleDevice.GetGattServicesForUuidAsync(GattServiceGuid);

    if (gattDeviceServices.Status == GattCommunicationStatus.Success)
    {
        gattCharacteristics = await gattDeviceServices.Services.First().GetCharacteristicsForUuidAsync(GattCharacteristicGuid);

        if (this.gattCharacteristics.Status == GattCommunicationStatus.Success)
        {
            var gattCharacteristic = this.gattCharacteristics.Characteristics.First();

            // CCCD への書き込みが必要。これがないとイベントハンドラが呼ばれない。
            GattCommunicationStatus status
                = await gattCharacteristic.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify);

            if (status == GattCommunicationStatus.Success)
            {
                gattCharacteristic.ValueChanged += GattCharacteristic_ValueChanged;
            }
        }
    }
}

Bing Image Search API v7 を使う

害鳥検出システムの教師データ用の画像収集プログラムで Bing Image Search API v5 を使っているが、v7 があったのでそちらを使ってみた。本では検索結果の重複を避けるため、現在のオフセットに、1回のクエリで取得する最大件数と nextOffsetAddCount を加えたものを次回クエリのオフセットに指定している。

offset += BING_SKIP + result['nextOffsetAddCount'] # v5

v7 では nextOffsetAddCount は存在しない。代わりに nextOffset の値をそのまま次回クエリのオフセットに指定する。

offset = result['nextOffset'] # v7

必要なもの

本の4章の始めの方に必要な部品やハードウェアのリストがあるが、そこに載ってあるもの以外に下記が必要となる。

  • Micro SD カード(これに Windows 10 IoT を書き込んで Raspberry Pi に挿す)
  • Micro SD カードの Reader/Writer(書き込む用)
  • A-B USB ケーブル(PC と Arduino 接続用)