粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

Raspberry Pi Mouseでサーボモータ(SG90)を動かす

Raspberry Pi Mouse上でのGPIOの配線

SG90はラズパイ上のGPIOポートを用いて制御しますが,ラズパイマウスではそのポートは覆い隠されてしまいます。

しかし,外のデバイスを繋げないかというとそうでもなく,以下の写真の箇所に接続可能なポイントがあります。

f:id:ossyaritoori:20190422195726p:plain
本体右手側にピンがあります。

ここに書かれている英字は以下のGPIO番号(ピン番号ではない)と対応しています。

  • SDA → GPIO2
  • SCL → GPIO3
  • TXD → GPIO14
  • RXD → GPIO15

詳しいピンの位置等は以下の図を参照してください。 https://hackster.imgix.net/uploads/attachments/218603/6sQiFTKXhZptFiGnPlsc.png

従って,先程の写真のようにオスのピンヘッダをはんだ付けすれば外部出力用として使えます。

ラズベリーパイでSG90を制御する

SG90とは安価に手に入るお手軽なサーボモータです。 可動域は180degでトルクは1.8kgfcm出ます。これは見かけよりはパワーが有ると思って良いです。

VCCとGNDに加えて制御用の信号が1つの計3つの信号線が必要です。信号はduty比を変えた矩形波を入力しますが詳しい説明に関してはこちらのサイトがわかりやすいと思います。

私はSDA,すなわちGPIO ポート2を信号線用に使うことにしました。

  • 以下補足情報

本来求められるPWM信号は4.8VくらいでGPIOは3.3Vしか出ないのですが,一応直挿しでも動きはします。ただ,時々ちょっと振動的な挙動を示すので精度が必要ならちゃんとやるべきかも(サンプル数1)

SG90用コントローラ クラス

初期化などの処理をまとめたかったのでクラスで実装しました。 最新版はここで管理しますが,現在は以下のような感じに書いています。

大まかな挙動は

  • ポート番号を渡して初期化
  • 角度をdegreeで渡して制御
  • stop()関数でサーボ状態から抜ける

となっています。

import RPi.GPIO as GPIO

class SG90servo():
    def __init__(self,motorport=2):
        self.port = motorport
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(self.port, GPIO.OUT)
        self.servo = GPIO.PWM(self.port, 50)

        self.servo.start(0.0) # set duty cicle to 0-100
        self.minlim = -90
        self.maxlim = 90

    def servo_deg(self,deg):

        if deg > self.maxlim:
            print("Exceed max degree!")
            return
        elif deg < self.minlim:
            print("Exceed min degree!")
            return
        
        cycle = 7.25+4.75*deg/90.0
        self.servo.ChangeDutyCycle(cycle)

    def stop(self):
        self.servo.start(0.0)

宣伝枠

ラズパイマウス,ちょっと高いですが手軽に勉強できるので教育的にはいいのかなと思います。

Raspberry Pi Mouse V2 フルキット

Raspberry Pi Mouse V2 フルキット

Raspberry Piで学ぶ ROSロボット入門

Raspberry Piで学ぶ ROSロボット入門