IToTの覚え書き

マイクロビット、アルドゥイーノ、ラズベリーパイなどで楽しい道具を作る趣味のサイトです。 基本的に自分用の覚え書きです。

カテゴリ: アルドゥイーノ

WeMos D1 Mini

Arduino UNOと互換のD1 miniカードの最大の違いはWiFi機能が搭載されていることです。
WiFi機能は IoT(Internet of Things) には必要な機能です。
IoTの中心となるGoogle Home miniなどのスマートスピーカーとの連動をする準備をまとめます。
※この記事は2年前の記事を2021/03/05最新版にリニューアルしたものです。

1.D1 miniカードを買います。
 Arduino UNO R3互換、ESP8266搭載のWiFi 開発ボード、WeMos D1 miniを入手します。
アマゾンで買えます
(D1 miniにはピンがハンダ付けされていないものがあります。自分でハンダ付けが面倒なら少し大きくなりますがD1カードを買っても設定は同じです。)

2.USBドライバをインストールします。
 D1ボードのUSBドライバをダウンロードしてインストールします。

3.Arduino IDE をインストールします。
 ソフト開発環境(IDE)はArduino IDE が使える点が有り難い。無料で使いやすく情報が豊富です。
最新のArduino 1.8.13 をDOWNLOAD OPTIONS のWIndows win7 and newer からJUST DOWNLOADしてインストールします。

4.Arduino IDEを設定します。
 1)Arduino IDEを起動して、
ファイル>環境設定>追加のボードマネジャのURL で、
http://arduino.esp8266.com/stable/package_esp8266com_index.json
と入れてOKをクリックします。
 2)ツール>ボード>ボードマネージャ…で空欄に esp8266 と入れて、
esp8266 by ESP8266 communityの最新バージョン2.7.4をインストール します。
 3)ツールからボード設定します。
ボード>LOLIN(Wemos) D1 R2 & mini
Upload Speed: 115200
CPU Frequency: 160MHz
シリアルポート: COM3(←コントロールパネル>システム>デバイスマネージャ>ポートで実際にD1ボードが刺さっているCOMポートを調べる)
 4)スケッチ>ライブラリをインクルード>ライブラリを管理で空欄に esp8266-google と入れて、esp8266-google-home-notifier 1.0.7 と esp8266-google-tts 1.1.0 をインストールします。

5.google home miniを用意します。
間違って格安の中古を買ったときは、必ず裏面のボタンを長押しして初期状態にリセットして下さい。手を離せと少し脅されますが離さなければリセットされます。
Android 6.0以上のタブレットに google home アプリをインストールして、google home mini を設定します。
設定はiOSでもできますがPCではできません。(googleはMicrosoftに塩を送りません)

6.google home notifier を用意します。
日本人のhorihiroさんがgoogle home miniに自分の言葉を喋らせることのできるgoogle home notifierをD1 miniカードでも動くように全力で移植してesp8266-google-home-notifier を作ってくれました。多謝。
D1 mini カードに esp8266-google-home-notifier を入れると、google home mini に好きな言葉を喋らせることができて便利です。
ファイル>スケッチ例>esp8266-google-home-notifier>esp8266>SimpleUsage を開いて SSID やpassword、google home mini名 などを自分の環境に変更して、保存後、「→」ボタンをクリックしてマイコンボードに書き込みます。コンパイルが成功し、書き込みが100%になれば成功です。
D1 mini カードのリセットボタンを押すと google home mini が「hello world」と喋るはずです。後はスケッチを自分の用途に改造します。
(google home mini名はリビングルームのときは続いていますが、ダイニング ルームのときは半角スペースが入ります。気をつけてください)

7.googleスプレッドシート を用意します。
googleスプレッドシート は google アカウントがあれば https://docs.google.com/spreadsheets/ から作成できます。
表計算式は Excel に似ていて簡単です。
マクロは GoogleAppsScript(GAS) と言って JavaScript に似ていて慣れやすいです。GoogleAppsScript の本もたくさんあります。
googleスプレッドシート のメニュー>ツール>スクリプトエディタで doPost(e) という関数を作り、
公開>ウェブアプリケーションとして導入…すると URL を教えてくれるので、それを IFTTT の設定に使います。

<< googleスプレッドシートのマクロ例>>

