Simple WebSocket server to control a tank.

Dependencies:   SNICInterface_mod WebSocketServer mbed-rtos mbed PowerControl C12832

au Firefox OS WoTハッカソン on ホワイトデーで使用した、タンクを動かすプログラムです。 ゲームパッドでタンクを操縦します。

ゲームパッドは PC に接続し、ブラウザ上の Web アプリから Gamepad API で入力を取得します。 取得した入力データは WebSocket で mbed 上の WebSocket サーバに送信します。

WebSocket サーバのコードはライブラリ化したので、他のプログラムでもインポートして使えます。

使用した機材

  • LPC1768
  • Murata TypeYD
  • LPC1768 用アプリケーションボード
  • TAMIYA トラック&ホイールセット
  • TAMIYA ダブルキヤボックス(左右独立4速タイプ)
  • TAMIYA ユニバーサルプレート
  • TOSHIBA TA7291P x 2
  • その他、モバイルバッテリー、電池ボックス等

左右のモータードライバにそれぞれ LPC1768 の p12, p13 と p14, p15 のピンを割り当てていますが、必要に応じてコードを変更してください。

コントローラー側(Webアプリ)

https://github.com/chikoski/wotxwot-control

Firefox ブラウザで動作確認しています(他のブラウザでは動かないかも)。 ゲームパッドの左右のスティックの前後の操作が左右それぞれのモータの前転・後転に対応しています。

動いているところの動画

https://www.facebook.com/video.php?v=456620974491805

ハッカソンでは ARM 賞をいただきました!

(参考) au Firefox OS WoTハッカソン on ホワイトデー

http://au-fx.kddi.com/event/20150314/wot_hackathon0314.html

