2015年12月10日木曜日

IchigoJam で遊ぶ その6 IchigoStorms

 IchitoJam で遊ぶ 第6弾は LEGO Mindstorms を IchigoJam で制御してみようと思います。ただし、IchigoJam でダイレクトに LEGO Mindstorms のセンサとシリアル通信したり、サーボモータのエンコーダパルスをカウントしたりするのは難しいので(モータのPWM駆動くらいはIchigoJam単体でイケルと思いますが)、センサとの通信とモータエンコーダのカウント及びモータPWMは ATMega 328P (に Arduinoのファームウェアを書き込んだもの)に行わせて、IchigoJam は ATMega と シリアル通信することで、制御を行います。

 IchigoJam にスタックできるシールド形状の基板を秋月電子のパワーグリッドユニバーサル基板で作成しました。外部からの 6~9V前後の給電をレギュレータで5Vにしてシールド側の電源とするとともに、IchigoJam側のUSBコネクタに繋がるソケットに供給しています。
 実はこの基板の製作で一番苦労したのは、LEGO Mindstorms で使われている特殊なモジュラーコネクタを用意することでした。一見、電話(ISDN)などに使われる6極のモジュラーに見えますが、爪の位置が真ん中ではなくコネクタの穴に向かって覗きこむように見ると右側にずれています。この特殊なコネクタは Robo Product さんで入手しました。



 この IchigoJam + シールド を LEGO と結合できるようにするために、以前に BrickPi のケースを新型のものに取り替えた時に余った旧型の BrickPi のRaspberry Pi を固定するためのアクリルケース(ボード)を流用することにしました。
 IchigoJam と Raspberry Pi の穴位置を変換するスペーサマウントをアクリル板で自作して、取り付けました。





 IchigoStorms シールドを載せて、


 IchigoStorms 本体は、こんな感じで出来上がりました。



 超音波センサとサーボモータ大を2つ使って、簡単なタンクのモデルを組んでみました。





 IchigoJam の BASIC で簡単な障害物回避プログラム(超音波センサがある距離内で検知したら、左に曲がる)を試しに動かしてみました。


 ソースは・・・、そういてば、本体に載せたIchigoJamで直接プログラミングして、パソコンにダウンロードしてないや。あとで、追加で掲載する予定です。

 以下、落書きレベルですが、回路図のpng画像です。


