AdSense

2015年11月29日日曜日

ミニ四駆をワイヤレス(Wi-Fi)で動かす④ 電池給電化

前回までの記事で、制御のワイヤレス化は実現できましたが、
バッテリーが電源からの給電だったので、今回電池給電にして完全なワイヤレスにしました。


これ迄の記事

http://mementomorisince2013.blogspot.jp/2015/11/esp-wroom-02.html
ワイヤレスモジュール(Wi-Fi)の使い方

http://mementomorisince2013.blogspot.jp/2015/11/drv8832arduino.html
モーターコントローラーの使い方

http://mementomorisince2013.blogspot.jp/2015/11/wi-fi.html
ミニ四駆に接続してワイヤレス化

やったこと


まずは、電池だけで動くことを確認します。
電池BOXからの給電で動くことが確認できたので、モーターとモーターコントローラー側はシャシーに乗る電池をつかうことにします。

ただし、そのままつけるとモーターが直接電流を拾ってしまうので、エナメル線でモーターコントローラ経由になるように取り回します。

モーター側も絶縁ビニールテープで金具に接触しないようにします。



電池からもエナメル線で外に流します。



このように、元の場所に収まりますが、電気的には接触してません。



エナメル線を外に出します。


ワイヤレスモジュールのESP-WROOM-02は、単三乾電池(1.5V)を3つを直列につないで4.5Vにし、レギュレータで3,3Vにして流し込みました。ばっちり動いています。

これで完全にミニ四駆のワイヤレス化です。


モーターコントローラは後ろのバンパーに載せました。


シリアルのチップも載せてるので、ブレットボードの配線はまだごちゃごちゃしてます。
追々整理して小型化するとして、とりあえず動かしてみます。



無事動きました!
速度は、モーターコントローラで調整できます。

不恰好ではありますが、とりあえずミニ四駆のワイヤレス制御成功です。
ハードの知識があまり無いので試行錯誤でしたが、よい勉強になりました。



2015年11月9日月曜日

Xcode7でDeveloper登録せずにiPhone実機で自作アプリを動かす

swiftが登場して購入したMacBookでしたが、
iPhoneで自作プログラム動かすには、Apple Developer Program(年会費11800円)に登録が必要とのことですっかり手が止まっていたiPhoneアプリ作成。
ひょんなことから、最新のXcode7ならばDeveloper Programに登録せずに、無料で実機動作させることができるとのお話を聞き、 早速ためしてみました。

概ねこちらを参考にさせて頂きました。
http://qiita.com/FumihikoSHIROYAMA/items/a754f77c41b585c90329
Xcode7で1円も払わずに自作iOSアプリを実機確認する


試したプログラムは下記のiPad Roboさんのソース

同ページからのリンクでGitHubにソース公開されてたので、動かしてみました。

やったこと:

1. Xcode(7.0.1)を立ち上げて、GitHubのレポジトリからソース取得する

 起動したら、「Check out an existing project」を選択する。
 「or enter a repository location:」というとこにGithubのURLを貼り付けてNextを押す。

2. 「Identity」で警告が出てるので治す

まず、Identityで「No provisioning profiles found」と警告がでてるので「Fix issue」を押す。

そうすると、Bundle Identifierについて、
「An App ID with Identifier “com.netonjapan.RoboPad” is not available. Please enter a different string.」と怒られるので、

IdentityのBundle Identifierを適当な名前を変える。

再度「Fix issue」押すと、今度は
「creating a provisioning profile requires one or more devices to be registered with your team. ...」と怒られた。
 ※これは、Deployment InfoのDevicesがiPadになってるのに、
  iPhone実機をつなげてたため。
  今回はiPhoneで動かすので、DevicesをiPhoneにする。

すると、左上のとこが、
 「Robo > iPhoneの名前」になる。

で「No provisioning profiles found」という警告もなくなった。

途中でアカウント関連の警告もでたけど、

 http://qiita.com/FumihikoSHIROYAMA/items/a754f77c41b585c90329
 Xcode7で1円も払わずに自作iOSアプリを実機確認する

こちらを参考にさせて頂き、自分のicloudアカウントを入れて解決。


3. ビルドエラーを修正する

左上の▶︎マークで実行する、Build Failedになる。
どうやら、ビルドラーがたくさんでてる模様。

