masato-ka's diary

日々思ったこととか、やったことの備忘録。

SORACOM BeamにGoogle Cloud IoT Coreへの接続設定をソラコムのAPI経由で設定する。

この記事について

この記事ではSORACOM APIを使って Google Cloud IoT Coreへの接続設定を行う方法を記載します。前回の記事ではSORACOMの管理画面からSORACOM Beamの設定を行い、Cloud IoT Coreへの接続設定を行いましたが今回はソラコムが提供するWEB APIを利用して設定を行ってみます。基本的にAPIを叩くだけですが、SORACOM BeamのCloud IoT Core向け設定をAPIで実効する方法など公式ドキュメント化されていない箇所があるので備忘録的に記載しています。

APIで接続設定する利点

前回の記事にも記載しましたが、SORACOM BeamからCloud IoT Coreへ接続する場合、Cloud IoT Coreに登録したデバイスとSORACOM Beamの設定は一対一の関係にする必要があります。これはCloud IoT Coreではデバイスが個別の証明書(秘密鍵)を持つのに対して、SORACOM Beamの仕様では1設定ごと(=1グループ)に証明書を1つしか設定できないことが理由です。そのため、複数のデバイスを接続するためにはデバイス(=SORACOM Air SIM)ごとにグループを作成し、SORACOM Beamの設定を行う必要があります。

f:id:masato-ka:20180623131229p:plain
GCPのデバイス設定とSORACOM Beam設定は一対一

複数の設定をSORACOM のユーザコンソールから設定するのは煩雑ですが、SORACOM Beamの設定はSORACOM APIから設定することができるため、APIでグループの作成と、SORACOM Beamの設定をすることで煩雑さから解放されます。この方法がわかればCloud IoT Coreの設定と合わせて管理ツールを作ることもできます。

APIからの設定

 ソラコムの提供するサービスは全てAPI経由で設定を行うことができます。当然Beamの設定についてもAPIから設定を行うことができます。今回はAPIのクライアントとしてCURLコマンドを利用します。その他のクライアントを使う場合は適宜よみかえを行ってください。soracom-cliAPI のSwaggerドキュメント、各言語のAPIクライアントライブラリが存在しています。現在のバージョンでは証明書の登録ができませんが、私が開発しているVisual Studio CodeのExtentionも利用できます。

 Cloud IoT Coreの設定やデバイスの登録、証明書の発行については以下の過去記事を参考にしてください。

masato-ka.hatenablog.com

なお以降のサンプルでは「//」をコメントとして扱っています。必要に応じて取り除いてください。

証明書の登録

まずはじめにCloud IoT Coreに接続するための認証情報を登録します。あらかじめ、Cloud IoT Coreにデバイスを登録する際に設定した公開鍵のついとなる秘密鍵を用意しておきます。以下のリクエスト送ることで、credential-device01と言うcredentialIDを持つ認証情報を作成することができます。

curl -X POST --header 'Content-Type: application/json;charset=UTF-8' --header 'Accept: application/json' \
--header 'X-Soracom-API-Key: API KEY' \
--header 'X-Soracom-Token: APIのトークン' \
-d '  {
    "description": "api-registry", //(1)
    "type": "googleIoT-credentials", //(2)
    "credentials": {//(3)
      "projectId": "careful-maxim-150804", 
      "region": "us-central1", 
      "registryId": "my-registry", 
      "deviceId": "newcamer", 
      "algorithm": "RS256", 
      "privateKey":"-----BEGIN RSA PRIVATE KEY-----\n..."(4)
    }
}' 'https://api.soracom.io/v1/credentials/credential-device01' //(5)
  • (1) 認証情報の概要を記載しておきます。
  • (2) type要素にCloud IoT Coreの認証情報であることを指定しておきます。
  • (3) credentials要素内ではCloud IoT Coreへの接続情報を入れます。Userコンソール画面を参考に入力します。先述の過去記事を参考にしてください。
  • (4) privateKeyにはpem形式の秘密鍵を設定します。この際、改行を「\n」に置き換えて1行の文字列として貼り付けてください。
  • (5) 認証情報のIDはAPIのパスバリューとして私ます。上記の例ではURL末尾のcredential-device01がcredentialIDとなります。任意の値を指定してください。デバイスごとに認証情報を使う必要があるため、「credential-デバイスID」など命名規則を決めておくと良いでしょう。

