#305 Wifi Serial Brick
Overview
Wifi通信ができるBrickです。TCPクライアントやアクセスポイント、HTTPサーバになることができます。他にもWifiBrick間で1対1で接続ができます。また、マイコン搭載によりWifiBrickだけでUNOより高性能なArduinoとして単体で活用いただけます。使用できるWifi規格はIEEE 802.11 b/g/nとなっております。
技適マークがありますので安心して日本国内で使用できます。
Connecting
Serialコネクタに接続します。
Support
Arduino |
---|
◯ |
ESP-WROOM-02 Datasheet
Document |
---|
ESP-WROOM-02 Datasheet Page |
Schematic
ATコマンドとは?
ATコマンドは、電話回線(モデム)に対して制御するのに開発され、現在でも使われております。WiFiBrickには、あらかじめファームウェアがインストール済みで、ATコマンドの文字列の信号をこのBrickに送信することにより命令ができるようになっています。
ATコマンド(構文)
コマンド名 | |
---|---|
コマンドを実行する | AT+コマンド |
コマンドの内容表示 | AT+コマンド? |
コマンド実行引数 | AT+コマンド=引数 |
ATコマンド(基本コマンド)
コマンド名 | レスポンス | |
---|---|---|
テスト | AT | OK |
リセット | AT+RST | Ready |
ファームウェアのバーション表示 | AT+GMR | バーション表示 |
コマンドエコー設定 | ATE1 | OK |
UART通信設定 | AT+UART_DEF=通信速度(9600bps),データビット(8ビット),ストップビット(1),パリティビット(0),フロー制御(0) | -- |
TX Power設定 | AT+RFPOWER | -- |
スリープモード設定 | AT+SLEEP | -- |
工場設定 | AT+RESTORE | -- |
ATコマンド(Wifiコマンド)
コマンド名 | 正常レスポンス | |
---|---|---|
Wifiの設定 | AT+CWMODE | 1:ステーション(STA) 子機2:アクセスポイント親機3:ステーション、アクセスポイント 例 AT+CWMODE=1 |
アクセスポイント一覧 | AT+CWLAP | SSID名,電波強度,Macアドレス,0:キーなし 2:WPA 3:WPA2 4:WPA_WPA2 |
アクセスポイントに接続 | AT+CWJAP="SSID名","パスワード" | WIFI CONNECTED |
アクセスポイントの切断 | AT+CWQAP | WIF IDISCONNECTED |
アクセスポイントの設定 | AT+CWSAP | AT+CWSAP=SSID名,64バイトまでのパスワード,チャンネル,暗号(0:オープン2:WPA_PSK 3:WPA2_PSK 4:WPA_WPA2_PSK) |
アクセスポイントの確認 | AT+CWSAP? | --- |
ATコマンド(IPコマンド)
コマンド名 | 正常レスポンス | |
---|---|---|
IPアドレスの確認 | AT+CIFSR | +CIFSR:STAIP,"IPアドレス" +CIFSR:STAMAC,"Macアドレス" |
TCPまたは、UDP接続開始 | AT+CIPSTART="プロトコル名","URL",ポート数 | CONNECT OK |
転送設定 | AT+CIPMODE=数字 | AT+CIPMODE=0 非透過モード AT+CIPMODE=1 透過モード(トランスペアレントモード) |
データ送信(1) | AT+CIPSEND=転送接続ID,バイト数(2048バイトまで) | --- |
データ送信(2) | AT+CIPSEND=バイト数(2048バイトまで) | --- |
データ送信(3) | AT+CIPSEND | OK > が表示される 参考:データ送信後、+++入力で終了 |
ファームウェア更新 | AT+CIUPDATE | --- |
IP,IPDの表示 | AT+CIPDINFO | --- |
コネクション設定 | AT+CIPMUX=数字 | 0:シングル接続 1:多重接続(最大4まで) |
コネクション設定確認 | AT+CIPMUX? | ---- |
サーバの設定 | AT+CIPSERVER=モード数字、ポート数字 | モード 0:サーバー削除、1:サーバー作成 ポート デフォルト333 |
Arduino接続
WiFiBrickを4pinケーブルを使い、ソフトウェアシリアルとハードウェアシリアルのいずれかに接続します。
Wifiモジュールの動作確認
WiFiBrickをハードウェアシリアルに接続し、ArduinoIDEを起動。シリアルモニタを開き設定は、改行コードはCR+LF,通信速度を115200bpsに設定します。AT+CWMODE=1(子機)を入力し、送信、次に、AT+CWJAPAT="SSID","パスワード"を送信し、LANに接続する。AT+CIFSRコマンドを送信。IPアドレス(例:192.168.10.8)を確認する。次に同じLANネットワークに属するパソコンのターミナルからPingコマンドを実行する。 ping 192.168.10.8 64 bytes from 192.168.10.8: icmp_seq=3 ttl=255 time=6.434 ms などのレスポンスが返ってきたら成功です。 WifiBrickのファームウェアの不具合などに備えて、SSID,Macアドレスを控えておきましょう。
AT+CWSAP?
AT+CIPSTAMAC?
AT+CIPAPMAC?
Sample Code
for Arduino サンプル1
サンプル1は、Arduino IDEでコマンド入力できる。9600bpsでの通信。サンプル1は、Arduino IDEでコマンド入力できる。9600bpsでの通信。WifiモジュールはArduino(SoftSerial使用)においてデフォルトの通信速度は115200bpsなのでを9600bpsにする。サンプル2(9600bpsに設定)を実効後、サンプル1(コマンド入力可能)を実効してください。サンプル3でIoTプラットフォームであるIFTTTを使います。サンプル1を実行後、ArduinoIDEのシリアルモニタを開き、CL及びLF,9600bpsに設定する。シリアルモニタのテキストボックスにATコマンドを入力し送信ボタンかエンターキーでATコマンドが入力できます。ATと入力し、OKが返ってきたらシリアル通信は正常です。
//
// FaBo Brick Sample 1
// 2016/2/23
// Wifi Brick #305
#include <SoftwareSerial.h>
int bluetoothRx = 12;
int bluetoothTx = 13;
SoftwareSerial mySerial(bluetoothRx, bluetoothTx); // RX, TX
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.println("Goodnight moon!");
// set the data rate for the SoftwareSerial port
mySerial.begin(9600);
}
int c = 0;
void loop() // run over and over
{
if (mySerial.available()){
char c = mySerial.read();
Serial.write(c);
}
if (Serial.available())
mySerial.write(Serial.read());
}
for Arduino サンプル2
ArduinoUNOとWifiBruckとの通信はソフトウェアシリアル通信を行っています。115200bps(デフォルト)では文字化けしやすいので、#305 Wifi BrickとArduinoShield間の通信速度を9600bpsに変更し、Ardunoとパソコン間のハードウェアシリアル通信は9600pbsとします。
//
// FaBo Brick Sample 2
// 2016/2/23
// Wifi Brick #305
// 115200bps→9600bps
#include <SoftwareSerial.h>
#define TimeInterval 2000
#define ComminucationSpeed_Arduino 9600
#define ComminucationSpeed_bleShield 115200
int bluetoothRx = 12;
int bluetoothTx = 13;
SoftwareSerial bleShield(bluetoothRx, bluetoothTx);
void setup()
{
Serial.begin(ComminucationSpeed_Arduino);
while (!Serial) {
}
Serial.println("bps changed!");
// set the data rate for the SoftwareSerial port
bleShield.begin(ComminucationSpeed_bleShield);
}
void ResposeCatch(){
while(bleShield.available()){
Serial.write(bleShield.read());
bleShield.write(Serial.read());
}
delay(TimeInterval);
}
void loop()
{
ResposeCatch();
delay(TimeInterval);
bleShield.println("AT+UART_DEF=9600,8,1,0,0");
ResposeCatch();
Serial.println("Excute");
while(1){
}
}
for Arduino サンプル3
IFTTTを使い、Fabo#115Humidity Brickセンサーで取得したデータをMakerで受け、Googleドライブのスプレッドシートにレコードを追加します。#115Humidity BrickをA0に接続します。
IFTTTのアカウント(SingUP)を作る。
IFTTTのWebサイトにアクセス。右上の画面にあるSingUPをクリックしてアカウントを作成。Welcome to IFTTTというメールが送られてくるので、Get Startedをクリックして登録完了。
IFTTTのレシピを作成。
IFTTTに再びアクセスし、Thisを選択。Search ChannnelボックスにMakerで検索。create trigger画面が出る。Receive a web requestをクリックします。Event Nameを入力 例:115_Humidityと入力します。thatを選択。Choose Action Channel画面が出る。GoogleDriveで検索する。GoogleDriveの許可を与える。(Googleアカウントがない方はアカウントを作ります。)Choose an Actionの画面が出たら、”Add row to spredsheet"を選択。(1ファイル2000行まで記録できる。2000行を超えると別ファイルが生成される)次に、Complete Action Fields画面が表示される。ファイル名、列の設定、パスの設定ができる。しかし、今回の例の場合は、何も変更しないでCreate Actionボタンを押す。すると、Create and connect画面が現れ、レシピのタイトルが確認できる。確認ができたら、Create Recipeボタンを押す。次に画面右上にあるChannelをクリックします。Makerで検索します。Maker Channnel画面が出たら、クリックしkeyをコピーしてサンプルコードに貼り付けます。サンプルコードに接続したいSSIDとWifiのパスワードを入力、Event NameとKeyを入力しコンパイルします。GoogleDriveでIFTTTというフォルダができているので、クリックし任意のスプレッシートにデータが書き込まれているのか確認します。無事に書き込まれているなら成功です。
必要なライブラリは#115Humidity Brickを参考にしてください。
//
// FaBo Brick Sample 3(To transmit data to Google Drive at IFTTT.)
// 2016/7/21
// Wifi Brick #305
//Rev 0.0.0
#include <SoftwareSerial.h>
#include <ArduinoJson.h>
#include "DHT.h"
#define bluetoothRx 12
#define bluetoothTx 13
const String ssid = "ssid";
const String password = "password";
const String Serverhost = "maker.ifttt.com";
const int httpPort = 80;
const String key = "key";
const String event = "event name";
const String uri = "/trigger/" + event + "/with/key/" + key;
struct dht_Data {
float h;
float t;
};
SoftwareSerial bleSheild(bluetoothRx, bluetoothTx);
DHT dht(A0, DHT11);
dht_Data dht_data;
void wifiConnect(){
delay(100);
bleSheild.begin(9600);
delay(1000);
//テストコマンド
bleSheild.println("AT");
delay(5000);
if (!bleSheild.find("OK")) {
Serial.println("ATisBad");
return;
}else{
Serial.println("ATisOK");
}
//アクセスポイントに接続
String cwjap = "AT+CWJAP=\"" + ssid + "\",\"" + password + "\"";
Serial.println("AccessPointConnection.");
bleSheild.println(cwjap);
Serial.println(cwjap);
delay(10000);
if (!bleSheild.find("OK")) {
}else{
Serial.println("AT+CWJAPisOK");
}
//TCPプロコトルで接続
String cipst = "AT+CIPSTART=\"TCP\",\"" + Serverhost + "\"," + httpPort;
bleSheild.println(cipst);
Serial.println(cipst);
delay(50);
if (!bleSheild.find("OK")) {
Serial.println("AT+CIPSTARTisBad");
}else{
Serial.println("AT+CIPSTARTisOK");
Serial.println("Wifi Connected");
}
}
//湿度、温度測る
void tmpMesurement(){
dht_data.h = dht.readHumidity();
dht_data.t = dht.readTemperature();
}
void setup() {
//ESP8266とシリアル通信
bleSheild.begin(9600);
//Arduinoのシリアル通信
Serial.begin(9600);
dht.begin();
wifiConnect();
}
void loop() {
String value;
//200文字分でバッファを用意。
StaticJsonBuffer<200> jsBuffer;
JsonObject& data = jsBuffer.createObject();
if (!data.success()){
Serial.println("createObject failed!");
}
tmpMesurement();
data["value1"] = dht_data.h;
data["value2"] = dht_data.t;
data.printTo(value);
value += "\r\n";
//HTTP POST
String jsonPacket = "POST " + uri + " HTTP/1.1\r\nHost: " + Serverhost + "\r\nContent-Length: " + value.length() + " \r\nContent-Type: application/json\r\n\r\n" + value +"\r\n";
Serial.println(jsonPacket);
//トランスペアレントモードで送信
bleSheild.print("AT+CIPSEND=");
bleSheild.println(jsonPacket.length());
delay(10);
if (!bleSheild.find(">")){
Serial.println("AT+CIPSENDisBad");
}
//HTTPリクエスト送信
Serial.println("Request.");
bleSheild.print(jsonPacket);
delay(10);
if (!bleSheild.find("SEND OK\r\n")) {
Serial.println("SEND FAILED");
//失敗した時は再接続する。
wifiConnect();
Serial.println("Attmpt reconnection.");
}else{
Serial.println("send completely.");
Serial.print("");
}
delay(5000);
}
WifiBrickにスケッチを書き込む
これまではArduinoからWifiBrickをATコマンドを使ってWifiの通信をしていましたが、WifiBrickをArduinoのようにすることもできます。WifiBrickにスケッチを書き込むので、以後ATコマンドは使えなくなるのでご注意ください。WifiBrickと#304USB Brickを接続します。#304USB Brickのスイッチは電圧3.3Vにしてください。Arduino IDE(Arduino1.6.11の場合。)を起動します。Arduno->Preference->追加のボードマネージャのボックスにhttp://arduino.esp8266.com/stable/package_esp8266com_index.jsonを代入しOKします。ツール->ボード->ボードマネージャからesp8622 by ESP8266 Communityを選択してインストールします。参照先以外のファームウェアは、電波法に抵触する可能性があります。絶対に参照または、使用しないでください。次にツール->ボード->Generic ESP8266 Moduleを選択します。ツール->ボード->Flash Size:"4M(3M SPIFFS)"を選択します。繋がっている任意のポートを選択して、/dev/usbserial*(Macの場合)、COM**(Windowsの場合)を選択し、WifiBrickのRESETボタンとIO0ボタンを同時に押して、RESETボタンを離します。ArduinoIDEを使ってマイコンボードに書き込みをします。ArduinoIDEの100%の表示が出たら完了です。IO0ボタンを離します。
以下のサンプルは、WiFiBrickがWebサーバーになるサンプルプログラムです。10秒ごとにサーバーから メッセージが表示されるようにしました。
//Fabo Sample WebServerTest
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
//所属するネットワークSSIDとパスワードを上書きする。
const char *ssid = "ssid";
const char *password = "password";
char count = 0;
ESP8266WebServer server ( 80 );
//メッセージを用意 10秒ごとに変わる。
char *g[] = {"Good morning!","Good afternoon!","Good evening!"};
void handleRoot() {
char temp[400];
snprintf ( temp, 400,
"<html>\
<head>\
<meta http-equiv='refresh' content='10'/>\
<title>WifiBrick_Test</title>\
<style>\
body { background-color: #ff0000; font-family: Arial, Helvetica, Sans-Serif; Color: #ffffff; }\
</style>\
</head>\
<body>\
<h1>FROM #305WiFiBrick WebServer!</h1>\
<h1>Sucess!</h1>\
<h1>%s</h1>\
</body>\
</html>",g[count % 3]
);
server.send ( 200, "text/html", temp );
count++;
}
void setup ( void ) {
//指定されたSSIDのネットワークに接続する。
Serial.begin ( 9600 );
WiFi.begin ( ssid, password );
Serial.println ( "" );
//接続を待機する。
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
Serial.print ( "." );
}
//接続先の情報を表示する。
Serial.println ( "" );
Serial.print ( "SSID=" );
Serial.println ( ssid );
Serial.print ( "IP=" );
Serial.println ( WiFi.localIP() );
if ( MDNS.begin ( "esp8266" ) ) {
Serial.println ( "MDNS responder started" );
}
//サーバー始動
server.on ( "/", handleRoot );
server.begin();
Serial.println ( "HTTP server started" );
}
void loop ( void ) {
server.handleClient();
}
Parts
- ESP-WROOM-02