工作と競馬

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

概要

Androidアプリ作成の環境構築し、サンプルプログラムが動作することを確認した。


背景と目的

最近、スマートフォンをiPhoneからAndroidに変えた。なので、久しぶりにAndroidアプリを作ってみたくなった。なのでとりあえず、環境構築。


詳細

1.Android Studioのセットアップ

これは、Web各所に解説されているのでそれに倣った。参考になったのは、

こちら

あたり。無事、インストールが完了。

2.端末をデバッグ用に

次に、自分のAndroidスマホでデバッグできるように設定。昔やったことがあるが完全に忘れたので、

参考

を見ながら、

設定>端末情報>ビルド番号を5回くらい連打>端末情報に戻る

開発者向けオプションが表示される

とりあえず、今回はスリープモードにしないとUSBデバッグをONにし、デバッグモードを許可。

という感じで、設定。以下が、PCに端末を接続して、Runを押したとき。デバッグ対象のデバイスとして選択できるようになった。

20170423105140

図2 接続して認識された様子


3.動作確認

下のスクリーンショットが、サンプルアプリを動かした様子。無事、動いた。これで、自分のスマホでいろいろできるだろう。

Screenshot_20170423-105302

写真3 サンプルアプリが動いた様子


まとめ

Androidアプリ作成の環境構築し、サンプルプログラムが動作することを確認できた。

概要

boto3を使い、CloudWatchEventsでLambda Functionを呼ぶルールを設定した。最初、うまくルールが発動せずハマったことがあるので、注意点もメモっておく。


背景と目的

boto3から、AWSのCloudWatchEventsにルールを設定し、定期的にLambda Functionを実行しようと思ったので、方法を調べ、メモしておく。


詳細

1.boto3のドキュメントで方法を確認

CloudWatchEventsのルールを設定するには、boto3.client("events").put_ruleboto3.client("events").put_targetsを使う。

また、呼び出し側のLambda関数のpolicyにおいて、CloudWatchEventsから呼び出されることを許可必要がある。ここで、ハマってしまいうまく動かなかった。注意。


2.実装

実装したのは以下。ここでは、ルール名をboto3_test、ターゲットのLambda Functionをfor_testという名前のもの(内容は、ブランク関数。Hello world!を出力するだけ)、入力パラメータはjson文字列とした。

import boto3

# ルールを追加
ret_rule = boto3.client("events").put_rule(
    Name="boto3_test",
    Description=u"説明文",
    ScheduleExpression="cron(* * * * ? *)"
)

print json.dumps(ret_rule, indent=4)

# ターゲットを追加
ret_target = boto3.client("events").put_targets(
    Rule="boto3_test",
    Targets=[
        {
            "Id": "for_test",
            "Arn": "arn:aws:lambda:リージョン:アカウントID:function:for_test",
            "Input": json.dumps({})
        }
    ]
)

ここで、上記ソースコードを実行すると、エラーなく実行され、マネジメントコンソール上にも、有効なルールとして表示される。しかし、これだけではちゃんと動かない。

put_targetsの説明をじっくり読むと、

To be able to make API calls against the resources that you own, Amazon CloudWatch Events needs the appropriate permissions. For AWS Lambda and Amazon SNS resources, CloudWatch Events relies on resource-based policies.

とある。つまり、Lambda Function側のポリシーを設定してねということ。で、リソースポリシーはどう設定すればいいのかというと、こちらに記述があり、AWS Lambda Permissionの項を参考に、呼び出されるLambda Functionのポリシーを設定。


# Lambdaにパーミッションを追加
ret_lambda = boto3.client("lambda").add_permission(
    FunctionName='for_test',
    StatementId='ステートメントID',
    Action='lambda:InvokeFunction',
    Principal='events.amazonaws.com',
    SourceArn='arn:aws:events:リージョン:アカウントID:rule/boto3_test'
)


なお、マネジメントコンソールからルールを設定した場合は、裏で勝手にこのパーミッションの設定をやってくれている。なので、動くということだ。

3.動作確認

上記の設定により、ちゃんと指定したルールに沿って、イベントが発生し、Lambda Functionが実行された。


まとめ

boto3を使い、CloudWatchEventsでLambda Functionを呼ぶルールを設定することができた。呼び出し側のLambda Functionのポリシーを適切に設定する必要があることに注意。

概要

HiLetgo Attiny85 マイクロ USB 開発ボードの開発環境を整え、無事LED点滅することができた。

背景と目的

以前、Trinketという小さなArduino互換マイコンを遊んだ。しかし、200円程度と非常に安くて小さいHiLetgo Attiny85 マイクロ USB 開発ボードというものをAmazonで見つけた。そこで、このボードを動かしてみる。

IMG_3452

HiLetgo Attiny85 マイクロ USB 開発ボード