credentialIDは次のSORACOM Beamの設定で利用するため書き留めておきましょう。

SORACOM Beamの設定

SORACOM Beamの設定はSIMグループに対して設定します。また、SORACOM BeamからCloud IoT Coreへ接続する場合は前述の通り、1デバイスにつき、1グループが必要になります。そこで、API/groups エンドポイントに対して以下のリクエストを投げ、SIMグループの作成とSORACOM Beamの設定を行います。リクエストに成功した場合、レスポンスボディにgroupIdが含まれていますので書き留めておきましょう。SIMをグループに追加する際に利用します。

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' \
--header 'X-Soracom-API-Key: APIキー' \
--header 'X-Soracom-Token: APIトークン' \
-d ' {
    "configuration": {
      "SoracomBeam": {
        "mqtt://beam.soracom.io:1883": {
          "enabled": true,
          "name": "IoTCore",// (1)任意の設定名を追加する。
          "addEquipmentHeader": false,
          "addSignature": false,
          "addSubscriberHeader": false,
          "customHeaders": {},
          "skipStatusCode": false,
          "useClientCert": false,
          "useGoogleIoT": true,
          "googleIoTCredential": {
            "$credentialsId": "credential-device01" //(2)証明書の登録で登録した認証情報を指定する。
          },
          "addDeviceIdHeader": false,
          "destination": "mqtts://mqtt.googleapis.com:8883"//(3)Cloud IoT Coreの設定
        }
      }
    },
    "tags": {
      "name": "IoTCore2" //(4) グループ名固有の名前になるよう、デバイス名などを指定しておく。
    }
  }' 'https://api.soracom.io/v1/groups'

グループに対する設定はconfigurationセクションで行われます。また、SORACOM Beamへの設定はその中のSoracomBeamネームスペースに設定を記載します。各設定の要点を以下にまとめています。

  • (1) SORACOM Beamの設定名、任意の名前を指定可能。
  • (2) 「証明書の登録セクションで設定した認証情報を指定する。」
  • (3) Cloud IoT Coreのエンドポイントの設定 固定値になります。
  • (4) グループ名、どのデバイスの設定かわかりやすくするため、デバイス名+Groupなど命名規則を決めておくといいと思います。

なお、SORACOM Technology Camp の際に質問し回答をいただいた範囲ではグループ作成の上限数は決まっていないとのことです。

GroupへSIMを追加する。

以下のリクエストでSIMをグループに追加します。

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' \
--header 'X-Soracom-API-Key: APIキー' \
--header 'X-Soracom-Token: APIトークン' \
-d '{
  "groupId": "グループ作成時に取得した値",
}' 'https://api.soracom.io/v1/subscribers/{imsi}/set_group'

groupIdを記録し忘れた場合は以下のAPIを実効することでグループの情報を再度確認することができます。このリクエストは/v1/groupsのエンドポイントにリクエストパラメータでタグ名とその値のクエリを渡して検索しています。SORACOM Beamの設定でリクエストとして送ったJSON(4)の要素を指定しています。もしグループのタグ情報としてnameを指定していない場合は適宜グループの検索条件を指定してください。また、リクエストパラメータを設定しない場合は全てのグループを取得することが可能です。

https://api.soracom.io/v1/groups?tag_name=name&tag_value=IoTCore&tag_value_match_mode=exact

以上で設定は完了となります。追加したSIMを使いSORACOM BeamのMQTTエンドポイントmqtt://beam.soracom.io:1883へpub-subすることでCloud IoT Coreにメッセージが送れるようになります。

まとめ

 今回はSORACOM Beamの設定のみでしたが、Google Cloud IoT Coreへのデバイス追加を行うGCPAPIと組み合わせればデバイス追加を行うための管理サービスを作ることができます。実際に運用するためには証明書の管理などポイントがあると思いますが、小規模なデバイスを管理するのであればこの方法で十分ではないでしょうか。証明書自身はサーバ側で作り、ファイルに保存することなく、SORACOMとGCPの証明書管理サービスに投げ込めばセキュアに実現できるでしょうか。

Google IoT CoreとSORACOM Beamをつなげてみた。