以下が、ATMega328P側のコード(Arduinoスケッチ)になります。 EV3UARTSensor というライブラリを利用させてもらっています。このライブラリはこちらから頂いたものです。
#include <SoftwareSerial.h>
#include <EV3UARTSensor.h>
// -- Grobal Variable --
const int MAT0 = 2; // MAT0 : Motor A's tacho0 pin.
const int MAT1 = 4; // MAT1 : Motor A's tacho1 pin.
const int MAO0 = 6; // MAO0 : Motor A's output0(PWM) pin.
const int MAO1 = 7; // MAO1 : Motor A's output1(DIR) pin.
const int MBT0 = 3; // MBT0 : Motor B's tacho0 pin.
const int MBT1 = 5; // MBT1 : Motor B's tacho1 pin.
const int MBO0 = 9; // MBO0 : Motor B's output0(PWM) pin.
const int MBO1 = 8; // MBO1 : Motor B's output1(DIR) pin.
int MA_speed = 0; // Motor A speed.
int MB_speed = 0; // Motro B speed.
long MA_enc = 0; // Motor A encorder count.
long MB_enc = 0; // Motor B encorder count.
const int CW = 0; // Motor rotary direction CW.
const int CCW = 1; // Motor rotary direction CCW.
int MA_dir = 0; // Motor A rotary direction.
int MB_dir = 0; // Motor B rotary direction.
unsigned long lastMessage = 0;
EV3UARTSensor S1(10, 11);
//EV3UARTSensor S2(12, 13);
void setup()
{
// Initialize serial port.
Serial.begin(115200);
// Sensor Initialization.
S1.begin();
//S2.begin();
// Motor A pin configuration.
pinMode(MAT0, INPUT);
attachInterrupt(0, MAT0_changed, CHANGE);
pinMode(MAT1, INPUT);
pinMode(MAO0, OUTPUT);
pinMode(MAO1, OUTPUT);
// Motor B pin configuration.
pinMode(MBT0, INPUT);
attachInterrupt(1, MBT0_changed, CHANGE);
pinMode(MBT1, INPUT);
pinMode(MBO0, OUTPUT);
pinMode(MBO1, OUTPUT);
}
void loop()
{
char buf[20];
// Update sensor.
S1.check_for_data();
//S2.check_for_data();
float sample1[S1.sample_size()];
S1.fetch_sample(sample1, 0);
//float sample2[S2.sample_size()];
//S2.fetch_sample(sample2, 0);
if (millis() - lastMessage > 100)
{
if (Serial.available() > 0)
{
char cmd = Serial.read();
switch (cmd)
{
case '#':
break;
case 'D':
// D + A or B + ?(Query Drive Speed) or Value(Set Drive Speed).
while (Serial.available() == 0);
cmd = Serial.read();
switch (cmd)
{
case 'A':
while (Serial.available() == 0);
cmd = Serial.read();
switch (cmd)
{
case '?':
Serial.println(MA_speed);
break;
default:
int i;
for (i = 0; i < 20; i++)
buf[i] = 0;
buf[0] = cmd;
for (i = 1; i < 20; i++)
{
while (Serial.available() == 0);
buf[i] = Serial.read();
if ((buf[i] == 0x0d) || (buf[i] == '#'))
break;
}
buf[i] = 0;
MA_speed = atoi(buf);
MA_speed = set_motor_speed_A(MA_speed);
break;
}
break;
case 'B':
while (Serial.available() == 0);
cmd = Serial.read();
switch (cmd)
{
case '?':
Serial.println(MB_speed);
break;
default:
int i;
for (i = 0; i < 20; i++)
buf[i] = 0;
buf[0] = cmd;
for (i = 1; i < 20; i++)
{
while (Serial.available() == 0);
buf[i] = Serial.read();
if ((buf[i] == 0x0d) || (buf[i] == '#'))
break;
}
buf[i] = 0;
MB_speed = atoi(buf);
MB_speed = set_motor_speed_B(MB_speed);
break;
}
break;
default:
break;
}
break;
case 'E':
// E + A or B + ?(Query Encoder Count) or R(Reset Encoder)
while (Serial.available() == 0);
cmd = Serial.read();
switch (cmd)
{
case 'A':
while (Serial.available() == 0);
cmd = Serial.read();
switch (cmd)
{
case '?':
Serial.println(MA_enc);
break;
case 'R':
MA_enc = 0;
break;
default:
break;
}
break;
case 'B':
while (Serial.available() == 0);
cmd = Serial.read();
switch (cmd)
{
case '?':
Serial.println(MB_enc);
break;
case 'R':
MB_enc = 0;
break;
default:
break;
}
break;
default:
break;
}
break;
case 'S':
// S + 1 or 2 + ?(Query Sensor Value).
while (Serial.available() == 0);
cmd = Serial.read();
switch (cmd)
{
case '1':
while (Serial.available() == 0);
cmd = Serial.read();
switch (cmd)
{
case '?':
for (int i = 0; i < S1.sample_size(); i++)
{
Serial.print((int)sample1[i]);
Serial.print(" ");
}
Serial.println();
break;
default:
break;
}
case '2':
while (Serial.available() == 0);
cmd = Serial.read();
switch (cmd)
{
case '?':
/*
for (int i = 0; i < S2.sample_size(); i++)
{
Serial.print((int)sample2[i]);
Serial.print(" ");
}
Serial.println();
*/
break;
default:
break;
}
default:
break;
}
break;
default:
break;
}
}
lastMessage = millis();
}
}
// Motor A encorder operation.
void inc_enc_MA()
{
if (MA_enc >= 999999999)
MA_enc = -999999999;
else
++MA_enc;
}
void dec_enc_MA()
{
if (MA_enc <= -999999999)
MA_enc = 999999999;
else
--MA_enc;
}
int get_enc_MA()
{
return MA_enc;
}
void clear_enc_MA()
{
MA_enc = 0;
}
// Motor B encorder operation.
void inc_enc_MB()
{
if (MB_enc >= 999999999)
MB_enc = -999999999;
else
++MB_enc;
}
void dec_enc_MB()
{
if (MB_enc <= -999999999)
MB_enc = 999999999;
else
--MB_enc;
}
int get_enc_MB()
{
return MB_enc;
}
void clear_enc_MB()
{
MB_enc = 0;
}
// MAT0 pin status changed event handler.
void MAT0_changed()
{
if (digitalRead(MAT0))
{
if (digitalRead(MAT1))
dec_enc_MA();
else
inc_enc_MA();
}
else
{
if (digitalRead(MAT1))
inc_enc_MA();
else
dec_enc_MA();
}
}
// MBT0 pin status changed event handler.
void MBT0_changed()
{
if (digitalRead(MBT0))
{
if (digitalRead(MBT1))
dec_enc_MB();
else
inc_enc_MB();
}
else
{
if (digitalRead(MBT1))
inc_enc_MB();
else
dec_enc_MB();
}
}
// Motor A set motor speed.
int set_motor_speed_A(int speed)
{
if (speed >= 0)
{
analogWrite(MAO0, 0);
digitalWrite(MAO1, LOW);
if (speed > 255) speed = 255;
if (speed < 0) speed = 0;
analogWrite(MAO0, speed);
return speed;
}
else
{
analogWrite(MAO0, 0);
digitalWrite(MAO1, HIGH);
speed = 255 + speed;
if (speed > 255) speed = 255;
if (speed < 0) speed = 0;
analogWrite(MAO0, speed);
return speed - 255;
}
}
// Motor B set motor speed.
int set_motor_speed_B(int speed)
{
if (speed >= 0)
{
analogWrite(MBO0, 0);
digitalWrite(MBO1, LOW);
if (speed > 255) speed = 255;
if (speed < 0) speed = 0;
analogWrite(MBO0, speed);
return speed;
}
else
{
analogWrite(MBO0, 0);
digitalWrite(MBO1, HIGH);
speed = 255 + speed;
if (speed > 255) speed = 255;
if (speed < 0) speed = 0;
analogWrite(MBO0, speed);
return speed - 255;
}
}

