走らないと進めないマリオカートのブラッシュアップ版【家で過ごそう】【運動不足解消】

#概要
<a href="https://qiita.com/ginger/items/bb8e66da953ff07f2b70">前回の記事</a>でNintendo Switchのコントローラーをハックした「走らないと進めないマリオカート」の簡単な作り方をご紹介しました。
今回はプリント基板や3Dプリント筐体を作成してよりクオリティを上げたものを作っていきます。
![_IMG2767.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164437/8346b9b3-62c7-5c33-5592-23f5f83a2d73.jpeg)
この記事ではプリント基板や筐体のデータをダウンロードできるようにしています。また、発注の仕方も解説していますので、ご参考になれば幸いです。

###ご注意
「Nintendo Switch利用規約」における第1条第5項「任天堂の許諾を受けていない本ゲーム機の周辺機器およびソフトウェア等」の使用にあたる可能性がありますので、利用は自己責任でお願いします。

#必要なパーツについて
前回の記事とは少しだけ必要なパーツが違っています。

<a href="http://akizukidenshi.com/catalog/g/gM-08286/">Arduino Micro</a>：¥2538　×1
<a href="http://akizukidenshi.com/catalog/g/gP-08080/">タクトスイッチ</a>：¥120　×1パック（10個入）
<a href="http://akizukidenshi.com/catalog/g/gP-07193/">スナップインタイプタクトスイッチ</a>：¥10　×2
<a href="http://akizukidenshi.com/catalog/g/gP-06107/">可変抵抗</a>：¥50　×1
<a href="http://akizukidenshi.com/catalog/g/gM-05153/">加速度センサ</a>：¥850　×1
<a href="http://akizukidenshi.com/catalog/g/gP-08241/">ユニバーサル基板（47.5×36mm）</a>：¥30　×1
<a href="https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=55L6-43MD">6芯リボンコード 1m</a>：¥295　×1
<a href="https://www.amazon.co.jp/gp/product/B071S5NTDR/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1">USBケーブル3m（Aオス-microBオス）</a>：¥698　×1
<a href="https://www.yodobashi.com/product/100000001002301994/">タッピングネジ M3×10mm</a>：¥356　×2本（1パック12本入）

※ユニバーサル基板は上記の47.5×36mmのものを使用してください。筐体にネジ止めする関係上、穴が上記のものと同じ位置に空いているものがおすすめです。
※リボンコードは5芯以上のものであれば何でもOKです。長さは1m以上あると良いと思います。また、リボンコードではなく同軸ケーブルですとより綺麗に仕上がるかもしれません。
※USBケーブルは長いもののほうがプレイしやすいと思います。

#プリント基板
今回、回路図と基板はEagleで作成しています。
<img width="898" alt="schemantic.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164437/ac0cd41e-f69e-ae27-3b24-1fc5bd3a32b8.png">
<img width="671" alt="board.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164437/0e7ce777-818e-2b13-cba4-2645945433df.png">


###データダウンロード
プリント基板のデータを公開しています。こちらからZIPファイルをダウンロードしてください。
https://www.dropbox.com/sh/2ceh717ggk3bi10/AADy-unYCg-i-XjaC1u4kayaa?dl=0

###発注の仕方
<a href="https://www.fusionpcb.jp/fusion_pcb.html">Seeed Studioのサイト</a>に行き、先程ダウンロードしたZIPファイルを解凍せず、ZIPのままアップロードしてください。基板の設定はデフォルトから特に変える必要がありませんが、基板の色はお好きなものをお選びください。必要事項を入力したら、Add to Cartから発注すれば、早ければ1週間ほどで基板が届きます。
![200425-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164437/5c8ffb08-d8d2-0aae-b51d-a47bb9c3d080.png)

