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:
4:4a46982a4cf2
Parent:
1:84af7a219830
Child:
5:ce3f1dd90068

File content as of revision 4:4a46982a4cf2:

#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;
}