この記事について

前回はGoogle Cloud IoT Core(以下 IoT Core)とSORACOM Beamを連携させた場合のメリットデメリットについて考察しました。今回はIoT CoreとSORACOM Beamを接続する設定方法について説明します。GCPのコンソール画面とSORACOM Beamの基本的な設定方法には触れませんので公式を参考にしてください。 前回までの記事は以下です。

masato-ka.hatenablog.com

IoT Coreの準備

GCPGetting StartedBefore you beginを参考にCloud IoT Coreを 利用できるようにしてください。クラインとのインストールは実施しなくても大丈夫です。IoT Core利用の準備は以下の手順で行います。  もちろんそれぞれの手順は公式チュートリアルに記載があります。特別な設定はないですが、SORACOM Beam連携でのポイントを説明します。

  1. レジストリの作成(MQTTSエンドポイントを作成する。)
  2. バイス認証用CA証明書の作成
  3. バイス登録

レジストリの作成

レジストリ作成時は「レジストリID」、「リージョン」の値が必要になるので控えておいてください。下の画像だと「hogehoge」,「us-central1」が必要な値です。 またプロトコルの「MQTTにチェックが」入っていることを確認します。「cloud pub/sub」のトピック名も設定してください。Cloud IoTは受信したデータはここで設定した Cloud Pub/Subのトピックに送られます。レジストリへの証明書登録はオプションのため、必要ありません。

f:id:masato-ka:20180411081131p:plain

CA証明書の作成

CA証明書は以下のコマンドで作成します。opensslがない場合はあらかじめインストールしてください。RSA256 2048bitのキーサイズです。

> openssl genrsa -out rsa_private.pem 2048
> openssl rsa -in rsa_private.pem -pubout -out rsa_cert.pem

バイスの登録

バイス 登録を行う場合は端末 IDをメモってください。以下の画像中の「my-device」です。認証の項目で入力方法を「アップロード」 を選択して公開鍵の選択します。作成した証明書に従って「RS256」を選択してください。他の選択肢は「ES256」のみ利用できます。 残り二つはおそらくSORACOM側で選択できません。デバイスを登録する際に証明書のアップロードが求められるので作成した証明書のうち、 公開鍵を設定します。上記コマンド実行の場合は「rsa_cert.pem」です。手動で入力する場合はファイルの内容をコピペしてください。

f:id:masato-ka:20180411081149p:plain

SORACOM Beamの準備

次に SORACOM Beam側の設定です。あらかじめ、グループを作成し、接続に使うSIMをグループへ所属させてください。

SORACOM Beamの設定

グループ設定からSORACOM BeamのMQTTエントリポイントを作成します。種別はGoogle IoTを選択して認証情報を新規に登録します。

f:id:masato-ka:20180411082025p:plain

認証情報IDは任意の値を入力してください。種別がGoogle IoT 認証情報になっていることを確認します。ProjectIDにはGCPのプロジェクト IDを入力します。RegionにIoT Coreのリージョン情報(今回はus-central1)Registry ID(my-registry), Device ID (my-device)を入力します。AlgorithmはRS256を選択します。private keyには作成したCA証明書のプライベートキーを設定します。「-----BEGIN RSA PRIVATE KEY-----」から「-----END RSA PRIVATE KEY-----」までコピペしてください。

f:id:masato-ka:20180411082623p:plain

以上で設定は完了となります。

クライアント

利用方法はSORACOM Beamのエンドポイントmqtt://beam.soracom.io:1883に接続し、IoT Coreのテレメトリデータトピック「'/devices/{device ID}/events'」にパブリッシュするのみです。もちろん、サブスクライブと他のIoT Coreのトピックにメッセージを投げることができます。Pythonでクライアントコードを作成しました。接続後、「Cloud IoT Core」を投げて終了します。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import paho.mqtt.client as mqtt

host = 'beam.soracom.io'
port = 1883
project_id = '' # Please setting your Project ID.
cloud_region = '' # Please setting your Region.
registry_id = '' # Please setting your registry ID. 
device_id = '' # Please setting your device ID. 

topic = '/devices/{}/events'.format(device_id)
message = 'Cloud IoT Core!'

