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

Revision:
0:f7596ed7ab5c
Child:
1:84af7a219830
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Mar 13 00:22:57 2015 +0000
@@ -0,0 +1,94 @@
+#include "mbed.h"
+#include "SNIC_WifiInterface.h"
+#include "SNIC_Core.h"
+#include "SNIC_UartMsgUtil.h"
+
+#define SSID        ""
+#define SEC_TYPE    e_SEC_WPA2_AES
+#define SEC_KEY     ""
+
+//static char* getIPAddress();
+
+// tx, rx, cts, rts, reset, alarm=NC, baud=115200
+C_SNIC_WifiInterface wifi(p9, p10, NC, NC, p30);
+
+int main() {
+    int ret = 0;
+
+    ret = wifi.init();
+    if (ret != 0) {
+        printf("ERROR: Failed to init wifi %d\r\n", ret);
+        return 1;
+    }
+    wait(0.5);
+    
+    ret = wifi.disconnect();
+    if (ret != 0) {
+        printf("ERROR: Failed to disconnect wifi %d\r\n", ret);
+        return 1;
+    }
+    wait(0.3);
+
+    wifi.connect(SSID, strlen(SSID), SEC_TYPE, SEC_KEY, strlen(SEC_KEY));
+    if (ret != 0) {
+        printf("ERROR: Failed to connect wifi %d\r\n", ret);
+        return 1;
+    }
+    wait(0.5);
+
+    printf("WiFi connected: %s\r\n", wifi.getIPAddress());
+}
+
+// from http://developer.mbed.org/users/MACRUM/code/SNICInterface_mod/
+//char* ::getIPAddress() {
+//    C_SNIC_Core               *snic_core_p  = C_SNIC_Core::getInstance();
+//    C_SNIC_UartCommandManager *uartCmdMgr_p = snic_core_p->getUartCommand();
+//    
+//    snic_core_p->lockAPI();
+//    // Get local ip address.
+//    // Get buffer for response payload from MemoryPool
+//    tagMEMPOOL_BLOCK_T *payload_buf_p = snic_core_p->allocCmdBuf();
+//    if( payload_buf_p == NULL )
+//    {
+//        DEBUG_PRINT("getIPAddress payload_buf_p NULL\r\n");
+//        snic_core_p->unlockAPI();
+//        return 0;
+//    }
+//
+//    C_SNIC_Core::tagSNIC_GET_DHCP_INFO_REQ_T req;
+//    // Make request
+//    req.cmd_sid      = UART_CMD_SID_SNIC_GET_DHCP_INFO_REQ;
+//    req.seq          = mUartRequestSeq++;
+//    req.interface    = 0;
+//    
+//    unsigned char *command_array_p = snic_core_p->getCommandBuf();
+//    unsigned int  command_len;
+//    // Preparation of command
+//    command_len = snic_core_p->preparationSendCommand( UART_CMD_ID_SNIC, req.cmd_sid, (unsigned char *)&req
+//                            , sizeof(C_SNIC_Core::tagSNIC_GET_DHCP_INFO_REQ_T), payload_buf_p->buf, command_array_p );
+//    // Send uart command request
+//    snic_core_p->sendUart( command_len, command_array_p );
+//    // Wait UART response
+//    int ret = uartCmdMgr_p->wait();
+//    if( ret != 0 )
+//    {
+//        DEBUG_PRINT( "getIPAddress failed\r\n" );
+//        snic_core_p->freeCmdBuf( payload_buf_p );
+//        snic_core_p->unlockAPI();
+//        return 0;
+//    }
+//    
+//    if( uartCmdMgr_p->getCommandStatus() != UART_CMD_RES_SNIC_SUCCESS )
+//    {
+//        snic_core_p->freeCmdBuf( payload_buf_p );
+//        snic_core_p->unlockAPI();
+//        return 0;
+//    }
+//    
+//    snic_core_p->freeCmdBuf( payload_buf_p );
+//    snic_core_p->unlockAPI();
+//
+//    sprintf(ip_addr, "%d.%d.%d.%d\0", payload_buf_p->buf[9], payload_buf_p->buf[10], payload_buf_p->buf[11], payload_buf_p->buf[12]);
+//
+//    return ip_addr;
+//}