メインコンテンツまでスキップ

ラズパイZeroでLチカ with Greengrassコネクタ

· 約4分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

Greengrass Coreがv1.9.3でArmv6lをサポートしました。ラズパイZeroでもGreengrassが動作するようになりました。

https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/what-is-gg.html

久しぶりにGreengrassに触るので、Greengrassコネクタを使ってLチカをしてみました。 GreengrassコネクタにRaspberry Pi GPIOコネクタが用意されているので簡単です。

ラズパイZeroの準備

以下の公式ドキュメントに従って行います。

Raspberry Pi のセットアップ https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/setup-filter.rpi.html

モジュール 2: AWS IoT Greengrass Core ソフトウェアのインストール https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/module2.html

Greengrassの設定

リソースの追加

Raspberry Pi GPIOコネクタがGPIOにアクセスするため、リソースを設定します。

対象のGreengrassグループを選択し、リソースタブを表示し、ローカルリソースの追加ボタンを押します。

設定項目設定値
リソース名任意の名前
リソースタイプデバイス
デバイスパス/dev/gpiomem
グループ所有者のファイルアクセス許可リソースを所有するLinuxグループのOSグループアクセス許可を自動的に追加
Lambda関数の関連無指定でOK

コネクタの追加

Raspberry Pi GPIOコネクタを追加します。

対象のGreengrassグループを選択し、コネクタタブを表示し、コネクタの追加ボタンを押します。

Raspberry Pi GPIOを選択したあと、パラメータはこんな感じで指定しました。

設定項目設定値
Resource for /dev/gpiomem device作成したリソース
Input GPIO pins2 ※ボタンのGPIOピン番号
Input GPIO polling period50(millisecond)
Output GPIO pins17 ※LEDのGPIOピン番号

Lambdaの作成

ボタンが押された/離されたイベントで起動し、LEDのオン/オフを設定する処理を行います。試行錯誤したのであまりきれいではありませんが。。

import os
import greengrasssdk
import json
import sys
import logging

## Setup logging to stdout
logger = logging.getLogger(__name__)
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)

iot_client = greengrasssdk.client('iot-data')

thingName = os.environ['AWS_IOT_THING_NAME']

def get_read_topic(gpio_num):
return '/'.join(['gpio', thingName, str(gpio_num), 'read'])

def get_write_topic(gpio_num):
return '/'.join(['gpio', thingName, str(gpio_num), 'write'])

def send_message_to_connector(topic, message=''):
iot_client.publish(topic=topic, payload=str(message))

def set_gpio_state(gpio, state):
send_message_to_connector(get_write_topic(gpio), str(state))

def read_gpio_state(gpio):
send_message_to_connector(get_read_topic(gpio))

def function_handler(event, context):
logger.info("Received message!")
logger.info(event)
logger.info(type(event))

# event
# 1 : button off
# 0 : button on

state = 0
if(event == 0):
state = 1
set_gpio_state(17, state)

return

LambdaにはAWS IoT Greengrass Core SDK for Pythonを含める必要があります。このあたりを参考にしました。

Lambda 関数の作成とパッケージ化 https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/create-lambda.html

Lambdaの追加

作成したLambdaをGreengrassに追加します。

対象のGreengrassグループを選択し、Lambdaタブを表示し、Lambdaの追加ボタンを押します。

設定項目設定値
Lambdaの追加既存の Lambda 関数の使用
Lambda の選択作成したLambda
Lambda バージョンの選択作成したLambdaのバージョン

サブスクリプションの追加

対象のGreengrassグループを選択し、サブスクリプションタブを表示し、サブスクリプションの追加ボタンを押します。

ボタンイベント -> Greengrassコネクタ -> Lambda呼び出し

ソースターゲットトピック
Raspberry Pi GPIOLambdagpio/+/ボタンのGPIOピン番号/state

Lambda -> Greengrassコネクタ -> LEDオンオフ

ソースターゲットトピック
LambdaRaspberry Pi GPIOgpio/+/LEDのGPIOピン番号/write

サブスクリプションをいじれば、クラウド経由でLチカも簡単です。

デプロイ

これで設定は完了です。デプロイしましょう。