[IchigoJam メニューへ戻る]

ボクにもわかる
IchigoJam用サンプルプログラム
Espressif ESP8266 ESP-WROOM-02
無線LAN ワイヤレス通信実験

IchigoJamとESP-WROOM-02を使ったワイヤレス通信実験の様子
IchigoJamとESP-WROOM-02を使ったワイヤレス通信実験の様子

はじめに

 ここではIchigoJamと、Espressif 無線LAN Wi-Fi モジュール ESP-WROOM-02を使ったワイヤレス通信実験用サンプルプログラムを紹介します。

メニュー(本ページ内)


ESP-WROOM-02モジュールとは

 ESP-WROOM-02モジュールは、無線ICチップのメーカーEspressif Systems社(中国・上海)が開発した無線LANチップESP8266およびフラッシュメモリ(SPI接続・4MB)、水晶発振子、そして同社が開発したWiFiとTCP/IPのプロトコルスタック、ATコマンドAPIを実装したIEEE802.11b/g/n対応の無線LANワイヤレス通信モジュールです(以下、ESPモジュール)。GPIOやADC、PWM、I2C等のインタフェースを搭載しており、アプリケーションソフトウェアを本ESPモジュール上で動かすことも可能です。
 このESPモジュールの特長は500円前後の低価格で販売されていることと、国内の電波法に基づいた認証を取得していること、インターネットにアクセスするためのTCP/IPプロトコルスタックを搭載していることです。秋月電子通商やaitendoから購入することが出来ます。
 ESPモジュールのサイズは18mm×20mm×3mmです。この中に同社が開発した5mm角のサイズの無線LAN用ICチップが実装されています。しかも、その5mm角のサイズに(従来は外付けだった)周辺部品のほぼ全てが内蔵されています。

無線LANワイヤレス通信モジュールESP-WROOM-02とaitendo製ピッチ変換基板
無線LANワイヤレス通信モジュールESP-WROOM-02とaitendo製ピッチ変換基板

 本ESPモジュールは表面実装用部品です。端子のピッチも1.5mm間隔です。通常の2.54mmピッチのユニバーサル基板やブレッドボードで使用するにはピッチ変換基板が便利です。
 上図の右側はaitendo製のWiFiモジュール変換基板(A)[IFB1518-A](参考価格130円)、下図の左側は秋月電子通商製のESP-WROOM-02用2.54mmピッチ変換基板AE-ESP-WROOM-02(参考価格120円)の写真です。
 これらはESPモジュールのピンピッチ変換のみを行う基板です。全てのピンにアクセスすることが出来ますが、その一方で設定ピンやプルアップ抵抗についても外部(ブレッドボード等)で配線・実装する必要があります。

無線LANワイヤレス通信モジュールESP-WROOM-02と秋月製ピッチ変換基板
無線LANワイヤレス通信モジュールESP-WROOM-02と秋月製ピッチ変換基板

 秋月製の変換基板にESPモジュールとピンヘッダを半田付けした後の写真を下図に示します。

秋月製ピッチ変換基板AE-ESP-WROOM-02の完成例
秋月製ピッチ変換基板AE-ESP-WROOM-02の完成例

 ESPモジュールの半田付け部が狭く、半田付けに慣れていないと難しいので、ESPモジュールの半田付けが不要な「Wi-Fiモジュール ESP-WROOM-02 DIP化キット(参考価格650円)」がお奨めです。ピンヘッダも付属しています。しかも、ESPモジュール(550円)、ピッチ変換基板(120円)、ピンヘッダ(9ピン×2本×1円=18円相当)を別々に購入するよりも安価です。


ESP-WROOM-02モジュールのファームウェア

 古いファームウェアをお使いの場合はバージョンアップが必要です。2015年8月以降にaitendoや秋月電子通商にて購入したモジュールについては問題ありません。
 本ページのサンプルは、下記のファームウェアにて動作確認を行いました。これよりも古いファームウェアの場合は動作しない場合があります(後述のバージョンアップが必要です)。

動作確認済みバージョン

AT+GMR

AT version:0.25.0.0(Jun  5 2015 16:27:16)
SDK version:1.1.1
compile time:Jun  5 2015 21:03:10

AT version:0.50.0.0(Sep 18 2015 20:55:38)
SDK version:1.4.0
compile time:Sep 18 2015 21:46:58


ハードウェアの製作・ESP-WROOM-02の接続 Ver 1.2

 下表にESP-WROOM-02のピン配列表を示します。シリアルのTXDとRXD(TXD→RXD、RXD→TXD)、GNDをIchigoJamへ接続します。実際にTXDとRXDをIchigoJamに接続するタイミングは、プログラムの実行直前が良いでしょう。(プログラム入力中にエラー等のメッセージがESPモジュールに送信されたり、その応答がIchigoJamに入力され、場合によっては作成中のプログラムが破壊されることがあります。)
 なお、IchigoJam BASICのバージョンがVer 1.0〜1.1の場合は、
後述の製作例を参照してください。