def on_connect(unused_client, unused_userdata, unused_flags, rc):
    """Callback for when a device connects."""
    print('on_connect')
    client.publish(topic, message)

def on_publish(unused_client, unused_userdata, unused_mid):
    """Paho callback when a message is sent to the broker."""
    client.disconnect()

if __name__ == '__main__':
    client = mqtt.Client(protocol=mqtt.MQTTv311)
    client.on_connect = on_connect
    client.on_publish = on_publish
    client.connect(host, port=port)
    client.loop_forever()

動作や機能が違うので一概に比較はできませんが、以下のサンプルコードに比べてJWTやMQTTSの部分がシンプルになっています。このようにJWTやMQTTSの設定が不要な分、ローカルのMQTTブローカにメッセージを投げる感覚でコードが書けます。

github.com

まとめ

ここまででGoogle IoT CoreとSORACOM Beam連携の概要と実際の方法を試してきました。引き続き、GCP周りを触っていきたいと思います。

Google IoT CoreとSORACOM Beamの連携について調査してみた。

この記事について

この記事ではSORACOM BeamからGoogle Cloud IoT Core(以下 IoT Core)へ接続する方法について調査しました。SORACOM Beamではエンドポイントで受けた通信をGoogle IoT Coreへ転送することができます。今回はSORACOM Beamと IoT Coreを組み合わせることで何が実現できるのか考えてみました。

具体的な設定方法などは以下の記事を参考にしてください。

masato-ka.hatenablog.com

IoT CoreとSORACOM Beam接続について

IoT CoreとSORACOM Beam連携のメリット

通常、IoT Coreへデバイスを接続する場合、デバイスがCA証明書で署名されたJWTトークンを作成する必要があり、デバイスはCA証明書のプライベートキーを保持する必要があります。IoT CoreへSORACOM Beamを利用して接続した場合、SORACOM Beam側で証明書を保持し、JWTトークンの作成もBeamが代替します。そのため、デバイスにCA証明書は必要ないので、デバイスの管理が楽になります。デバイスへの遠隔配置よりもサーバ側への配置の方がハードルが低くなると思います。さらにJWTトークンをデバイス側で作成する必要がありません。そして、IoT CoreへはMQTTSで接続する必要がありますが、SORACOM Beamを使うことでデバイスはMQTTのみで通信することができます。  まとめると、連携のメリットは以下のようになります。

  1. バイス(証明書)の管理を簡略化できる。
  2. JWTトークンの作成やMQTTSといった高負荷処理をクラウドへオフロードできる。

IoT CoreとSORACOM Beam連携の不便な点

現状、SORACOM BeamとIoT Coreの接続設定の関係は、SORACOM Beamの1設定につき、IoT Coreの1デバイスIDのみ接続できるようです。SORACOM Beamの設定はSIM グループに複数設定可能ですが、同一の宛先には1つのみですので、複数のデバイスIDを接続したい場合はSIMごとにグループを作る必要がありそうです。メリットで述べたデバイスの管理を簡略化できますが、SORACOM側の設定管理が煩雑になりそうです。またCA証明書の暗号化方式もGCP側は4種類に対して、SORACOM側で現在対応している方式が2種類です。SORACOM BeamのIoT Coreとの連携は2017年6月にリリースされましたが、IoT Core自体は2018年2月にGAになりました。今後SORACOM Beamのサービスアップデートでこの辺りが改善されるのではないかと考えています。

まとめ

今回はGoogle Cloud IoT Core とSORACOM Beamについて調査をしました。連携のメリットはありますが、実際に使おうとすると考えなければいけないポイントがありそうです。もしかすると想定する使い方以外の方法があるかもしれませんが、もう少し公式のドキュメントを増やして欲しいと思いました。次の記事では具体的にIoT CoreとSORACOM Beamを連携させる方法について紹介していきます。

SORACOM Airを管理できるVSCode Extentionを作ってみた。

この記事について

この記事では自作のVSCode Extentionを紹介します。今回はSORACOM AIrVSCode上から管理できるExtentionです。

作った理由

最近ではWioLTEを使い、SORACOM Beamを利用してMicrosoft Azure IoT Hubや他のクラウドサービスに接続する機会が行くかありました。WioLTEの開発では、 以前紹介したVSCode + PlatformIOを利用した環境で開発をしています。

