タンスから出てきたRaspberry Pi2 BでPWMサーボモーターを動かす

Posted on Sat 08 May 2021 in Raspberry Pi

はじめに

故あってPWMサーボを制御しようと思い、手軽にできそうなものを探したところAdafruitの製品である「Adafruit 16-Channel PWM/Servo HAT & Bonnet for Raspberry Pi」(以下:PWM/Servo HAT)に行き着いた。


Adafruit 16チャンネル PWM/サーボ HAT for Raspberry Pi

この商品は「Raspberry Pi(RasPi)」のピン配列に則って作られており、RasPiに差しこむだけで使用できる。
そういえばRasPiを持っていたなと思い購入した次第である。
さて、肝心のRasPiはどこかと片付けしながら探したところ、無事(?)タンスから「Raspberry Pi2 Model B」が出てきた。

OSのセットアップについては前記事を参照のこと。

Raspberry Piの設定変更

PWM/Servo HATはRasPiのIC2機能を使って最大16本のPWMを制御することができる。
一方で、RasPiの初期設定ではIC2を含めSPIやカメラモジュールなどの機能も切られているため、設定を変更する必要がある。 Adafruit公式のガイド

Adafruit公式ガイドの記述に対して、私の場合はOSとしてUbuntu MATE16.04を使用しているため、[python-smbus]、[i2c-tools]は入っていた。
一方で、[raspi-config]はインストールされていなかったので、インストールした上で実行し設定を変更した。

sudo apt install raspi-config
sudo raspi-config

[Interfacing Options]から変更できる。

PWM/Servo HATの接続

PWM/Servo HATではPWMサーボ用の電源はRasPiと分けることを推奨している。 ここでは以下の写真のようにmicro-USB基板を用意し、配線を伸ばして接続した。

なお、USB基板は昔秋月電子で買ったものを使用した。 アマゾンだとこの当たりが近いか。


USBマイクロBコネクタ・ピッチ変換基板

改めて買うのであればType-Cが良いかもしれない。


CK-45 USB Type-C コネクタ変換基板 サンハヤト

PWMサーボモーターの制御

RasPiでPWM/Servo HATの利用にはAdafruitのPythonライブラリを利用する。この時、Adafruit公式では2つの方法が紹介されている。 一つはAdafruitのGithub。 もう一つ、AdafruitのPython Usageでは以下のようにライブラリをインストールする。

sudo pip3 install adafruit-circuitpython-servokit

この時、以下のようなエラーが出てしまう場合はaptでインストールされているpip3が古いため[setuptool]のupdateを行う。

Traceback (most recent call last):
  File "/usr/bin/pip3", line 11, in <module>
    sys.exit(main())
  File "/home/mate/.local/lib/python3.5/site-packages/pip/__init__.py", line 12, in main
    from pip._internal.utils.entrypoints import _wrapper
  File "/home/mate/.local/lib/python3.5/site-packages/pip/_internal/utils/entrypoints.py", line 4, in <module>
    from pip._internal.cli.main import main
  File "/home/mate/.local/lib/python3.5/site-packages/pip/_internal/cli/main.py", line 58
    sys.stderr.write(f"ERROR: {exc}")
                                   ^
SyntaxError: invalid syntax
sudo pip3 install --upgrade setuptools

※ コマンドをメモしていなかったので間違っているかもしれない。

ライブラリがインストールできたのならば、後はPythonで制御できる。

from adafruit_servokit import ServoKit
kit = ServoKit(channels=16)
kit.servo[0].angle = 180

以下、動作の様子。

準備中

おわりに

今回はサンプルの設定をそのままで動かしたが、PWMサーボモーターはメーカー毎にPWMの範囲が異なっていることが多い。 AdafruitのLibrary Referenceによると以下のような形で範囲を調整できるようだ。

pwm = PWM(0x40)
pwm.setPWM(15, 1024, 3072)

以上で本記事は終わるが、次はROSを絡めて使ってみたい。


Raspberry Piクックブック 第3版 (Make:PROJECTS)