CBPeripheral.isConnectedが無いとか、CBPeripheral.UUIDが無いとかエラーになっている。どうやらiOS7から非推奨担っている模様。


を参考に、
    if(activePeripheral && activePeripheral.isConnected){
    if(activePeripheral && activePeripheral.state == CBPeripheralStateConnected){
に書き換える

もう一方の、
 Property 'UUID' not found on object of type 'CBPeripheral *’
というエラーについては、下記に変更する。

    [self UUIDToString:p.UUID]
    p.identifier.UUIDString
に修正する。

さらに、
 [self UUIDToString:peripheral.UUID]
 を
 peripheral.identifier.UUIDString
に修正する。

さらに、
        if ([self UUIDSAreEqual:p.UUID u2:peripheral.UUID]) {
        if ([self UUIDSAreEqual:(__bridge CFUUIDRef)(p.identifier) u2:CFBridgingRetain(peripheral.identifier)]) {
に修正する。(自信無いが、Xcodeの補完機能を信じる)

これで、幾つかの警告は残るがBuild successになる。

4. iPhoneで実行する

ホーム画面にアプリが登録されてるので、タップして実行。



無事、カメラが起動して、顔認証が動きました。

やはり実機で動かすとテンションが上がります。
Xcode7のおかげでようやく、iPhoneアプリ作成も捗りそうです。

2015年11月3日火曜日

ミニ四駆をワイヤレス(Wi-Fi)で動かす③ モーターと無線を結合して確認

前回、前々回と、単体のモジュールは動かせたので、いよいよ組み合わせて
ミニ四駆をWi-Fiでリモートコントロールします。

前々回のWi-fiモジュール(ESP-WROOM-02)を動かした記事
http://mementomorisince2013.blogspot.jp/2015/11/esp-wroom-02.html

前回のDCモーター(DRV8832)を動かした記事
http://mementomorisince2013.blogspot.jp/2015/11/drv8832arduino.html


使ったもの
・ESP-WROOM-02

・DRV8832使用DCモータードライブキット
・ミニ四駆


とりあえず、前回、前々回の組み合わせだけで、
ミニ四駆のモーターを開始、停止、逆回転できました。

ESP-WROOM-02のIO13とIO14を、DRV8832のIN1とIN2に接続しています。
写真、動画では、IN1とIN2それぞれがHIGHになるとLEDを点灯させました。





動画はこちら



ソースコードはこちら


#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
const char *ssid = "yyy";
const char *password = "xxx";
ESP8266WebServer server(80);
#define command_start 0
#define command_stop 1
#define command_back 2
char state = command_stop;
String form ="<html><head><meta name=viewport content=width=100></head>"
"<form action=start><input type= submit value=start target=tif></form>"
"<form action=back><input type=submit value=back target=tif></form>"
"<form action=stop><input type=submit value=stop target=tif></form>"
"<iframe src=javascript:false style=display:none name=tif id=tif></iframe>"
"</html>";
const int IN1 = 13;
const int IN2 = 14;
void setup() {
delay(1000);
Serial.begin(115200);
Serial.println();
Serial.print("Configuring access point...");
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
digitalWrite(IN1, 0);
digitalWrite(IN2, 0);
delay(40);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
if (MDNS.begin("esp8266")) {
Serial.println("MDNS responder started");
}
server.on("/", handleRoot);
server.onNotFound(handleNotFound);
server.on("/stop", handle_stop);
server.on("/start", handle_start);
server.on("/back", handle_back);
server.begin();
Serial.println("HTTP server started");
}
void loop() {
server.handleClient();
}
void handleRoot() {
server.send(200, "text/html", form);
}
void handleNotFound(){
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET)?"GET":"POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i=0; i<server.args(); i++){
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
}
void handle_stop() {
Serial.print("stop");
if((state == command_start)||(state == command_back)) {
stop_motor();
state = command_stop;
}
server.send(200, "text/html", form);
}
void handle_start() {
Serial.print("start");
if(state == command_back){
stop_motor();
delay(10);
start_motor();
}else if(state == command_stop){
start_motor();
}
state = command_start;
server.send(200, "text/html", form);
}
void handle_back() {
Serial.print("back");
if(state == command_start){
stop_motor();
delay(10);
reverse_motor();
}else if(state == command_stop){
reverse_motor();
}
state = command_back;
server.send(200, "text/html", form);
}
void start_motor(){
delay(10);
digitalWrite(IN1, 0);
digitalWrite(IN2, 1);
delay(10);
}
void reverse_motor(){
delay(10);
digitalWrite(IN1, 1);
digitalWrite(IN2, 0);
delay(10);
}
void stop_motor(){
delay(10);
digitalWrite(IN1, 0);
digitalWrite(IN2, 0);
delay(10);
}
view raw gistfile1.txt hosted with ❤ by GitHub
さて、今回はモーター、WifiそれぞれにUSBシリアルとArduinoから5V電源供給していますが、制御がワイヤレスでも、電源が有線では意味無いので、次は電池駆動を考えます。

続く。

ミニ四駆をワイヤレス(Wi-Fi)で動かす② モーターコントローラ(DRV8832)をArduinoで制御


ESP-WROOM-02を動かしてみる

上記の記事の続きです。
ミニ四駆wifi遠隔操作環境作成のため、モーター側の制御を確認します。

今回はDRV8832のDCモータードライブキットを使用します。




Arduinoで動かすスケッチをググって探すと、DRV8830の記事は見つかりますが、
DRV8832の記事が見つかりません。
どうやら品番間違って買ってたようです。

サンプルスケッチが無いけどめげません。
どうやら、DRV8830はI2Cタイプ、DRV8832はポート制御タイプのようです。

なので正転、逆回転の制御ですが、DRV8832はシンプルで、
IN1, IN2をHIGH, LOW設定することで制御できました。

●正転
 IN1 HIGH
 IN2 LOW
●逆回転
 IN1 LOW
 IN2 HIGH
●停止
 IN1 LOW
 IN2 LOW

で動きました。
とりあえずArduinoとシリアル通信でモーターの動きを確認します。

下記は、シリアルで上記PINをHigh/Lowして正転・逆回転・停止するだけのスケッチです。


void setup() {
Serial.begin(115200);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
Serial.write("setup\n");
}
void loop() {
if (Serial.available() > 0) { // シリアル通信でデータが送られてくるまで待つ。
char c = Serial.read(); // 一文字分データを取り出す。
if (c == 's') { // nが送られてきたら正転
digitalWrite(12, LOW);
digitalWrite(13, HIGH);
Serial.write("start\n");
} else if(c == 'r') { // rが送られてきたら逆回転。
digitalWrite(12, HIGH);
digitalWrite(13, LOW);
Serial.write("reverse\n");
} else if(c == 'n') { // nが送られてきたら停止。
digitalWrite(12, LOW);
digitalWrite(13, LOW);
Serial.write("non\n");
}
}
}
view raw Serial DRV8832 hosted with ❤ by GitHub
とりあえず動いたので、これでミニ四駆作成を進めます。

2015年11月1日日曜日

ミニ四駆をワイヤレス(Wi-Fi)で動かす① Wi-Fiモジュール(ESP-WROOM-02)を動かしてみる

ESP8266が乗ってるESP-WROOM-02を動かした記録。DMM,makeのミニ四駆のwifi操作ワークショップにエントリーできなかったので、自前で部品買ってどこまで出来るか頑張ってみる。


使ったもの

・ESP-WROOM-02(wifiモジュール) ※リンクは参考

・FT232RL USBシリアル変換 ※リンクは参考

・3.3v レギュレーター
・47μF、0.1μFコンデンサ
・10k抵抗



秋月電子で購入。



所々のブログを参考に回路を組む。
どうやら、「ESP-WROOM-02ピッチ変換済みモジュール《シンプル版》」を使った例は少ない模様。PINに注意しながらブレッドボードに回路を組む。




USB挿した時点では、ESP-WROOM-02と通信できなかったが、
ESP-WROOM-02の3.3V入力を抜き差しすると、シリアル通信OK。

その後、ATコマンドでWifi接続OK。

こちらを参考にArduinoのスケッチアップロード設定。

途中で、
error : espcomm_open failed
となって書き込み失敗。

ググると、下記PIN設定必要なことがわかる。
GPIO 0 -> GND(PullDown)
GPIO 2 -> 3.3V(PullUp)

設定後は、書き込みOK。
ESP-WROOM-02だけ3.3V入力PIN挿し直してリセット。



無事プログラム書き込み成功。
webサーバとして動きました。

次回はモーターだ。