masato-ka.hatenablog.com

また、Azure IoT HubもVSCodeのExtentionから管理することができます。そのため、Azure IoT Hubの設定とWioLTEの開発はVSCode側で完結させることができます。 WioLTEの開発を進める上で、SORACOMのサービスを利用しようとすると、どうしてもSIMへの設定が必要であったり、SORACOM Beamへの設定が必要になります。また、動作テスト時には正常にSIMが接続されているかを確認する場面が多くありました。その度に、ブラウザからSORACOMの管理画面に移動するのが煩わしく感じました。そこで、SORACOMのAPIを使い、SORACOM サービスの設定もVSCodeからできるExtentionがあると便利だなと思い開発に至りました。

開発中のプラグインについて

2018年4月1日の段階で、バージョン0.3.0として公開しています。VSCodeマーケットプレイスには公開していないため、使ってみたい方がいたら、個別にインストールしてください。いずれ、マーケットプレイスに公開したいと思っています。ライセンスはMITです。

github.com

また、SORACOM APIJavaScriptライブラリとして以下のライブラリを使わせていただきました。

github.com

主な機能

主な機能を紹介していきます。

1. SIM一覧の確認

Extentionをインストールすると、VSCodeのサイドバーに"SORACOM MANAGER"が表示されるようになります。VSCodeの設定ファイルにAPI Key IDとシークレットキーを設定することで認証を自動で行い、SIM一覧を取得できます。現状SIMの数が多くなるとすべて取得することができないため、修正する予定です。また今後はグループごとにサブツリー化して表示するなど考えています。

ちなみに、立ち上げっぱなしで、API tokenの有効期限が切れると使えなくなるので、VSCodeを再起動してください。次のバージョンでで直す予定です。ひどいバグだ。

2. SIMの操作

SIMのリストを右クリックで選択することで、各SIMに対して操作をすることができます。現在操作できるコマンドは以下の通りです。また、これらのコマンドはもちろんコマンドパレットから実行することができます。

f:id:masato-ka:20180401232340p:plain

コマンド名 意味
Get sim details SIMの詳細情報を取得する。
Update sim speed SIMの通信速度を変更する。
Update sim name SIMの名前を変更する。
Add new tag to sim SIMにタグを追加する。
Delete tag タグの削除
Show stats Air of SIM Airの通信量を取得する。
Show stats Beam of SIM Beamの通信量を取得する。

SIMのTagはメタデータサービスにより、SIM固有のデータとしてデバイス側から参照できます。WioLTEでメタデータサービスを使う場合、"Add new tag to sim"など開発時やデバック時に便利です。

Update sim speedを実行すると以下のようにSIM スピードを選択できるようになります。

f:id:masato-ka:20180401231237p:plain

3. 利用料金の確認

SIMの操作以外では利用料の確認ができます。これはそのうち常駐させたい。。。

f:id:masato-ka:20180401232404p:plain

こんな感じでダイアログが表示されます。SIM2枚持ちですが、ほとんど使ってないのがバレてしまいます。

f:id:masato-ka:20180401232014p:plain

まとめ

 VSCode Extentionの作り方についてはなんとなくわかったという程度でした。が、なれるとサクサク作れそうです。どちらかというと今回はJavaScriptの非同期処理周りではまった時間が多かった気がします。コールバック地獄にならないように、Promiseでラップしまくりましたが、なんかバットノウハウな気もしています。(理由はありませんが。)この辺りのTipsは後ほど記事にしていこうと思っています。  今後もExtentionを拡張していこうと考えています。もし使ってみたと言う方がいたら改善要望やバグをあげていただけると嬉しいです。次はグループの管理機能を追加していきたいと思います。また、依存しているライブラリの関係で、テストの実行には本番のAPIを利用しています。sandboxのAPIを活用してテストができるようにしていきたいです。JavaScriptのDIとかちょっと使ってみたいです。

Microbot Push2のAPIについて調べてみた。

この記事について

この記事ではMicrobot Push2を制御するにためにBLEのインタフェースについて調べた内容についてまとめました。Microbot Push 2とのペアリングと、モータの制御方法について記載します。

Microbot Push 2について

