1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ラズパイでモーターを動かしたかったので、WaveshareのMotor Driver Boardを使ってみた

Last updated at Posted at 2019-11-08

とりあえず動画

IMAGE ALT TEXT HERE

こんなマニアック記事誰が読むんだ。。

Raspberry Piには、ある分野に特化したHATと呼ばれる拡張基盤がたくさん存在します。
今回、ラズパイでモーターを動かす任務が舞い込んできました。
最初はブレッドボードで頑張っていたのですが、面倒になり、

いやいや、なんかHATを探せばいいやん!!!

というわけで探しにかかりました。

HATの条件

  • ラズパイのGPIOが全て生き残ること。
  • 電池だけでラズパイ本体の給電もできること。
  • 5000円以下
  • 2つのモーターのセットが可能

の4点でした。

そして見つけたのがこれ!!
20191106_234520.jpg
Waveshare製のRPi Motor Driver Boardと呼ばれるHATです。

ラズパイにHATをかぶせても、全てのGPIOが使えるし、
モーターも2つ繋げられ、ラズパイへの給電も可能!!
電池は単三6本使っております。
20191108_225610.jpg

Pythonでモーターを動かす

例)

import RPi.GPIO as GPIO
from time import sleep

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

#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の設定
motor1 = GPIO.PWM(D1,50)
motor2 = GPIO.PWM(D2,50)


#()内には0~100のスピードを指定
motor1.start(50)
motor2.start(50)

# モーターを動かす。
GPIO.output(PWMA1,1)
GPIO.output(PWMA2,0)

GPIO.output(PWMB1,1)
GPIO.output(PWMB2,0)

# モーターを3秒動かす
sleep(3)

# モーターを停止。
GPIO.output(PWMA1,0)
GPIO.output(PWMA2,0)

GPIO.output(PWMB1,0)
GPIO.output(PWMB2,0)

上記のプログラムでとりあえず3秒間2つのモーターを動かすことが可能です。
上から順にプログラムを見ていきましょう。

ライブラリのインポート

おなじみGPIOと、タイムスリープのライブラリを使用します。

import RPi.GPIO as GPIO
from time import sleep

変数宣言

GPIOのポート番号を宣言します。

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

Motor Driver Boardはモーターを2つセットでき、

モーター1をポート番号12
モーター2をポート番号26

を使うようです。

さらに電気を流すときには、

モーター1の片方をポート番号6
モーター1の片方をポート番号13

モーター2の片方をポート番号20
モーター2の片方をポート番号21

を使用します。

片方から電流を流し、片方はGNDになる想定ですね。

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を利用

モーターはGPIOのセットアップ後に、PWMの宣言をします。

motor1 = GPIO.PWM(D1,50)
motor2 = GPIO.PWM(D2,50)
  • 第1引数にPWMを使用したいポート番号
  • 第2引数は周波数となります。(ここでは50とします)

GPIOは本来、デジタル信号の入出力しか対応していません。デジタル信号はオンとオフしかないのです。速度調整やLEDの明るさ調整は、オンとオフだけでは表現できず、アナログ信号を送ってやらなければなりません。
そこでこのPWMの方式で、疑似的に出力電圧をコントロールして制御をしてあげる必要があるのです。

モーターの速度を指定

motor1.start(50)
motor2.start(50)

引数に0~100の速度を指定できます。

モーターに電気を流す

これはお馴染みです。

前回転

GPIO.output(PWMA1,1) #6番ポート
GPIO.output(PWMA2,0) #13番ポート

6番ポートから電流が流れ、13番ポートがGNDとなります。

後回転

GPIO.output(PWMA1,0) #6番ポート
GPIO.output(PWMA2,1) #13番ポート

13番ポートから電流が流れ、6番ポートがGNDとなります。
これによって、モーターの回転が逆になるのです。

モーター2も同様の動きなので割愛

3秒間動かす

お馴染みsleep

sleep(3)

終了

GPIOに流れている電流を全てオフにすることにより、モーターは止まります。

GPIO.output(PWMA1,0)
GPIO.output(PWMA2,0)

GPIO.output(PWMB1,0)
GPIO.output(PWMB2,0)

以上。

こんなマニアックHAT使う人っているのかな。。
いたら是非用途を教えてもらいたいし、情報共有お願いします―!

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?