IchigoJam の BASICコードは以下のとおり。
10 ?"#DA100#"
20 ?"#DB100#"
30 ?"#S1?#"
40 INPUT A
50 IF A>200 THEN GOTO 10
60 ?"#DA-100#"
70 GOTO 30

2015年10月18日日曜日

IchigoJam で遊ぶ その5 ムカデロボット編

 1ヶ月以上間が空いてしまいましたがIchigoJamで遊ぶ、 その1のタミヤ昆虫ロボットその2のタミヤのボクシングロボットその3のハンドロボットその4の2足歩行ロボットに続いて、第5弾はムカデロボットです。
 ハンドロボットで使ったAdafruitのI2C 16ch PWM Servo Driverを使って複数のサーボを動かすという手もありますが、やっぱり、ムカデといえば、これ・・・。


 ・・・。
 かつて、幼少の頃、マッドサイエンティストを目指した私としては、このムカデ人間方式にならって進めていきたいと思います。
 IchigoJamは公式版を使っても十分ローコストではありますが、今回はaitendoの最小構成LPC1114FN28キットを使います。ムカデの1関節(上の図の人間一人・・・)をIchigoJam一つと3関節分のサーボで1モジュールとして構成し、この同じ構成のモジュールを複数連結してムカデロボットを構成します。
 今回作ったのは、機構部は左右脚がサーボで上下方向に回転し、腹部連結関節が水平方向に回転するような機構を3Dプリンタで出力してマイクロサーボSG90を実装し、制御部はaitendo の最小構成LPC1114FN28キットにIchigoJamのファームウェアを書き込んだLPC1114FN28を載せ、3端子レギュレータでサーボ供給電源4.8VからIchigoJam用の3.3Vを作成する回路と電子工作マガジンに掲載されていたオートスタート回路を実装しています。








 実際には今回は4関節分連結します。




 本当はもう少し長くしたかったんだけど、途中で使っている3Dプリンタ(Flashforge Creator Pro)が壊れてしまったため、とりあえず4関節とします。どうもこの3Dプリンタは買ったばかりの時からX軸用のベルトが稼働中に外れて空中分解することがしばしばあり、何度かベルトを取り付け直してネジを締め直すを繰り返していたのですが、とうとうベルトをまともに取り付けることが出来ない状態で稼働後数分で綿菓子製造機(フィラメントがぐちゃぐちゃに放出される)になってしまいます。


 IchigoJamでオートスタートするプログラムは非常に単純です。

