誰でもできる電子工作・プログラミング趣味ブログ

電子工作とプログラミングを趣味にする人口を増やすため、
誰でもできる電子工作とプログラミングを紹介します。

秋月電子さんへ行ってきました

2015年11月23日 | 電子工作
ブログの更新が大分おろそかになってます。最近仕事もプライベートもめっきり忙しくプロジェクトの進捗も芳しくない状況です。すみません。
今日はたまたま東京に来る予定があったので、秋葉原の秋月電子さんに寄ってきました。店内は最近リニューアルしたからかとても混雑。当たり前ですがネットと違い部品探すのが大変。ただ、探している部品を店員さんに告げると即座に「何番の棚でーす」と教えて頂ける。店員さんの記憶力に天晴れでした。また、店舗がそこまで大きくないので、在庫も最小限しか置いていないとのこと。購入を予定していた一部部品も在庫切れで買えず、残念。個人的には送料500円払ってでもネット注文が楽かな、、、
今日購入した部品はPICマイコン16系と18系を数個とArduinoのマイコンATmega328を数個。後は適当に基板やらソケットやらを購入しました。
プロジェクトVAの赤外線センサー回路はATmega328での接続でと考えています。やはり、Arduinoの開発環境が使いやすく楽であるのが一番の理由でしょうか。
まだまだ完成の姿には程遠いですが、プロジェクトVAの拡張機能としてマイクロホンモジュールを搭載し音声認識で、操作することを考えてます。目標を高く持たないとモチベーションが維持できない達なので、敢えてハードルを上げていきます。

ESP-WROOM-02でDCモーターをWiFi駆動

2015年11月08日 | 電子工作
前回のブログで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"を入力すると
以下のようなボタンが並んだ画面が表示され、車両を制御することができます。