タミヤ「バギー工作基本セット」を改造してラジコンを作ってみた

# タミヤ「バギー工作基本セット」とは
電池とモーターで走る2WDバギーカーの工作キット。
専用シャーシに同梱のサスペンションとステアリング機構、２段変速ギアを実装するだけで、本格的なバギーのベースが手軽に作れる優れもの。
今回はお馴染みのマイコンボード(micro:bit)を使ってアクセルやブレーキ、ステアリング操舵を外部から無線操縦できるよう改造してみた。
<img width="400" alt="ファイル名"70112_p1.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696263/bc613025-c9bc-5c9e-78f4-b5fbd7182e63.jpeg">
(参照 https://www.tamiya.com/japan/products/70112/index.html)

電池ボックスとスイッチボックスを除いて組み立ててみた。
DCモーターにはノイズ除去の0.1uFコンデンサも取り付けた。
<img width="400" alt="built_up_plain2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696263/335025eb-53eb-917e-912a-56e755c0d54a.png">

# 製作工程
- メカ機構設計
- 回路設計
- 操縦方法の決定
- プログラム作成

[用意したもの]
1. バギー工作基本セット
2. micro:bitメインボード×2
3. USB出力バッテリー(ダイソー)
4. USB電源ケーブル(L型短めのもの)
5. マイクロサーボ(SG92R)
6. micro:bitブレークアウトボードキット
7. ブレッドボード(回路確認用)
8. ジャンパーケーブル(回路確認用)
9. ユニバーサル基板
10. モータードライバ(TB6612ブレークアウトボードキット)
11. マイクロUSBコネクタDIP化キット
12. 3.3V三端子レギュレータ(NJU7223F33)
13. セラミックコンデンサ0.1uF x 3
14. 電解コンデンサ47uF
15. 2回路トグルスイッチ
16. リード線・ピンヘッダ・金具・絶縁テープ 少々
17. ビス・ナット・両面テープ、輪ゴム 少々
18. フーセンガムの空き容器(PP材質)
※電子部品は秋月電子通商さんで調達した。

## メカ機構設計
設計自由度および周辺への影響度が高い「ステアリング操舵」の機構から作ってゆく。
3Dプリンターがあればベストですが、残念ながら手元にないため、家にあった材料で加工を試みた。
＜候補材料＞
- 牛乳パック
- お菓子の樹脂ケース
<img width="100" alt="ファイル名"PP_case.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696263/925dac57-e7ca-95f7-5c4f-9c83d993bff1.png">

実験の結果「お菓子の樹脂ケース（フーセンガムの空き容器）」を選定。
PP=ポリプロピレン材質は、「軽量」かつ「高強度」であることから、サーボのトルクにも耐久性が高いのがメリット。ただしバリが発生しやすくヤスリによる仕上げ加工に時間を要するのがデメリット。
1. お菓子の樹脂ケースの加工箇所に墨付けし糸鋸＆ドリルで加工、サーボの駆動をステアリングに伝達する「サーボ受け部品」が完成。
2. 完成した「サーボ受け部品」にステアリングシャフトを通して仮組み。
3. サーボホーンにM2x25mmビスを取り付け「サーボ受け部品」と勘合させて位置決め、両面テープで固定。トルクが2.5kgf・cmと割と大きめであるため、サーボの4か所をシャーシにアンカーボルトで固定。その上からゴムバンドを掛けた。
4. 「サーボ受け部品」とステアリングシャフトも接着剤で最終固定。

<img width="200" alt="ファイル名"complete_steering.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696263/aee597b6-bf1d-ce16-f6cc-9c4d2bfada65.png">


## 回路設計
まずは電源系から考える。
高電流が必要とされるDCモーター駆動系とそれ以外の制御系の２系統に大別。
電圧の観点では5V、3.3Vの２電源が必要であるため、以下のような電源系に決定。

- 電池ボックス(3V)
　　┗ DCモーター(3V) 
- USB出力バッテリー(5V)
　　┗ マイクロサーボ(5V)
　　┗ 3.3V降圧レギュレータ(5V==>3.3V)
　　　　┗ micro:bit(3.3V)
　　　　┗ モータードライバ(3.3V)

＜モータードライバTB6612＞
デュアルDCモータードライバで各モーターへ２つのIN信号を入力することで正転/逆転/ショートブレーキ/ストップの4モードを選択することができる。モーターの回転速度はPWMを使うことで可変することができる。

<img width="400" alt="ファイル名"FB6612FNG_block.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696263/c3728597-4628-64cd-3d2b-2644b57e084a.png">
データシート参照
https://akizukidenshi.com/download/ds/Toshiba/TB6612FNG_datasheet_ja_20141001.pdf

今回使用するモータードライバは2ch対応だが、実際に使用するのは1chのみ。
完成した回路を確認用ブレッドボード環境で確かめてみる。
<img width="400" alt="ファイル名"test_circuit2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696263/3e376b59-d1a4-7e04-887f-aa16efb69143.png">

ブレッドボードのままでは大きすぎて実装困難であるため、コンパクトにまとめてユニバーサル基板に実装してみた。配線を着脱しやすいようピンヘッダーで接続端子もまとめる。
<img width="400" alt="ファイル名"circuit.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696263/99b66c19-6674-e21b-f310-1e42558257f0.png">

＜補足＞
- DCモーターの制御信号はドライバ出力のA系統に接続した。
- マイクロサーボの急な電流変動によるノイズ抑制のため、電源系に47uF電解コンデンサを追加。

＜micro:bitとの接続＞
- サーボ制御信号 - P0 端子
- ドライバPWMA - P1 端子
- ドライバAIN2 - P2 端子
- ドライバAIN1 - P8 端子
※LEDを使いたかったので空きP8端子を使用。

## 操縦方法の決定
micro:bitを受信＆送信でそれぞれ用意。
送信側は、micro:bitを前後左右に傾けてピッチとロールの角度を検出して、アクセルとステアリングをコントロールする形とした。

(参照 https://microbit.org/ja/projects/make-it-code-it/spirit-level/)

## プログラム作成
受信＆送信それぞれのプログラムは下記。
ステアリングとアクセルをアナログ値で、ブレーキが踏まれたかのフラグと、前進後退フラグも、シリアル送信して、受信側でリアルタイム識別してアクチュエーターを制御する。

なお、送信側でA+Bボタンを押すとブレーキがかかるように設計。

＜受信側＞
```python
def on_received_value(name, value):
    global steering, gaspedal, brake, forward
    if name == "steering":
        steering = value
    if name == "gaspedal":
        gaspedal = value
    if name == "brake":
        brake = value
    if name == "forward":
        forward = value
radio.on_received_value(on_received_value)

forward = 0
brake = 0
gaspedal = 0
steering = 0
radio.set_group(1)
steering_prev = 90
steering = 90
gaspedal = 0
brake = 0
forward = 1
basic.show_leds("""
        . . . # .
        . . # . .
        . # # # .
        . . # . .
        . # . . .
""")

def on_forever():
    global steering_prev
    if steering != steering_prev:
        servos.P0.set_angle(steering)
        steering_prev = steering
    pins.analog_write_pin(AnalogPin.P1, gaspedal)
    if brake == 1:
        pins.digital_write_pin(DigitalPin.P2, 1)
        pins.digital_write_pin(DigitalPin.P8, 1)
    else:
        if forward == 1:
            pins.digital_write_pin(DigitalPin.P2, 1)
            pins.digital_write_pin(DigitalPin.P8, 0)
        else:
            pins.digital_write_pin(DigitalPin.P2, 0)
            pins.digital_write_pin(DigitalPin.P8, 1)
basic.forever(on_forever)
```

＜送信側＞
```python
brake = 0
forward = 0
gaspedal = 0
steering = 0
radio.set_group(1)
basic.show_leds("""
        . . . # .
        . . # . .
        . # # # .
        . . # . .
        . # . . .
""")

def on_forever():
    global steering, gaspedal, forward, brake
    steering = Math.constrain(90 - input.rotation(Rotation.ROLL), 30, 150)
    gaspedal = pins.map(abs(input.rotation(Rotation.PITCH)), 0, 90, 0, 1023)
    if input.rotation(Rotation.PITCH) > 0:
        forward = 1
    else:
        forward = -1
    if input.button_is_pressed(Button.AB):
        brake = 1
    else:
        brake = 0
    radio.send_value("steering", steering)
    radio.send_value("gaspedal", gaspedal)
    radio.send_value("brake", brake)
    radio.send_value("forward", forward)
basic.forever(on_forever)
```

＜送信機＞
電源さえ供給できればなんでも可。
手元にあったaitendoの電池ボックス付キットを利用した。
<img width="200" alt="ファイル名"transmitter.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696263/0e483f0e-5463-2527-1227-214e32c30858.png">

＜完成＞
タミヤ「ユニバーサルプレート」とスペーサ等を使えばもっと綺麗に実装できるが、手抜きで輪ゴムで固定＆絶縁保護のみで組み立てた。
<img width="600" alt="ファイル名"complete_car2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696263/b7a920f6-b92d-2d87-8aff-1a08d04250ef.png">

送信側micro:bitを前後左右に傾けるだけで、バギーを自由自在に操れることを確認。
ただし、ピッチを深く傾けた状態でロールも高角度にすると感度が鈍く、曲がりが弱い。これは今回定めた操作方法による分解能の限界かもしれない。改善策としては送信側のセンサ値をアナログジョイスティックでX-Yのアナログ値として取る方が、より正確なコントロールができると考えられる。

いかがでしたか？
今回はラジコン制作を通じて、モーターの制御＆ステアリング操舵の基本を学ぶことができました。