端の知識の備忘録

技術メモになりきれない、なにものか達の供養先

Arduino Leonardoでエアロバイクをコントローラーにしてヴァナ・ディールを駆け抜ける話

背景

田舎の引きこもり生活は健康に悪い。

東京で長距離通学をしていた頃は否応なしに人波を抜け、歩き、自転車に乗るトライアスロンをさせられていたのだが、田舎に来るとマジで動かない。

しかもコロナのせいで輪をかけて動かないものだからより健康に悪い。

流石にそれはまずいと思い筋トレとエアロバイクを日課にしていたのだが、最近はちょい残業が多かったせいでサボリ気味。すると元々痩せ型であった我が肉体にも徐々に余分な脂がつきはじめ……。

研究職もある程度は健康維持に務めねばならないということで、酒飲んでゲームしかしない休日に運動を無理やりブチ込む仕掛けはないものかと思案していたところ、1つの考えが湧いてくる。

今年一年は間違いなく現実世界よりもエオルゼアとヴァナ・ディールで歩いた量のほうが多いと断言できる。ならば、ゲームの世界をエアロバイクで移動できればよいのでは!?

……ということで、エアロバイクを漕げばW押して前進するようなものをArduino使って作ったろ!を実際にやってみたお話。

まとめ

注意:市販品に変な改造を施しているので、真似するときは自己責任で!

  • コードはこちら

GitHub - bobfromjapan/exercise_bike_as_a_controler: Arduino code for using an exercise bike to control video games.

  • アルインコのAFB4417というエアロバイクが今回犠牲になったブツ

    • こいつは速度・漕いだ距離とかを表示してくれるマイコン的なやつがついているので、ここから上手いこと漕いでいることを判定できる情報を取り出すことにした

    • 最初は出力の3.5mm プラグから何らか電圧とかで取れないかと思ったのだが、結局半田ごてを動員するはめになった

www.amazon.co.jp

  • 使うArduinoUSB入力をエミュレートできるArduino Leonardoを使用

参考URL

こちらのサイトを参考にさせていただきました。

Arduino電子工作の基本⑥ スイッチの状態を読み取る | Device Plus - デバプラ

Arduino Leonardo(Pro Micro)のHID(キーボード)機能を使う(ショートカットキー実行,コマンド実行) - Qiita

1. エアロバイクの改造

まずこのエアロバイク(AFB4417)では本体から3.5mmのプラグが伸びており、それを上部のサイクルコンピューター的な機械に差し込みペダルを漕ぐと、走行距離や速度が表示されるという機能がある。1万で買えた割には多機能である。

で、当初はこの3.5mmのプラグからペダル漕いだときにダイナモかなんかが動いて電圧が発生、それをサイクルコンピューターで読み取っているのかと思っていたのだが、テスターを当てながらいくら漕げども電圧表示は0Vのまま。

サイクルコンピューターには電池を2本入れて動作させるので、どうやら電圧をかけないと漕いでもなんの変化も現れないらしい。なんかこんなの高校の物理のときやった気がするが、今回の目的を達するために原理まで理解する必要はないのでとりあえず置いておくことにする(詳しい人いたら教えてください!)。要はサイクルコンピューターばらして、どっかの端子から漕いだときに何らかの変化を得られればいいわけである。

というわけで、まだ買ってから一年経っていないこいつを躊躇なくバラすことにした。実験には犠牲が不可欠!

中身はこんな感じ。非常にシンプルな基盤だが、私は別にこういうのに強いわけではないのでここもまた実験的手法でなんとかする。いくつかなんか取れそうな端子にテスターを当てながらエアロバイクを漕いで電圧変化が起こる組み合わせを探してみることに。

f:id:hashicco:20210509135355j:plain

すると、3.5mm端子の刺さっている部分の2極にテスターを当てながら漕いでると電圧が変化することがわかった。具体的には漕いでないときは電池由来の3V前後の電圧がかかっているのだが、ペダルを漕ぐと特定の場所を過ぎるときに電圧が下がる。ただ、下がる量は不安定だし漕いでいるときずっと下がるわけではない。

まあ一瞬でも下がってくれればそれをArduinoのAnalogピンに繋いで電圧が閾値を下がったことを検知できるはずなので、ここに無理やり導線をはんだ付けして信号を取り出すことにした。