Microbot Push 2はNARAN社から発売されている物理的なスイッチを押すためのデバイスです。このデバイスを使うとスマホのアプリから物理的なスイッチを押すことができます。照明のスイッチや家電製品などを手軽に遠隔操作することができます。

我が家の寝室の照明スイッチはなぜか部屋の一番奥にあります。そのため、夜部屋に入る時に電気をつけるのが大変めんどくさいです。そこで今回実現したかったことはGoogle Homeにお願いするとMicrobot Push 2が部屋の照明を押してくれる仕組みです。 Microbot Push 2単体ではBLEのインタフェースしか存在しませんが、IFTTTやスマートスピーカーと連携させる仕組みがいくつかあります。

1. Prota S

Prota SはNaran社から発売されているMicrobot Push 2と接続できるハブです。こちらを購入することでMicrobot Push 2をIFTTTから制御することができます。 以下商品ぺーじは並行輸入品のページです。ご注意ください。

Prota S [並行輸入品]

Prota S [並行輸入品]

2. Raspberry Pi + Prota Pi

Prota OSな高額なので買うのはちょっとという場合は、ご家庭にあるRaspberry Piが利用できます。公式から配布されているRaspberry Pi用のOS、Prota Piを利用するとProta S相当のものが作れます。

prota.info

BLEのインタフェースの調査

上記2の方法でおおよそのユースケースはカバーできそうですがもう少し柔軟な構成でMicrobot Push2を使いたい場合はBLEのインタフェースを直接叩く必要があります。そこで、BLEのインタフェースがどのようになっているか調査しました。

参考にしたプロジェクト

Microbot Push2用のサーバをOSSで開発していらっしゃる方がいます。

github.com

このリポジトリの以下のディレクトリでMicrobot Push 2のBLEインタフェースについて記載があります。

https://github.com/VRGhost/PyPush/blob/master/docs/microbot_ble_api.md

このドキュメンではMicrobot Push 2のBLEサービスとキャラクタリスティックについて記載があります。しかし、ペアリングをどのように実施するか、実際に使うための記載になっていません。(不明瞭の部分も多いです)そこで、上記のドキュメントとこのかたのソースコードを参考にしながらMicrobot Push 2をペアリングしてスイッチの制御を行うまでを、Bluezのgatttoolで実行するコマンドを組み立ててみました。

$ sudo gatttool -b [Microbot pushのMAC] -t random -I 
[xx:xx:xx:xx:xx:xx][LE]> connect
Attempting to connect to xx:xx:xx:xx:xx:xx
Connection successful
[XX:XX:XX:XX:XX:XX][LE]> char-write-req 0x2A90 0000
Characteristic value was written successfully
[XX:XX:XX:XX:XX:XX][LE]> char-write-req 0x2A90 000000
Characteristic value was written successfully
#このタイミングでMicrobot Push2がペアリングモードになるので本体のボタンを押す。
[XX:XX:XX:XX:XX:XX][LE]> char-write-req 0x2A11 01 # スイッチ動作
Characteristic value was written successfully

connect から最初の書き込みまでに30秒以内に実行しないとMicrobot Push 2側から切断されます。また char-write-req 0x2A90 0000char-write-req 0x2A90 000000のコマンドのペイロードは本来接続元のMACアドレスをベースに組み立てるようですが、これでもgatttool上から接続できました。ただ、Python ラッパのgattoollibから実行すると''' char-write-req 0x2A90 000000 '''の部分で動作が止まってしまいます。LightBlueなどのツールではうまく動作します。何が原因かわかりませんが、この部分時間があるときにまた調べてみたいとお思います。

Azure、SORACOM、Futabaのサーボで金賞をもらった話。

この記事について

この記事ではIoT ALGYAN(あるじゃん)さん主催のFutaba製コマンド方式サーボIoTアプリコンテストに参加 して、考えたことや審査会当日では語りきれなかったことなどを記録として残しています。記録しないと忘れちゃう。

イベントの概要

イベントの募集ページは以下です。

algyan.connpass.com

双葉電子工業様から参加者にコマンド方式サーボモータRS304MDが配られ、2ヶ月でサーボとMicrosoft Azureを使ったIoTアプリケーションを組み上げる というのがお題でした。それ以外のテーマは自由です。

コマンド方式サーボRS304MDについて

