RaspberryPi用MC33886でDCモータを制御してみる

# やったこと
　RaspberryPi用MC33886を使ってDCモータの回転数を制御した。

<iframe width="560" height="515" src="https://www.youtube.com/embed/R8fEyQinDCc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


# 構成
- Raspberry Pi
- MC33886
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483299/1c7430b0-0234-e4e5-b90a-c4f9d294bd56.jpeg width=320>

<img src=https://user-images.githubusercontent.com/7821215/154165805-2f82d227-d7e5-4463-9677-4b36993017f6.jpg width=420>

# 設定と動作

* 基本はwiki通りに進めると動く。
  [RPi Motor Driver Board](https://www.waveshare.com/wiki/RPi_Motor_Driver_Board)
* ChangeDutyCycle関数を用いることで、PWMの波形を出力している途中でもデューティ比を変更することができます


```py:DC_sample_cord.py
from tkinter import E

import RPi.GPIO as GPIO
from time import sleep
import time


PWMA1 = 6
PWMA2 = 13
PWMB1 = 20
PWMB2 = 21
D1 = 12
D2 = 26

class DC_motor_drive():
    def __init__(self):
        #GPIOのポート番号を使用
        GPIO.setmode(GPIO.BCM)
        #モーターで使うGPIOをセットアップ
        GPIO.setup(PWMA1,GPIO.OUT)
        GPIO.setup(PWMA2,GPIO.OUT)
        GPIO.setup(PWMB1,GPIO.OUT)
        GPIO.setup(PWMB2,GPIO.OUT)
        GPIO.setup(D1,GPIO.OUT)
        GPIO.setup(D2,GPIO.OUT)
        #PWMの設定
        self.motor1 = GPIO.PWM(D1,100)
        self.motor2 = GPIO.PWM(D2,100)
        self.motor1.start(0)
        self.motor2.start(0)

    def sample_process(self,speedA,speedB):
        print('start sample_process')
        self.motor1.ChangeDutyCycle(speedA)
        self.motor2.ChangeDutyCycle(speedB)
        print('speedA:{},speedB:{}'.format(speedA,speedB))
        GPIO.output(PWMA1,1)
        GPIO.output(PWMA2,0)
        GPIO.output(PWMB1,1)
        GPIO.output(PWMB2,0)

        # モーターを2秒動かす
        time.sleep(2)

    def move_process(self,speedA,speedB):
        print('start move_process')
        self.motor1.ChangeDutyCycle(speedA)
        self.motor2.ChangeDutyCycle(speedB)
        print('speedA:{},speedB:{}'.format(speedA,speedB))
        # モーターを動かす。
        GPIO.output(PWMA1,1)
        GPIO.output(PWMA2,0)
        GPIO.output(PWMB1,1)
        GPIO.output(PWMB2,0)

    def stop_process(self):
        # モーターを停止。
        GPIO.output(PWMA1,0)
        GPIO.output(PWMA2,0)
        GPIO.output(PWMB1,0)
        GPIO.output(PWMB2,0)

    def cleanup(self):
        GPIO.cleanup()
        print('Process End')
        time.sleep(1)

def drive_main():
    motor_drive= DC_motor_drive()
    #()内には0～100のスピードを指定
    speedA=50
    speedB=50
    try:
        print('--- start program ---')
        while True:
            motor_drive.sample_process(speedA,speedB)
            print('speed UP:{}'.format(speedA))
            if speedA < 100:
                speedA+=10
            else:
                speedA=speedA-80
                print('speed reset'.format(speedA))
    except KeyboardInterrupt:
            print("intrrupted Ctrl-C")
            pass
    finally:
        GPIO.cleanup()
        print('--- stop program ---')
        motor_drive.cleanup
        time.sleep(1)

if __name__ == '__main__':
    drive_main()
```

以上

# 参考
* [RPi Motor Driver Board ,From Waveshare Wiki](https://www.robotshop.com/media/files/pdf2/rpi_motor_driver_board_-_waveshare_wiki.pdf)
* [販売サイト](https://www.robotshop.com/jp/ja/mc33886-raspberry-pi-motor-driver-board-raspberry-pi.html?gclid=CjwKCAiAxJSPBhAoEiwAeO_fP36sIZ3ye_uHfuD7ZwPKAhYNGqMT_f6dZvSWnyaVxpDSLR_Eir7eFRoC9rcQAvD_BwE)
* [ラズパイでモーターを動かしたかったので、WaveshareのMotor Driver Boardを使ってみた](https://qiita.com/21century_girl_/items/1bb7ca03f06650c9da8e)
* [Raspberry Pi 3でpythonを使いモータードライバーを使いモータを制御する！](https://qiita.com/RyosukeKamei/items/147de58738084826f749)
* [RPi.GPIOでPWM信号を出力する](https://www.mechatronahibi.com/rpi-gpio-pwm/)