
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, committed 2015-03-13
- Comitter:
- flatbird
- Date:
- Fri Mar 13 14:36:43 2015 +0900
- Parent:
- 0:f7596ed7ab5c
- Child:
- 2:160c20430be3
- Commit message:
- add code to bind, listen, accept and receive TCP socket.
Changed in this revision
--- a/WebSocketServer.cpp Fri Mar 13 00:22:57 2015 +0000 +++ b/WebSocketServer.cpp Fri Mar 13 14:36:43 2015 +0900 @@ -6,3 +6,83 @@ WebSocketServer::~WebSocketServer() { } +bool WebSocketServer::init(int port) { + mTCPSocketServer.set_blocking(true); + + int ret = mTCPSocketServer.bind(port); + if (ret != 0) { + printf("ERROR: Failed to bind %d\r\n", ret); + return false; + } + ret = mTCPSocketServer.listen(); + if (ret != 0) { + printf("ERROR: Failed to listen %d\r\n", ret); + return false; + } + + return true; +} + +void WebSocketServer::run() { + TCPSocketConnection connection; + char buf[1024]; + + while (true) { + bool isWebSocket = false; + int ret = mTCPSocketServer.accept(connection); + if (ret != 0) { + continue; + } + printf("New connection\r\n"); + while (connection.is_connected()) { + ret = connection.receive(buf, sizeof(buf) - 1); + if (ret <= 0) { + if (ret == 0) { + printf("closed\r\n"); + } else { + printf("ERROR: Failed to receive %d\r\n", ret); + } + break; + } + if (!isWebSocket) { + if (this->handleHTTP(buf, ret)) { + isWebSocket = true; + } else { + printf("ERROR: Non websocket\r\n"); + break; + } + } else { + if (!this->handleWebSocket(buf, ret)) { + break; + } + } + } + connection.close(); + } +} + +bool WebSocketServer::setHandler(const char* path, WebSocketHandler* handler) { + return true; +} + +bool WebSocketServer::handleHTTP(char* buf, int size) { + char* line = &buf[0]; + + for (int i = 0; i < size; i++) { + if (buf[i] == '\r' && i+1 < size && buf[i+1] == '\n') { + buf[i] = '\0'; + if (strlen(buf) <= 0) { + break; + } + printf("%s\r\n", line); + i += 2; + line = &buf[i]; + } + } + + return true; +} + +bool WebSocketServer::handleWebSocket(char* buf, int size) { + return true; +}
--- a/WebSocketServer.h Fri Mar 13 00:22:57 2015 +0000 +++ b/WebSocketServer.h Fri Mar 13 14:36:43 2015 +0900 @@ -23,7 +23,9 @@ bool setHandler(const char* path, WebSocketHandler* handler); private: - TCPSocketServer mTcpSocketServer; + bool handleHTTP(char* buf, int size); + bool handleWebSocket(char* buf, int size); + TCPSocketServer mTCPSocketServer; }; #endif \ No newline at end of file
--- 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; -//}