ESP-WROOM-02のピン配列 Ver 1.2
Pin ピン名 接続先   Pin ピン名 接続先
1 3V3 電源   18 GND GND
2 EN Hレベル   17 IO16 Open
3 IO14 Open   16 TOUT Open
4 IO12 Open   15 RST P-UP/SW
5 IO13 Open   14 IO5 Open
6 IO15 Lレベル   13 GND GND
7 IO2 Hレベル   12 TXD RXDへ
8 IO0 P-UP/SW   11 RXD TXDへ
9 GND GND   10 IO4 Open

 下図は秋月電子通商製のWi-Fiモジュール ESP-WROOM-02 DIP化キットを使った場合の製作例です。右側の小さな部品は、同じく秋月電子通商製のUSBシリアル変換アダプタです。このページでは使用しませんが、本モジュールをパソコンのUSB端子に接続する時に必要です。なお、この製作例ではGPIOを電源やGNDに接続しています(不用意にGPIOに出力しないように注意してください)。

ブレッドボード上に組んだ回路の様子
ブレッドボード上に組んだ回路の様子

 必要な部品リストは以下の通りです。

ESP-WROOM-02 DIP化キット                1式     650円   秋月電子通商 AE_ESP-WROOM-02
レギュレータ 3.3V500mA TA48M033F        1個     100円   秋月電子通商 TA48M033F(S Q)
電解コンデンサ 47uF                     1個     -       上記の商品に付属
(セラミックコンデンサ 0.1uF)           (1個)    -       上記の商品に付属・ここでは使用しない
USBシリアル変換モジュール               1式     600円   秋月電子通商 AE-FT234X
タクトスイッチ                         1個     10円    汎用品(単価10円程度)
ミニブレッドボード BB-601               1枚     130円   170穴、電源なし
ブレッドボード用ジャンパ EIC-J-L        1式     400円   単線ワイヤ。長さが色で表示されている

 下図のように、電源とTXD、RXDをIchigoJamや、IchigoJamマイコンボードの互換基板などに接続します。ESP-WROOM-02のTXをIchigoJamのRXDに、ESP-WROOM-02のRXDをTXDに接続してください。

