# センサーから果物の品質検査をトリガーする

> スケッチノート作成者:[Nitya Narasimhan](https://github.com/nitya)。画像をクリックすると拡大版が表示されます。
## 講義前のクイズ
[講義前のクイズ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/35)
## はじめに
IoTアプリケーションは、単一のデバイスがデータを収集してクラウドに送信するだけではありません。多くの場合、複数のデバイスが協力してセンサーを使って物理的な世界からデータを収集し、そのデータに基づいて意思決定を行い、アクチュエーターや可視化を通じて物理的な世界と相互作用します。
このレッスンでは、複雑なIoTアプリケーションの設計について学びます。複数のセンサーやクラウドサービスを組み合わせてデータを分析・保存し、アクチュエーターを通じて応答を表示する方法を学びます。また、果物の品質管理システムのプロトタイプを設計する方法、IoTアプリケーションをトリガーするための近接センサーの使用方法、このプロトタイプのアーキテクチャについても学びます。
このレッスンで学ぶ内容:
* [複雑なIoTアプリケーションの設計](../../../../../4-manufacturing/lessons/4-trigger-fruit-detector)
* [果物の品質管理システムの設計](../../../../../4-manufacturing/lessons/4-trigger-fruit-detector)
* [センサーから果物の品質検査をトリガーする](../../../../../4-manufacturing/lessons/4-trigger-fruit-detector)
* [果物品質検査に使用されるデータ](../../../../../4-manufacturing/lessons/4-trigger-fruit-detector)
* [複数のIoTデバイスをシミュレートするための開発者デバイスの使用](../../../../../4-manufacturing/lessons/4-trigger-fruit-detector)
* [本番環境への移行](../../../../../4-manufacturing/lessons/4-trigger-fruit-detector)
> 🗑 このプロジェクトの最後のレッスンです。このレッスンと課題を完了した後は、クラウドサービスをクリーンアップするのを忘れないでください。課題を完了するためにサービスが必要なので、まず課題を完了してください。
>
> 必要に応じて、[プロジェクトのクリーンアップガイド](../../../clean-up.md)を参照してください。
## 複雑なIoTアプリケーションの設計
IoTアプリケーションは多くのコンポーネントで構成されています。これにはさまざまなデバイスやインターネットサービスが含まれます。
IoTアプリケーションは、デバイス(*things*)がデータを送信し、それが*洞察*(insights)を生み出し、その洞察が*アクション*(actions)を引き起こしてビジネスやプロセスを改善する仕組みとして説明できます。例えば、エンジン(デバイス)が温度データを送信し、そのデータを使用してエンジンが期待通りに動作しているかどうかを評価します(洞察)。その洞察を基に、エンジンのメンテナンススケジュールを優先的に調整します(アクション)。
* 異なるデバイスが異なるデータを収集します。
* IoTサービスはそのデータに基づいて洞察を提供し、時には追加のデータソースで補強します。
* これらの洞察は、デバイスのアクチュエーターを制御したり、データを可視化して人間が意思決定を行うのに役立てたりします。
### IoTリファレンスアーキテクチャ

上の図は、IoTリファレンスアーキテクチャを示しています。
> 🎓 *リファレンスアーキテクチャ*とは、新しいシステムを設計する際に参考にできる例のアーキテクチャです。この場合、新しいIoTシステムを構築する際に、リファレンスアーキテクチャを参考にして、適切なデバイスやサービスを置き換えることができます。
* **デバイス(Things)**:センサーからデータを収集するデバイスで、画像データを解釈する画像分類器などのエッジサービスと連携する場合もあります。デバイスからのデータはIoTサービスに送信されます。
* **洞察(Insights)**:サーバーレスアプリケーションや保存されたデータの分析から得られます。
* **アクション(Actions)**:デバイスへのコマンド送信や、データの可視化による意思決定を含みます。

上の図は、これまでのレッスンで取り上げたコンポーネントやサービスが、リファレンスIoTアーキテクチャでどのように連携しているかを示しています。
* **デバイス(Things)**:センサーからデータを収集するデバイスコードを記述し、クラウドやエッジデバイスでCustom Visionを使用して画像を分析しました。このデータはIoT Hubに送信されました。
* **洞察(Insights)**:Azure Functionsを使用してIoT Hubに送信されたメッセージに応答し、Azure Storageにデータを保存しました。
* **アクション(Actions)**:クラウドでの意思決定に基づいてデバイスのアクチュエーターを制御し、Azure Mapsを使用してデータを可視化しました。
✅ スマートホーム家電など、これまでに使用したことのある他のIoTデバイスについて考えてみましょう。そのデバイスとソフトウェアにおけるデバイス(Things)、洞察(Insights)、アクション(Actions)は何でしょうか?
このパターンは、必要に応じて規模を拡大または縮小し、デバイスやサービスを追加することができます。
### データとセキュリティ
システムのアーキテクチャを定義する際には、常にデータとセキュリティを考慮する必要があります。
* デバイスはどのようなデータを送受信しますか?
* そのデータはどのように保護されるべきですか?
* デバイスやクラウドサービスへのアクセスはどのように制御されるべきですか?
✅ 所有しているIoTデバイスのデータセキュリティについて考えてみましょう。そのデータのどれが個人情報であり、転送中や保存時にプライバシーを保護する必要がありますか?保存すべきでないデータは何ですか?
## 果物の品質管理システムの設計
次に、デバイス(Things)、洞察(Insights)、アクション(Actions)の考え方を果物品質検査に適用し、より大規模なエンドツーエンドのアプリケーションを設計してみましょう。
果物加工工場で使用される果物品質検査システムを構築するタスクを与えられたと想像してください。果物はコンベアベルトシステムで運ばれ、現在は従業員が手作業で果物を検査し、未熟な果物を取り除いています。工場のオーナーはコスト削減のため、自動化されたシステムを望んでいます。
✅ IoT(および技術全般)の普及に伴い、手作業の仕事が機械に置き換えられる傾向があります。調査してみましょう:IoTによって失われると推定される仕事の数はどれくらいですか?IoTデバイスを構築することで新たに生まれる仕事の数はどれくらいですか?
果物がコンベアベルトに到着すると検出され、写真が撮影され、エッジでAIモデルを使用して検査されます。その結果はクラウドに保存され、果物が未熟である場合は通知が行われ、未熟な果物を取り除くことができます。
| | |
| - | - |
| **デバイス(Things)** | コンベアベルト上の果物を検出するセンサー
果物を撮影して分類するカメラ
分類器を実行するエッジデバイス
未熟な果物を通知するデバイス |
| **洞察(Insights)** | 果物の熟度を検査する判断
熟度分類の結果を保存
未熟な果物について通知が必要かどうかを判断 |
| **アクション(Actions)** | 果物を撮影し、画像分類器で検査するコマンドをデバイスに送信
未熟な果物を通知するためのコマンドをデバイスに送信 |
### アプリケーションのプロトタイピング

上の図は、このプロトタイプアプリケーションのリファレンスアーキテクチャを示しています。
* 近接センサーを備えたIoTデバイスが果物の到着を検出します。この情報をクラウドに送信して果物が検出されたことを知らせます。
* クラウド内のサーバーレスアプリケーションが、別のデバイスに写真を撮影して分類するコマンドを送信します。
* カメラを備えたIoTデバイスが写真を撮影し、エッジで実行される画像分類器に送信します。その結果はクラウドに送信されます。
* クラウド内のサーバーレスアプリケーションがこの情報を保存し、後で未熟な果物の割合を分析します。果物が未熟である場合、別のIoTデバイスにコマンドを送信して、LEDを通じて工場の作業員に通知します。
> 💁 このIoTアプリケーション全体は、単一のデバイスとして実装することも可能です。すべてのロジックを組み込み、画像分類の開始やLEDの制御を行うことができます。このレッスンでは、大規模なIoTアプリケーションの概念を示すために拡張されています。
プロトタイプでは、すべてを単一のデバイスで実装します。マイクロコントローラーを使用している場合は、画像分類器を実行するために別のエッジデバイスを使用します。必要な知識はすでにほとんど学んでいます。
## センサーから果物の品質検査をトリガーする
IoTデバイスには、果物が分類の準備ができたことを示す何らかのトリガーが必要です。このトリガーの1つとして、センサーを使用してコンベアベルト上の果物が適切な位置にあるかどうかを測定する方法があります。

近接センサーは、センサーから物体までの距離を測定するために使用されます。通常、レーザービームや赤外線などの電磁波を送信し、物体から反射して戻ってくる信号を検出します。レーザービームが送信されてから信号が戻るまでの時間を使用して、センサーまでの距離を計算します。
> 💁 近接センサーを知らずに使用したことがあるかもしれません。多くのスマートフォンは、通話中に耳に近づけると画面をオフにして、耳で誤って通話を終了しないようにします。これは、近接センサーを使用して、通話中に画面の近くに物体があることを検出し、一定の距離まで離れるまでタッチ機能を無効にすることで実現されています。
### タスク - 距離センサーを使用して果物の品質検査をトリガーする
近接センサーを使用してIoTデバイスで物体を検出する方法について、関連するガイドを参照してください:
* [Arduino - Wio Terminal](wio-terminal-proximity.md)
* [シングルボードコンピュータ - Raspberry Pi](pi-proximity.md)
* [シングルボードコンピュータ - 仮想デバイス](virtual-device-proximity.md)
## 果物品質検査に使用されるデータ
プロトタイプの果物検査システムには、複数のコンポーネントが相互に通信します。

* 近接センサーが果物までの距離を測定し、IoT Hubに送信
* カメラデバイスを制御するコマンドがIoT Hubから送信
* 画像分類の結果がIoT Hubに送信
* 未熟な果物を通知するためのLEDを制御するコマンドがIoT Hubからデバイスに送信
これらのメッセージの構造を事前に定義しておくことは重要です。これにより、アプリケーションの構築がスムーズになります。
> 💁 経験豊富な開発者であっても、送信されるデータと期待されるデータの違いによって引き起こされるバグを追跡するのに数時間、数日、場合によっては数週間を費やした経験があるはずです。
例えば、温度情報を送信する場合、JSONをどのように定義しますか?`temperature`というフィールドを使用するか、一般的な略語である`temp`を使用するかの選択があります。
```json
{
"temperature": 20.7
}
```
または:
```json
{
"temp": 20.7
}
```
さらに、単位についても考慮する必要があります。温度は°Cですか、それとも°Fですか?消費者向けデバイスで表示単位が変更された場合でも、クラウドに送信される単位が一貫していることを確認する必要があります。
✅ 調査してみましょう:単位の問題がどのようにして1億2500万ドルの火星気候オービターの墜落を引き起こしたのか?
果物品質検査のデータ送信について考えてみましょう。各メッセージをどのように定義しますか?データをどこで分析し、どのデータを送信するかを決定しますか?
例えば、近接センサーを使用して画像分類をトリガーする場合、IoTデバイスが距離を測定しますが、どこで判断を行いますか?デバイスが果物が十分近いと判断して、IoT Hubに分類をトリガーするメッセージを送信しますか?それとも、距離測定値を送信してIoT Hubが判断しますか?
このような質問への答えはケースバイケースです。各ユースケースは異なるため、IoT開発者として構築するシステム、その使用方法、検出されるデータを理解する必要があります。
* IoT Hubが判断を行う場合、複数の距離測定値を送信する必要があります。
* メッセージを多く送信しすぎると、IoT HubのコストやIoTデバイスの帯域幅(特に数百万台のデバイスがある工場では)が増加します。また、デバイスの動作が遅くなる可能性もあります。
* デバイスで判断を行う場合、デバイスを微調整するための設定方法を提供する必要があります。
## 複数のIoTデバイスをシミュレートするための開発者デバイスの使用
プロトタイプを構築するには、IoT開発キットを使用して複数のデバイスのように動作させ、テレメトリを送信し、コマンドに応答する必要があります。
### Raspberry Piや仮想IoTハードウェアで複数のIoTデバイスをシミュレートする
Raspberry Piのようなシングルボードコンピュータを使用する場合、複数のアプリケーションを同時に実行できます。これにより、複数のIoTデバ
💁 一部のハードウェアは、複数のアプリケーションが同時にアクセスすると動作しない場合があります。
### マイクロコントローラーで複数のデバイスをシミュレーションする
マイクロコントローラーで複数のデバイスをシミュレーションするのは、少し複雑です。シングルボードコンピューターとは異なり、複数のアプリケーションを同時に実行することはできません。そのため、すべてのIoTデバイスのロジックを1つのアプリケーションにまとめる必要があります。
このプロセスを簡単にするための提案は以下の通りです:
* IoTデバイスごとに1つ以上のクラスを作成する - 例えば、`DistanceSensor`、`ClassifierCamera`、`LEDController`といったクラスを作成します。それぞれが独自の`setup`メソッドと`loop`メソッドを持ち、メインの`setup`および`loop`関数から呼び出されます。
* コマンドを1箇所で処理し、必要に応じて関連するデバイスクラスに指示を送ります。
* メインの`loop`関数では、各デバイスのタイミングを考慮する必要があります。例えば、10秒ごとに処理が必要なデバイスクラスと1秒ごとに処理が必要なデバイスクラスがある場合、メインの`loop`関数では1秒の遅延を使用します。各`loop`呼び出しで1秒ごとに処理が必要なデバイスのコードをトリガーし、カウンターを使用してループを数え、カウンターが10に達したときに他のデバイスを処理し、その後カウンターをリセットします。
## 本番環境への移行
プロトタイプは最終的な本番システムの基盤となります。本番環境に移行する際の違いは以下の通りです:
* 耐久性のあるコンポーネント - 工場のノイズ、熱、振動、ストレスに耐えられるよう設計されたハードウェアを使用します。
* 内部通信の利用 - 一部のコンポーネントはクラウドへの通信を避け、直接通信を行い、データをクラウドに保存するだけにします。これがどのように行われるかは工場のセットアップによります。直接通信を行う場合もあれば、ゲートウェイデバイスを使用してIoTサービスの一部をエッジで実行する場合もあります。
* 設定オプション - 工場や使用ケースごとに異なるため、ハードウェアは設定可能である必要があります。例えば、近接センサーが異なる距離で異なる果物を検出する必要がある場合、分類をトリガーする距離をハードコードするのではなく、クラウドを介して設定可能にする必要があります。例えば、デバイスツインを使用して設定を行います。
* 自動果物除去 - 熟していない果物を知らせるLEDの代わりに、自動化されたデバイスが果物を除去します。
✅ 調査してみましょう: 本番環境のデバイスは開発キットとどのように異なるでしょうか?
---
## 🚀 チャレンジ
このレッスンでは、IoTシステムを設計するために必要な概念について学びました。これまでのプロジェクトを振り返り、それらが上記のリファレンスアーキテクチャにどのように適合するか考えてみましょう。
これまでのプロジェクトの中から1つ選び、プロジェクトで扱った内容を超えた複数の機能を組み合わせたより複雑なソリューションの設計を考えてみてください。アーキテクチャを描き、必要なデバイスやサービス、送信されるデータ、セキュリティやプライバシーの考慮事項を考えてみましょう。
例えば、GPSを組み合わせた車両追跡デバイスを設計し、冷蔵トラック内の温度を監視するセンサー、エンジンのオン・オフ時間、ドライバーの身元確認などを行うものを考えてみてください。関与するデバイス、サービス、送信されるデータ、セキュリティやプライバシーの考慮事項は何でしょうか?
## 講義後のクイズ
[講義後のクイズ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/36)
## レビューと自己学習
* IoTアーキテクチャについてさらに学ぶには、[Microsoft DocsのAzure IoTリファレンスアーキテクチャドキュメント](https://docs.microsoft.com/azure/architecture/reference-architectures/iot?WT.mc_id=academic-17441-jabenn)を参照してください。
* デバイスツインについてさらに学ぶには、[Microsoft DocsのIoT Hubドキュメントでデバイスツインを理解し使用する](https://docs.microsoft.com/azure/iot-hub/iot-hub-devguide-device-twins?WT.mc_id=academic-17441-jabenn)を参照してください。
* 産業オートメーションで使用される機械間通信プロトコルであるOPC-UAについては、[WikipediaのOPC-UAページ](https://wikipedia.org/wiki/OPC_Unified_Architecture)を参照してください。
## 課題
[果物品質検出器を作成する](assignment.md)
**免責事項**:
この文書は、AI翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を期すよう努めておりますが、自動翻訳には誤りや不正確さが含まれる可能性があります。元の言語で記載された原文が公式な情報源と見なされるべきです。重要な情報については、専門の人間による翻訳を推奨します。本翻訳の使用に起因する誤解や誤認について、当方は一切の責任を負いません。