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
Diff: main.cpp
- Revision:
- 8:6635ca3b5a5c
- Parent:
- 6:79ecd4e53456
- Child:
- 9:774f408b9740
--- a/main.cpp Sat Mar 14 00:14:40 2015 +0900 +++ b/main.cpp Sat Mar 14 07:52:50 2015 +0000 @@ -6,9 +6,22 @@ #include "PowerControl/EthernetPowerControl.h" #endif -#define SSID "wotxwot" +#define SSID "KDDI_hackathon05" #define SEC_TYPE e_SEC_WPA2_AES -#define SEC_KEY "wotpasswd" +#define SEC_KEY "123456789" + +DigitalOut l1(p5); +DigitalOut l2(p6); + +DigitalOut r1(p7); +DigitalOut r2(p8); + +class WSHandler: public WebSocketHandler +{ +public: + virtual void onMessage(char* text); + virtual void onMessage(char* data, size_t size); +}; static bool connectWiFi(); @@ -19,20 +32,24 @@ #if defined(TARGET_LPC1768) PHY_PowerDown(); #endif - while (!connectWiFi()) { - wait(3); - } - - printf("WiFi connected: %s\r\n", wifi.getIPAddress()); + while (true) { + if (!connectWiFi()) { + wait(3); + continue; + } + WebSocketServer server; + WSHandler handler; - WebSocketServer server; + if (!server.init(80)) { + printf("Failed to init server\r\n"); + wait(3); + continue; + } + printf("WiFi connected: %s\r\n", wifi.getIPAddress()); - if (!server.init(80)) { - printf("Failed to init server\r\n"); - return 1; + server.setHandler("/ws", &handler); + server.run(); } - - server.run(); } bool connectWiFi() { @@ -65,3 +82,42 @@ return true; } +void WSHandler::onMessage(char* text) { + printf("TEXT: [%s]\r\n", text); +} + +#define THRESHOLD 30 + +void WSHandler::onMessage(char* data, size_t size) { + int8_t lv = data[0]; + int8_t rv = data[1]; + + printf("[%d/%d]\r\n", lv, rv); + + // 0 0 free + // 0 1 normal rotation + // 1 0 reverse rotation + // 1 1 brake + if (lv <= -THRESHOLD) { // normal + l1 = 0; + l2 = 1; + } else if (lv >= THRESHOLD) { // reverse + l1 = 1; + l2 = 0; + } else { // free + l1 = 0; + l2 = 0; + } + + if (rv <= -THRESHOLD) { // normal + r1 = 0; + r2 = 1; + } else if (rv >= THRESHOLD) { // reverse + r1 = 1; + r2 = 0; + } else { // free + r1 = 0; + r2 = 0; + } +} +