function doPost(e) {
var jsonString = e.postData.getDataAsString();//IFTTTからのデータを受け取る
var data = JSON.parse(jsonString);//JSONだと日本語もOK
var value1 = data.value1; //IFTTTからの番号#をvalue1に
var value2 = data.value2; //IFTTTからの文字$をvalue2に
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName(value1);
sheet.getRange("A1").setValue(value2);//IFTTTからの文字$がA1セルに入る
url = sheet.getRange("A3").getValue();//表計算式でurlを計算してA3に入れておく
UrlFetchApp.fetch(url); //家のD1 miniカードに指示を出す
}

上記例では google home mini に喋った言葉が IFTTT 経由で A1セルに入りますが、勝手にスペースが入ることがありますので、A2セルは =SUBSTITUTE(SUBSTITUTE(A1," ","")," ","") と計算してスペースを抜きます。
A3セルは A2を使って url を計算して入るようにしておきます。


8.IFTTT(イフト)と連携します。
 1)IoT には IFTTT が必須ではないでしょうか?例えば室外からのスマホでの遠隔操作などに WebHook 機能をつかいます。
まだでしたらIFTTTの登録をおすすめします。
IFTTT を使えば直接家電製品の電源を操作したり、赤外線を出して家電製品を操作したり、google-home-notifier 経由で google home mini に喋らせたりできます。
 2)しかし、IFTTT は毎月約4ドルを支払うと無制限に使えますが、無料なら3個までしか使えません。
そこで、いったん使用者が google home mini に発した言葉を IFTTT経由で googleスプレッドシートに飛ばし、それから家の D1 mini カードを様々に指示します。
1手間増えますがそうすればIFTTT1個でシート100枚まで操作でき、100倍に使えます。

<< IFTTTの設定>>

IF(トリガー)
google assistantからSay a phrase with both a number and a text ingredient
What do you want to say?: ナンバー # $
What do you want the Assistant to say in response?: ナンバー # $ ですね?
Language: Japanese

Then(アクション)
WebHooksからMake a web request
URL: https://script.google.com/macros/s/-----------------/exec(先ほどgoogle スプレッドシートのマクロをウェブアプリとして公開したURL)
Method: POST
Content Typ: application/json
Body: {"value1": "{{NumberField}}", "value2": " {{TextField}}"}


これで準備完了です。
あとはファイル>スケッチの例>からいろいろ試して見るといいでしょう。
スケッチのコンパイルおよびボードへの転送はメニューバー下の→(右矢印)ボタンでできます。

これでできることは、
1.Google home miniから、IFTTTを使って家の電気をつけたり消したりできます。
(赤外線を使った家電製品もコントロールできます。家の外からスマホを使ってもできます)
2.Google home miniから、IFTTTを使ってGoogle Spredsheetに各種データを保存できます。
3.esp8266-google-home-notifierを使って、Google home miniに好きな言葉を喋らせることができます。

音声認識モジュール V3

音声認識モジュールVoiceRecognitionV3をアマゾンで買いました。2,990円でした。
(参考サイト)自作CNCマシン・レーザーカッターについて
メーカー/販売店:ELEHOUSEマニュアルArduino用のライブラリリファランス
この種のものとしてはArduino用のライブラリがあるので使いやすいです。

このモジュールは1.5秒以内の音声命令を最大80個記憶しますが、1度に呼び出して識別できるのは最大7個までです。
従って簡単な使い方は、7個以下の命令で使う方法です。
複雑な使い方は6個以下の命令を6個の機種で使い分ける方法です。

まず、Arduino用のライブラリをダウンロードしてArduinoIDE1.6.5のスケッチ…Include Library…Add ZIP Libraryでライブラリをインクルードします。
使うピンはアースと5VとTX,RXの4つです。UNO側のTX,RXは何番でもいいですがクロスリンクしてください。つまりTX----RX,RX----TXと繋ぎます。私は5.6番を使いました。

最初に音声登録をします。スケッチ例からvr_sample_trainを選んでそのまま、Arduino Unoにアップロードします。この段階では3VのESP8266は使えません。音声登録はArduino Unoを使います
アップロードしたらシリアルモニタをだしてtrein 0と書き込むとSpeak nowとでるのでマイクに向かって話します。Speak Againでもう一度。Sucsessがでたら0番に音声が入りました。train 1で1番、train 2で2番とそれぞれ音声を入れていきます。

