
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
WebSocketServer.cpp
- Committer:
- flatbird
- Date:
- 2015-03-13
- Revision:
- 1:84af7a219830
- Parent:
- 0:f7596ed7ab5c
- Child:
- 5:ce3f1dd90068
File content as of revision 1:84af7a219830:
#include "WebSocketServer.h" WebSocketServer::WebSocketServer() { } 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; }