【自動運転#26】モータをPWMで制御する【ソフトウェアPart14】

目次

環境

Raspberry pi zero

エディターはラズパイに初めから付いている、Thonnyを使ってます。

今回は

以前、モータを回した時はモータをただ回す、止める、回す、止めるだけの制御だったので、

今回はPWM制御を使って、回転数を変えてみたいと思います。

部品

  • ピンソケット2種類
  • 基板
  • モータドライバ
  • Raspberry Pi Zero
  • ジャンプワイヤー
  • モバイルバッテリ

PWM制御とは

PWM制御とは、Pulse Width Modulationの略で、日本語だと「パルス幅変調」と訳します。

これは、電力を制御する方法の1つで、ONとOFFを高速に繰り返すことによって、出力される電力を制御する方法です。

意味わかりませんね。

これができるとモータの速度が変えられるということです。

準備

モータドライバーの番号とラズパイGPIOと繋ぐ場所

なんとなくPWM制御のことがわかったところで、早速繋げましょう。

この写真では上から1番です。
モータドライバ端子名と機能繋ぐ先
1番GNDラズパイGPIO39番
2番OUT1 出力端子モータの端子
3番NC何も繋げません。
4番Vref 制御電源端子モータドライバ8番と10kΩと繋いでます。
5番IN1 入力端子ラズパイGPIOピン13番
6番IN2 入力端子ラズパイGPIOピン15番
7番VCC ロジック側電源端子ラズパイGPIOピン1番(3.3V)
8番VS 出力側電源端子ラズパイGPIOピン2番(5V)
9番NC何も繋げません。
10番OUT2 出力端子モータの端子
*モータ端子はどちらに繋げてもいいです。
*ラズパイGPIOピン番号です。GPIOポート番号ではありませんのでご注意ください。
こんな感じです。ジャンプワイヤーの色は適当です。

PWM制御でモータを回すプログラミングコード

続いて実際のコードを書きます。「”a” + enter 」で進む、「”s” + enter 」で止まる、「”d” + enter 」でバックするというプログラムです。”motor_pwm.py”という名前で保存しました。


import RPi.GPIO as GPIO
import sys

duty = 50 #ここの数値を変えると、モータの速さが変わります。

#GPIO初期設定
GPIO.setmode(GPIO.BCM)
GPIO.setup(27, GPIO.OUT) #ラズパイGPIOピン13番
GPIO.setup(22, GPIO.OUT) #ラズパイGPIOピン15番

p1 = GPIO.PWM(27, 50) #ラズパイポート番号27, 50Hz
p2 = GPIO.PWM(22, 50) #ラズパイポート番号22, 50Hz
            
p1.start(0)
p2.start(0)

try:
    while True:
        #「a」キーが押されたら前進
        c = sys.stdin.read(1)
        if c == 'a':
            p1.ChangeDutyCycle(duty)
            p2.ChangeDutyCycle(0)
              
        #「d」キーが押されたら後退
        if c == 'd':
            p1.ChangeDutyCycle(0)
            p2.ChangeDutyCycle(duty)

        #「s」キーが押されたら止まる
        if c == 's':
            p1.ChangeDutyCycle(0)
            p2.ChangeDutyCycle(0)

except KeyboardInterrupt:
    pass

GPIO.cleanup()

4行目の”Duty”の値を変えると速度が変わります。

「a」を入力すると進みます。アクセルの「a」です。

「s」を入力すると止まります。ストップの「s」です。

「d」を入力するとバックします。キーボードの配列的に押しやすいので「d」にしました。

動作確認

(ラズパイ側)

上のプログラミングファイル(motor_pwm.py)をダブルクリック。

エディタ”Thonny”が開くので、”Run”をクリック。

すると、下の動画のような動きをします。

“Duty = 80″の時です。

“Duty = 20″の時です。

わかりづらいですが、音を聞くとわかりやすいかと思います。

できました。これで車の速さを制御できるようになりました。

今後は。

これでモータに関しては終わりです。

次はサーボモータの制御をもっとやっていこうと思います。

苦労したこと

プログラムを”Run”させたら、”RuntimeWaring”とかアラームが出て、”This channel is already in use,・・・”とか言ってる。

色々調べると、「無限ループしてる」とか「最後に”GPIO.cleanup()”と書いててもエラーは出る」とか書いてました。

めんどくさいので、エディターの”Thonny”の下側に”Shell”があるのでそこに直接。

GPIO .cleanup()

と入力して、enterキーを押して、解決しました。

enterを押した瞬間、モータが回り出したので、私と同じやり方で行う際は気をつけて。

もっといい方法があるかも知れませんが、

私はそれで、解決しました。

使った部品

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次