全部入ったら、ピンをESP8266に差し替て、実際の運用はESP8266でします。私はLOLINを使いました。LOLINの5Vピンでは作動しませんが3Vピンで作動します。TX,RX通信用にはD1(IO5),D2(IO4)ピンを使用しました。シンプルな使い方はスケッチの例のvr_sample_control_ledを改造し、複雑な例はvr_sample_multi_cmdを改造しました。

これ1台で家のものが全部音声で操作できます。
つまりグーグルホームミニに代わって家庭内IoTの中核となれるものだと思います。グーグルホームミニよりは認識率は低いですが、例えばインターネットに繋がっていなくてもルータがあればWIFIで動かせますし、車内とか屋外とかのIoTに使えるのではないでしょうか?
EXCEL

部屋の電気を電源ではなく赤外線でコントロールしたい。
1.家の外からコントローする。→スマホを使う。
2.室内で音声でコントロールする。→グーグルホームミニを使う。¥3000(ヤフオクで)
今回は安くて小さいNodeMCU(Amica)ボードを使用する。¥500
赤外線LED¥450

AmicaIR

1のためには家のバッファローのルータでNodeMCUのローカルアドレス192.168.11.22を固定した上で、グローバルアドレスのポート50022に変換されるようにする。そうするとスマホからhttp://****.xyz:50022とやるとNodeMCUを外からコントロールできる。

2のためにはIFFTT(イフト)サービスを使う。¥0
ひとつめはトリガーはグーグルアシスタント「電気をつけて」、アクションはウェブリクエストでhttp://****.xyz:50022/on
もうひとつはトリガーが「電気を消して」、アクションがhttp://****.xyz:50022/off

/////////////////////////////////////////// スケッチ例 ////////////////////////////////////////////
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <RremoteESP8266.h>
#include <Rsend.h>

ESP8266WebServer server(80);
IRsend irsend(4);//LEDの長い方+を4番(表記はD2)ピンに、短い方-はGNDに。

void handleRoot() {
server.send(200, "text/html", "<h1><A HREF='/on'>LIGHT ON</A> | <A HREF='/off'>LIGHT OFF</A></h1>");
}

void setup() {

irsend.begin();

WiFi.mode(WIFI_STA);
WiFi.begin("106F3F3C****", "mh1nr5jpc****");

while (WiFi.status() != WL_CONNECTED) {
delay(500);
}

server.on("/", handleRoot);

server.on("/on", []() {
irsend.sendNEC(0x41B6659A, 32);//onにする赤外線コマンド送信
server.send(200, "text/html", "<h1>LIGHT ON | <A HREF='/off'>LIGHT OFF</A></h1>");
});

server.on("/off", []() {
irsend.sendNEC(0x41B67D82, 32);//offにする赤外線コマンド送信
server.send(200, "text/html", "<h1><A HREF='/on'>LIGHT ON</A> | LIGHT OFF</h1>");
});

server.begin();
}

void loop() {
server.handleClient();
delay(10);
}
///////////////////////////////////////////////////////////////////////////////////////////

<注意点>
赤外線のライブラリはIRremoteESP8266-2.5.5.zipをダウンロードしてインストールする。
赤外線のコマンドはスケッチ例のIRrecvDemoを使って前もってコマンダーから調べておく。
このためには赤外線レシーバーが必要。(¥0 既出)
NodeMCUの電源は100均で売ってるスマホ充電用の立方体の白いやつとスマホ充電用のケーブル。¥100x2
居間と寝室が離れていたのでもう一つ作って、寝室のエアコンの横に貼り付けて動かしています。2個目は¥1000でできました。

WEMOS wikiの商品スペック表を見ていたらD1ボードはアナログは入力ピンが1個だけだったが、D32ボードはアナログの入力ピンが6、出力ピンが2もある。ややこしい設計変更せずに、D1ボードに変更しましょう。

これで、H2とCH4の2つのアナログ値を同時に計測できます。

1.HiLetgo® ESP32 ESP-32S NodeMCU開発ボード2.4GHz WiFi + Bluetoothデュアルモード

