QT4でサーボモータ(SG90)の操作パネルを作成

ネットで安価なサーボモータを探してまとめ買いしたのですが、動きをテストするのにプログラムを書き換えるとか、キーボードで角度を入力するのは面倒だったので、GUIで操作できるようにしました。

GUIはQT4で作成するので、まずはそのインストールから。 なお、動作環境はRaspberry Pi 3でOSはUbuntu mateです。

QT4インストール

ターミナルに以下のコマンドを入力し、QT4をインストールします。

sudo apt-get install python-pyqt4

プログラム

GUIはQT4ですが、モータの動作はRPi.GPIOで行います。
今回使用するサーボモータはSG90という型式のもので、動作範囲は-90~90度であり、
これをDuty cycleで指定します。 また、PWM周波数の50HzはGPIO.PWMで指定します。

GUIの方は、角度の表示パネルとスライダーで構成しています。
このスライダーを動かすとその角度にモータが動きます。

from PyQt4 import QtGui,QtCore
import RPi.GPIO as GPIO

servo=None

def initialize():
    gp_out=2
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(gp_out,GPIO.OUT)
    global servo
    servo=GPIO.PWM(gp_out,50)
    servo.start(0.0)

def change_detect(val):
    global servo
    #input 2~12 (-90~90 deg)
    servo.ChangeDutyCycle((val+90)*9.5/180+2.5)
    print (val)

if __name__ == '__main__':
    initialize()
    
    app=QtGui.QApplication(sys.argv)
    w=QtGui.QWidget()
    w.resize(320,240)
    w.setWindowTitle("Motor Test")

    disp=QtGui.QLCDNumber()
    slider=QtGui.QSlider(QtCore.Qt.Horizontal)

    slider.setRange(-90,90)
    slider.setValue(0)

    slider.valueChanged.connect(disp.display)
    slider.valueChanged.connect(lambda:change_detect(slider.value()))
    
    vbox=QtGui.QVBoxLayout()
    vbox.addWidget(disp)
    vbox.addWidget(slider)
    
    w.setLayout(vbox)
    w.show()
    
    sys.exit(app.exec_())
    GPIO.cleanup()

実行結果

動画は撮っていないので、載せられませんが、プログラムを実行すると、下記の画像のような
ウィンドウが表示されます。下のスライダーを動かすと、 -90~90度の範囲でモータが動きます。

f:id:oki-lab:20170826202813p:plain


今回地味にハマった点は、スライダーの動きを検出する関数にどうやって数値を渡すか、です。
lambdaを使ったことは無かったですが、色々とググって試してみると上手くいきました。