詳細

1.入手

Amazonから、注文したところ海外発送のため約10日で到着。

2.環境構築

Arduinoで開発できるように環境を構築するため、Web上でやり方を調べたら、既に先人がいろいろ試しているおかげでたくさん出てきた。参考としたものを以下に列挙。なお、私の環境は、

  • Arduino 1.8.2
  • Windows 10
2.0 参考になった情報源
2.1 ドライバのインストール

参考2のUsageを見ると、私の環境であるWindows10では、専用ドライバが必要とのこと。そこで、

こちらを丸ごとダウンロードし、

windows_driver_installerのzadig_2.1.2.exeを実行。

Device>Load Preset Deviceから、同フォルダのmicronucleus.cfgを選択。

Unknown Device #1を選択し、Install Driverボタンをクリック。

すると、デバイスマネージャーに以下のように表示される。これで準備は整ったはず。

なお、数秒おきにデバイスが認識されたり、解除されたりするのは仕様らしい。。。(参考1などの記述によれば)

20170331000657

図2.1 ドライバのインストールが終わったところ。

2.2 Arduino IDEのセットアップ

参考1や参考2の手順に従い、Arduino IDEにボード情報のインストールを行う。

http://digistump.com/package_digistump_index.json

をボードマネージャー参照先URLに追加し、ボードマネージャーからDigistump AVR Boardsというのをインストール。46MBくらいあってなかなかでかい。

これが終わると、ツール>ボードから、Digistump AVR Boardsが選択できる。今回使用するのは、Digispark (Default - 16.5mhz)なのでそれを選択しておく。

3.プログラムの作成と書き込み

3.1 作成したプログラム

作成したのは、スケッチ例>Digispark_Examples>Startほぼそのまま。

// the setup routine runs once when you press reset:
void setup() {                
  pinMode(1, OUTPUT); //LED on Model A  or Pro
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(1, HIGH);
  delay(500);               // wait for a second
  digitalWrite(1, LOW); 
  delay(500);               // wait for a second
}
3.2 書き込み

このデバイスは、書き込み方法が少しクセがある。

まず、デバイスはUSBに接続せず、書き込みボタンを押す

Plug in device now... (will timeout in 60 seconds)という表示が出るので、ここでUSBに接続する

しばらくすると、デバイスが認識され書き込み実行される

となる。以下が書き込まれた様子。

20170330235354

書き込まれた様子

4.動作確認

3.の書き込みが完了した直後、すぐにプログラムが走り、無事、LEDが点滅した。

まとめ

HiLetgo Attiny85 マイクロ USB 開発ボードの開発環境を整え、プログラムの動作確認ができた。

概要

ESP

背景と目的

本日、ESP-WROOM-32の秋月版開発ボードを入手した。そこで、早速動かす。ESP-WROOM-02をArduino環境で動かしていたので、これも同様にやってみたい。

詳細

1.主な流れ

  • Arduino用開発ツールをインストール、セットアップ
  • Arduinoでコーディング

という感じで、サクサク行く。

2.Arduino用開発ツールをインストール、セットアップ

