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:
1:84af7a219830
Parent:
0:f7596ed7ab5c
Child:
2:160c20430be3
--- a/main.cpp	Fri Mar 13 00:22:57 2015 +0000
+++ b/main.cpp	Fri Mar 13 14:36:43 2015 +0900
@@ -7,8 +7,6 @@
 #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);
 
@@ -39,56 +37,3 @@
     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;
-//}