2.KKHMF ESP32 ESP-32S NodeMCU開発ボード2.4GHz WiFi + Bluetooth デュアルコアCPU低消費電力

3.WINGONEER UNO R3 D1 R32 ESP32 ESP-32 CH340G開発ボードDual-Mode WiFi Bluetooth Arduino用マイクロUSB搭載の4VDC DC 5V-12V(今回のテストは3.を使いました)

今まで使ってきたWindowsXpはESP32とは、相性が悪いのでWindows10を使います。USBドライバは必要ありません。

Arduino IDEも1.6.5ではD32ボードをインストールできないので、1.8.5を使います。1.6.5に追加でインストールするため1.8.5はZIPダウンロードしました。

環境設定で以下を追加。
https://dl.espressif.com/dl/package_esp32_index.json

ボードマネージャでesp32 と入力. esp32 by Espressif Systems version 1.0.0を選択して Install

ボード: "DOIT ESP32 DEVKIT V1"
Flash Mode: "QIO"
Flash Size: "4MB (32Mb)"
Partition Scheme: "初期値"
Flash Frequency: "80MHz"
PSRAM: “Disabled”
Upload Speed: "115200"
Core Debug Level: なし
シリアルポート: ご自分のUSB(COM)ポート
書込み装置: USBasp

その後、esp8266-google-home-notifierをインストールしました。

////////////////////////////////////////////////////////////////////////////////////////
#include <WiFi.h>
#include <esp8266-google-home-notifier.h>

GoogleHomeNotifier ghn;

void setup() {
WiFi.mode(WIFI_STA);
WiFi.begin("106F3F3C2***", "mh1nr5jpc0***");
delay(5000);
ghn.device("リビングルーム", "ja");
ghn.notify("みなさん、こんにちわ");
}

void loop() {
}
/////////////////////////////////////////////////////////////////////////////

D32ボードでもちゃんと喋ってくれました。

HiLetgo 1602 LCD キーパッド シールド ボード ブルー バックライトを付き Arduinoに対応 Duemilanoveロボット [並行輸入品]はD1ボードで使えるか?

本家はDFROBOTのキーパッドシールドDFR0009です。
Arduinoの上に亀の子状に被せる事で面倒な配線や半田付け不要で動作します。

DFR0009_Web.pdf

/////////////////////////////// ボタン不使用のスケッチ例 /////////////////////////////////
#include <LiquidCrystal.h>
//LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // for original UNO board
LiquidCrystal lcd(0, 2, 4, 14, 12, 13); // for D1 board

void setup(){
lcd.begin(16, 2); // start the library
lcd.setCursor(0,0); // set the LCD cursor position
lcd.print("Push the buttons"); // print a simple message on the LCD
}

void loop(){
}
//////////////////////////////////////////////////////////////////////

D1ボードでも上のスケッチのようにピン番号を変えたら使えます。
ボタンもスケッチを書けば使えます。
しかしこのシールドはボタン操作のためにアナログ端子を1つ使います。
D1ボードに唯一のアナログ端子が使われてしまい、アナログセンサーを1つもつけられなくなります。
なので、D1ボードとDFR0009シールドの相性は悪いと言うことになりました。残念。

ですがD32ボードならアナログピンもいっぱいあるので使えるのではないでしょうか?
waves ESP32 ESPDuino-32 (ESP-WROOM-32) 技適取得品
D32Board
これなら形がUNOなので乗っかります。

ESPduino32s
ピン配列も印刷通りのようです。

/////////////////////////////// ボタン不使用のスケッチ例(失敗例) /////////////////////////////////
#include <LiquidCrystal.h>
//LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // for original UNO board
//LiquidCrystal lcd(0, 2, 4, 14, 12, 13); // for D1 board
LiquidCrystal lcd(12, 13, 17, 16, 27, 14); // for D32 board

void setup(){
lcd.begin(16, 2); // start the library
lcd.setCursor(0,0); // set the LCD cursor position
lcd.print("Push the buttons"); // print a simple message on the LCD
}

void loop(){
}
//////////////////////////////////////////////////////////////////////

あれ~?やってみたけど、うまくいかない。残念。
ESP32系列はWindowsXpと相性が悪いので、Windows10が来たら再度挑戦・・・
ということで勘弁してください。

↑このページのトップヘ