Jeffrey Cross
Jeffrey Cross

バーチャルリアリティで100ドル以下で自転車をペダル

Paul Yanの「Arduinoのもの」は、バーチャルリアリティサイクリングを手頃な価格の分野にもたらします。ヤン氏は、「私は絶対にエクササイズをするのが嫌いで、その経験をもう少し痛みを感じさせないようにしたい」と自白しています。それに加えて、Arduinoは「代替のゲームコントローラです」という彼の考えと相まって、仮想現実のアイデアが生まれました。サイクリング体験。この装置は2つのメカニズムで作動します。それは赤外光を使用するタコメーターで自転車の車輪の回転を測定し、BLEを介してその情報をスマートフォンに伝達することができます。これらのメカニズムは連携してペダリング出力を測定し、それをバーチャルリアリティ環境に送り込みます。

Yanは自転車を固定式の屋内トレーナーに乗せ、所定の位置にペダルを踏むことができました。彼のデバイスの長所は、あらゆるタイプの自転車だけでなく、トレッドミルのようなループしているか回転している表面を持っているどんなデバイスとも広く互換性があるということです。それは、光学式タコメータは比較的非侵襲的で、タイヤにテープで貼り付けられた小さな紙切れだけが必要だからです。 Yan氏は、「車輪が完全に回転するたびに、Arduinoは紙切れがいつ通過したかを確認してから携帯電話にワイヤレスメッセージを送信する」と説明し、それによって仮想バイクを仮想環境内で前進させます。

Yanは、この10ドルのヘッドセットと、Unityで開発されたシンプルな漫画の街をGoogle Cardboardの無料SDKを使用してVR用にレンダリングしています。彼はどのように彼が環境を通って移動するためにバーチャルバイクをセットアップしたかを説明します:

私はスプラインパスを引き出すためにSimple Waypoint Systemと呼ばれるサードパーティ製のパッケージを使いました。自分のしていることを知っていれば、このパッケージは必要ではありませんが、作業がずっと楽になります。その例の1つは、キーボードのアップボタンを使って車をパスに沿って押すように作られていたので、車をカメラリグに交換し、着信BLE pingにアップボタンと同じ機能を呼び出させました。

全体として、Yanは彼の費用をArduinoが30ドル、ヘッドセットが10ドルと見積もっており、プロジェクトの総額は40ドルになる。ただし、Unity環境は10ドルのダウンロード、iOSおよびAndroid用のBLEをサポートするサードパーティパッケージはさらに10ドル、そしてオプションのSimple Waypoint Systemは15ドルであることに注意することが重要です。 Arduinoに接続するには、ステーショナリーバイクのセットアップ、BLEブレイクアウト、およびIRセンサーを構築または入手する必要もあります。さらに、自転車を左右に操縦できるようにしたい場合は、追加のコンポーネントも必要になります。これらの追加の考慮事項は確かに40ドル以上の価格をもたらすが、それはまだ100ドル以下のために構築することができます。

以下は、Yanの回路図とArduinoのコードです。

Arduinoには、BLEブレイクアウト(AdafruitのnRF8001)と反射型IRセンサーの2つの主要コンポーネントがあります。反射型センサーには2つの側面があります。1つはIR LED(「E」)、もう1つはIRフォトトランジスタ(「S」)です。私はこれらをArduinoから離れた小さなperfボードに18ゲージのワイヤーでできた延長コードでハンダ付けしました。ワイヤーは、パフォーマンスボードを空中に吊るすのに十分な太さでありながら、その位置を調整してグースネックランプのように照らすのに十分なほど柔軟である。 nRF8001 BLEブレークアウトはピン2、9、10、11、12、および13を使用しますが、セットアップはおそらく異なるでしょう。

#include #include "Adafruit_BLE_UART.h" // nRF8001ピン:SCK:13、MISO:12、MOSI:11、REQ:10、ACI:X、RST:9、3Vo:X #define ADAFRUITBLE_REQ 10 #define ADAFRUITBLE_RST 9# ADAFRUITBLE_RDYを定義します。2 Adafruit_BLE_UART uart = Adafruit_BLE_UART(ADAFRUITBLE_REQ、ADAFRUITBLE_RDY、ADAFRUITBLE_RST)。符号なし長時間= 0; boolean connection = false。 uint8_t btm = 65。 uint8_t out = btm; uint8_t cap = 90。 #define persec 30 #define sendat(1000 / persec)int irPin = 7; int irSensorPin = 5; int testLEDPin = 4。 int tripTime = 0。 int lastTrip = 0。 int tripBetween; boolean detectState = false; boolean lastDetectState = false; void setup(void){Serial.begin(9600); pinMode(irPin、OUTPUT); pinMode(irSensorPin、INPUT); pinMode(testLEDPin、OUTPUT); uart.setDeviceName( "YanBLE"); / * BLE名を定義します。最大7文字です。 * / uart.setRXcallback(rxCallback); uart.setACIcallback(aciCallback); uart.begin(); void loop(){pollIR();} // IRセンサーuart.pollACI(); void pollIR(){digitalWrite(irPin、HIGH); // BLE}。 if(digitalRead(irSensorPin)== LOW){detectState = true; if(detectState!= lastDetectState){//リフレクションが最初に検出されたときに実行Serial.println( "BLE経由で送信されたメッセージ"); if(connection == true){sendBlueMessage( "1"); //ここに渡されるダミーデータ。これは任意の値にすることができます。アプリにpingを送信するだけです。} lastDetectState = true; } else {//ここでは、複数のフレームにわたって同じ反射が見られます。//テストLEDをオンにして、正の反射を表示します。digitalWrite(testLEDPin、HIGH); else {detectState = false;} lastDetectState = false; digitalWrite(testLEDPin、LOW); / ***************************************************** *************************** / / *!これ以下のBLE関連の機能* / / *************************************** ********************************** / void aciCallback(aci_evt_opcode_t event){//この関数はselectのたびに呼び出されますACIイベントが発生しますswitch(event){ケースACI_EVT_DEVICE_STARTED:Serial.println(F( "Advertising開始"));ブレーク; ACI_EVT_CONNECTED:Serial.println(F( "Connected!")); connection = true;ブレーク; ACI_EVT_DISCONNECTED:Serial.println(F( "Disconnected")); connection = false;ブレーク;デフォルトはbreakです。 void rxCallback(uint8_t * buffer、uint8_t len){//データが受信チャネルに到着するたびにこの関数が呼び出される} void sendBlueMessage(String message){uint8_t sendbuffer [20];} message.getBytes(sendbuffer、20); char sendbuffersize = min(20、message.length()); Serial.print(F( " n *送信 - > " ")); Serial.print((char *)sendbuffer); Serial.println(" ""); //データを書き込みますuart.write(sendbuffer、sendbuffersize); }

シェア

コメントを残します