IoTあるじゃん勉強会でReButtonを貰いました。
遠隔お酌のコントローラにしてみようと思います。
コントロールするには、傾きを検知するセンサが必要ですが、まだI2Cの加速度センサを手に入れていないので、とりあえず、ボタンを押すとお酌する仕様とします。
遠隔お酌とは
とっくりコントローラーを傾けると、とっくりや缶ビールを乗せた装置が傾き、お酌ができる「IoTお酌装置」です、WiFiが繋がるところであれば、遠く離れた装置も傾けることができます。海外からお酌も成功しています。
遠隔お酌のページはこちら
Arduino IDEの設定
https://seeedjp.github.io/ReButton/ の「Development environment」に書いてあります、特に難しいことはありません。古いバージョンのIDEではダメなようです。
プログラムの転送方法
通常Arduinoでの開発は、USBを経由してPCからデバイスにプログラムを転送・書込みしますが、ReButtonには、USB端子がありません、プログラムのバイナリをAzure Storageを送信しておき、ReButtonがそこからダウンロード・書込みするという、ちょっと面倒な方法になります。
またデバッグもできません、配線を半田付けするか、特殊なコネクタを買えば可能なようです。
ソースファイルの修正
サンプルプログラムというかReButtonのソースファイルが、https://github.com/SeeedJP/ReButtonApp にあります、見たところ、バイナリのダウンロードのソースも含まれているため、その部分は必ず実装する必要がありそうなので、これを変更して開発するのがよさそうです。
プログラムの解説
メインのソースは「ReButtonApp.ino」になります、Arduinoは通常setup()関数で初期処理を、loop()関数で主な処理を書きますが、ReButtonは、電池の持ちをよくするため、ボタンを押すと電源が入り、処理を行い、電源を落とす処理になっているので、setup()に処理が書かれています、loop()は終了処理のみ書かれているようです。
ボタンが押された時の処理は、ActionTaskBlocking()で行われているので、ここを変更します。
通信処理追加
遠隔お酌は、HTTPとかWebSocketではなくTCP独自プロトコルとなっています。
バイナリの数バイトのデータを送受信しています、今回はとりあえず傾けるだけの機能を実装します。
- TCP通信するAPIはAZ3166WiFiClientが使えるようです、マニュアルは、https://microsoft.github.io/azure-iot-developer-kit/docs/apis/wifi-client/ にありました
- お酌するプログラムActionOshaku.cppとActionOshaku.hを新規作成
# include <Arduino.h>
# include <AZ3166WiFi.h>
# include <AZ3166WiFiClient.h>
# include "Config.h"
bool ActionOshaku(int value)
{
unsigned char buf[5] = {0x55, 0xee, 1, 20, 0xff};
buf[4] = (unsigned char)value;
if (WiFi.begin(Config.WiFiSSID, Config.WiFiPassword) != WL_CONNECTED) return false;
while (WiFi.status() != WL_CONNECTED) {
wait_ms(100);
}
WiFiClient client;
if (client.connect("xxx.xxx.xxx.com", 999)) {
client.write(buf, sizeof buf);
delay(3000);
buf[4] = 0;
client.write(buf, sizeof buf);
client.stop();
return true;
}
return false;
}
# pragma once
bool ActionOshaku(int value);
- Action.cppの先頭にinclude文を追加
# include "ActionOshaku.h"
- Action.cppのActionTaskBlocking()関数にシングルクリックの場合、お酌装置に通信するようにActionOshaku()関数を呼ぶように修正
case ACTION_10:
case ACTION_11:
return ActionOshaku(123);
// return ActionSendMessage(action);
case ACTION_AP:
:
ビルド
IDEのメニューの下にあるチェックのボタンを押すか、「ctrl」+「r」でコンパイルされます、出来上がったバイナリは、私の場合下記にありました。
C:\Users\ユーザ名\AppData\Local\Temp\arduino_build_441572\ReButtonApp.ino.bin
プログラムの転送
CRC計算ツールのダウンロード
https://github.com/SeeedJP/ReButton/tree/master/tools/generatecrcからCRC計算ツールをダウンロードします
CRCの計算
上記のツールを使ってCRCを計算します
C:\>generatecrc.exe C:\Users\ユーザ名\AppData\Local\Temp\arduino_build_441572\ReButtonApp.ino.bin
========== ReButton Firmware Information ==========
Package path: C:\Users\ユーザ名\AppData\Local\Temp\arduino_build_441572\ReButtonApp.ino.bin
Package CRC: 0xada3
Package size: 682224
===================================================
Azure Storageにプログラムを配置
詳細はhttps://github.com/SeeedJP/ReButton/blob/master/OTA.md に書いてありますが、下記のとおりです。
Azure CLIをインストール
Azure CLIがインストールされていない場合
、インストールします、詳細は、ここ に書いてあります
Azure Portalでリソースグループを作成
- 私は「東日本リージョンに」「ReButton」で作成しました
ストレージアカウントを作成
- 私は「itobutton」で作成しました
az storage account create --location japaneast --name itobutton --resource-group ReButton --sku Standard_GRS
環境変数にストレージアカウントを設定
- キーのリストを表示させます
C:\>az storage account keys list --account-name itobutton --resource-group ReButton
[
{
"keyName": "key1",
"permissions": "Full",
"value": "rpO12lNJbLSwfDgNy1....xOyQ=="
},
{
"keyName": "key2",
"permissions": "Full",
"value": "B5GMg/hGqJvNn5qxvR....LT2Q=="
}
]
- 環境変数にAZURE_STORAGE_ACCOUNTにストレージアカウント名を設定
C:\>set AZURE_STORAGE_ACCOUNT=itobutton
- 環境変数にAZURE_STORAGE_KEYに上記で表示させたkey1のvalueの値を設定
C:\>set AZURE_STORAGE_KEY=rpO12lNJbLSwfDgNy1....xOyQ==
保存するコンテナを作成
C:\>az storage container create --name buttoncontainer --public-access container
プログラムをアップロード
C:\>az storage blob upload -f C:\Users\ユーザ名\AppData\Local\Temp\arduino_build_441572\ReButtonApp.ino.bin --container-name containername --name ReButtonApp.1.0.bin
保存先URLを確認
ReButtonをAccess Pointモードで起動
ボタンを押し続けてください、この間、LEDの色が変化します。10秒以上たったら、ボタンを離してください。
すると、ボタンがAccess Pointモードで起動して、LEDが点滅しつづけます。
ReButtonのアクセスポイントに接続
AZB-xxxxxxxxという名前のアクセスポイントがReButtonです。
パソコンからこのアクセスポイントに接続してください。
アクセスポイントの設定
ブラウザでhttp://192.168.0.1/wifi を開きます、SSIDとパスワードを設定してください
プログラムの保存先の設定
ブラウザでhttp://192.168.0.1/firmware を開きます、
- Package URIは、先ほどAzure Portalで確認したURLです。
- Package CRCとPackage size先のCRC計算ツールで表示された値を指定します。CRCの値は先頭の「0x」も入れます。
- ReButtonのボタンを押し続けます、ブラウザのUpdateボタンをクリックします。
- RGB LEDが点滅し始めるまでボタンを押し続けます。ReButtonはファームウェアイメージをダウンロードし、CRCをチェックし、そして新しいイメージをフラッシュしています。これは約30秒かかります。
- RGB LEDが白色に変わったらボタンを離します。新しいファームウェアでAPモードに入っています。
- アクセスポイントが再起動したので、多分パソコンとの接続が切れています。再度、パソコンでAZB-xxxxxxxxという名前のアクセスポイントと接続します
- 再度、ブラウザでhttp://192.168.0.1/wifi を開きます、SSIDとパスワードを設定してください
以上です。
結構、大変ですね、Azureにバイナリを置くのが面倒なので、ローカルに置いてみましたが、うまくいきませんでした。
httpsでなければいけないのか、httpヘッダなどが必要なのか、不明です。