#筐体
##データダウンロード
筐体のデータを公開しています。こちらからデータ一式をDLしてください。
今回配布しているのはコントローラーのグリップと、加速度センサーホルダーになります。
https://www.dropbox.com/sh/o42zax8i1o92kq7/AACGvbFsdeCtnsebfqmS0Avya?dl=0
![WS000050.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164437/abce1207-dca8-3223-9af9-780c898a5dc6.jpeg)
![WS000051.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164437/3696d663-de8c-936f-023f-6a81b3a811ea.jpeg)
※この記事の冒頭の写真ではダッシュキノコのホルダーの写真が載っていますが、著作権の関係上配布できないのでホイール型のホルダーにしました。

##発注の仕方
3Dプリンタをお持ちでない方は業者に発注すると簡単に作ることが出来ます。
以下に各業者ごとの発注の仕方を解説していきます。

###DMM 3Dプリント
https://make.dmm.com/print/
国内最大手の3Dプリントサービス。様々な種類の樹脂から選ぶことができ、価格も比較的安いです。
今回はすでに3Dデータをアップロードしておきましたのでこちらからご注文ください。
素材は「ナイロン」が安く、強度や仕上がりも良いので推奨しています。

- <a href="https://make.dmm.com/item/1183189/">コントローラーグリップ</a>：¥3070〜
- <a href="https://make.dmm.com/item/1183188/">加速度センサーホルダー</a>：¥2351〜

###3Dayプリンター
https://3day-printer.com
その名の通り3日ほどの短納期で3Dプリントを届けてくれるサービス。
お値段はDMMよりも高くなる傾向にありますが、モノの形状・素材によってはこちらのほうが安い場合もあります。
<a href="https://3day-printer.com/inquire">こちら</a>のフォームから必要事項を入力して送信すると、その後見積もりがメールで返ってきますのでメール返信で発注する手順になります。メールは平日であればすぐに（経験上当日中に）返ってくる印象です。
![200425-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164437/45bd239c-76de-eac9-1a37-6c48d1407302.png)
フォームの素材の欄は「ナイロン樹脂」を選択し、ファイル添付のところで上記の3Dデータをアップロードしてください。

###Shapeways
https://www.shapeways.com
海外の大手3Dプリントサービスです。海外から発送する関係で時間がかかる傾向にありますが、値段は最も安いことが多いです。
※ただ今回のデータの場合以下のように、DMMの方が安かったので日本から利用するメリットは薄いかもしれません。

- コントローラーグリップ：$32.94〜
- 加速度センサーホルダー：$29.94〜
![200425-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164437/d88e992c-9355-b083-b484-bec282a74d75.png)
ログイン後、START MAKINGからUPLOAD NOWを選択します。
![200425-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164437/7644ab25-7726-cd7e-b848-8772de601444.png)
3Dデータをアップロードします。
![200425-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164437/467f4f28-ba72-beb9-11a7-f509fd91bd74.png)
素材は「Versatile Plastic」を選択してください。こちらがいわゆる「ナイロン樹脂」になります。

##自分で3Dプリントする場合
3Dプリンターをお持ちの方、あるいはFab施設などで利用可能な方はご自分でプリントするのも楽しいかもしれません。
参考までにZortrax M200 Plus、材料はZ-HIPSで印刷した時の様子をご紹介します。
以下にプリントの様子をご紹介します。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">「走らないと進めないマリオカート」コントローラーをブラッシュアップしてみました。<a href="https://t.co/t2XvbV3D1c">https://t.co/t2XvbV3D1c</a><a href="https://twitter.com/hashtag/%E6%96%B0%E5%9E%8B%E3%82%B3%E3%83%AD%E3%83%8A%E3%82%A6%E3%82%A4%E3%83%AB%E3%82%B9?src=hash&amp;ref_src=twsrc%5Etfw">#新型コロナウイルス</a> <a href="https://twitter.com/hashtag/%E9%81%8B%E5%8B%95%E4%B8%8D%E8%B6%B3%E8%A7%A3%E6%B6%88?src=hash&amp;ref_src=twsrc%5Etfw">#運動不足解消</a> <a href="https://twitter.com/hashtag/nintendoswitch?src=hash&amp;ref_src=twsrc%5Etfw">#nintendoswitch</a></p>&mdash; Ginger (@ginger_you) <a href="https://twitter.com/ginger_you/status/1255152667313139716?ref_src=twsrc%5Etfw">April 28, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#組み立て
###はんだづけ
タクトスイッチやArduino Microなどは基板の所定の位置にはんだ付けしていくだけになっていますが、わからない場合は、こちらの回路図を参照してください。
<img width="898" alt="schemantic.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164437/ac0cd41e-f69e-ae27-3b24-1fc5bd3a32b8.png">

