NodeMCUを使ったIoTの - 開発のためのセットアップ [日本語]
この記事のパート 1では、準備と IoT ツールの選択、すべてのツールの準備について見てきました。IoT ツールは、開発環境をセットアップし、NodeMCU をいくつかのコードで動作可能にします。
ミニ USB コネクタ付きの NodeMCU ユニットを使って、MacOS(BigSur)に接続することを説明します。しかし、その前にいくつかの設定を行う必要があります。なお、デバイスの仕様によって説明が異なる場合があります。
- Arduino IDE のインストールと設定
- Arduino ESP8266 extension を IDE に追加する。
- USB ドライバのインストール
- IDE との通信テスト
- テスト用のコードを読み込む
Arduino のインストール 1.8.13 (Mac OS X) IDE はこちらからダウンロードできるので、必要なバージョンをダウンロードしてインストールします。IDE を起動すると、一般的な LED Blink コードの Sketch プログラムがサンプルとしてロードされます。簡単な Sketch では、LED を ON/OFF にして、少し遅れて点滅させることができます。
私の NodeMCU ユニットを USB に接続すると、ボード上に青い LED があり、何かをロードする前に点滅し始めました。このユニットのメーカーである Oddwires 社は、NodeMCU にそのスクリプトをプリロードしており、それは OK です。デバイスが動作しているかどうかを知るための良いテストです。
次に、開発用の IDE に Arduino ESP8266 エクステンションを追加する必要がある。メニューから IDE Arduino > Preferences を選択し、Additional Board Manager URLs の欄にhttp://arduino.esp8266.com/stable/package_esp8266com_index.json
を入力する。これにより、IDE の Tools->Board メニューにいくつかの選択肢が追加されます。
Tools -> Board メニューから Boards Manager を開き、esp8266 プラットフォームをインストールし、インストール後に Tools -> Board メニューから NodeMCU 1.0(ESP-12E Module)を選択します。このモジュールは、新しい NodeMCU 開発キット 2.0 に対応しています。
インストールが完了すると、バージョン 2.7.4
この時点で、コードを NodeMCU デバイスにロードすることができます。 私の MacOS では、これは期待通りに動作し、IDE は接続の準備ができています。
なお、システムによっては、NodeMCU にコードを書き込むために、IDE に USB 通信を追加する必要があります。最初の IoT 投稿で、この dev-kit は CP2102 USB UART チップをベースに作られていると述べました。MacOS 用の署名入りドライバをインストールする必要があります。 Silicon Labs CP210x USB to UART Bridge VCP Driversを参照してください。インストールした後にこの機能を有効にするには、MAC OSX を再起動する必要があります。
NodeMCU ユニットをミニ USB ケーブルで MAC に接続すると、LED が点滅し始め、ユニットが正常に動作していることを示します。IDE Tools -> Port メニューで、デバイスのポートを選択します。私の場合、デバイスに応じて以下のように選択しました。
- Port: /dev/cu.usbserial-00001
ボードタイプを選択します ESP8266 Board (2.7.4) -> NodeMCU 1.0 (ESP-12E Module)
これは私が持っているデバイスのタイプですが、あなたのキットにはこれのバリエーションがあるかもしれません。
デバイスが接続されていない場合、ポートは表示されませんのでご注意ください。また、このポートや同様のポートが表示されない場合は、正しい USB ドライバーがインストールされていないことを意味します。私は、USB ドライバーを再インストールし、MAC を再起動してユニットを再接続することで、この問題を少しいじりました。この時点では、これらの選択はすべて良いはずです。delay(2000);`を変更して Blink スケッチをコンパイルしてみてください。
では、このスケッチプログラムを端末に読み込ませてみましょう。
MCU の USB に接続して問題がないことを確認した後、開発者のセットアップをテストするためにサンプルのスケッチコードをロードしようとしました。以下のコードは、LED を点滅させるだけで面白いものではありませんが、テストには十分です。
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
digitalWrite(LED_BUILTIN, HIGH);
delay(2000);
}
コードのコンパイルには成功しましたが、プログラムのロード時に以下のエラーが発生しました。このエラーは、MacOS BigSur 11.2.3 で発生することがあります。それ以前の MacOS や他の Linux を使用している場合は、このエラーが表示されない可能性があります。
Arduino: 1.8.13 (Mac OS X), Board: "NodeMCU 1.0 (ESP-12E Module), 80 MHz, Flash, Legacy (new can return nullptr), All SSL ciphers (most compatible), 4MB (FS:2MB OTA:~1019KB), 2, v2 Lower Memory, Disabled, None, Only Sketch, 115200"
Executable segment sizes:
IROM : 228624 - code in flash (default or ICACHE_FLASH_ATTR)
IRAM : 26752 / 32768 - code in IRAM (ICACHE_RAM_ATTR, ISRs...)
DATA : 1248 ) - initialized variables (global, static) in RAM/HEAP
RODATA : 688 ) / 81920 - constants (global, static) in RAM/HEAP
BSS : 24880 ) - zeroed variables (global, static) in RAM/HEAP
Sketch uses 257312 bytes (24%) of program storage space. Maximum is 1044464 bytes.
Global variables use 26816 bytes (32%) of dynamic memory, leaving 55104 bytes for local variables. Maximum is 81920 bytes.
pyserial or esptool directories not found next to this upload.py tool.
An error occurred while uploading the sketch
This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.
なお、Arduino でデバッグを行う際には、IDE を「Show verbose」モードにすると便利です。
Google ではこのようなエラー例が多数紹介されています。解決方法は比較的簡単で、MacOS の BigSur にある Python の lib ファイルlist_ports_osx.py
をこのディレクトリパスに更新する必要があります。
~/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/tools/pyserial/serial/tools/list_ports_osx.py
- そのファイルをテキストエディタで開きます。私は Sublime Text エディタを使用し、以下のコマンドを使用しました。
cd ~/Library/Arduino15/packages/esp8266/hardware/esp8266/2.7.4/tools/pyserial/serial/tools
open -a "Sublime Text" list_ports_osx.py
- コードを以下のように編集し、29 行目と 30 行目をコメントして保存します。下図のように 2 行のコードを追加します。
#iokit = ctypes.cdll.LoadLibrary(ctypes.util.find_library('IOKit'))
#cf = ctypes.cdll.LoadLibrary(ctypes.util.find_library('CoreFoundation'))
iokit = ctypes.cdll.LoadLibrary('/System/Library/Frameworks/IOKit.framework/IOKit')
cf = ctypes.cdll.LoadLibrary('/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation')
このpostのjuanssl
さんのアップロードエラーを解決してくれたヒントに、大きな感謝を捧げます!
スケッチコードをアップロードすると、NodeMCU ユニットの LED が点滅し始め、テストが成功したことを示します。
このコードが読み込まれると、NodeMCU の青色 LED が、コードで設定した遅延時間で点滅し始めます。 このテストは成功しましたが、LED を点滅させるのはあまりエキサイティングではないことは同意できます。
それでは、NodeMCU を WiFi に接続して、このデバイスにリモートコマンドを送るような、もっと面白いことをやってみましょう。ここでは 2 つのエンドポイントを作り、URL コマンドで LED を ON/OFF します。ESP8266 の拡張機能で提供されているサンプルを使います。File > Examples > ESP8266WebServer “を開き、”HelloServer “を選択します。これはコマンドを設定するためのシンプルな HTTP サーバのサンプルコードである。ここでは完全なソースコードを示します。
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
const char* ssid = "...<WiFi SSID Here>..";
const char* password = "...<Password>";
ESP8266WebServer server(80);
const int led = 2;
void handleRoot() {
digitalWrite(led, HIGH);
server.send(200, "text/plain", "Hello from esp8266! NodeMCU Server");
digitalWrite(led, LOW);
}
void ledOn() {
digitalWrite(led, HIGH);
server.send(200, "text/plain", "NodeMCU LED ON");
}
void ledOff() {
digitalWrite(led, LOW);
server.send(200, "text/plain", "NodeMCU LED OFF");
}
void handleNotFound(){
digitalWrite(led, HIGH);
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET)?"GET":"POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i=0; i<server.args(); i++){
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
digitalWrite(led, LOW);
}
void setup(void){
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
if (MDNS.begin("esp8266")) {
Serial.println("MDNS responder started");
}
server.on("/", handleRoot);
server.on("/inline", [](){
server.send(200, "text/plain", "this works as well");
});
server.on("/on", ledOn);
server.on("/off", ledOff);
server.onNotFound(handleNotFound);
server.begin();
Serial.println("HTTP server started");
}
void loop(void){
server.handleClient();
}
搭載された LED を簡単なコマンドで制御することができる。
const int led = 2; // LED ID may be different depneds on wiring
digitalWrite(led, LOW); // LED OFF
digitalWrite(led, HIGH); // LEAD ON
LED スイッチを制御するために、URL パス/on & /off
にマッピングされた 2 つの小さなメソッドを追加しました。
void ledOn() {
digitalWrite(led, LOW);
server.send(200, "text/plain", "NodeMCU LED ON");
}
void ledOff() {
digitalWrite(led, HIGH);
server.send(200, "text/plain", "NodeMCU LED OFF");
}
server.on("/on", ledOn);
server.on("/off", ledOff);
Tools > Serial Monitor
でシリアルモニタウィンドウを開き、このコードを NodeMCU にアップロードすると、ロードの進行状況が表示されます。この作業を初めて行う場合は、最初のロードの後、NodeMCU デバイスを再起動する必要があります。電源を切るか、NodeMCU デバイスのプラグを抜いてください。アップロード後、デバイス上でサーバが起動します。モニターウィンドウには、ウェルカムメッセージと、IoT デバイスにコマンドを送信するために使用できる IP アドレスが表示されます。
ウェブブラウザを開き、以下の URL を入力します。http://192.168.1.12/on
この動作は、LED ライトを青い光で点灯させます。同様の URL http://192.168.1.12/off
を入力すると、LED が消灯します。
さて、これまでの成果をまとめてみましょう。
- NodeMCU 用の Arduino IDE で開発システムをセットアップしました。
- IoT デバイスを接続し、テストしました。
- WiFi ネットワークに接続した
- ブラウザから NodeMCU の制御を開始しました。
次の IoT 開発プロジェクトのための非常に良い出発点となりました。それは新しい Trailblazing になるでしょう!