IchigoJamに接続した時の様子
CQ出版社 Personal Computer基板に接続した時の様子

 ブレッドボードへ供給する電源の電圧は5Vです。純正のIchigoJam Uの場合は、マイコンボード以外の別電源が必要です。ESPモジュールが一時的に500mAくらいの電流が流れるのに対し、純正のIchigoJam UのUSB端子にはポリスイッチが入っており、100mAまでしか流せないからです。別電源から供給する場合についても、ESP-WROOM-02のGNDについてはIchigoJamにも接続してください。
 なお、現在、jig.jp社が開発中の次の新IchigoJamマイコンボード(名称不明)では、電源部が改良されており、5ピンのCN5から5Vの電源を取り出すことが可能になる見込みです(http://fukuno.jig.jp/1367)。


プログラム Ver 1.2 ワイヤレスでLチカ

 回路が完成したらIchigoJamへプログラムを入力します。無線LANアクセスポイントへ接続するにはSSIDとパスワードが必要です。これらを行番号40と60の「"」で囲まれた部分に入力します。

プログラム Ver 1.2 ワイヤレスでLチカ
cls:new
rem     Espressif ESP8266 ESP-WROOM-02 ヨウ
rem     Wireless LED for IchigoJam Version 1.2
rem     Copyright (c) 2015-2016 Wataru KUNINO
rem     https://bokunimo.net/ichigojam/

1 'ESP Example
2 uart 3,2:? "AT":wait 30
10 ? "AT+RESTORE":gosub 900
20 ? "AT+CWMODE=1":gosub 900
30 ? "AT+CWJAP=";chr$(34);
40 ? "ココ ニ SSID ヲ キニュウ";
50 ? chr$(34);",";chr$(34);
60 ? "ココ ニ パスワード ヲ キニュウ";
70 ? chr$(34):wait 400:gosub 900
80 ? "AT+CIFSR":gosub 900
100 'Serv
110 ? "AT+CIPMUX=1":gosub 900
120 ? "AT+CIPSERVER=1,23":gosub 900
200 'LED
210 gosub 950:if K<>asc(":") goto 200
220 gosub 950:if K<>asc("L") goto 200
230 gosub 950:if K=asc("0") goto 250
240 led 1:beep:?:? "LED=1":goto 200
250 led 0:beep:?:? "LED=0":goto 200
260 goto 200
270 end
900 'Rx
910 wait 30:uart 0,2
920 K=inkey():if K=0 goto 940
930 ? chr$(K);:goto 920
940 uart 3,2:return
950 'Rx0
960 K=inkey():if K=0 goto 960
970 uart 0,2:?chr$(K);
980 return

 プログラムの入力が完了したら、TXDとRDXを接続します。上図のPersonal Computer基板であれば、IO切り替えスイッチSW5を右の「IO」側にスライドさせるだけで接続することが出来ます(切断は左の「USB」側)。
 そして、キーボードから「RUN」を入力して実行します。モジュールの設定を初期状態に戻したあとに、無線LAN子機(STAモード)として無線LANアクセスポイントへの接続が実行されます。接続が完了するまで10秒ほどの時間を要します。
 無事に接続出来た場合はテレビに本機のIPアドレスとMACアドレスが表示されます。この後、このIPアドレスを使用するので必ず控えておきます。(MACアドレスは不要)

 次に、同じネットワーク上のパソコンのTera Term等から上記のIPアドレスにTELNETで接続してみましょう。Tera Termの「ファイル」メニューの「新しい接続」を選び、ESPモジュールのIPドレスとポート番号「23」を下図のように入力します。IPアドレスは先ほど控えた番号です。ポート番号23はTELNET用に決められた番号です。

TeraTermをTELNETクライアントとして使用する
TeraTermをTELNETクライアントとして使用する

 Tera Termによる接続後に、Tera Termのウィンドウ内で、「L」「1」「Enter」を入力すると、無線LAN経由でメッセージ「L1」が送信され、IchigoJam側のLEDが点灯します。消灯は「L0」です。
 CygwinやLinux、Raspberry Piの場合は、以下のようなコマンドで制御することも可能です(IPアドレスが「192.168.0.140」であった場合の例)。

LEDを点灯する: echo "L1" > /dev/tcp/192.168.0.140/23

LEDを消灯する: echo "L0" > /dev/tcp/192.168.0.140/23

 IchigoJamのLED端子にリレーを接続すれば、IchigoJamに接続した機器をワイヤレスで制御することが出来るようになります。しかも、セキュリティの知識があれば外出先やインターネット経由で制御することも可能になります。
 プログラムのうち、LEDの制御に関する部分は、行番号200番台です。メッセージを受信すると「+IPD,0,4:L1」のような文字列がシリアルから入力されます。この意味はセッションID=0に4バイトの受信データを受け取り、その内容が「L1」であることを示しています。
 行番号210では、このメッセージ内の「:」を待ち受け、行番号220では、その直後に「L」が来たらLED制御と判断し、行番号230では、その次のデータが「0」の時にLEDを消灯する行番号250にジャンプします。

 ESP-WROOM-02の命令(ATコマンド)については「ESP-WROOM-02モジュール ATコマンドリファレンス」を参照してください。

 主要な解説は以上です。実際に製作される場合は「その他・応用情報・注意事項など」もご確認ください。



ESP-WROOM-02モジュール単体で同じ動作

 ESP-WROOM-02内にプログラムを書き込んで、IchigoJamなしで動かすことも可能です。以下は似たような動作をするサンプルプログラムを紹介しておきます。

[参考情報] ESP-WROOM-02のみ「IchigoJamなしでワイヤレスLチカ」
/*******************************************************************************
LEDを点滅させるサンプルプログラム Example Wireless LED for ESP-8266

                                            Copyright (c) 2016 Wataru KUNINO
*******************************************************************************/

#include <ESP8266WiFi.h>                    // Wi-Fi機能を利用するために必要
#define PIN_LED 13                          // IO 13(5番ピン)にLEDを接続する
#define SSID "1234ABCD"                     // 無線LANアクセスポイントのSSID
#define PASS "password"                     // パスワード
#define TIMEOUT 20000                       // タイムアウト 20秒
WiFiServer server(23);                      // Wi-Fiサーバ(ポート23=TELNET)定義

void setup(){                               // 起動時に一度だけ実行する関数
    pinMode(PIN_LED,OUTPUT);                // LEDを接続したポートを出力に
    Serial.begin(9600);                     // 動作確認のためのシリアル出力開始
    Serial.println("Example Wireless LED"); // タイトルをシリアル出力表示
    WiFi.begin(SSID,PASS);                  // 無線LANアクセスポイントへ接続
    while(WiFi.status() != WL_CONNECTED){   // 接続に成功するまで待つ
        Serial.print('.');                  // 進捗表示
        digitalWrite(PIN_LED,!digitalRead(PIN_LED));    // LEDの点滅
        delay(500);                         // 待ち時間処理
    }
    server.begin();                         // サーバを起動する
    Serial.println("\nStarted");            // 起動したことをシリアル出力表示
    Serial.println(WiFi.localIP());         // 本機のIPアドレスをシリアル出力
}

void loop(){                                // 繰り返し実行する関数
    WiFiClient client;                      // Wi-Fiクライアントの定義
    char c;                                 // 文字変数を定義
    int i=0;                                // 待ち受け時間のカウント用の変数
    
    client = server.available();            // 接続されたクライアントを生成
    if(client==0) return;                   // 非接続の時にloop()の先頭に戻る
    Serial.println("Connected");            // 接続されたことをシリアル出力表示
    while(client.connected()){              // 当該クライアントの接続状態を確認
        if(client.available()){             // クライアントからのデータを確認
            i=0;                            // 待ち時間変数をリセット
            c=client.read();                // データを文字変数cに代入
            switch(c){                      // 文字cに応じて
                case '0':                       // 文字変数cの内容が「0」のとき
                    digitalWrite(PIN_LED,LOW);  // LEDを消灯
                    Serial.println("0");        // 文字の内容をシリアルに出力
                    break;
                case '1':                       // 文字変数cの内容が「1」のとき
                    digitalWrite(PIN_LED,HIGH); // LEDを点灯
                    Serial.println("1");        // 文字の内容をシリアルに出力
                    break;
                case 0xF6:                      // AYT信号
                    Serial.println("AYT");      // 文字の内容をシリアルに出力
                    client.println("Yes");      // 「Yes」を応答
                    break;
                case 0xF3:                      // BRK信号
                    Serial.println("BRK");      // 文字の内容をシリアルに出力
                    i=TIMEOUT;                  // 切断するためにiを最大値に
                    break;
            }
        }
        i++;                                // 変数iの値を1だけ増加させる
        if(i>TIMEOUT) break; else delay(1); // TIMEOUTに到達したらwhileを抜ける
    }
    client.stop();                          // クライアントの切断
    Serial.println("Disconnected");         // シリアル出力表示
}


コマンド・リファレンス


クリックで拡大表示

ハードウェアの製作・ESP-WROOM-02の接続 Ver 1.0

 以下は、IchigoJam BASIC 1.0.1〜1.1.1用の古い記事です。1.2でも動くと思いますが、プログラムが複雑になっています。シリアルの受信バッファが小さかったため、通信速度を下げたり、フロー制御を行っているためです。
 下表にESP-WROOM-02のピン配列表を示します。シリアルのTXDとRXD(TXD→RXD、RXD→TXD)、GNDのほか、フロー制御用のCTS端子をIchigoJamのOUT1に接続します。実際にTXDとRXDをIchigoJamに接続するタイミングは、プログラムの実行直前が良いでしょう。(プログラム入力中にエラー等のメッセージがESPモジュールに送信されたり、その応答がIchigoJamに入力され、場合によっては作成中のプログラムが破壊されることがあります。)

ESP-WROOM-02のピン配列 Ver 1.0
Pin ピン名 接続先   Pin ピン名 接続先
1 3V3 電源   18 GND GND
2 EN Hレベル   17 IO16 Open
3 IO14 Open   16 TOUT Open
4 IO12 Open   15 RST P-UP/SW
5 IO13 OUT1へ   14 IO5 Open
6 IO15 Lレベル   13 GND GND
7 IO2 Hレベル   12 TXD RXDへ
8 IO0 P-UP/SW   11 RXD TXDへ
9 GND GND   10 IO4 Open

 上表に従ってミニブレッドボード上に回路を組みます。aitendoの変換基板の場合は下図の様に配線します。ブレッドボード上で完結しているジャンパー線の色はジャンパー線の長さ(100mil単位)を示しています。ブレッドボードの上部(矢印の列)にESPモジュールを装着します。
 ミニブレッドボードにはピン位置を示す番号などが印刷されていないので予め結線情報をシールなどで貼っておくと便利です。あるいは縦方向に1〜17の番号を書いておくだけでも配線ミスを減らせます。

ブレッドボード上に組んだ回路の様子
ブレッドボード上に組んだ回路の様子(aitendo製ピッチ変換基板の場合)

 基板上の2つのスイッチはそれぞれリセットスイッチ(黒・上)とファームウェアの書き換え用スイッチ(白・下)です。ファームウェアの書き換え時は白のスイッチを押しながら黒のスイッチを押して離します。本スイッチが無かったとしても、「AT+CIUPDATE」コマンドを実行すればインターネット経由でファームウェアをダウンロードし、最新のファームウェアに書き換えることが出来ます。
 本ESPモジュール電源電圧範囲は3.0〜3.6Vです。今回は安定化電源(3.3VのACアダプタでも可)を使用し、外部から供給して実験しました。電源線の配線が長かったため、電解コンデンサ(1000uF)を入れていますが、レギュレータ等を使用した場合はもっと小さなコンデンサで良いでしょう。
 秋月製のピッチ変換基板を使った場合の製作例を下図に示します。こちらはファームウェアの書き換え用ボタンを省略しました。

ブレッドボード上に組んだ回路の様子
ブレッドボード上に組んだ回路の様子(秋月製ピッチ変換基板の場合)

 配線が完了したら、ブレッドボードにESPモジュールを実装します。秋月製ピッチ変換基板を使った場合、モジュールをブレッドボードに乗せたまま配線の変更を行えます。

ブレッドボード上に組んだ回路の様子
ブレッドボード上に組んだ回路の様子(秋月製ピッチ変換基板の場合)

 以上、本ページでは2種類のピッチ変換基板について説明しました。周辺回路との配線数についてはaitendo製の方がブレッドボードの内側の穴間で配線が可能な分だけ有利で、またブレッドボードからの食み出しが少なく省スペースに収まります。一方、無線性能はアンテナ部がブレッドボードから食み出す秋月製ピッチ変換の方が良好のようです。それぞれの特長について下表にまとめておきます。

aitendo製と秋月製のピッチ変換基板の比較表
項目 aitendo
IFB1518-A
vs 秋月電子通商
AE-ESP-WROOM-02
基板単品の参考価格 120円+税 秋月
電子
120円
省スペース ブレッドボード内 aite
ndo
モジュールがはみ出る
実装状態での配線変更 不可能 秋月
電子
可能
周辺回路との配線数の有利性 対向ピン間配線が可能 aite
ndo
対向ピン間配線不可能
アンテナ特性 ブレッドボードが影響 秋月
電子
影響が少ない
モジュール実装済み品 なし 秋月
電子
あり(参考価格650円)


ソフトウェアの製作@無線LANアクセスポイントへの接続

 回路が完成したらIchigoJamへプログラムを入力します。この節ではESPモジュールを無線LANアクセスポイントへワイヤレス接続するプログラム@を作成し、本プログラムの実行後に次節に示すTELNETサーバ用のプログラムAを実行します。
 なお、一度、無線LANアクセスポイントへの接続を行うとESPモジュール内に設定が記憶され、次回からは自動で接続するようになります。したがってこのプログラム@を使用するのは、初回時と、長時間使わなかった場合などです。

 無線LANアクセスポイントへ接続するにはSSIDとパスワードが必要です。これらを行番号6と7の「=」に続けて入力します。(「"」は不要です。)

プログラム@無線LANアクセスポイントへの接続
rem     Espressif ESP8266 ESP-WROOM-02 ヨウ
rem     Setup for Wi-Fi Station

rem     Copyright (c) 2015 Wataru KUNINO
rem     https://bokunimo.net/ichigojam/

rem     X,Y ヒョウジザヒョウ
rem     P   ESP メイレイ ポインタ
rem     Q   ESP データ ポインタ
rem     K   キーニュウリョク
rem     C   クギリモジ(620 strcharヨウ)

1 'ESP Setup
2 'AT+UART=9600,8,1,0,3
3 'AT+CWMODE=1
4 'AT+RST
5 'AT+CWJAP="
6 'AP=ここにアクセスポイントのSSIDを記入する
7 'PW=ここにパスワードを記入する
8 'AT+CIFSR
10 ifver()>=11000uart1
20 cls:bps0:?"AT";chr$(13):gosub650
100 'STA
110 P=#C10
120 C=39:gosub600:?chr$(13):gosub650
130 bps9600:?"AT";chr$(13):gosub650
140 gosub600:?chr$(13):gosub650
150 gosub600:?chr$(13):wait120:gosub650
160 gosub600:
170 C=61:gosub600:?chr$(34);",";chr$(34);
180 gosub600:?chr$(34);chr$(13):wait400:gosub650
200 'IP
210 C=39:gosub600:?chr$(13)
220 X=0:Y=10:gosub700
230 bps0:end
600 'TX
610 ifpeek(P)<>CletP,P+1:goto610
620 P=P+1:ifpeek(P)?chr$(peek(P));:goto620
630 return
650 'CLR
660 out1,0
670 wait3:ifinkey()goto670elseout1,1
680 wait3:ifinkey()goto680
690 return
700 'RX
710 J=0:Q=#700
720 K=inkey():ifKpokeQ,K:Q=Q+1:J=0:ifQ<#800goto720
730 J=J+1:ifJ<100out1,0:out1,1:goto720
740 ifQ=#700:return
750 forJ=#700toQ-1:K=peek(J)
760 ifK>32poke#900+X+Y*32,K:X=X+1:ifX>31letX,0:Y=Y+1
770 ifK=13letX,0:Y=Y+1:lcX,Y
780 ifY>23:Y=23:scroll0:lc0,Y
790 next:return

 プログラムの入力が完了したら、TXDとRDXを接続し、プログラムを実行してみてください。ESPモジュールの通信速度を9600bpsに設定後、無線LANアクセスポイントへ無線LAN子機(STAモード)としてネットワーク接続が実行されます。接続が完了するまで10秒ほどの時間を要します。
 無事に接続出来た場合はテレビに本機のIPアドレスとMACアドレスが表示されます。この後、このIPアドレスを使用するので必ず控えておきます。(MACアドレスは不要)

 UARTシリアル通信が動作しなかった場合は、ESP-WROOM-02の5番ピンがOUT1に接続されているかどうかを確認してください。
 それでも動作しない場合はリセットボタンを押してから実行してみたり、電源を入れ直してみたりして下さい。どうしても動かない場合は、パソコンなどにシリアル接続してファームウェアを更新する、もしくは上書きを行います。ただし、この作業はパソコンや通信IFの扱いに慣れた方にしか出来ません。例えば、ファームウェアを更新するにはESPモジュールの5番ピンをGNDに接続した状態でESPモジュールをインターネットに接続し、下記のコマンドをシリアルから実行します。

ファームウェアのアップデートコマンド

AT+CIUPDATE

 なお、本フロー制御用のコマンドはFacebookのIchigoJam-FANグループの山本三七男さんからの情報を利用させていただきました。リファレンスマニュアルには掲載されていないコマンドです。また、このコマンドを使わずにIchigoJamで本モジュールをうまく使うことが出来なかったので、とても有用な情報でした。ただし、1200bpsに設定を行ってしまった時に「don't use RTC mem」のようなメッセージが表示され、以降、何をやっても通信することが出来なくなりました。このような場合は、フラッシュを消去して書き換えることで修復します。


ソフトウェアの製作A簡易TELENTサーバ

 次はTELNETサーバのサンプルプログラムです。TELNETが何か不明な方も気にしなくて大丈夫です。TELNETサーバは最も基本的なテキストベースのサーバです。Webページが普及する前のインターネット通信や、LAN内でサーバと接続する際に用いられていました。(ただし、HTTPやSSHの普及により現在は殆ど使われていません。)

 ここで本TELNETサーバのプログラムの概要を先に説明しておきます。本TELNETサーバを実行すると、ネットワーク上のパソコンなどからTELNETクライアントソフトで接続することが出来ます。ボクはTELNETクライアントソフトとして「TeraTerm」を使用しています。
 パソコンのTeraTermから入力した文字はIchigoJamに送信され、それを受け取った本プログラムが文字をテレビへ出力します。また、IchigoJamのキーボードで「#」(シフトを押しながら「3」)を押すとIchigoJamが送信モードに切り替わり、続けてIchigoJamのキーボードから文字を入力して「Enter」を押すとパソコンのTeraTermに入力した文字が表示されます。

プログラムA簡易TELENTサーバ
rem     Espressif ESP8266 ESP-WROOM-02 ヨウ
rem     Telnet Server

rem     Copyright (c) 2015 Wataru KUNINO
rem     https://bokunimo.net/ichigojam/

rem     X,Y ヒョウジザヒョウ
rem     P   ESP メイレイ ポインタ
rem     Q   ESP データ ポインタ
rem     R   ESP ソウシンコマンド ポインタ
rem     K   キーニュウリョク

1 'ESP Serv
2 'AT+CIPMUX=1
3 'AT+CIPSERVER=1,23
5 'AT+CIPSEND=0,
10 ifver()>=11000uart1
20 cls:bps9600:?"AT";chr$(13):gosub650
30 X=0:Y=10
100 'Serv
110 P=#C10
120 gosub600:?chr$(13):gosub650
130 gosub600:?chr$(13):gosub650
140 R=P
200 'KEY
210 gosub700
220 ifK=33:bps0:?:end
230 ifK<>35:goto200elseQ=#700
240 K=inkey():ifK>32pokeQ,K:poke#200+Q+Y*32,K:Q=Q+1:ifQ>#71FletQ,#71F
250 ifK<>10goto240
260 P=R:gosub600:?Q-#6FF;chr$(13):gosub650
270 forI=#701toQ:?chr$(peek(I-1));:next
280 ?chr$(13):goto200
600 'TX
610 ifpeek(P)<>39letP,P+1:goto610
620 P=P+1:ifpeek(P)?chr$(peek(P));:goto620
630 return
650 'CLR
660 out1,0
670 wait3:ifinkey()goto670elseout1,1
680 wait3:ifinkey()goto680
690 return
700 'RX
710 J=0:Q=#700
720 K=inkey():ifKpokeQ,K:Q=Q+1:J=0:ifQ<#800goto720
730 J=J+1:ifJ<100out1,0:out1,1:goto720
740 ifQ=#700:return
750 forJ=#700toQ-1:K=peek(J)
760 ifK>32poke#900+X+Y*32,K:X=X+1:ifX>31letX,0:Y=Y+1
770 ifK=13letX,0:Y=Y+1:lcX,Y
780 ifY>23:Y=23:scroll0:lc0,Y
790 next:return

 プログラム@の実行後に、このプログラムAを実行すると、TELNETサーバが起動します。起動した状態でネットワークに接続されたパソコンのTeraTermから接続してみましょう。
 まずはTeraTermから文字を入力し、「Enter」を押してください。IchigoJam側に同じ文字が表示されたはずです。もし、うまく送信できない場合は、TeraTermの「設定」の「端末の設定」を開き、「改行コード」の「送信」が「CR+LF」になっているかどうかを確認してください。また「ローカルエコー」にチェックが入っていた方が分かりやすいです。但し、ESPモジュールの設定などを行う際に、USBシリアルアダプタ経由でパソコンとESPモジュールとを接続した状態でTeraTermのシリアル接続を使用する場合はローカルエコーをOFFに切り替える必要があります。
 受信した文字の最初には「+IPD,0,25:」のような文字が付与されます。最初の数字は接続IDです。複数のTELNETクライアントからの接続があったときに区別するための番号です。次の数字は受信したメッセージ長です。改行コード2バイトを含めた値が表示されます。
 次にIchigoJamのキーボードから「#」を入力してください。そして、少し(1秒くらい)待つと画面に「#」が表示されます。この表示が出たら「テキスト入力モード」に切り替わっていますので、続けて文字を入力し「Enter」を押して送信します。

 本プログラムの強制終了は「!」です。「ESC」キーで止めたり、エラーで止まると、厄介なことになるかもしれません。IchigoJamの「SyntaxError」や「OK」の文字がESPモジュールに送信され、ESPモジュールは不明なコマンドとして「ERROR」を応答します。その「ERROR」がIchigoJamにBASICコマンドとして入力されると「SyntaxError」が発生します。つまりこの繰り返しの無限ループに陥ります。もしそうなった時は通信線を外して無限ループを断ち切ります。

 下表にプログラムの概要を示します。本プログラムを修正する際に参考になると思います。

TELENTサーバの概要
行番号 概要
1 タイトル
2〜4 初期設定用のATコマンド
5 送信用のATコマンド
10 IchigoJamバージョン確認とUART設定
20 IchigoJam側のビットレート設定とATコマンド送信
30 変数の初期化
100〜140 初期設定用ATコマンドの送信
200〜210 ESPモジュール受信処理またはキーボードからの入力
220 「!」キーでプログラムの終了
230 「#」キー以外の場合は受信処理(行番号200)に戻る
240〜250 キーボードからの送信用文字列の入力処理
260 送信用ATコマンドの送信
270 キーボードから入力した文字列の送信
280 改行コード(CR+LF)の送信
600〜630 サブルーチン「TX」 :コマンド送信
650〜690 サブルーチン「CLR」:受信バッファのクリア
700〜740 サブルーチン「RX」 :受信処理
750〜790            受信データの表示

ソフトウェアの製作BワイヤレスでLチカ

 プログラムAを改造してワイヤレスLチカを行ってみましょう。このプログラムはネットワーク上のパソコンのTeraTerm等から「L1」を入力するとIchigoJam上のLEDを点灯し、「L0」を入力するとLEDを消灯する処理を行います。
 IchigoJamのLED端子にリレーを接続すれば、IchigoJamに接続した機器をワイヤレスで制御することが出来るようになります。しかも、
セキュリティの知識があれば外出先やインターネット経由で制御することも可能になります。
 プログラムの大半はTELNETサーバと同じです。行番号200番台を変更し、「L」コマンドと引数「0」に関する処理を行います。

プログラムBワイヤレスでLチカ
rem     Espressif ESP8266 ESP-WROOM-02 ヨウ
rem     Wireless LED

rem     Copyright (c) 2015 Wataru KUNINO
rem     https://bokunimo.net/ichigojam/

rem     X,Y ヒョウジザヒョウ
rem     P   ESP メイレイ ポインタ
rem     Q   ESP データ ポインタ
rem     R   ESP ソウシンコマンド ポインタ
rem     K   キーニュウリョク
rem     L   LED

1 'ESP WiLED
2 'AT+CIPMUX=1
3 'AT+CIPSERVER=1,23
5 'AT+CIPSEND=0,
10 ifver()>=11000uart1
20 cls:bps9600:?"AT";chr$(13):gosub650
30 X=0:Y=10
100 'Serv
110 P=#C10
120 gosub600:?chr$(13):gosub650
130 gosub600:?chr$(13):gosub650
140 R=P
200 'LED
210 gosub700
220 ifK=33:bps0:?:end
230 ifQ<#708goto210elseJ=#708:beep
240 ifpeek(J)<>58letJ,J+1:ifJ<Qgoto240
250 ifpeek(J+1)<>76beep:goto210
260 ifpeek(J+2)=48led0:L=0elseled1:L=1
270 P=R:gosub600:?6;chr$(13):gosub650
280 ?"LED";L;chr$(13):goto200
600 'TX
610 ifpeek(P)<>39letP,P+1:goto610
620 P=P+1:ifpeek(P)?chr$(peek(P));:goto620
630 return
650 'CLR
660 out1,0
670 wait3:ifinkey()goto670elseout1,1
680 wait3:ifinkey()goto680
690 return
700 'RX
710 J=0:Q=#700
720 K=inkey():ifKpokeQ,K:Q=Q+1:J=0:ifQ<#800goto720
730 J=J+1:ifJ<100out1,0:out1,1:goto720
740 ifQ=#700:return
750 forJ=#700toQ-1:K=peek(J)
760 ifK>32poke#900+X+Y*32,K:X=X+1:ifX>31letX,0:Y=Y+1
770 ifK=13letX,0:Y=Y+1:lcX,Y
780 ifY>23:Y=23:scroll0:lc0,Y
790 next:return

ワイヤレスでLチカの概要
200〜210 ESPモジュール受信処理またはキーボードからの入力
220 「!」キーでプログラムの終了
230 受信データが8バイト以下の時は受信待ちに戻る
240 文字「:」を検索
250 命令「L」でなければ受信処理に戻る
260 引数「0」でLED OFF、その他はLED ON
270 送信用ATコマンドの送信
280 LEDの状態を送信(LED0またはLED1)


その他・応用情報・注意事項など

応用@ダイレクトモード

 クライアント側のプログラムは記していませんが、サーバの内容を理解すれば容易に作成することが出来ると思います。また、今回はサーバなので multiple connection を使用しました。しかし、クライアント側は single connection でも実装することが出来ます。しかも、transparent transmission モードが使えるので、IchigoJamのダイレクトモード(BASICコマンドモード)にアクセスすることも容易だと思います。そのためには transparent モードにしたい端末で、single connection 設定の「AT+CIPMUX=0」と、transparent transmission モード設定の「AT+CIPMODE=1」を実行しておき、セッション接続時は「AT+CIPSTART="TCP","192.168.0.XXX",23」のようにIPアドレスとポート番号とともに実行し、さらにtransparentモードに入るための「AT+CIPSEND」を実行する流れのプログラムを作成します。(IchigoJamでは未確認。)


応用AWebサーバ・クライアント

 サンプルプログラムAではコマンド「AT+CIPSERVER=1,23」を入力してポート23のTELENETサーバを実行しましたが、Webサーバではポート80を使用します。そして「GET」命令を受けた時にヘッダ情報とHTMLコンテンツを応答すればWebサーバの完成です。ただし、IchigoJamのメモリーの都合上、プログラム上にHTMLコンテンツのひな型を持つことが困難であると思います。EEPROMなどを利用する必要があるでしょう。
 また反対にHTTPクライアントになる場合は「AT+CIPSTART="TCP","www.xxxx.xxxx.jp",80」のようにポート80を指定してセッション接続し、「AT+CIPSEND=16」、「GET / HTTP/1.0」といった具合に情報を取得し、「AT+CIPCLOSE」でセッションを閉じます。(IchigoJamでは未確認。)


応用Bモジュール内のマイコンへのプログラム実装

 本ページではESPモジュールにIchigoJamを接続して制御しましたが、ESPモジュール内のマイコンにプログラムを実装することも可能です。つまり、IchigoJamなしのESPモジュール単独で使用することが出来るのです。
 このため、このモジュールはIoTモジュールと呼ばれています。通常の(マイコンなしの)機器にインターネットに接続するプロトコルを搭載した無線機能と、ユーザアプリケーションを実装可能なマイコンを実装しているからです。


プログラム容量と拡張性について

 IchigoJam BASICのプログラムの最大容量は1024バイトです。ここで紹介したプログラムは、ほぼ1024バイトを使い果たしています。したがって、プログラムを大幅に拡張するには拡張部を別ファイルとして保存し、LRUNコマンドで呼び出して使用する必要があると思います。(マイコン内のフラッシュメモリにプログラムを4ファイルまで保存することが出来ます。)


セキュリティに関する注意点

 この実験ではIchigoJamが無線LANを経由してインターネットに接続される場合があります。IchigoJam BASICはインターネットの脅威に関して極めて脆弱ですので、あまりネットワークの仕組みに詳しくない人は実験が終わったら必ず電源を切っておきましょう。
 とくにESPモジュールを接続したIchigoJamは、比較的容易に外部からBASICコマンドが実行される対象となる場合があります。実行中のプログラムは「ESC」コードひとつで停止させることが出来、その後は外部から自由にプログラムを実行することが可能です。さらに、IchigoJamが悪意ある者に乗っ取られると、同じLANに接続されたパソコン内にウィルスを送り込んだり、情報を盗み取ることも容易です。現時点でIchigoJamを攻撃対象に選ぶハッカーの存在は無いと思いますが、システム構成上、極めて容易に攻撃・ハッキング可能であることを認識しておきましょう
 いかなる被害を被った場合であっても、当方は一切の責任を負いません。

ESC無効モードについて(2015/11/23 追記)

 IchigoJam BASICのバージョン1.1以降にESC無効モードが搭載される予定です。(Ver 1.1β14より実装されました)
 この機能はネットワークに接続したIchigoJamのセキュリティを高める効果があります。IoTデバイスとして使用する場合に、設定しておくと良いでしょう。
 ESCを有効のままIchigoJamのシリアルをネットワークに接続した場合、不審者が外部からIchigoJam上のプログラムを停止することができる懸念があります。しかも、プログラム停止後は、BASICコマンドを自由に実行することも可能です。
 ESC無効モードに設定しておくと、プログラムが動作している限りは外部からIchigoJamに侵入しにくくなります。但し、何らかの方法でエラーを発生させて停止させたり、END命令や行番号末に到達してしまうと、BASICコマンドが実行できるようになってしまうので、そのあたりの注意は必要です。
 使い方は下記などを参照ください。

IchigoJamのUARTシリアル制御に関する情報
https://github.com/bokunimowakaru/IchigoJam/blob/master/UART_ControlCode.txt


その他

 ボクはこれまでにも、XBee ZigBee、Bluetooth RN-42をはじめ、様々な通信モジュールをIchigoJamに接続し、通信プログラムの作成を行ってきました(※)。その経験上、IchigoJam BASICを使った通信用プログラムの作成は、あまり容易では無いと感じています。その対処方法として、本ページのようなサンプルプログラムを利用し、改良する方法が良いと思います。
 このサンプルを作成するまでに、ボクはTeraTermによる事前確認や、Arduino、PC上のCygwinなどで通信の手続きの流れをつかんでからIchigoJamへ実装しています。IchigoJam BASICにはメモリが少ない点、関数・モジュール化が行いにくい点、シリアルがBASICダイレクトモード(BASICコマンド入力)と共用になっている点、BASIC処理速度による受信の取りこぼしなど、様々な課題があるからです。実際、IchigoJam上で通信プログラムを作成する際の大半の時間をこれらの課題の解決に要します。そこで他のプラットフォームを併用し、手続きや動作の流れを決めてからIchigoJam向けに移植することで開発時間の短縮を図るようにしています。


掲載情報について

  • こどもパソコン IchigoJamを用いた電子工作、応用回路、BASICプログラム等を紹介しています。
  • 当ページの著作権は国野亘が所有します。複製・改変については以下の規定に従ってください。
  • 合理的な手段による著作権表示が必要です。少なくとも「国野亘」の文字を含んでください。
  • 概ね20歳以下を対象にした教育目的での利用については複製・改変・再配布が可能です。
  • FacebookグループIchigoJam-FANでの利用については複製・改変・再配布が可能です。
  • その他の目的での利用については個別に当方の承諾を受ける必要があります。
  • IchigoJam は株式会社 jig.jp の登録商標です。当ページは jig.jp社の作成物ではありません。
  • 当ページの背景画像はライセンス CC BY https://pcn.club/ に基づいて改変したものです。
  • 背景画像中のIchigoJamロゴは CC BY https://ichigojam.net/ に基づいて改変したものです。
  • 当ページの作成にあたりFacebookグループIchigoJam-FANに掲載された情報を参照しました。
  • 当ウェブサイトの内容や情報については、ご自身の責任でご利用ください。
    製作品などで事故が発生した場合であっても当方は一切の補償をいたしません。

IchigoJam メインメニューへ戻る