ホビー用2足歩行ロボットにも使われているコマンド方式サーボモータです。サーボモータは通常PWMのパルス幅で角度を指定しますが、このサーボはシリアル通信で指示角度を与えて制御します。また、モータを動かすだけでなく、現在角度の取得、トルクのON/OFFやコンプライアンス制御(バネのように動かす)、モータ負荷(電流値)や電圧、温度を取得することができます。  アクチュエーションだけでなく、センシングに活用できそうというのがアイディアを考える点でもキーポイントとなりました。

www.futaba.co.jp

応募したもの

今回のコンテストで作成したアプリの詳細は以下の当日の資料をご覧ください。

サマリー

  • 小物を管理するアプリケーション
  • モータでリフター機構を作成
  • 上に乗せたものの重さをセンサーレスで計測する。
  • Microsoft Azure、SORACOMを利用する。

結果について

今回のイベントは順位がつきます。今回私は金賞をいただくことができました。 双葉電子工業様から賞状をいただきました。金賞も嬉しい話ですが、他の方の発表の中で公開したサーボモータのライブラリが思ったよりも利用いただいていたことが印象的でした。嬉しかったです。(中にはこれで間に合ったと言っていただける方もありがたや!)

f:id:masato-ka:20180320114945j:plain

コンテスト応募の動機とお題に対して考えたこと

コンテスト応募の動機について

コンテストに応募する上で自分の動機はIoTっぽいものを作ってみたいという純粋な動機とともにまだ触ったことのない新しい技術やサービスを習得したいというモチベーションがあったためです。また、自分自身同じ趣向の人と仲良くなりたいというモチベーションがあったため、交流をキーワードに参加しました。

新しい技術という点ではAzureとSORACOMを利用したアーキテクチャを自分なりに作れていけたのでよかったかなと思います。また、サーボモータのライブラリを開発し公開を行いました。このライブラリは他の参加者からのフィードバックもあり、今後も育てていきたいなと思っています。

github.com

モータのライブラリ詳細については以下の記事です。

masato-ka.hatenablog.com

交流をキーワードに積極的にコミュニティに関わっていこうと考えて行動しました。上記のように協力をいただいたり、アドバイスや次に繋がりそうなお話もいただいたりとよかったと思います。ただ、より色んな人と話したり、Azureやクラウド周りの部分も意見が欲しかったなと若干不完全燃焼感が残っています。この部分はまた別の機会でチャレンジしていきたいです。貪欲に生きたい。

お題に対して考えたこと

応募作品を考える上で以下の3つをテーマにしました。

  1. モータからの取得情報を活用したIoTサービスを考える。
  2. Microsoft Azureを触ってIoT系のサービスやServerlessといった技術の勘所を抑える。
  3. 利用方法が明確になってなかったWioLTEとSORACOMを利用する。

これに加えて、生活の課題を解決しようというテーマで一人ブレストを行いテーマを検討しました。その他のネタとしては腕のリハビリテーションマシンなどがありましたが、機構の面白さなどから今回のネタを採用しました。

自分の作品の売りポイント

1. リフトアップ機構

ものを持ち上げる。持ち上げたものの重さを測ることができる。をキーワードにいくつかの機構を考えましたが、最終的に今回のリフト機構を採用しました。機械設計は素人なのですが、10年以上前の大学の製図の時間を思い出し、見よう見まねでOSXKeynoteで図面を起こしました。加工は東急ハンズの工房で行いました。

  • プロトタイプ2の組み立て

f:id:masato-ka:20180307114957j:plain

以下は機構の動作動画です。動画の後半は副賞としてもらった高トルク版のRM303に差し替えています。 今まで厳しかった500mlのペットボトルも余裕。ええもんもろた。

www.youtube.com

2. Azure IoT Hub とSORACOMの連携

ここはいずれ別の記事に起こそうと思っています。タイミングよくSORACOM BeamとAzure IoT Hubの下り制御ができるようになったため、活用しました。また、SORACOM SIMのIMSIをAzure IoT HubのIDとして利用しています。そのため、認証情報はSORACOM Beamにあり、Azure IoT Hubに接続するために必要なデバイスIDもSORACOMのメタデータサービスから取得することができます。したがって次のような利点があります。

  1. バイスに固有の情報を書き込む必要がない(書き込みと設定が楽)
  2. 管理アプリケーション側からのデバイス追加処理を簡略化できる。