10 PWM 2, 150
20 PWM 3, 150
30 PWM 4, 150
40 WAIT(30)
50 INPUT A:IF A=0 THEN GOTO 50
60 INPUT B:IF B=0 THEN GOTO 50
70 INPUT C:IF C=0 THEN GOTO 50
80 PWM 2, A
90 PWM 3, B
100 PWM 4, C
110 WAIT(15)
115 D=0:PRINT D:WAIT(2)
120 PRINT A:WAIT(2)
130 PRINT B:WAIT(2)
140 PRINT C:WAIT(2)
150 GOTO 50
view raw Centipede.bas hosted with ❤ by GitHub
  前のモジュールからの左脚、右脚、腹部サーボのPWM値をシリアルポートで受信(INPUT文の入力)を順番に受けて、サーボに設定し、所定の待ち時間を入れて、次のモジュールへ送信(PRINT文)しているだけです。つまり、ムカデ人間の口から入れて、次の人間の口へ・・・の原理を踏襲しています。



 先頭の関節にだけ、LPC1114FN28と合わせて、ATMega 328P にArduinoファームウェアを書き込んだものを載せて、関節の動きの情報を送信させています。このArduinoからの情報が順次後ろに連結されたモジュールに伝わっていきます。それぞれのモジュール自体は基本的には同じもので前方からの信号伝達で歩行します。


2015年8月15日土曜日

IchigoJam で遊ぶ その4 (サーボモータ編)

 その1のタミヤ昆虫ロボットその2のタミヤのボクシングロボットその3のハンドロボットに続いて、今回はIchigoJamで2足歩行ロボットに挑戦です。と、言っても、一般に見かけるような立派なののではありません。「歩くおもちゃ」程度のものです。前回、その3のハンドロボットで使ったI2Cの16chサーボモータドライバを使えば、もっと複雑(多関節)なロボットも作れそうですが、今回は、IchigoJamにPWM出力が実装されたということで、そちらを使って、やってみようと思います。
 利用可能になったPWM出力は合計4chです。4ch=4サーボで実現できる二足歩行としては RAPIRO の歩行機構があります。1脚に付き2個のサーボ、股関節の回転による足先の向き(ヨー)と足首の左右角度(ロール)の組み合わせで歩行を行います。



 このような歩行の例をネットで調べていたところ、ダンボットというのを見つけました。今回はこれを参考(というか、ほとんど真似して)にして、簡易2足歩行の機構を組んでみました。


 いつもは、タミヤのロボクラフトシリーズ等を使いますが、今回はお盆休みを利用して、機構周りも一から作っていくことにしました。今回の夏休みの工作のために、しばらく前に、ワークベンチとボール盤を新調しました。ワークベンチは新調したボール盤以外にも手持ちのサーキュラソーやバンドソーも固定して使えるので、作業が快適になりそうです。




 今回使用したサーボは秋月電子で購入した、SG92Rというマイクロサーボです。マイクロサーボではSG90が価格も安く入手しやすいので有名ですが、今回は少しトルクのあるSG92Rというのを選んでみました。



 2足歩行ロボットと言っても、簡易型で腰から下しかないんですが、足の平というか足首より下の部分と腰に当たる部分は3Dプリンタで造形して、サーボブラケットというかコの字の金具はアルミの平板から帯状の板を切り出して穴あけや曲げを行って作成しました。





 それぞれのパーツを組み合わせて行きます。



 IchigoJam (U) を載せたところ。


 サーボ等を接続するためのコネクタを載せたシールドをスタック。


 一応、こんな感じで、ハードは出来上がり。



 まずは、単純に決め打ちでサーボを動かして、歩かせてみました。


 まっすぐ進めていませんが、とりあえず、歩行っぽいことは出来そうです。お盆休みに引き続き、調整の予定です。



