概要
AWSのGreengrassを使い、遠隔でGPIOを操作しLEDの点滅ができた。
背景と目的
先日のGreengrass使い始めに続き、ドキュメントに沿っていろいろ試したところ、遠隔でエッジのLambda関数をトリガする方法もわかった。また、エッジのローカルリソース(ドライブや、シリアルポート、GPIOなど)にもアクセスできるとの記述がある。そこで、Raspberry PiのGPIOを遠隔で操作してみることにした。
詳細
0.参考資料
AWSドキュメント内の以下URLを参考にした。GPIOにアクセスできるとの旨が書いてある。
https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/access-local-resources.html
1.Lambda関数
Lambda関数は、基本的にRaspberry Pi上でGPIOをいじるときと同じコード。
# coding:utf-8 import sys import greengrasssdk import RPi.GPIO as GPIO import time import platform import os import logging # Create a Greengrass Core SDK client. client = greengrasssdk.client('iot-data') # GPIOの設定 GPIO_NUM = 4 GPIO.cleanup() GPIO.setmode(GPIO.BCM) GPIO.setup(GPIO_NUM, GPIO.OUT) def function_handler(event, context): try: client.publish(topic='LRA/test', payload="Sent from AWS Greengrass Core.") GPIO.output(GPIO_NUM, GPIO.HIGH) time.sleep(1) GPIO.output(GPIO_NUM, GPIO.LOW) time.sleep(1) except Exception as e: logging.error("Experiencing error :{}".format(e)) client.publish(topic='LRA/test', payload="Experiencing error") return
2.リソースの設定
Greengrass>グループ>リソースで、/dev/gpionumというリソースに対して、Lambda関数がアクセスできるように設定した。
3.サブスクリプションの設定
以下2つを設定した。IoT Cloud側からLRA/test/triggerトピックに、送信することで、Lambdaが呼び出せる。
- "LRA/test/trigger"トピックをIoT Cloud ⇒ Lambda関数で設定
- "LRA/test"トピックをLambda関数 ⇒ IoTCloudで設定
4.テスト
以上の設定で、Greengrass CoreにLambdaをデプロイし、IoT Cloud側からLRA/test/triggerトピックにメッセージを送信した。ところ、GPIO4に接続したLEDが1秒間光り、"LRA/test"トピックに、Lambdaからのメッセージが来た。正しく、Lambdaが呼び出せている。
まとめ
AWSのGreengrassを使い、遠隔でGPIOを操作しLEDの点滅ができた。