3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

求ム!Pythonを使ってAzureで開発する時のTips!【PR】日本マイクロソフトAdvent Calendar 2020

Day 18

Azure IoT Edge カスタムモジュールの作成(RaspberryPi & Python)

Last updated at Posted at 2020-12-31

Azure IoT Edge のインストール設定に続いてカスタムモジュールの作成を行います。

一番最初なのでLチカします。(T先生のFPGA+IoT EdgeでLチカよりもテクノロジの無駄遣いのような気もしますね)
ただ、Lチカするだけでも罠があったりします。
あとで詳しい説明はしますけど、IoT Edgeがコンテナで動作していることが問題になります。

公式ドキュメントも参照してください。

##準備

・IoTHub
・RaspberryPi(ARM32v7以上の機種)IoT Edgeをインストール済み
・コンテナレジストリ
・Docker
・VS Code
・VS Code用Python拡張機能
・VS Code用Azure IoT Tools
・Python(3.7)

RaspberryPiにはLEDと抵抗を接続します。
led.png

##プロジェクトの作成

1.VSCodeを起動します。F1キーを押してコマンドパレットを開きます。

2.Azure: Sign in コマンドでAzureにサインインしておきます。

3.コマンドパレットでAzure IoT Edge:New IoT Edge solution コマンドを入力して実行します。
led01.PNG

4.ソリューションファイルを保存するフォルダーを選択します。
led02.PNG

5.ソリューション名を入力します。
led03.PNG

6.Pythonモジュールを選択します。
led04.PNG

7.モジュール名を入力します。
led05.PNG

8.リポジトリ情報を入力します。 [registry name].azurecr.io/モジュール名 になります。
led07.PNG

9.プロジェクト内の.envファイルを開いてユーザー名、パスワードが設定されているのを確認します。設定されいない時はコンテナレジストリのアクセスキーからユーザー名とパスワードをコピーします。
led09.PNG
contener05.PNG

10.画面下部のターゲットプラットフォームをクリックしてプラットフォームを「ARM32v7」に変更します。
led08.PNG

11.画面下部の使用言語がPython3.7になっているのを確認します。違う場合にはコマンドパレットで選択しなおします。
led10.PNG

12.main.pyを開き次の内容に変更します。

main.py
import time
import RPi.GPIO as gpio

gpio.setmode(gpio.BCM)

gpio.setup(26,gpio.OUT)


try:
    while True:

        gpio.output(26,1)

        time.sleep(.5)

        gpio.output(26,0)

        time.sleep(.5)

except KeyboardInterrupt:
    gpio.cleanup()

13.Dockerfile.arm32v7を開き次のように変更します。

Dockerfile.arm32v7
FROM arm32v7/python:3.7-slim-buster

WORKDIR /app

RUN apt update && apt install -y \
    build-essential

COPY requirements.txt ./
RUN pip install -r requirements.txt

RUN pip install RPi.GPIO

COPY . .

CMD [ "python3", "-u", "./main.py" ]

14.deployment.template.jsonを開き、67行目以降を変更します。この設定がキモになります。
通常コンテナ内からデバイスのハードウェアへのアクセスはできません。コンテナからアクセスするためにはprivilegedオプションを使うことで可能になりますが、Dockerのようにコマンドラインで指定することはできません。そこでdeployment.template.json内でオプションを追加することでアクセスすることができるようになります。デバイスのGPIO以外にBluetoothやネットワークにアクセスする必要がある場合にはこのようなオプションの追加が必要になります。(しかし、この情報が公式にでてないのはどうしてなのかな。見落としている?)

deployment.template.json

~省略~

"createOptions": {
  "NetworkingConfig": {
    "EndpointsConfig": {
      "host": {}
    }
  },
  "HostCOnfig": {
    "NetworkMode": "host",
    "Privileged": true
  }
}

~省略~

led13.PNG

15.deployment.template.jsonを右クリックして「Build and Push IoT Edge Solution」をクリックします。
   問題がなければコンテナレジストリにビルドしたソリューションファイルが登録されます。
led14.PNG

16.Auzre IoT HubセクションからDevicesを展開し、デプロイしたいデバイスを右クリックし「1つのIoT Edgeに配置」をクリックします。
led15.PNG

17.configフォルダを開き「deployment.arm32v7.json」を選択します。
led16.PNG
led17.PNG
led18.PNG

18.問題がなければしばらくしてLEDが点滅を始めます。

19.試しにmain.pyの14,18行目のtime.sleepの中の数値を変更してみてください。

20.module.json内の7行目の「version」の数値を大きくして保存します。

21.再び手順15から進めると変更した内容がデバイスに反映されるはずです。

IoT Edgeを利用してリモートデプロイをすることができました。

いかがでしたでしょうか。

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?