で、出来上がったのはこんなもの。Amazonで30mも買ってしまって余っていたオーディオケーブルを導線として使ったが、太すぎて取り回しが悪かったので普通の27AWGくらいの導線を使うことをおすすめする。

酒飲みながらやったせいで、めちゃめちゃはんだ付けが雑……。気が向いたら直そうと思う。

f:id:hashicco:20210509141611j:plain

f:id:hashicco:20210509141618j:plain

この導線をArduinoのアナログピンに指すことで、エアロバイクを漕ぐことによる電圧変化を測れるわけである。

2. Arduinoのコードを書く

魔改造は前項までで、ここから先は至って普通のArduino工作です。

流石にペダル漕いで前にすすめるだけでは使い物になりませんので、横への方向転換用にハンドル部分に'A'と'D'のボタンもつけることにした。

配線はこんな感じ。'A'と'D'のボタンはfritzingの都合上ブレッドボードに挿してますが、実際には導線(オーディオケーブル)を2mくらいつけて、エアロバイクのハンドル部分に雑にマスキングテープで取り付けてます。実際の写真は後でのお楽しみということで。

f:id:hashicco:20210510205306p:plain

コードはこちら。'A'と'D'のボタンについてはシンプルに押されたかどうかをプルアップの変化で読み取ります。Keyboard.pressで'A'と'D'押したことにする。ピンで言うと7と8を利用。

エアロバイクの電圧変化はAnalogピンを利用。適当に閾値を3.3Vとしてそれを下回ったときにKeyboard.pressで'W'キーを入力するという感じ。更に、先程述べたように漕いでるとき常に電圧が下がる感じではないので、過去5回分の移動平均をとりそれが閾値を下回るか否かを判定基準とすることにした。

また単押しだと進む距離が短すぎて超漕がないとミリも進まないマゾ設定になってしまうので、press後Delayを入れて100ms押した状態にする。

#include <Keyboard.h>
const int A_PIN = 7;
const int D_PIN = 8;
double v_logs[5] = {3.3,3.3,3.3,3.3,3.3}; 
double thresh = 3.3;


void setup(){
    pinMode( A_PIN, INPUT_PULLUP );
    pinMode( D_PIN, INPUT_PULLUP );
    Serial.begin( 9600 );
}

void loop(){
    int value_a, value_d;
    double value_w = analogRead(A0);
    value_w *= 5;
    value_w /= 1024;

    int i;
    double sum = 0 ;
  
    for (i = 0; i < 4; i = i + 1) {
    v_logs[i] = v_logs[i+1];
    sum += v_logs[i];
    //Serial.println(v_logs[i]);
    }
    
    v_logs[4] = value_w; 
    sum += value_w;
  
    if(((sum/5) < thresh) && (sum > 10)){
      Keyboard.press( 0x77 );
      delay(100);
    } else {
      Keyboard.release( 0x77 );
    }
    
    value_a = digitalRead( A_PIN );
    if ( value_a == LOW ){
      Keyboard.press( 0x61 );
    } else {
      Keyboard.release( 0x61 );
    }

    value_d = digitalRead( D_PIN );
    if ( value_d == LOW ){
      Keyboard.press( 0x64 );
    } else {
      Keyboard.release( 0x64 );
    }

    
}

3. ヴァナ・ディールを走ってみる

てなわけでコーディングも配線も終わったのでいざ実物を!

f:id:hashicco:20210510214602j:plain

……はい汚い。こんなの部屋においてあったら長年の友達でも少し引く。後ろの自作のプラモ塗装乾かしスペースやらプチプチの巻きつけられたダンベルやら相まって怪しい部屋度が50%増し。独身寮だから許される何かが出来上がりました。

せめて導線にもっと目立たない細い配線を使ったり、フレームに這わせたり、なによりマスキングテープは使わないようにしたりすればもうちょいマシでしょうか。

で、肝心のゲーム内の移動に関しては問題なくできることを確認。アルテパ砂漠をラプトルに乗って走る冒険者をエアロバイクで操作するのはなかなか趣があって面白かったし、何よりしっかり運動になりました。

これからもこれ使って寿命を伸ばしつつ健康的にヴァナ・ディール生活を送っていこうと思いました。めでたしめでたし。