【注意点】
・基板のオモテウラに注意。加速度センサがつく8個の端子が左上に見えるほうが表です。
・Arduino Microの上下に注意。USB端子が基板の上に出ます。
・加速度センサの配線に注意。詳細は以下のとおりです。

加速度センサーは以下の写真の通りに、番号が対応するように配線していってください。
なお、加速度センサーは基板に直接はんだ付けして実装しても使うことができ、その場合はコントローラーを手でフリフリして進むマリオカートになります。
![200425-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164437/6e87f9ab-234b-79af-7f81-38256dff8eb5.png)
![200425-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164437/6e5f0472-9e7e-72c2-f6ef-d313d8250ffd.png)

###筐体の組み立て
コントローラーのグリップの方は基板を差し込むだけなのですが、加速度センサーホルダーの方は多少組み立てが必要ですので解説しておきます。
![200425-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164437/8f3df659-0520-7b54-89e3-7c309bfb0844.png)
造形物が届きましたらこちらのライナーをニッパーなどで切り取ってください。
![200425-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164437/4ea12328-8d1d-2463-9713-922346864765.png)
2箇所あるネジ穴に、M3、長さ10mm程度のタッピングネジを入れて固定してください。加速度センサーとコントローラー本体をつなぐケーブルはケーブル穴から出してください。
![_IMG2777.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164437/8e3a26be-debb-b543-5a71-d9eea083bca8.jpeg)
ユニバーサル基板の穴にネジを貫通させるように止めることでうまく固定することが出来ます。

#プログラムと書き込み
ここまできたらプログラムを書き込むだけです。
書き込みの設定と注意点は<a href="https://qiita.com/ginger/items/bb8e66da953ff07f2b70#プログラムと書き込みの注意点">前回と同じ</a>ですのでご参照ください。
※今回はArduino Microを使用していますが、前回同様Arduino Leonardoとして書き込みを行います。

