前回のブログでI2C通信に手こずった内容を投稿しましたが、今回のWiFi通信は以外とスムーズに成功しました。
DCモータのWiFi制御システムとしては、ESP-WROOM-02側をWebサーバーとして起動しHTTPのインターフェースで車両をコントロールします。
Webサーバーとしての必要な関数類はArduinoのライブラリで提供されているので、何も難しいことはありません。
ESP-WROOM-02のライブラリのインポート方法は、「ファイル」→「環境設定」より以下の図のように
Additinal Boards Manager URLs: の欄に"http://arduino.esp8266.com/stable/package_esp8266com_index.json"
を入力して"OK"とすると、ESP8266(ESP-WROOM-02のチップ)のライブラリが使用できるようになります。
※設定後に「ツール」→「ボード」から適切なESP8266のボードを選択してください。
因みに、私は"Generic ESP8266 Module"を使用しています。
車両筐体は仮姿で製作しました。
材料と部品としては、タミヤのギヤボックスとタイヤセット、ポールキャスターと適当な板(家に落ちてた板)で車両筐体を製作し
ブレッドボードでESP-WROOM-02とDRV8266の回路を構築してモーターに接続しました。固定はガムテープです。雑ですみません。。。
モータードライバのA0, A1端子処理とそれぞれのドライバのI2Cアドレスは以下の通りとなります。
左タイヤ両方OPEN状態としたので、以下表よりI2Cのスレーブアドレスは0xC8となりますが、プログラム上は1bit右シフトさせた値の0x64となります。
右タイヤ両方GND接続としたので、以下表よりI2Cのスレーブアドレスは0xC0、上記同様1bit右シフトさせた値の0x64となります。
※1bitシフトさせた値は、windowの電卓で(プログラマ電卓)で数値を入力後、2で割ると簡単に計算できます。
ESP-WROOM-02のソースコードは以下。
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <Wire.h>
const char *ssid = "PROJECT-VA";
const char *password = "";
ESP8266WebServer server(80);
#define ADDR1 0x64
#define ADDR2 0x60
byte LEFT_VALUE=0x00;
byte RIGHT_VALUE=0x00;
String form ="<html><head></head>"
"PROJECT-PA Control"
"<form action=start><input type= submit value=FORWARD target=tif></form>"
"<form action=back><input type=submit value=BACKWARD target=tif></form>"
"<form action=right><input type=submit value=RIGHT target=tif></form>"
"<form action=left><input type=submit value=LEFT target=tif></form>"
"<form action=stop><input type=submit value=STOP target=tif></form>"
"<form action=left_plus1><input type=submit value=Left_Plus1 target=tif></form>"
"<form action=right_plus1><input type=submit value=right_Plus1 target=tif></form>"
"<iframe src=javascript:false style=display:none name=tif id=tif></iframe>"
"</html>";
void setup() {
delay(500);
Serial.begin(115200);
Wire.begin(2, 14);
delay(50);
WiFi.softAP(ssid, password);
server.on("/", root_command);
server.on("/stop", stop_command);
server.on("/start", start_command);
server.on("/back", back_command);
server.on("/right", right_command);
server.on("/left", left_command);
server.on("/left_plus1", left_plus1_command);
server.on("/right_plus1", right_plus1_command);
server.begin();
}
void loop() {
server.handleClient();
}
void root_command() {
server.send(200, "text/html", form);
}
void stop_command() {
motor_command(0x18, 0x18);
server.send(200, "text/html", form);
}
void back_command() {
motor_command(0x18, 0x18);
delay(10);
motor_command(0x19, 0x19);
server.send(200, "text/html", form);
}
void start_command() {
motor_command(0x18, 0x18);
delay(10);
motor_command(0x1A, 0x1A);
server.send(200, "text/html", form);
}
void right_command() {
motor_command(0x18, 0x18);
delay(10);
motor_command(0x2A, 0x1A);
server.send(200, "text/html", form);
}
void left_command() {
motor_command(0x18, 0x18);
delay(10);
motor_command(0x1A, 0x2A);
server.send(200, "text/html", form);
}
void left_plus1_command() {
byte temp = LEFT_VALUE;
if (LEFT_VALUE < 0xFC) {
temp = LEFT_VALUE + 0x04;
}
motor_command(temp, RIGHT_VALUE);
server.send(200, "text/html", form);
}
void right_plus1_command() {
byte temp = RIGHT_VALUE;
if (RIGHT_VALUE < 0xFC) {
temp = RIGHT_VALUE + 0x04;
}
motor_command(LEFT_VALUE, temp);
server.send(200, "text/html", form);
}
void motor_command(byte left_data, byte right_data){
for(int i=0;i<3;i++) { //通信信頼性確保のため、同一命令を3回送信
Wire.beginTransmission(ADDR1);
Wire.write(0x00);
Wire.write(left_data);
Wire.endTransmission();
Wire.beginTransmission(ADDR2);
Wire.write(0x00);
Wire.write(right_data);
Wire.endTransmission();
LEFT_VALUE = left_data;
RIGHT_VALUE = right_data;
delay(10);
}
}
</code>
後は、スマホのWiFi接続から"PROJECT-VA"のアクセスポイントへ接続。
上記ソースコードのssidは自由に設定変更下さい。
接続後スマホのブラウザのアドレス入力部に、"192.168.4.1"を入力すると
以下のようなボタンが並んだ画面が表示され、車両を制御することができます。