f:id:masato-ka:20180320110719p:plain

他の参加者さんの作品で特に面白いと思ったアイディア

並び順に意味はありませんが当日見てなるほどなと思ったもの

1. ボトルマネージャー(すながわさん)

 サーボモータでボトルを振って、その時のサーボの負荷から水量を推定するというもの。個人的にIoT居酒屋を将来やってみたいと思っているのでこの装置は使えるなと思いました。是非資料公開いただきたい。

2. IoTアロマディフューザー bluewell(ブルーウェルさん)

 アロマオイルの瓶を複数装置の中に設置しておく。サーボモータで空気の流路を変え、遠隔から部屋の香りを制御できるというアイディア。これも何かに使えそうと思ったアイディアでした。

3. 金庫番サーボ 情報科学専門学校 IoTゼミさん

サーボモータダイアル式金庫のダイアルに使えるというものでした。遠隔からのロックや、スマホからの暗証番号設定を行えるとのこと。個人的にはワンタイムパスワードのように毎回、開錠番号が変わったりするともっと面白いのかなと思いました。

4. フライ バイ ワイキー 高瀬さん

飛行機のフライバイワイヤ方式に習って、シリンダー錠をフライバイワイヤにしたもの。フライバイワイヤってロマンがありますよね。

上記に挙げた方以外の作品もどれも力作ぞろいでしたので、コンテストの時しか見れないのは惜しいものばかりでした。どこかで一挙展示とかすると面白そうです。

Arduino ファンもくもく会について

実は準備期間中Arduinoファンもくもく会というものにも参加していました。参加の動機は前述の交流がメインでしたが、実は他の参加者の方もきており、ここでの情報交換やいただいたアドバイスがかなり参考になりました。今後も参加していきたい活動のひとつです。

arduinofun.connpass.com

感想

全体を通して大変おもしろかたです。でも準備に時間(あとお金も)をかなり使ったなと思いまいました。ここを無駄にしないためにも今後につなげていきたいです。やってみてまだ自分もこんなもの作る根気があるんだなと思ったので、これからもいろいろ挑戦していければと思います。あとチーム組んで参加できたら面白いだろうなと思いました。また今回スポンサーだった双葉電子工業さんと主催のIoT ALGYAN(あるじゃん)さんにはチャレンジの場を提供いただきかつ素晴らしい結果までいただいて感謝しかありません。これからも是非面白い企画を作っていただきたいです。参加するだけでなく企画や運営、ネタの提供などお手伝いする機会があればより嬉しいと思っています。(貧欲に生きたい。)

RS304をWio LTEで動かすライブラリを書いてみた。

この記事について

この記事ではFUTABA社製のホビー用サーボモータRS304をWio LTE(Arduino)で動かすためのライブラリを紹介します。 現在のところWio LTE, Arduino Leonardoでの動作を確認しています。まだまだ作成中ですのですが、最低限の機能が実装できたので公開します。

ライブラリのインストール

   ライブラリは以下のGitHubリポジトリで開発しています。ダウンロードしたzipをArduino IDEに読み込ませるか、ライブラリフォルダにおくことで使えます。 利用方法はreadmeをサンプルを確認してください。

github.com

現在対応しているサーボの動作は以下の通りです。

  1. サーボの角度指定
  2. トルクのON, OFF, BREAK
  3. 角度の取得

サーボとArduinoの接続回路

以下、先人の回路を参考にして下さい。74HC125で半二重全二重の変換回路を組みます。

制限事項

 現在のところサーボのコンプライアンス制御や細かい設定は実装していません。徐々に実装していく予定です。また、最低限の動作しか確認していませんので、動作は保証できません。さらにハードウェアシリアルの利用が必要です。ソフトウェアシリアルは現在は対応していませんが、今後対応してく予定です。

まとめ

 使ってみて不具合や対応してほしい、提案などあればコメント欄やGitHubのIssueにあげていただけるとありがたいです。未実装機能の中で希望があれば、優先して実装していきたいと思います。また、プルリクエストや提案があれば対応いたします。現在のところ@lutecla16vさんがLeonardoでの動作報告とESP32へのインポートを検討されています。