```c:qiita.rb
#include <SwitchControlLibrary.h>

bool keyPress=false;
int moveCount=0;
int r;
int x;
int y;
int z;
int preR=0;
int up=2;
int right=3;
int down=4;
int left=5;
int aButton=6;
int bButton=7;
int xButton=8;
int yButton=9;
int lButton=10;
int rButton=11;
int plus=12;
int LED=13;
int param=3;
int value=0;
int threshold=1000;
int level=0;

void setup() {
  pinMode(lButton, INPUT_PULLUP);
  pinMode(rButton, INPUT_PULLUP);
  pinMode(aButton, INPUT_PULLUP);
  pinMode(bButton, INPUT_PULLUP);
  pinMode(xButton, INPUT_PULLUP);
  pinMode(yButton, INPUT_PULLUP);
  pinMode(up, INPUT_PULLUP);
  pinMode(right, INPUT_PULLUP);
  pinMode(down, INPUT_PULLUP);
  pinMode(left, INPUT_PULLUP);
  pinMode(plus, INPUT_PULLUP);
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}

void loop() {

  //////////////////KEY-CONFIG///////////////////

  if(digitalRead(lButton)==LOW){
    Serial.println("lButton");
    SwitchControlLibrary().PressButtonL();
  }else{
    SwitchControlLibrary().ReleaseButtonL();
  }
  if(digitalRead(rButton)==LOW){
    Serial.println("rButton");
    SwitchControlLibrary().PressButtonR();
  }else{
    SwitchControlLibrary().ReleaseButtonR();
  }
  if(digitalRead(aButton)==LOW){
    Serial.println("aButton");
    SwitchControlLibrary().PressButtonA();
  }else{
    //SwitchControlLibrary().ReleaseButtonA();
  }
  if(digitalRead(bButton)==LOW){
    Serial.println("bButton");
    SwitchControlLibrary().PressButtonB();
  }else{
    SwitchControlLibrary().ReleaseButtonB();
  }
  if(digitalRead(xButton)==LOW){
    Serial.println("xButton");
    SwitchControlLibrary().PressButtonX();
  }else{
    SwitchControlLibrary().ReleaseButtonX();
  }
  if(digitalRead(yButton)==LOW){
    Serial.println("yButton");
    SwitchControlLibrary().PressButtonY();
  }else{
    SwitchControlLibrary().ReleaseButtonY();
  }
  if(digitalRead(plus)==LOW){
    Serial.println("Plus");
    SwitchControlLibrary().PressButtonPlus();
  }else{
    SwitchControlLibrary().ReleaseButtonPlus();
  }

  keyPress=false;
  
  if(digitalRead(up)==LOW){
    Serial.println("up");
    SwitchControlLibrary().MoveHat(0);
    keyPress=true;
  }
  
  if(digitalRead(right)==LOW){
    Serial.println("right");
    SwitchControlLibrary().MoveHat(2);
    keyPress=true;
  }
  
  if(digitalRead(down)==LOW){
    Serial.println("down");
    SwitchControlLibrary().MoveHat(4);
    keyPress=true;
  }
  
  if(digitalRead(left)==LOW){
    Serial.println("left");
    SwitchControlLibrary().MoveHat(6);
    keyPress=true;
  }
  
  if(keyPress==false){
    SwitchControlLibrary().MoveHat(8);
  }

 //////////////////END-OF-KEY-CONFIG///////////////////


  x=analogRead(A0);
  y=analogRead(A1);
  z=analogRead(A2);
  r=sqrt(pow(x-500,2)+pow(y-500,2)+pow(z-500,2));

  //可変抵抗の値でAボタンを押すのに必要な運動強度を変化させています。
  value=analogRead(param);
  level=map(value,0,1023,150,50);
  
  if(moveCount>level){
    moveCount-=level;
  }
  if(moveCount<threshold*3){
    moveCount+=abs(preR-r);
  }

  if(level>50){
    if(moveCount>threshold){
    SwitchControlLibrary().PressButtonA();
    digitalWrite(LED,HIGH);
    }else{
      SwitchControlLibrary().ReleaseButtonA();
      digitalWrite(LED,LOW);
    }
  }
  else{//可変抵抗を左に回しきった状態では、普通にAボタンを押すとアクセルが踏めます
    if(digitalRead(aButton)==LOW){
    Serial.println("aButton");
    SwitchControlLibrary().PressButtonA();
    }else{
      SwitchControlLibrary().ReleaseButtonA();
    }
  }
  
  preR=r;
  delay(16);
  
}
```

#完成！
いかがでしたでしょうか？
最後にコントローラーの操作方法について説明しておきます。
![200425-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164437/fa11e7f4-d6b8-0024-7ebd-d42468920ac5.png)
前回のものと違い、X、Y、＋ボタンも実装してありますので一通りの操作をすることが出来ます。
また、真ん中の可変抵抗でアクセルを踏むのに必要な運動強度を調整でき、左に回すとEASYモード、右に回すとHARDモードになります。なお、左に回しきると普通にAボタンを押してアクセルが踏めるようになります。

複数作ってご家族で遊んでみるのも良いかもしれません。
ご質問、改善点などあればお気軽にコメントください。