2015/09/18
Wi-FiラジコンカーをAndroid OSCアプリで操作する
前記事の「ESP-WROOM-02 Wi-Fiラジコンカー」ではApple Store AppのiOSCを使って操作しましたが、今回はAndroid携帯から操作するアプリを紹介します。
Android上でもOSCアプリは多くありますが、その中でラジコンのコントローラーっぽい操作画面に設定できるAndrOSCを使用します。(Android版でも同様にアクセスポイント無しで直接接続できます)
AndrOSCのダウンロードサイト(寄付アプリ)
AndrOSCで設定した操作画面
AndrOSCネットワーク設定画面
AndrOSC設定ファイル(car2.json)
[場所:/内蔵ストレージ/perisonic/androsc/templates/car2.json]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
{ contents: [ { type:"hslider", cursorFillColor: [255, 0, 0], defaultFillColor: [20, 0, 0], borderColor: [155, 0, 0], height: 200, slidedFillColor: [100, 0, 0], width: 1024, rect: [580, 300, 1604, 500], maxValue: 127.0, minValue: 0.0, OSCValueChanged: "/osc/L $1" }, { type:"hslider", cursorFillColor: [255, 0, 0], defaultFillColor: [20, 0, 0], borderColor: [155, 0, 0], height: 200, slidedFillColor: [100, 0, 0], width: 1024, rect: [580, 600, 1604, 800], maxValue: 127.0, minValue: 0.0, OSCValueChanged: "/osc/R $1" }, { type:"toggle", defaultFillColor: [20, 0, 0], defaultText: "Light OFF", fontColor: [255, 255, 255], borderColor: [250, 0, 0], height: 200, toggledFillColor: [250, 0, 0], toggledText: "Light ON", width: 200, rect: [300, 600, 500, 800], oscToggleOn: "/osc/F 1", oscToggleOff: "/osc/F 0", fireOSCOnToggleOff: "true" }, { type:"button", defaultFillColor: [0, 0, 60], height: 200, pressedFillColor: [255, 9, 0], borderColor: [255, 0, 0], fontColor: [255, 255, 255], text: "Horn", rect: [300, 300, 500, 500], width: 200, oscButtonPressed: "/osc/C 1" } ]} |
AndrOSCのテンプレート設定画面の例
File Commanderなどのファイル操作アプリが使えない環境の方は、AndrOSCのテンプレート設定画面でも設定できます。この場合、好みに合わせてボタンの位置、大きさ、色などを自由に設定できます。
AndrOSC対応版スケッチ(実数値情報に対応)
AndrOSCではスライダー位置情報が実数値で通知されます、この実数値を受取れるように変更しました(この変更版でもiOSCから操作できます)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
#include <ESP8266WiFi.h> #include <WiFiUdp.h> #define LED_Light 2 #define LED_Hone 15 #define PWM_LF 4 #define PWM_LR 12 #define PWM_RF 5 #define PWM_RR 13 const char ssid[] = "ESPCar"; const char pass[] = "ESP8266ap"; WiFiUDP udp; unsigned int localPort = 10000; const int OSC_PACKET_SIZE = 256; char packetBuffer[OSC_PACKET_SIZE]; void setup() { Serial.begin(115200); WiFi.softAP(ssid, pass); IPAddress myIP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(myIP); Serial.println("Starting UDP"); udp.begin(localPort); Serial.print("Local port: "); Serial.println(udp.localPort()); pinMode(LED_Light, OUTPUT); pinMode(LED_Hone , OUTPUT); pinMode(PWM_LF , OUTPUT); pinMode(PWM_LR , OUTPUT); pinMode(PWM_RF , OUTPUT); pinMode(PWM_RR , OUTPUT); analogWrite(PWM_LF, 0); analogWrite(PWM_LR, 0); analogWrite(PWM_RF, 0); analogWrite(PWM_RR, 0); } int f2i(char *f) { char w; w = *(f ); *(f ) = *(f + 3); *(f + 3) = w; w = *(f + 1); *(f + 1) = *(f + 2); *(f + 2) = w; return ((int) *(float *)f); } void loop() { int rlen, NoData = 0; int Val_i = 0, Val_L = 0, Val_R = 0, Val_F = 0, Val_C = 0; while (1) { if (Val_C && --Val_C == 0) analogWrite(LED_Hone, 0); // MAX 50 ticks if (!(rlen = udp.parsePacket())) { if (++NoData > 50) { analogWrite(PWM_LF, 0); analogWrite(PWM_LR, 0); analogWrite(PWM_RF, 0); analogWrite(PWM_RR, 0); } delay(10); continue; } NoData = 0; udp.read(packetBuffer, (rlen > OSC_PACKET_SIZE) ? OSC_PACKET_SIZE : rlen); if (strncmp(&packetBuffer[0], "/osc/", 5) == 0) { if (packetBuffer[9] == 'i') { Val_i = packetBuffer[15] ; } else if (packetBuffer[9] == 'f') { Val_i = f2i(&packetBuffer[12]); } switch (packetBuffer[5]) { case 'F': digitalWrite(LED_Light, (Val_F = Val_i)); break; case 'C': Val_i *= 50; analogWrite(LED_Hone, (Val_C = Val_i) ? 512 : 0); break; case 'L': analogWrite(PWM_LF, 0); analogWrite(PWM_LR, 0); Val_L = Val_i; if (Val_L >= (64 - 8) && Val_L <= (64 + 8)) Val_L = 64; if (Val_L >= 64) analogWrite(PWM_LF, (Val_L - 64) * 16); else analogWrite(PWM_LR, (63 - Val_L) * 16); break; case 'R': analogWrite(PWM_RF, 0); analogWrite(PWM_RR, 0); Val_R = Val_i; if (Val_R >= (64 - 8) && Val_R <= (64 + 8)) Val_R = 64; if (Val_R >= 64) analogWrite(PWM_RF, (Val_R - 64) * 16); else analogWrite(PWM_RR, (63 - Val_R) * 16); break; } } else { // for (int w = 0; w < 24; w++) Serial.printf("%2X,", packetBuffer[w]); // Serial.printf("\n"); } // Serial.printf("F=%d, C=%d, L=%4d, R=%4d\n", Val_F, Val_C, Val_L, Val_R); delay(2); } } |
コメント:7
はじめまして、たーぼうと申します。
記事拝見し、自分でも作ってみようと思いました。
そこで、いくつか質問ですが、
Honeがなっている時間が短いので、スマホのボタンを
押している間鳴らしたいのですが、どこをどのように
改造すればよいでしょうか。
また、F,C,L,Rの4つの操作ですが、
5つ、6つと増やすにはCASEの記述を増やせば
宜しいでしょうか。
packetBufferの数値はそのままでOKでしょうか。
可能でしたらアドバイス頂けると助かります。
2017/01/29 @ 02:49 PM
たーぼう より
1)スマホのボタンを押している間鳴らしたい
残念ながらandrOSCのボタンには”ButtonPressed”しかありません、このため押した時に通知されますが、放した時の通知はありません。
73行目 Val_i *= 50; の50を大きな数値に変更すれば、伸ばすことはできます、現状では、ボタンを押した時から(2×50)msec鳴っていますが、この50を100にすると(2×100)msec鳴らすことができます。
2)5つ、6つと増やすにはCASEの記述を増やせばよいのか?
andrOSC側の変更:
操作画面にボタンまたはスライダーを追加し、それらの送信内容を定義します。
スケッチの変更:
上記で定義した送信内容を解釈するためのcase文を追加し、対応する処理を追加します。
3)packetBufferの数値はそのままでOKか?
そのままで問題ありません。
2017/01/30 @ 12:17 AM
goji より
早速ご丁寧なアドバイス、ありがとうございます。
おかげさまで、疑問が解消しました。
これでラジコン製作を継続してみたいと思います。
助かりました。
2017/01/30 @ 08:05 PM
たーぼう より
お世話様です。いつも読んで参考にさせて頂いてます。
何度も自分なりに工夫するのですが、エラーメッセージの山々で、完成されたスケッチが、書けません。スマホでのコントローラーは操作性がいまいちなので、esp8266の方での、コントローラーにしたいのですが、どのようにしたら良いかご指導いただけないでしょうか?
2018/02/23 @ 08:07 PM
勉強しても進歩なし より
どのような回答を期待されておられるのか分かりませんが、
>何度も自分なりに工夫するのですが、エラーメッセージの山々で、完成されたスケッチが、書けません。
ここに提示したソースコードそのままでエラーとなるのでしょうか?、
こちらの環境では期待した動作をすることは確認しております。
>スマホでのコントローラーは操作性がいまいちなので、esp8266の方での、コントローラーにしたい
ESP-WROOM-02と加速度センサーを使ったコントローラも公開しております。
ご参照ください。
「加速度センサ(ADXL345)を使ったWi-Fiラジコン・コントローラ」
http://goji2100.s199.coreserver.jp/blog/?p=534
ラジコンカー側は同じソースコードで動作します。
2018/02/23 @ 09:09 PM
goji より
早速の回答有り難うございます。先生のスケッチは完璧に動きます。
凄く素人な私は、esp8266同士で繋げてラジコンカーを作りたくて自分なりに先生のスケッチを参考にして、作ってみたのですが、エラーメッセージがでて、自分では、どうすることも出来ません。
参考のページへを見たのですけど、益々分からなくなってしまいました。参考のページの加速度センサーの送信機で操作できるのですか?
すみませんが、ご指導よろしくお願いします。
2018/02/23 @ 09:45 PM
勉強しても進歩なし より
なんとなく理解してきました、加速度センサーの動きを、osc同じ信号にして送信してる。とゆうことなのですね。加速度センサーの方のソースと、送信機メインソースと2つのソースは、どのようにして、コンパイルするのでしょうか?全くの素人ですので、すみません。迷惑かけてると思いますが、よろしくご指導お願いいたします。
2018/02/23 @ 10:34 PM
勉強しても進歩なし より