まず、秋月の商品ページに、[Arduino-ESP32プロジェクトサイト>https://github.com/espressif/arduino-esp32]というリンクがあったので、そこをざっと読んだところ、Using through Arduino IDEという項目があったので従う。(ただし、この開発プロジェクトでは2017/03/21現在、まだすべての機能について実装が完了していないらしい。)

20170321223817
図2.1 開発ステータス

 私のPCは、Windowsなので[こちら>https://github.com/espressif/arduino-esp32/blob/master/doc/windows.md]を参考にGitからクローニングした。クローニング先は、C:\Program Files (x86)\Arduino\hardware\espressif\esp32とした。この場所に置くことで、Arduino IDEのボードマネージャーに表示される。

2017/03/27追記 この場所は、Arduinoをアップデートしたときに削除対象になってしまうので良くない。他の場所にするか、アップデート前に切り取って、アップデート後に戻すととよい。

20170321235916

図2.2 ボードマネージャー

3.コーディング

とりあえず、Lチカができればいいので、以下の簡単なコードを作成。LEDをIO12に接続し、1秒周期で点滅。

const int GPIO_LED = 12;

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(GPIO_LED, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(GPIO_LED, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(500);                       // wait for a second
  digitalWrite(GPIO_LED, LOW);    // turn the LED off by making the voltage LOW
  delay(500);                       // wait for a second
}

4.動作確認

以下のように、ちゃんと点滅できた!

まとめ

ESP-WROOM-32の開発ボードのArduino開発環境が整った。

概要

LINE Bot APIの使ってLINEからメッセージを送ることで自宅のエアコンの電源を入れられるようにするシステムを試作した。

キーワード : LINE Bot API, AWS, Lambda, API Gateway

背景と目的

LINE Bot APIというものに興味がわいた。しかし、実際に使ってみないとよくわからないので、試しに使い方を調べ、せっかくなので以前作成したスマホからエアコンの電源を操作するシステムと連携させてみる。

詳細

1.LINE Bot APIについて知る

Web上でいろいろ情報を漁った結果、こちらにあるとおり、>>あなたのサービスとLINEユーザーの双方向コミュニケーションを可能にする機能<<とのこと。最低限使用するためには、

  • LINE Business CenterでMessaging APIを利用するビジネスアカウントを作成
  • 自分のシステムにLINEサーバからのWebhookを受け取るWebエンドポイントを用意
  • Webhookを受け取ったときの動作を自分のシステム上に実装

という感じだ。というわけで、以下順を追ってやってみる。

2.システムの実装

2.1 Messaging APIを使うためのアカウントを作成

アカウント作成手順の詳細いは、こちらなどが詳しいので、それを参照するとして、最終的に以下のように

  • Channel Secret
  • Channel Access Token
  • QR code

が見られるDeveloperのページまで無事たどり着いた。

ここで、スマホのLINEの友達追加でQR codeを読み取りこのアカウントと友達になった。

Developer

図2.1 Developerページ

2.2 AWS側にWebエンドポイントを用意

次に、先ほど作ったアカウントから、Webhookを受け取るためのエンドポイントを用意する。今回は、以前作成したエアコンの電源操作システムに、API Gatewayを使っているので、そこにリソースを追加した。設定は、

  • メソッドはPOST
  • 統合リクエスト
    • 統合タイプはLambda関数(対象は2.3で作成する関数)
    • マッピングテンプレートは特に設定なし
  • 統合レスポンス、メソッドレスポンス、メソッドリクエストはデフォルトのまま

とした。そして、このAPIのデプロイされたURLを、以下のように2.1でたどり着いた画面のWebhook URLに入力する。VERIFYボタンを押して、API GatewayのログがCloud Watch等で残っていれば、ちゃんと呼び出されたことが確認できる。(2.3のLambda関数を実装してからのほうがわかりやすいが)

Developer2

図2.2 Webhook用URLを記入

2.3 Webhook受信時の処理を実装

Lambda関数の実装を行う。Webhookを受信すると、eventという引数に呼び出し元のデータ(LINEアプリから送信したテキストなど)が入ってくる。今回は、送信されたテキストが、

  • "電源入れて"だったら、"入れました"と返答し、エアコンの電源を入れる
  • "電源切って"だったら、"切りました"と返答し、エアコンの電源を切る
  • それ以外は、"ごめんなさい。を返答する

を実装してみた。エアコン操作部分は、以前作成したLambda関数があるので今回はそちらを呼び出すだけとする。

受け取る引数のjsonの構造は、APIのドキュメント等があるので詳細は割愛するが、基本的な流れは、入ってきたメッセージを解析して、リプライ用のAPIを叩くというだけだ。(メッセージの解析とリプライ文章作成をAIのようなもので実装すれば、はやりのAIチャットボットみたいなものができるはず。)

なお、LINE Bot APIには、Python向けのSDKが用意されているが今回はAPIドキュメント通りに実装してもそんなに大変でなかったので使わなかった。(これは状況に応じて使えばよいのだろう)

# coding: utf-8

import urllib2
import json

def lambda_handler(event, context):

    for ev in event["events"]:
        
        # メッセージ解析
        message = ev["message"]["text"]
        if message in u"電源入れて":
            t = u"入れました"
        elif message in u"電源切って":
            t = u"切りました"
        else:
            t = u"ごめんなさい。わかりません。"
    
        # リプライ用APIを叩く
        url = "https://api.line.me/v2/bot/message/reply"
        headers = {
            "Content-type": "application/json",
            "Authorization": "Bearer {Channel Access Token}"
        }
        body = {
            "replyToken": ev["replyToken"],
            "messages": [
                {
                    "type": "text",
                    "text": t
                }
            ]
        }
        req = urllib2.Request(url, data=json.dumps(body), headers=headers)
        resp = urllib2.urlopen(req)
        print resp.read()
        
        # エアコン操作用の関数呼び出し
        # 詳細は省略
        :

3.動作確認

というわけで、早速LINE上からメッセージを送ってみたところ、無事電源の操作ができた。また、LINE上に返信が来た!

IMG_3436

図3 LINE上でメッセージのやり取りがなされた様子

まとめ

LINE Bot APIを使って自分の作ったWebシステムと連携させることができた。今回は、エアコン操作というIoT的なものをやってみたが、これ以外にもいろいろアイディアが思いつきそうなので、思いついたら適宜試してみたい。

このページのトップヘ