2017
03.02

PythonとPWM

Internship

インターン生の並木(学部1年)です。

最近はワカサギ釣り用のリールを巻くためにどのようにモータードライバー(TA7291P)を制御すればモータを動かせるのかいろいろ試しています。

レベルコンバーター(BSS138)を使ったりPWM出力を使ったりすることでPythonを使ってRaspberryPiからモーターの回転する向きや速度を制御することができました。しかしなぜかPWMの出力が安定しません。

今回はPythonのRPi.GPIOライブラリを使いました。このライブラリはソフトウェアPWMを出力するためどのピンでもPWMを出力できますが、高い周波数の波は出せません。しかし今回は100Hzで問題のない範囲です。

原因がわからなかったため、オシロスコープを使ってPWMの波形を見てみました。

不安定なPWM波

波が不規則に出ています。本来なら下のようになります。

正常な波形

色々調べてみたところ再起動して最初の1回は正常な波形になりますが、2回目以降は不規則な波形になりました。

そこで改めてコードを見てみると、

# coding: utf-8
import RPi.GPIO as GPIO
import time

MOTORPIN1 = 4
MOTORPIN2 = 5
MOTOR_LEVEL_PIN = 18
POWER_PIN = 17

GPIO.setwarnings(False)
GPIO.setmode( GPIO.BCM )
GPIO.setup(MOTOR_LEVEL_PIN, GPIO.OUT )
GPIO.setup(MOTORPIN1, GPIO.OUT )
GPIO.setup(MOTORPIN2, GPIO.OUT )

#基準用の3.3Vを確保するために使用
GPIO.setup(POWER_PIN, GPIO.OUT ) 
GPIO.output( POWER_PIN, True )


# PWM/100Hzに設定
MOTOR_LEVEL = GPIO.PWM(MOTOR_LEVEL_PIN, 100)
# 初期化
MOTOR_LEVEL.start(0)

if __name__ == '__main__':
    try:
        #モーター開始
        GPIO.output( MOTORPIN1, True )
        GPIO.output( MOTORPIN2, False )
        MOTOR_LEVEL.ChangeDutyCycle(10)
        time.sleep(3)
        MOTOR_LEVEL.ChangeDutyCycle(30)
        time.sleep(3)
        MOTOR_LEVEL.ChangeDutyCycle(50)
        time.sleep(3)

        MOTOR_LEVEL.ChangeDutyCycle(100)
        time.sleep(3)

        GPIO.output( MOTORPIN1, False )
        GPIO.output( MOTORPIN2, False )
    except KeyboardInterrupt:
        GPIO.cleanup()
        sys.exit(0)

となっており、PWMの出力を停止するコードがありません。PWMを停止させなかったためPWMの出力が不安定になったようです。

結局、最後の方に

MOTOR_LEVEL.ChangeDutyCycle(100)
        time.sleep(3)

        GPIO.output( MOTORPIN1, False )
        GPIO.output( MOTORPIN2, False )
#~~~~~~~~~~~~追加~~~~~~~~~~~~
        MOTOR_LEVEL.stop()
#~~~~~~~~~~~~~~~~~~~~~~~~~~~
    except KeyboardInterrupt:
#~~~~~~~~~~~~追加~~~~~~~~~~~~
        MOTOR_LEVEL.stop()
#~~~~~~~~~~~~~~~~~~~~~~~~~~~
        GPIO.cleanup()
        sys.exit(0)

を追加することで解決しました。

何か問題が起こった時には原点に戻ってみることが解決の近道だと改めて思いました。

Comment

  1. No comments yet.

  1. No trackbacks yet.

You must be logged in to post a comment.