AzureにラズベリーパイとPythonで繋げてみました。
初心者でも簡単にAzure(クラウド)を始めることができます。
Azureへの登録から設定方法、またPythonのプログラム含めて紹介しています。
Azureに入門!ラズパイとPythonから接続してみた!
Azure IoT Hubにラズベリーパイを接続してみました。
ラズパイとクラウド(Azure)で通信させて、GPIOの入出力を制御しています。
ラズパイはPythonから動かしています。
PythonのSDKをインストールするだけで、簡単に実行することが出来ました。
Azureのアカウントの登録から設定方法まで紹介します。
実際のテストの様子を動画でも紹介しています。是非一緒にご覧ください。
Azureの始め方
Azureの始め方は簡単です。下記ページから登録を進めていきます。
無料でアカウントが作成でき、無料のクレジットとサービスも使えます。
今回テストした内容も無料枠内で問題なく対応できました。。
「無料で始める」を選択すると、Microsoftのアカウントを聞かれるので入力します。
あとは名前や住所・クレジットカードなどの情報を埋めていくだけです。
この記事ではAzureの始め方を紹介していますが、AWSでも同様なテストが可能です。
- Azure…Microsoftのクラウド
- AWS…Amazonのクラウド
AWSにも無料分のクレジット・サービスがありますので、無料で実施できます。
下記記事で紹介しています。(リンクはこちら)
AWSにラズパイを接続!GPIOの信号をクラウドに送信してみた
Azure IoT Hubの作成
Azureとラズパイを接続するために、「Azure IoT Hub」のサービスを使います。
アカウント作成後に、Azureのホーム画面から「IoT Hub」を選択します。
最初にプロジェクト・インスタンスの詳細を埋めていきます。
各項目を入力して「次へ」を選択すればOKです。
リソースグループ、IoT Hub名は任意に入力しました。領域は東日本を選択しています。
次にネットワークに関してはパブリックドメインを選択しました。
価格とスケールティアに関しては「F1:Freeレベル」の選択をおすすめします。
今回の通信テストレベル程度ならば、無料で使えるFreeレベルで対応できました。
それ以外の項目は(筆者は)デフォルト設定です。
他にもリソースを整理するタグの設定がありますが、対応せずともテスト可能です。
最後に「確認および作成」で最終確認して、デプロイを待てばIoT Hubの作成完了です。
下記公式ページにも手順が記載されていますので、必要に応じて参考ください。
https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-raspberry-pi-kit-node-get-started
IoTデバイスを追加
IoT Hubの作成(デプロイ)が完了すると、IoTデバイスを登録出来ます。
作成したIoT Hubから、「IoTデバイス」から「デバイスの追加」を選択します。
デバイスIDは任意の名前を入力します。他はデフォルト設定でした。
デバイスの作成が完了すると、キーやプライマリ接続文字列などが入手できます。
プライマリ接続文字列に関してはコピーして控えておきます。
Azure IoT SDK (Python)をインストール
ラズベリーパイでAzureを使うためのライブラリ・SDKをインストールしていきます。
Azureは多くのプログラミング言語に対応していますが、今回はPythonを使います。
ラズパイにはデフォルトでPythonがインストールされており、誰でも簡単に使用できます。
初心者の方でも大丈夫です。下記記事で使い方を紹介しています。(リンク先はこちら)
ラズベリーパイでプログラミング入門!Pythonの簡単な始め方
SDKをインストール
今回使用するライブラリのGithubのリンク先は下記です。
https://github.com/Azure/azure-iot-sdk-python
「Azure IoT Device SDK」「Azure IoTHub Service SDK」をインストールします。
またGitのリポジストリもクローンしておきます。
Azure IoT Hubにメッセージ送信する
ラズパイからAzure IoT Hubにメッセージを送るプログラムは用意されています。
クローンしたリポジストリの中にあります。
下記フォルダ内の「simple_send_message.py」がメッセージ送信のプログラムです。
但しラズパイ上で動かす前に環境変数の設定が必要になります。
プログラムの中の "IOTHUB_DEVICE_CONNECTION_STRING"の箇所です。
IoT Hubを作成したときに控えた「プライマリ接続文字列」を使います。
色々対応方法はあると思いますが、筆者はexportのコマンドを使いました。
下記赤字箇所を「プライマリ接続文字列」に置き換えて、ターミナルで入力します。
あとはPythonのプログラムを動かすだけです。下記コマンドで実行できます。
実行後は「Message successfully sent!」と表示されます。
ラズベリーパイからAzureに無事メッセージ送信したことを確認できました。
Azure IoT Hubのメッセージを確認する
デバイス側(ラズパイ)からクラウド側(Azure)に送ったメッセージを確認します。
今回は「Visual Studio Code」の「Azure IoT Tools」を使用しています。
Visual Studio Codeをインストール
Visual Studio Code(VSCode)はMicrosoftが提供しているエディタです。
色々な拡張機能を追加することができます。
AzureもMicrosoftのクラウドのため多くのサポートが受けれます。
必要な方は下記からダウンロード・インストールをお願いします
https://azure.microsoft.com/ja-jp/products/visual-studio-code/
Azure IoT Toolsをインストール
Visual Studio CodeにAzureの拡張機能を追加します。
拡張機能の箇所で「Azure IoT Tools」と検索して、インストールすればOKです。
もしくは下記Visual StudioのURLからでも大丈夫です。
https://marketplace.visualstudio.com/items?itemName=vsciot-vscode.azure-iot-tools
その後サインインしてIoT Hubを選択すると、既に作成したデバイス含めて表示されます。
(VS Code上でもIoT Hubを作れるそうです。凄く便利です)
Azure IoT Hubをモニターする
Azure IoT Toolsで多くのことが出来るようになりますが、一部だけ簡単に紹介します。
Azure IoT Hubへのメッセージをモニターすることが可能になります。
デバイス箇所で右クリックして「ビルドエンドポイントのモニターを開始」を選びます。
デバイス・IoT Hubにメッセージ送信する
デバイスやIoT HubにVScodeからメッセージを送信することも可能になります。
- D2Cメッセージ…device-to-cloud
- C2Dメッセージ…cloud-to-device
Azure IoT Hubの使い方のテスト
ラズパイとクラウド(Azure)で通信させて、GPIOの入出力を制御するテストしました。
SDKのPythonのプログラムを少し弄って、下記2パターン試してみました。
- D2C…ラズパイのGPIO入力→Azureにメッセージ送信
- C2D…Azureからメッセージ送信→ラズパイのGPIO出力
ラズベリーパイのGPIO入出力の配線に関しては下記形です。
- GPIO出力…GPIO22にLEDと330Ω抵抗を直列接続
- GPIO入力…GPIO17にスイッチを接続。(10kΩプルダウン)
冒頭でも紹介しましたが、テスト動画含めて紹介しています。
是非一緒にご覧ください。
ラズパイからAzureにメッセージ送信
最初にラズパイのGPIO入力→Azureにメッセージ送信のテストを行います。
テスト内容
左の画面がラズベリーパイで、右の画面がAzure(Visual Studio Code)です。
Azureのモニターを開始します。
Visual Studio Codeで「ビルドエンドポイントのモニターを開始」を選択します。
ラズベリーパイ側でPythonのプログラムを準備します。
(動画内では省略していましたが)環境変数をexportしてから、プログラムを実行します。
プログラムを起動すると、Azureにもメッセージが表示されます。
ラズパイのGPIOに接続されたスイッチを押して、Azureにメッセージ送信しています。
Azure(Visual Studio Code)側を見ると、メッセージを確認できています。
Pythonのプログラム
SDKの下記のプログラムを弄って動かしました。
「/azure-iot-sdk-python/azure-iot-device/samples/simple_send_message.py」
単純にGPIO入力が入ったら、Azureにメッセージ送信する内容を加えています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
import os import asyncio from azure.iot.device.aio import IoTHubDeviceClient import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setup(17,GPIO.IN) async def main(): # Fetch the connection string from an enviornment variable conn_str = os.getenv("IOTHUB_DEVICE_CONNECTION_STRING") # Create instance of the device client using the connection string device_client = IoTHubDeviceClient.create_from_connection_string(conn_str) # Connect the device client. await device_client.connect() # Send a single message print("Sending message...") await device_client.send_message("This is a message that is being sent") print("Message successfully sent!") while True: if GPIO.input(17): await device_client.send_message("GPIO17_ON") time.sleep(1) break # Finally, shut down the client await device_client.shutdown() if __name__ == "__main__": asyncio.run(main()) # If using Python 3.6 or below, use the following code instead of asyncio.run(main()): # loop = asyncio.get_event_loop() # loop.run_until_complete(main()) # loop.close() |
Azureからラズパイにメッセージ送信
次にAzureからメッセージ送信→ラズパイのGPIO出力のテストを行います。
テスト内容
左の画面がラズベリーパイで、右の画面がAzure(Visual Studio Code)です。
ラズパイ側でAzureからのメッセージを受信するプログラムを用意します。
環境変数をexportしてからプログラムを起動します。
Azure(Visual Studio Code)からラズパイにメッセージ送信を行います。
「デバイスへC2Dメッセージ送信」を選択します。
1回目は「test」のメッセージを送信しています。
Azureから送信すると、ラズパイ側でメッセージ受信していることが分かります。
2回目は「GPIO22_ON」のメッセージを送信しています。
ラズパイがメッセージ受信すると同時に、LED点灯(GPIO出力)も確認できます。
Pythonのプログラム
SDKの下記のプログラムを弄って作りました。
「/azure-iot-sdk-python/azure-iot-device/samples/sync-samples/receive_message.py」
Azureから指定のメッセージが送信されたらGPIOをON/OFFする内容を加えています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
import os from six.moves import input import threading from azure.iot.device import IoTHubDeviceClient import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setup(22,GPIO.OUT) # The connection string for a device should never be stored in code. For the sake of simplicity we're using an environment variable here. conn_str = os.getenv("IOTHUB_DEVICE_CONNECTION_STRING") # The client object is used to interact with your Azure IoT hub. device_client = IoTHubDeviceClient.create_from_connection_string(conn_str) # connect the client. device_client.connect() # define behavior for receiving a message def message_handler(message): print("the data in the message received was ") print(message.data) #print("custom properties are") #print(message.custom_properties) if message.data == b'GPIO22_ON': GPIO.output(22, True) if message.data == b'GPIO22_OFF': GPIO.output(22, False) # set the message handler on the client device_client.on_message_received = message_handler # Wait for user to indicate they are done listening for messages while True: selection = input("Press Q to quit\n") if selection == "Q" or selection == "q": print("Quitting...") break # finally, shut down the client device_client.shutdown() |
無料枠内でテストできました
今回はAzure IoT Hubにメッセージを数回送信しているだけです。
(筆者は)何回もテストしましたが、特に問題なく無料枠内で十分にテスト出来ました。
(Freeレベルでも1日8000メッセージ使えますが、使用したのは44メッセージ程度でした)
まとめ
今回はAzureとラズパイとPythonの接続に関して紹介させていただきました。
記事をまとめますと下記になります。
Azureを始めてみるにもラズベリーパイ(raspberry pi)はちょうど良いデバイスかと思います。
ハードウェアの勉強や趣味・工作にも十分に使えます。
是非皆さまも試してみて下さい。
コメント