2015年7月23日木曜日

格安無線LANモジュール ESP8266 (ESP-WROOM-02) お試しのつづき。

 前回の格安無線LANモジュール ESP8266 (ESP-WROOM-02) のお試しの続きです。
 

 前回、こちらのESP8266-tranparent-bridgeを使って、ESP8266側UARTと無線LAN接続先の仮想COMポートをシリアルケーブル接続したような感覚で使おうとしたところ、すぐに接続が切れてしまう問題が発生してました。そちらの現象はまだ解決そていないのですが、tranparent-bridgeのファームに書き換えずに標準の機能(ファーム)でもこの「トランスペアレント(透過)モード」が使えることがわかりました。ただし、接続して使用開始するためには ATコマンドを発行して準備する必要があります。
 標準ファームウェアの透過モードを利用するには、UART側からATコマンドで以下の操作を行います。

① AT+CWMODE=3
 → AP+STAモードに設定。

② AT+CWJAP="ssid","password"
 → アクセスポイントに接続。

③ AT+CIFSR
 → デバイスのIPアドレスが応答されるので確認する。

④ 仮想COMポートサーバを立ち上げて Listen(待ち受け)状態にする。
 今回はPC側のソフトは USR-VCOM という仮想COMサーバソフトを使いました。
任意のポートでTCPサーバを起動して、Listen状態にしておきます。


⑤ AT+CIPSTART="TCP","xxx.xxx.xxx.xxx",9999
 → サーバに接続。

⑥ AT+CIPMODE=1
 → 透過モードに設定。

⑦ AT+CIPSEND
 → ">"のプロンプトが応答されて、以降、透過モードに。

⑧ "+++"
 → 透過モード終了。

 一度無線LANの接続が確立していれば、次からはPower Onで無線LAN接続は自動で行われるので、④~⑧のみで利用可能ですが、毎回コマンドを打つのは面倒です。ただし、前回のtranparent-bridgeのファームのように数分で接続が切れてしまう現象は発生しませんでした。
 そこで、UART側に接続したIchigoJamで以下のプログラムを実行してATコマンドを発行することで透過モード接続できることを確認しました。
10 ?"AT+CIPSTART=";CHR$(34);"TCP";CHR$(34);",";
20 ?CHR$(34);"xxx.xxx.xxx.xxx";CHR$(34);",8234";CHR$(13);CHR$(10);
30 WAIT(180)
40 ?"AT+CIPMODE=1";CHR$(13);CHR$(10);
50 WAIT(180)
60 ?"AT+CIPSEND";CHR$(13);CHR$(10);
70 WAIT(180)
80 ?" ";CHR$(13);CHR$(10)



 これで、PC側から仮想COMポートでネットワーク越しにIchigoJamを制御できる?かも。もともとのこどもパソコンの趣旨から外れるけど、BASICで使える1500円のマイコンが1000円追加で無線でネットワークに繋がるのは、すごいことではないかなと。

