トレーニングトレーサーでマイクロマウス九州地区大会に出てみた

![tracer.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688041/5fe07741-2698-d1de-a0f0-e889d8410c80.jpeg)

みなさんこんにちは，ロボトレース初心者のざきまつです．
この記事は，[マイクロマウス Advent Calendar 2022](https://adventar.org/calendars/8292) の17日目の記事になります．


# はじめに
永遠のロボット初心者・制御の実装何もわからないマンが，某R社から発売されているトレーニングトレーサーで大会に出ました．
出ちゃいました，**しかも準優勝**．（4台エントリーで，完走したのが2台のため）

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">マイクロマウス九州支部大会，ロボトレース無事に完走できました．<br>(それに付随して準優勝してしまった)<br><br>来年は，ジャイロセンサをゴリゴリに使って，賢く走らせたいお気持ちです． <a href="https://t.co/vwDpyDgV4x">pic.twitter.com/vwDpyDgV4x</a></p>&mdash; ざきまつ (@santana_hammer) <a href="https://twitter.com/santana_hammer/status/1584069124053151744?ref_src=twsrc%5Etfw">October 23, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

この記事は，キット購入から大会出場までの中で，何をしたのかを書き記すサムシングです．

ちなみに．今回使用したトレーサーは以下の商品です．（アールティさん，いい商品をありがとうございます）
[トレーニングトレーサー | 株式会社ア－ルティ - アールティ](https://rt-net.jp/products/rt-tracer/)

トレーニングトレーサーで大会出ようとしている人にとって，この話が参考になれば幸いです．

# 事の発端
始まりは，このAdvent Calender作成者であるhmsnﾆｷの一言．

hmsnﾆｷ **「ざきまつさん，マイクロマウスやらね？？？？？？？？？」**

そう，この一言で僕はトレーサーキットをポチり，マイクロマウスという沼の奥地へと足を進めたのです．

実は以前よりマイクロマウスには興味がありました，えぇありましたとも．
**が**，機械工学専攻である我が身です，センサ値によるモータの制御どころか，回路設計とかやったことないし何もわからないし．
これはもうﾋﾟｴﾝ超えてﾊﾟｵﾝ超えてゴリラです．ｳﾎｳﾎ．

そんな中，トレーニングトレーサーのマニュアル資料や，hmsnﾆｷの知見を借りながら開発を進めました．
**まじで，この素晴らしいキットと環境がなければ，夢のまた夢で終わってた．まじで．**
なお，一ヶ月で組み立て・プログラム改良を行い，大会では無事完走できるという**個人的にはもう怒涛すぎる展開**でした．

(ハーフサイズのスターターキットである，「HM-Starter」の購入も考えたのですが，いかんせん手が出せませんでした．)

# やったこと
基本的には，キットに付属しているプログラムをベースに開発を行いましたが，個人的に「自分でメンテナンスをしたい，プログラムを一部でいいから書きたい」という思いがあり，ライントレースをするだけのプログラムに機能を追加しました．
自作した部分のコードを載せていますので，まぁよかったら使ってください．
動作保証は...ｳﾞｰﾝって感じで．僕のマシンでは動きました．

### トレーサーの組み立て
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">届いた，うれC． <a href="https://t.co/M8AKCMwCDI">pic.twitter.com/M8AKCMwCDI</a></p>&mdash; ざきまつ (@santana_hammer) <a href="https://twitter.com/santana_hammer/status/1572533493598683141?ref_src=twsrc%5Etfw">September 21, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

嬉しそうです，いいですね．
未来がとても明るいです．

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ｷｬｯｷｬｯ <a href="https://t.co/cTrbPS82VM">pic.twitter.com/cTrbPS82VM</a></p>&mdash; ざきまつ (@santana_hammer) <a href="https://twitter.com/santana_hammer/status/1572924892252868608?ref_src=twsrc%5Etfw">September 22, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

楽しそうですね，楽しすぎてお猿さんになっています．

ちなみに，はんだこては[白光の簡易温度調整機能付きのはんだこて](https://www.hakko.com/japan/products/hakko_fx600.html)を使いました．
当時の手元には鉛フリーはんだしかなく，370℃で赤外線LEDのはんだ付けをしました．
LEDって，高温ではんだ付けすると壊れるじゃないですか．めちゃくちゃ不安だったんですよ．

僕「ハンダが鉛フリーしかなくて，370℃でつけたからLEDが心配でござる」

**hmsnﾆｷ「それぐらいじゃLED壊れないよ。(成膜温度は1000℃とかだし)」**

有識者すげぇ，一気に安心しました．

あと，特典でついてくる工具ですが，結構ゴツくて細かい作業に向かなかったりします．
なので，少し小さいサイズのニッパーやペンチがあると良いと思います．

### スタート/ゴールの検知
これができなきゃ何も始まりません，レギュレーション違反です．
走行ラインの右側に検知用マーカがあるので，それを検知してゴール時に停止できるようにしました．
ついでに，停止後にスイッチ1を押すと再度走行するようにしています．

```cpp
if(Line_State==0 && adc_read_value(PB_0, 10) > 30){
  Line_State = 1; //スタート時用の処理
  digitalWrite(BUZZER_Pin, HIGH);
  delay(100);
  digitalWrite(BUZZER_Pin, LOW);
  delay(100);
  digitalWrite(BUZZER_Pin, HIGH);
  delay(100);
  digitalWrite(BUZZER_Pin, LOW);
}

else if(Line_State==1 && adc_read_value(PB_0, 10) > 40){
  Line_State = 0; //ゴール時用の処理
  digitalWrite(BUZZER_Pin, HIGH);
  delay(500);
  analogWrite(PWM_L_Pin, 0);
  analogWrite(PWM_R_Pin, 0);
  digitalWrite(BUZZER_Pin, LOW);
  while (1) {
    if (digitalRead(SW1_Pin) == LOW) { 
      digitalWrite(LED_Pin, HIGH);
      Line_State = 0;
      break;
    }
  }
}
```

スタートライン通過時には```Line_State = 1```となり，ゴールラインを通過すると```Line_State = 0```となって無限ループに入ります．
無限ループ中にスイッチ1を押すと無限ループから脱出，再度走行するようになっています．

### ライン交差時の処理
リングバッファを使ってセンサ値の勾配を計算，閾値より大きければモータを一定出力とか，いろいろ考えました．
結果，どうなったかというと．

マシン前方部分についているフォトリフレクタの合計値がある閾値を超えたら，モータ制御の処理を遅らせるようにしました．
ついでに保険をかけて，モータの出力値が一定になるように処理を加えました．

ただ，モータの組付けが悪かったのか何なのか，うまく直線で走ってくれなかったです．
そのため，プログラムでは左右で値を変えています．

```cpp
if(analogRead(LINE_L2_Pin)+analogRead(LINE_L1_Pin)+analogRead(LINE_R1_Pin)+analogRead(LINE_R2_Pin) > 1500){
    PWM_L_Value = 150;
    PWM_R_Value = 120;
    delay(200);
  }
```

これについては，要調査かと．多分，組付けたときのズレががが．

### モータのパラメータ調整
hmsnﾆｷ「あ，R10のコーナーを曲がれるようにしたらいいかもしれね～．」

大会当日に試走，ギリギリ現状での限界パラメータを見つけました．

# 今後やりたいこと
### ジャイロセンサを使いたい
ショートカットしてかっこよく賢く走りたい！！！！！！夢！！！！！！
まずは，これが最優先事項ですね．

### モータ制御の改良
ジャイロセンサから得た角加速度あたりを使って，カーブ径によって通過速度を最適化できるようにしたいですね．

### 賢く走らせたい
かっこよく以下略

# 最後に
以上，制御わからんﾊﾞﾌﾞﾊﾞﾌﾞｴｹﾁｭﾝマンが，なんやかんやで大会に出場した話でした．
最初らへんトレーニングトレーサーの宣伝みたいになってますが，気にしちゃダメです．

振り返ってみると，すごく楽しかったし充実した時間でした．
回路に部品をはんだ付けしたり．
自分で組み立てたものが動いて感動したり．
毎週，友達と通話を繋いで夜な夜な作業したり．
プログラムを少し書き換えたら上手く挙動が安定しなくて，頭抱えたり．
大会で，いろんな人と話して交流したり．

とても良いコミュニティだなってすごく感じました．

ではでは．