Committer:
flatbird
Date:
Mon Mar 16 10:18:34 2015 +0000
Revision:
11:a66b3b2aeb6c
Parent:
10:578778037efb
updated.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
flatbird 9:774f408b9740 1 #include <stdarg.h>
flatbird 9:774f408b9740 2 #include <stdio.h>
flatbird 0:f7596ed7ab5c 3 #include "mbed.h"
flatbird 0:f7596ed7ab5c 4 #include "SNIC_WifiInterface.h"
flatbird 0:f7596ed7ab5c 5 #include "SNIC_Core.h"
flatbird 2:160c20430be3 6 #include "WebSocketServer.h"
flatbird 2:160c20430be3 7 #if defined(TARGET_LPC1768)
flatbird 2:160c20430be3 8 #include "PowerControl/EthernetPowerControl.h"
flatbird 2:160c20430be3 9 #endif
flatbird 9:774f408b9740 10 #include "C12832.h"
flatbird 0:f7596ed7ab5c 11
flatbird 10:578778037efb 12 #define SSID "your_wifi_ssid"
flatbird 0:f7596ed7ab5c 13 #define SEC_TYPE e_SEC_WPA2_AES
flatbird 10:578778037efb 14 #define SEC_KEY "your_wifi_password"
flatbird 8:6635ca3b5a5c 15
flatbird 9:774f408b9740 16 #if defined(TARGET_LPC1768)
flatbird 9:774f408b9740 17 C12832 lcd(p5, p7, p6, p8, p11);
flatbird 9:774f408b9740 18 #endif
flatbird 8:6635ca3b5a5c 19
flatbird 9:774f408b9740 20 DigitalOut l1(p12);
flatbird 9:774f408b9740 21 DigitalOut l2(p13);
flatbird 9:774f408b9740 22
flatbird 9:774f408b9740 23 DigitalOut r1(p14);
flatbird 9:774f408b9740 24 DigitalOut r2(p15);
flatbird 8:6635ca3b5a5c 25
flatbird 8:6635ca3b5a5c 26 class WSHandler: public WebSocketHandler
flatbird 8:6635ca3b5a5c 27 {
flatbird 8:6635ca3b5a5c 28 public:
flatbird 8:6635ca3b5a5c 29 virtual void onMessage(char* text);
flatbird 8:6635ca3b5a5c 30 virtual void onMessage(char* data, size_t size);
flatbird 9:774f408b9740 31 virtual void onOpen();
flatbird 9:774f408b9740 32 virtual void onClose();
flatbird 8:6635ca3b5a5c 33 };
flatbird 0:f7596ed7ab5c 34
flatbird 6:79ecd4e53456 35 static bool connectWiFi();
flatbird 9:774f408b9740 36 static void lcd_printf( const char* fmt, ... );
flatbird 6:79ecd4e53456 37
flatbird 0:f7596ed7ab5c 38 // tx, rx, cts, rts, reset, alarm=NC, baud=115200
flatbird 0:f7596ed7ab5c 39 C_SNIC_WifiInterface wifi(p9, p10, NC, NC, p30);
flatbird 0:f7596ed7ab5c 40
flatbird 9:774f408b9740 41
flatbird 10:578778037efb 42 int main()
flatbird 10:578778037efb 43 {
flatbird 2:160c20430be3 44 #if defined(TARGET_LPC1768)
flatbird 2:160c20430be3 45 PHY_PowerDown();
flatbird 2:160c20430be3 46 #endif
flatbird 8:6635ca3b5a5c 47 while (true) {
flatbird 8:6635ca3b5a5c 48 if (!connectWiFi()) {
flatbird 8:6635ca3b5a5c 49 wait(3);
flatbird 8:6635ca3b5a5c 50 continue;
flatbird 8:6635ca3b5a5c 51 }
flatbird 8:6635ca3b5a5c 52 WebSocketServer server;
flatbird 8:6635ca3b5a5c 53 WSHandler handler;
flatbird 2:160c20430be3 54
flatbird 8:6635ca3b5a5c 55 if (!server.init(80)) {
flatbird 8:6635ca3b5a5c 56 printf("Failed to init server\r\n");
flatbird 8:6635ca3b5a5c 57 wait(3);
flatbird 8:6635ca3b5a5c 58 continue;
flatbird 8:6635ca3b5a5c 59 }
flatbird 9:774f408b9740 60
flatbird 10:578778037efb 61 server.setHandler("/ws/", &handler);
flatbird 8:6635ca3b5a5c 62 server.run();
flatbird 2:160c20430be3 63 }
flatbird 0:f7596ed7ab5c 64 }
flatbird 0:f7596ed7ab5c 65
flatbird 10:578778037efb 66 bool connectWiFi()
flatbird 10:578778037efb 67 {
flatbird 6:79ecd4e53456 68 printf("connecting wifi\r\n");
flatbird 9:774f408b9740 69 lcd_printf("connecting wifi\r\n");
flatbird 6:79ecd4e53456 70
flatbird 6:79ecd4e53456 71 int ret = wifi.init();
flatbird 6:79ecd4e53456 72 if (ret != 0) {
flatbird 6:79ecd4e53456 73 printf("ERROR: Failed to init wifi %d\r\n", ret);
flatbird 6:79ecd4e53456 74 return false;
flatbird 6:79ecd4e53456 75 }
flatbird 6:79ecd4e53456 76 wait(0.5);
flatbird 6:79ecd4e53456 77
flatbird 6:79ecd4e53456 78 ret = wifi.disconnect();
flatbird 6:79ecd4e53456 79 if (ret != 0) {
flatbird 6:79ecd4e53456 80 printf("ERROR: Failed to disconnect wifi %d\r\n", ret);
flatbird 6:79ecd4e53456 81 return false;
flatbird 6:79ecd4e53456 82 }
flatbird 6:79ecd4e53456 83 wait(0.3);
flatbird 6:79ecd4e53456 84
flatbird 6:79ecd4e53456 85 wifi.connect(SSID, strlen(SSID), SEC_TYPE, SEC_KEY, strlen(SEC_KEY));
flatbird 6:79ecd4e53456 86 if (ret != 0) {
flatbird 6:79ecd4e53456 87 printf("ERROR: Failed to connect wifi %d\r\n", ret);
flatbird 6:79ecd4e53456 88 return false;
flatbird 6:79ecd4e53456 89 }
flatbird 6:79ecd4e53456 90 wait(0.5);
flatbird 6:79ecd4e53456 91
flatbird 6:79ecd4e53456 92 wifi.setIPConfig(true);
flatbird 6:79ecd4e53456 93 wait(0.5);
flatbird 9:774f408b9740 94
flatbird 9:774f408b9740 95 printf("WiFi connected: %s\r\n", wifi.getIPAddress());
flatbird 9:774f408b9740 96 lcd_printf("connected: %s\r\n", wifi.getIPAddress());
flatbird 9:774f408b9740 97
flatbird 9:774f408b9740 98 return true;
flatbird 9:774f408b9740 99 }
flatbird 9:774f408b9740 100
flatbird 9:774f408b9740 101 void lcd_printf( const char* fmt, ... )
flatbird 9:774f408b9740 102 {
flatbird 9:774f408b9740 103 char buffer[ 64 ];
flatbird 6:79ecd4e53456 104
flatbird 9:774f408b9740 105 va_list ap;
flatbird 9:774f408b9740 106 va_start( ap, fmt );
flatbird 9:774f408b9740 107 vsnprintf( buffer, 64, fmt, ap );
flatbird 9:774f408b9740 108 va_end( ap );
flatbird 9:774f408b9740 109
flatbird 9:774f408b9740 110 lcd.cls();
flatbird 9:774f408b9740 111 lcd.locate( 0, 3 );
flatbird 9:774f408b9740 112 lcd.printf( buffer );
flatbird 6:79ecd4e53456 113 }
flatbird 6:79ecd4e53456 114
flatbird 10:578778037efb 115 void WSHandler::onMessage(char* text)
flatbird 10:578778037efb 116 {
flatbird 8:6635ca3b5a5c 117 printf("TEXT: [%s]\r\n", text);
flatbird 8:6635ca3b5a5c 118 }
flatbird 8:6635ca3b5a5c 119
flatbird 10:578778037efb 120 void WSHandler::onOpen()
flatbird 10:578778037efb 121 {
flatbird 9:774f408b9740 122 lcd_printf("websocket opened\r\n");
flatbird 9:774f408b9740 123 }
flatbird 9:774f408b9740 124
flatbird 10:578778037efb 125 void WSHandler::onClose()
flatbird 10:578778037efb 126 {
flatbird 9:774f408b9740 127 lcd_printf("websocket closed\r\n");
flatbird 9:774f408b9740 128 }
flatbird 10:578778037efb 129
flatbird 11:a66b3b2aeb6c 130 #define THRESHOLD 10
flatbird 8:6635ca3b5a5c 131
flatbird 10:578778037efb 132 void WSHandler::onMessage(char* data, size_t size)
flatbird 10:578778037efb 133 {
flatbird 8:6635ca3b5a5c 134 int8_t lv = data[0];
flatbird 8:6635ca3b5a5c 135 int8_t rv = data[1];
flatbird 8:6635ca3b5a5c 136
flatbird 8:6635ca3b5a5c 137 printf("[%d/%d]\r\n", lv, rv);
flatbird 8:6635ca3b5a5c 138
flatbird 8:6635ca3b5a5c 139 // 0 0 free
flatbird 8:6635ca3b5a5c 140 // 0 1 normal rotation
flatbird 8:6635ca3b5a5c 141 // 1 0 reverse rotation
flatbird 8:6635ca3b5a5c 142 // 1 1 brake
flatbird 8:6635ca3b5a5c 143 if (lv <= -THRESHOLD) { // normal
flatbird 8:6635ca3b5a5c 144 l1 = 0;
flatbird 8:6635ca3b5a5c 145 l2 = 1;
flatbird 8:6635ca3b5a5c 146 } else if (lv >= THRESHOLD) { // reverse
flatbird 8:6635ca3b5a5c 147 l1 = 1;
flatbird 8:6635ca3b5a5c 148 l2 = 0;
flatbird 8:6635ca3b5a5c 149 } else { // free
flatbird 8:6635ca3b5a5c 150 l1 = 0;
flatbird 8:6635ca3b5a5c 151 l2 = 0;
flatbird 8:6635ca3b5a5c 152 }
flatbird 8:6635ca3b5a5c 153
flatbird 8:6635ca3b5a5c 154 if (rv <= -THRESHOLD) { // normal
flatbird 8:6635ca3b5a5c 155 r1 = 0;
flatbird 8:6635ca3b5a5c 156 r2 = 1;
flatbird 8:6635ca3b5a5c 157 } else if (rv >= THRESHOLD) { // reverse
flatbird 8:6635ca3b5a5c 158 r1 = 1;
flatbird 8:6635ca3b5a5c 159 r2 = 0;
flatbird 8:6635ca3b5a5c 160 } else { // free
flatbird 8:6635ca3b5a5c 161 r1 = 0;
flatbird 8:6635ca3b5a5c 162 r2 = 0;
flatbird 8:6635ca3b5a5c 163 }
flatbird 8:6635ca3b5a5c 164 }