2015年7月20日月曜日

格安無線LANモジュール ESP8266 (ESP-WROOM-02) お試し。

 今回のガラクタは、巷(ただし、自分界隈に限る)で話題沸騰中?の格安無線LANモジュール ESP8266 (ESP-WROOM-02)です。このモジュール自体は今年のはじめ(だったかな?)くらいから存在は知っていましたが、ここ数ヶ月(だと思う)、あの恐怖の日本の「技適」をクリアして、各所から販売が開始され、Amazonなんかにも出ていたんですが、如何せん、ピッチが2.54じゃないんで、近頃、微妙に小さいものが見えにくくなり、はんだごてを持つ手も震えだしたお年頃の自分には手が出しづらい感じでした。そこにきて、スイッチサイエンスさんが変換基板付きのモジュールを出してくれたので、速攻でポチって入手しました。(2015年07月18日現在は、残念ながら在庫切れとなっているようですが、しばらくすれば補充されるんじゃないでしょうか。)


 スイッチサイエンスさんの変換基板は幅が広く、ちょうどブレッドボードの幅をすべて使ってしまいます。そこで、ブレッドボードを横に2つ並べて、ESP-WROOM-02モジュールで橋を渡すように連結して使い、配線を行いました。



 配線は、ここのGituHubの情報を元に行いました。このGituHubの情報を見るとわかりますが、実は、この ESP8266 はただの格安無線LANモジュールじゃありません。内蔵のCPUとFlashメモリを利用して、IOピンこそ少ないですが、なんとArduino IDEでの開発ができちゃいます。すげぇ~。

 ESP8266用のArduino IDEの開発環境の準備は先のGitHubのReadmeに記述がありますが、こちら等に日本語&画面キャプチャ付きでわかりやすい説明があります。こちらのサイトの説明の写しになりますが、Arduino IDE の 1.6.4 ~1.6.5 (2015年07月18日現在)でメニューの「ファイル」→「環境設定」を選択します。


 「環境設定」ダイアログの「Additional Boards Manager URLs:」に以下のURLを入力します。
   http://arduino.esp8266.com/package_esp8266com_index.json 
      ↓ 2015/8/17 現在下記に変更されていました。
   http://arduino.esp8266.com/stable/package_esp8266com_index.json


 「ツール」→「ボード」→「Boards Manager」を選択します。


 ESP8266 を選択して、「Install」ボタンをクリックします。インストールが終わると「Installed」表示になります。


 「ボード」の選択肢にESP8266が追加されます。


 「ボード」でESP8266を選択すると、「ツール」の設定項目や、


 「スケッチの例」にESP8266用のサンプルが追加されます。


 まずは、いくつかのサンプルを書き込んで、無線LANに接続できることを確認したり、簡単なWebサーバのサンプルを動かして動作を確認しました。今回は暫定的に普段の家庭用無線LANルータとは別に出張先ホテルで使う様な小型の無線LANルータ(コンバータ)を別途用意して、わかりやすいようにパスワードだけで接続できる環境を準備して接続を確認しました。
 なお、書き込みを行う場合は、~RESET=LOW(またはPOWER OFF) → IO0=LOW → ~RESET=HIGH(またはPOWER ON) → IO0=HIGH でUARTブートモードで起動して、Arduino IDEの書き込みボタンを押します。書き込みが終わってリセットされる様子がない場合は手動でリセットすればプログラムが開始されます。



 いや、これが1000円前後で買えるとか、IoTはそこまで来てる?って感じ。

 さて、Arduino機能で先に遊んでしまいましたが、本来?の無線LANをUART接続で使える機能はというと、こちらはATコマンドで先に送受信するバイト数を指定して・・・と今ひとつ使い勝手がよくありません。もっと、UARTとWLAN側UDTとかSocket、願わくば仮想COMポートとして右から左に使えるようじゃないと不便だな・・・と探したところ、すでに先人が実現してくれていました。こちらのESP8266-transparent-bridgeというものです。プロジェクトをダウンロードしてきて、その中のfirmwareフォルダ内にある2つのファイルでESP8266のファームウェアを書き換えます。ファームの書き換えに関しては、こちらの「ねむいさんのぶろぐ」サイトを参考にさせていただきました。書き換えに失敗した場合や、もとの機能に戻すためにこちらのBBSから最新のSDKをダウンロードしておきます。また、同BBSからファーム書き換えツール(自分がダウンロードした時は、FLASH_DOWNLOAD_TOOLS_v1.2_150512というバージョンでした)をダウンロードしておきます。先のTransparent-Bridgeのfirmwareフォルダに解凍された 0x00000.bin と 0x40000.bin をファーム書き換えツールで解凍された flash_download_tool_v1.2_150512.exe のような名前のツールを使ってアップロード(ダウンロード?)します。 flash_download・・.exe を起動して、


 このflash_download・・.exe の使い方の丁寧な説明が、前述の「ねむいさんのぶろぐ」にあります。この「ねむいさんのぶろぐ」には今回のESP8266以外にも有用な情報がたくさんあります。色々勉強させてもらいたいと思います。
 ESP8266での使い方は、書き込むファームのファイルを選択(メモリ領域別に複数選択して書き込める)して、書き込むエリアにはチェックボックスをチェックして、CryatarFreq=26M , SPI SPEED=40MHz , SPI MODE=QIO , FLASH SIZE=32Mbit , BAUDRATE=115200 を選択し、COMポートを選択して、「START」ボタンで書き込みです。あっ、そうそう、書き込みにはESP8266側はUARTブートモードで起動しておく必要があります。書き込みが終わってリセットし、書き込みが上手く行っていれば、ESP_xxxxのような無線LANアクセスポイントとして稼働し始めます。このESP_xxxxというアクセスポイントにPCで一旦接続します。パスワード等が一切かかっていないアクセスポイントなので接続先無線LANを選ぶ機能でESP_xxxxを選ぶだけで接続できるはずです。この無線LANに接続できたら、Tera TearmなどのTelnetの使えるターミナルソフトで「192.168.4.1」にTelnet接続します。こちらも特にパスワード等なしで接続できるはずです。ここで、「+++AT」と入力してEnterでOKが返ることを確認します。
 アクセスポイントに接続させるには、ここのコマンドリファレンスにしたがって、
   +++AT MODE 3
   +++AT STA ssid password
