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:
5:ce3f1dd90068
--- 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;
+}