Más contenido relacionado
La actualidad más candente (20)
Similar a IoT Kit ハンズオントレーニング ~ Seeed Wio LTE + SORACOM Beam ~ V4.0(旧) (20)
IoT Kit ハンズオントレーニング ~ Seeed Wio LTE + SORACOM Beam ~ V4.0(旧)
- 1. “ ”
Internet of Things
IoT Kit ハンズオントレーニング
初めの一歩
モノの接続からデータ分析まで
Seeed株式会社
松岡 貴志
1
2018/3/6 V4.0
~ Seeed Wio LTE
+ SORACOM Beam ~
株式会社ソラコム
松井 基勝
- 6. Wio LTE JP Version
Wio LTE JP VersionはLTE通信に対応したマイコンモジュールです。プログラミングは
Arduino IDEでおこないます。別売りのGroveモジュールとSIMカード、各種クラウド
サービスを組み合わせることで、IoTのプロトタイピングが可能です。
CPU STM32F405RG(Cortex-M4)
動作周波数 168MHz
フラッシュメモリ 1MB
内蔵SRAM 192KB
LTE Cat.1 FDD-LTE B1/B3/B8/B18/B19/B26
SIMサイズ ナノ
Groveポート数 6 (Digitalx2,Analogx2,I2Cx1,UARTx1)
6
- 13. ハードウェア
• パソコン
• Wio LTE
• Grove温湿度センサー
• Grove加速度センサー
• Groveブザー
• Groveケーブル 3本
• USBケーブル
• SORACOM Air SIM(nanoサイズ)
13
- 16. 開発環境の準備
• 通常モードとDFUモード
• Virtual COM Portドライバ
• WinUSBドライバ
• TeraTerm
• Arduino IDE
• ボードの追加
• WioLTEライブラリの追加
• その他ライブラリの追加
• DeviceExplorer
16
macOSの場合は、こちらを参照してください。
- 17. 通常モードとDFUモード
17
• DFUモード
• 通常モード
STM32 BOOTLOADER
Virtual COM Port
シリアルモニタ※1
Arduino IDE
※1 Windowsの場合は、シリアルモニタは不調になるのでオススメしません。
TeraTermを使いましょう。
• マイコンにプログラムを書き込むモード
• Device Firmware Upgradeの頭文字
• BOOT0ボタンを押しながらUSB接続
• BOOT0ボタンを押しながらRSTボタンをクリック
• 書き込んだプログラムを実行するモード
• RSTボタンをクリック
BOOT0ボタン
- 18. Virtual COM Portドライバ
18
1. Wio LTEを通常モードで接続。
2. Virtual COM Portデバイスドライバーのインストールに従い、ドライバをインストール。
https://github.com/SeeedJP/WioLTEforArduino/wiki/InstallVCOMDriver-ja
• stsw-stm32102.zipをダウンロード、解凍
• VCP_V1.4.0_Setup.exeを実行
• インストールファイルを実行
3. 右図のとおり表示されることを確認。
- 19. WinUSBドライバ
19
1. Wio LTEをDFUモードで接続。
2. WinUSBデバイスドライバーに切り替えに従い、ドライバをインストール。
https://github.com/SeeedJP/WioLTEforArduino/wiki/ReplaceDriver-ja
• zadig-2.3.exeをダウンロード
• zadig-2.3.exeを実行
• Options > List All Devicesを選択
• STM32 BOOTLOADERを選んで、WinUSBに入れ替え
3. 右図のとおり表示されることを確認。
- 22. ボードの追加
22
1. Wio Tracker LTEボードの追加に従い、Arduino IDEにボードを追加。
https://github.com/SeeedJP/WioLTEforArduino/wiki/AddWioLTEBoard-ja
• URLを追加
• Seeed STM32F4 Boards by Seeed Studioをインストール
2. ボードのWio Tracker LTEを選択。
- 27. [macOS]IoTHub-Explorer
27
1. Node.jsとnpm をインストール(参考: Qiita)
2. iothub-explorer をインストール
https://github.com/Azure/iothub-explorer
3. IoT Hub作成後、共有アクセスポリシーのiothubownerの接続文字列を取得
npm install -g iothub-explorer
connection_string='接続文字列'
iothub-explorer monitor-events --login $connection_string
- 44. [Arduino]スケッチにコードを追加
45
1. Arduino IDEで、lab3.inoを開く。
https://github.com/ms-iotkithol-jp/IoTKitHoLV4/blob/master/Support/Section1/Step1/WioLTE/IoTKitHoLV4_WioLTE_Sketch.zip
2. Wio LTEに書き込む。
void setup()
{
delay(200);
SerialUSB.println("");
SerialUSB.println("--- START ---------------------------------------------------
");
SerialUSB.println("### I/O Initialize.");
Wio.Init();
Wio.LedSetRGB(COLOR_SETUP);
SerialUSB.println("### Power supply ON.");
Wio.PowerSupplyGrove(true);
Wio.PowerSupplyLTE(true);
delay(500);
SerialUSB.println("### Turn on or reset.");
if (!Wio.TurnOnOrReset()) {
SerialUSB.println("### ERROR! ###");
return;
}
SerialUSB.println("### Connecting to ¥"soracom.io¥".");
if (!Wio.Activate("soracom.io", "sora", "sora")) {
SerialUSB.println("### ERROR! ###");
return;
}
SerialUSB.println("### Module Initialize.");
TimeInitialize();
AccelInitialize(16, 800);
TemperatureAndHumidityBegin(WIOLTE_D38);
SerialUSB.println("### Setup completed.");
void loop()
{
static unsigned long nextMillis = 0;
while (millis() < nextMillis) {}
// 加速度センサーから測定値を取得
Wio.LedSetRGB(COLOR_MEASURE);
while (!AccelWaitForSampling()) {}
int x, y, z;
AccelReadXYZ(&x, &y, &z);
Wio.LedSetRGB(COLOR_NONE);
// 温湿度センサーから測定値を取得
float temp, humi;
TemperatureAndHumidityRead(&temp, &humi);
// JSON文字列を作成
char jsonText[100];
sprintf(jsonText,
"{¥"accelX¥":%.2lf,¥"accelY¥":%.2lf,¥"accelZ¥":%.2lf,¥"temperature¥":%.1f,¥"humidi
ty¥":%.1f,¥"time¥":¥"%s¥"}", AccelValueToGravity(x), AccelValueToGravity(y),
AccelValueToGravity(z), temp, humi, TimeNow());
SerialUSB.println(jsonText);
nextMillis = millis() + Interval;
}
- 49. [Arduino]スケッチにコードを追加
50
1. Arduino IDEで、lab4.inoを開く。
https://github.com/ms-iotkithol-jp/IoTKitHoLV4/blob/master/Support/Section1/Step1/WioLTE/IoTKitHoLV4_WioLTE_Sketch.zip
2. Wio LTEに書き込む。 void loop()
{
static unsigned long nextMillis = 0;
while (millis() < nextMillis) {}
// 加速度センサーから測定値を取得
Wio.LedSetRGB(COLOR_MEASURE);
while (!AccelWaitForSampling()) {}
int x, y, z;
AccelReadXYZ(&x, &y, &z);
Wio.LedSetRGB(COLOR_NONE);
// 温湿度センサーから測定値を取得
float temp, humi;
TemperatureAndHumidityRead(&temp, &humi);
// JSON文字列を作成
char jsonText[100];
sprintf(jsonText,
"{¥"accelX¥":%.2lf,¥"accelY¥":%.2lf,¥"accelZ¥":%.2lf,¥"temperature¥":%.1f,¥"humidi
ty¥":%.1f,¥"time¥":¥"%s¥"}", AccelValueToGravity(x), AccelValueToGravity(y),
AccelValueToGravity(z), temp, humi, TimeNow());
SerialUSB.println(jsonText);
// Harvestへ送信
Wio.LedSetRGB(COLOR_SEND);
HarvestSend(jsonText);
Wio.LedSetRGB(COLOR_NONE);
nextMillis = millis() + Interval;
}
- 52. 加速度、温湿度をBeamでIoT Hubへ転送
• [Azure]IoT Hubを作成
• [Azure]IoT Hubにデバイスを作成
• [Azure]共有アクセスキーを取得
• [SORACOM](Harvestを無効化)
• [SORACOM]IoT Hub認証情報を登録
• [SORACOM]Beamに設定を追加
• [Arduino]スケッチにコードを追加
• DeviceExplorerでデータを確認
53
- 58. [Arduino]スケッチにコードを追加
60
1. Arduino IDEで、lab5.inoを開く。
https://github.com/ms-iotkithol-jp/IoTKitHoLV4/blob/master/Support/Section1/Step1/WioLTE/IoTKitHoLV4_WioLTE_Sketch.zip
2. Wio LTEに書き込む。
void setup()
{
delay(200);
SerialUSB.println("");
SerialUSB.println("--- START ---------------------------------------------------
");
SerialUSB.println("### I/O Initialize.");
Wio.Init();
Wio.LedSetRGB(COLOR_SETUP);
SerialUSB.println("### Power supply ON.");
Wio.PowerSupplyGrove(true);
Wio.PowerSupplyLTE(true);
delay(500);
SerialUSB.println("### Turn on or reset.");
if (!Wio.TurnOnOrReset()) {
SerialUSB.println("### ERROR! ###");
return;
}
SerialUSB.println("### Connecting to ¥"soracom.io¥".");
if (!Wio.Activate("soracom.io", "sora", "sora")) {
SerialUSB.println("### ERROR! ###");
return;
}
SerialUSB.println("### Module Initialize.");
TimeInitialize();
AccelInitialize(16, 800);
TemperatureAndHumidityBegin(WIOLTE_D38);
IoTHubInitialize();
void loop()
{
static unsigned long nextMillis = 0;
do {
// IoT Hubからの受信を処理
IoTHubLoop();
}
while (millis() < nextMillis);
// 加速度センサーから測定値を取得
Wio.LedSetRGB(COLOR_MEASURE);
while (!AccelWaitForSampling()) {}
int x, y, z;
AccelReadXYZ(&x, &y, &z);
Wio.LedSetRGB(COLOR_NONE);
// 温湿度センサーから測定値を取得
float temp, humi;
TemperatureAndHumidityRead(&temp, &humi);
// JSON文字列を作成
char jsonText[100];
sprintf(jsonText,
"{¥"accelX¥":%.2lf,¥"accelY¥":%.2lf,¥"accelZ¥":%.2lf,¥"temperature¥":%.1f,¥"humidi
ty¥":%.1f,¥"time¥":¥"%s¥"}", AccelValueToGravity(x), AccelValueToGravity(y),
AccelValueToGravity(z), temp, humi, TimeNow());
SerialUSB.println(jsonText);
// IoT Hubへ送信
Wio.LedSetRGB(COLOR_SEND);
IoTHubSend(jsonText);
Wio.LedSetRGB(COLOR_NONE);
nextMillis = millis() + Interval;
}
- 63. [Arduino]スケッチにコードを追加
66
1. Arduino IDEで、lab6.inoを開く。
https://github.com/ms-iotkithol-jp/IoTKitHoLV4/blob/master/Support/Section1/Step1/WioLTE/IoTKitHoLV4_WioLTE_Sketch.zip
2. Wio LTEに書き込む。
void IoTHubInitialize()
{
SerialUSB.println("### Connecting to MQTT server ¥""MQTT_SERVER_HOST"¥"");
MqttClient.setServer(MQTT_SERVER_HOST, MQTT_SERVER_PORT);
MqttClient.setCallback(IoTHubCallback);
MqttClient.setClient(WioClient);
if (!MqttClient.connect(DEVICE_ID)) {
SerialUSB.println("### ERROR! ###");
return;
}
MqttClient.subscribe(C2D_MESSAGE);
}
void IoTHubCallback(char* topic, byte* payload, unsigned int length)
{
SerialUSB.print("Callback -> ");
SerialUSB.println(topic);
SerialUSB.print(" ");
for (int i = 0; i < length; i++) SerialUSB.print((char)payload[i]);
SerialUSB.println("");
if (strncmp(topic, C2D_MESSAGE, strlen(C2D_MESSAGE) - 1) == 0) {
if (length != 7) return;
if (payload[0] != '#') return;
char message[length + 1];
memcpy(message, payload, length);
message[length] = '¥0';
long colorCode = strtol(&message[1], NULL, 16);
int r = colorCode >> 16 & 0xff;
int g = colorCode >> 8 & 0xff;
int b = colorCode >> 0 & 0xff;
Wio.LedSetRGB(r, g, b);
}
}
- 64. 1. Messages To DeviceタブのMessageにカラーコードを入力して、Sendをクリック。
DeviceExplorerでメッセージを送信
67
1
2
3
カラーコード例:
“#100000” … 赤16, 緑0, 青0
“#001000” … 赤0, 緑16, 青0
“#000010” … 赤0, 緑0, 青16
- 67. [Arduino]スケッチにコードを追加
70
1. Arduino IDEで、lab7.inoを開く。
https://github.com/ms-iotkithol-jp/IoTKitHoLV4/blob/master/Support/Section1/Step1/WioLTE/IoTKitHoLV4_WioLTE_Sketch.zip
2. Wio LTEに書き込む。
void IoTHubInitialize()
{
SerialUSB.println("### Connecting to MQTT server ¥""MQTT_SERVER_HOST"¥"");
MqttClient.setServer(MQTT_SERVER_HOST, MQTT_SERVER_PORT);
MqttClient.setCallback(IoTHubCallback);
MqttClient.setClient(WioClient);
if (!MqttClient.connect(DEVICE_ID)) {
SerialUSB.println("### ERROR! ###");
return;
}
MqttClient.subscribe(C2D_MESSAGE);
MqttClient.subscribe(DTWIN_SUB_RES);
MqttClient.subscribe(DTWIN_SUB_DESIRED);
delay(1000);
MqttClient.publish(DTWIN_PUB_GET, "");
}
void IoTHubCallback(char* topic, byte* payload, unsigned int length)
{
SerialUSB.print("Callback -> ");
SerialUSB.println(topic);
SerialUSB.print(" ");
for (int i = 0; i < length; i++) SerialUSB.print((char)payload[i]);
SerialUSB.println("");
if (strncmp(topic, C2D_MESSAGE, strlen(C2D_MESSAGE) - 1) == 0) {
...
}
else if (strncmp(topic, DTWIN_SUB_RES, strlen(DTWIN_SUB_RES) - 1) == 0) {
StaticJsonBuffer<200> jsonBuffer;
JsonObject& json = jsonBuffer.parseObject(payload);
if (!json.success()) return;
int telemetryCycleMs = json["desired"]["telemetry-cycle-ms"];
SerialUSB.print("telemetry-cycle-ms = ");
SerialUSB.println(telemetryCycleMs);
if (telemetryCycleMs >= 100) {
Interval = telemetryCycleMs;
}
}
else if (strncmp(topic, DTWIN_SUB_DESIRED, strlen(DTWIN_SUB_DESIRED) - 1) == 0)
{
StaticJsonBuffer<200> jsonBuffer;
JsonObject& json = jsonBuffer.parseObject(payload);
if (!json.success()) return;
int telemetryCycleMs = json["telemetry-cycle-ms"];
SerialUSB.print("telemetry-cycle-ms = ");
SerialUSB.println(telemetryCycleMs);
if (telemetryCycleMs >= 100) {
Interval = telemetryCycleMs;
}
}
}
- 73. [Arduino]スケッチにコードを追加
76
1. Arduino IDEで、lab8.inoを開く。
https://github.com/ms-iotkithol-jp/IoTKitHoLV4/blob/master/Support/Section1/Step1/WioLTE/IoTKitHoLV4_WioLTE_Sketch.zip
2. Wio LTEに書き込む。
void setup()
{
delay(200);
...
SerialUSB.println("### Module Initialize.");
TimeInitialize();
AccelInitialize(16, 800);
TemperatureAndHumidityBegin(WIOLTE_D38);
AlarmInitialize(WIOLTE_D20);
IoTHubInitialize();
SerialUSB.println("### Setup completed.");
Wio.LedSetRGB(COLOR_NONE);
}
void IoTHubCallback(char* topic, byte* payload, unsigned int length)
{
...
if (strncmp(topic, C2D_MESSAGE, strlen(C2D_MESSAGE) - 1) == 0) {
...
}
else if (strncmp(topic, DTWIN_SUB_RES, strlen(DTWIN_SUB_RES) - 1) == 0) {
StaticJsonBuffer<200> jsonBuffer;
JsonObject& json = jsonBuffer.parseObject(payload);
if (!json.success()) return;
int telemetryCycleMs = json["desired"]["telemetry-cycle-ms"];
SerialUSB.print("telemetry-cycle-ms = ");
SerialUSB.println(telemetryCycleMs);
if (telemetryCycleMs >= 100) {
Interval = telemetryCycleMs;
}
int alarm = json["desired"]["alarm"];
SerialUSB.print("alarm = ");
SerialUSB.println(alarm);
AlarmSet(alarm);
}
else if (strncmp(topic, DTWIN_SUB_DESIRED, strlen(DTWIN_SUB_DESIRED) - 1) == 0)
{
StaticJsonBuffer<200> jsonBuffer;
JsonObject& json = jsonBuffer.parseObject(payload);
if (!json.success()) return;
int telemetryCycleMs = json["telemetry-cycle-ms"];
SerialUSB.print("telemetry-cycle-ms = ");
SerialUSB.println(telemetryCycleMs);
if (telemetryCycleMs >= 100) {
Interval = telemetryCycleMs;
}
int alarm = json["alarm"];