のように設定します。これで、自分の環境では前述のモバイル無線LANルータに接続出来ました。DHCPで配られたIPアドレスはDHCPサーバ(ルータ)側のログを見るとかして調べて、ping を打って応答を確認しました。
 次に、こちらを参考にこの辺から仮想COMポートのソフトを拝借。


 作成したいCOMポート番号を選択して、ESP8266のIPアドレスを入力、Portは23として、「Create COM」ボタンで仮想COMポートが作成され、115200bps でシリアル通信が出来る状態になります。


 ESP8266のUART側をUSB-UART変換で接続しているのがCOM4で前述のネットワーク仮想COMポートとして作成したのが、COM5で、片方で"abc"、もう片方で"123"と入力して相互に通信していることを確認しました。が、・・・ですね、数分するとこの仮想COMポートでの通信ができなくなります。はじめは、仮想COMポートソフトを疑ったんですが、よくよく調べてみると、ESP8266をリセットした直後はpingが返るのに数分するとpingが帰らなくなっている、つまり、ESP8266側に問題があるようです。これが、Transparent-Bridgeのファームの問題なのか、ESP8266のハード的な問題(例えば熱とか電源不足とか)なのかは今日のところは不明のまま。ただ、このまま数分で接続断ではとても使いものにならないので、今後要調査です。