Raspberry Pi で秋月電子の4WD車 FT-MC-004 を使う

秋月電子の4輪車FT-MC-004をRaspberryPiで動かしましょう。
##FT-MC-004とは？
FT-MC-004は秋月電子のArduinoベースの４WD車のキットです。
価格は￥2,610です。
###4WD Mobile Robot Platform Kits for Education FT-MC-004
http://akizukidenshi.com/catalog/g/gK-13652/

FT-MC-004のキット構成は4個のモーターとモータドライバボード、シャーシとマイコンボード用のステーのセットになります。
兄弟機のFT-MC-002は2個のモーターとモータドライバボード、シャーシとマイコンボード用のステーのセットになります。
モーターの数の違いで2種類に分かれています。
ただし、そのままでは使えません。
##Raspberry Pi用のステーを作る
RaspberryPiとバッテリを置こうとすると厳しいです。
このため、タミヤ 楽しい工作シリーズ No.157 ユニバーサルプレート 2枚セット (70157)を使用します。
![DSC_0092 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c9eec8eb-0392-50c2-60cb-2e8393d415be.jpeg)
![DSC_0095 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/bf86d9a7-ae3a-ce00-9015-e5521d95689c.jpeg)
RaspberryPiを取り付るイメージ
これをFT-MC-004の上に載せます。
##FT-MC-004に載せる
今回は、直接載せず、ケースに入れたRaspberryPiを使用しました。
![DSC_0402 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/aadf7f52-fa9d-dfc5-58f7-d1c650b51c75.jpeg)
![DSC_0404 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/eeb479b0-6c48-f8ba-36df-66e62a78b6e0.jpeg)
電源は、USBバッテリからにしました。
RaspberryPiの5Vを使うと、配線が焼き切れてしまう可能性があるのでお勧めしません。
![DSC_0413 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/46da87c5-01d2-059e-1461-c0b3ba8da523.jpeg)
##モータドライバを動かす
それでは、動かしましょう。
FT-MC-004はモータドライバへPWM周波数を入れることで制御します。
###秋月電子の資料から
【質問】	付属の基板に入力するパルス幅は何msですか。
【回答】	メーカー資料が無いため実測値を下記に示します。
正転：1.2～1.4（これ以下は目視での変化なし）
静止：1.5（前後に若干の不感帯あり）
逆転：1.6～1.8（これ以上は目視での変化なし）
単位（ms）
(C)http://akizukidenshi.com/catalog/faq/goodsfaq.aspx?goods=K-13652
GPIOの4ピンと17ピンにPWMを出力することで制御します。
**なお、別の資料によれば、1ms～2ms　中心は1.5msとなっています。
##プログラム
プログラムはこんな感じです。
私は静止状態を

    servoX.ChangeDutyCycle(7.2)

としました。
6.5～8.5で前進後進を制御できるようになっています。
(前後のバランスが悪いですね）
これをPythonで実行すればとりあえず、タイヤが回ると思います。

```
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

lp_out = 4
rp_out = 17
GPIO.setup(lp_out, GPIO.OUT)
GPIO.setup(rp_out, GPIO.OUT)
servol = GPIO.PWM(lp_out, 50)
servor = GPIO.PWM(rp_out, 50)

servol.start(0)
servor.start(0)

for i in range(1):
    print("Stop")
    servol.ChangeDutyCycle(7.2)
    servor.ChangeDutyCycle(7.2)
    time.sleep(1.5)
    print("Start")
    servol.ChangeDutyCycle(6.5)
    servor.ChangeDutyCycle(8.0)
    time.sleep(1.5)
    print("Stop")
    servol.ChangeDutyCycle(7.2)
    servor.ChangeDutyCycle(7.2)
    time.sleep(1.5)
servol.stop()
servor.stop()
GPIO.cleanup()
```
##長くしたプログラム
ちょっと長く回してみましょう。

```
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

lp_out = 4
rp_out = 17
GPIO.setup(lp_out, GPIO.OUT)
GPIO.setup(rp_out, GPIO.OUT)
servol = GPIO.PWM(lp_out, 50)
servor = GPIO.PWM(rp_out, 50)

servol.start(0)
servor.start(0)

for i in range(1):
    print("Stop")
    servol.ChangeDutyCycle(7.2)
    servor.ChangeDutyCycle(7.2)
    time.sleep(1.5)
    print("Start")
    servol.ChangeDutyCycle(6.5)
    servor.ChangeDutyCycle(8.0)
    time.sleep(1.5)
    print("Stop")
    servol.ChangeDutyCycle(7.2)
    servor.ChangeDutyCycle(7.2)
    time.sleep(1.5)
    print("R")
    servol.ChangeDutyCycle(7.2)
    servor.ChangeDutyCycle(8.0)
    time.sleep(1.5)
    print("L")
    servol.ChangeDutyCycle(5.0)
    servor.ChangeDutyCycle(7.2)
    time.sleep(1.5)
    print("BR")
    servol.ChangeDutyCycle(7.2)
    servor.ChangeDutyCycle(5.0)
    time.sleep(1.5)
    print("BL")
    servol.ChangeDutyCycle(10.0)
    servor.ChangeDutyCycle(7.2)
    time.sleep(1.5)
servol.stop()
servor.stop()
GPIO.cleanup()
```