はじめに
OSOYOO PWM HATは、I2C通信を介して16個のPWM出力を制御できます。2つのオンボード電圧レギュレータモジュールは、Raspberry Piとサーボ用にそれぞれ独立した2つの5V電源を提供します。とりわけ、マイクロコントローラの入出力を解放し、2本のピン(SCLとSDA)を使用して最大16個のLEDまたはサーボ(またはPWM信号を入力として受け取るその他のモジュール)を駆動しながら、センサーなどの他のモジュール用にマイクロコントローラのピンを保持できます。Raspberry Piは、BluetoothおよびWifiモジュールを統合したマイクロコントローラです。非常に使いやすく、軽量で、Arduinoよりも高いメモリとコンピューティング能力を備えています。
このチュートリアルでは、Raspberry PiとOSOYOO PWM HATを使用してLEDの明るさを調整し、サーボを駆動する方法を見ていきます。
注: このチュートリアルは、ユーザーがRaspberry Piに精通しており、Pythonの一般的な知識を持っていることを前提としています。これらの項目に慣れていない場合は、まずRaspberry Piをセットアップし、グラフィカルユーザーインターフェイス(GUI)に慣れてから、Pythonの基本を学ぶことをお勧めします。開始するためのリソースは以下のとおりです。
RPi接続

OSOYOO PWM HATとRaspberry Piの組み立ては非常に簡単です。まず、何も電源が入っていないことを確認してください。次に、HATをRaspberry Piの上に積み重ねて、PCBが互いに一直線になるようにします。HATは側面に**突き出すようには**設計されていません。
- PWM HATをPCBがRaspberry Piの側面に突き出すように積み重ねる(上または上部ではなく)と、ピンが誤って接続され、何かが損傷する可能性が非常に高くなります。
- 通常は最小限ですが、Raspberry HATを接続する場合でも、短絡、ブラウンアウト、および/または損傷の可能性があります。ベストプラクティスとして、何かに電源が入っている間(HAT、サーボ、LED、または追加のQwiicボードを含む)は、HATを接続しないでください。
- Raspberry Pi 4またはDebian Busterイメージを使用していないことを確認してください。どちらもこの製品での使用はまだテストされていません。
- Raspberry Piの実行中にサーボを接続しないでください。サーボに電力を供給するために必要な突然の電流スパイクにより、Raspberry Piがリセットされます。常に最初にすべてのサーボを接続してから、起動してください。
Raspberry Piの実行中にサーボを接続しないでください。サーボに電力を供給するために必要な突然の電流スパイクにより、Raspberry Piがリセットされます。常に最初にすべてのサーボを接続してから、起動してください。
HATのアドレス指定
スタック内の各HATには、一意のアドレスを割り当てる必要があります。これは、ボードの右中央にあるアドレスジャンパーで行います。各ボードのI2Cベースアドレスは0x40です。アドレスジャンパーでプログラムするバイナリアドレスが、ベースI2Cアドレスに追加されます。
アドレスオフセットをプログラムするには、アドレス内の対応するバイナリ「1」のアドレスジャンパーをハンダでブリッジします。
この写真は、このドライバーのArduinoシールドバージョンからのものですが、セットアップは同じです
ボード0:アドレス = 0x40 オフセット = バイナリ 00000(ジャンパー不要)
ボード1:アドレス = 0x41 オフセット = バイナリ 00001(上の写真のようにA0をブリッジ)
ボード2:アドレス = 0x42 オフセット = バイナリ 00010(A1をブリッジ)
ボード3:アドレス = 0x43 オフセット = バイナリ 00011(A0とA1をブリッジ)
ボード4:アドレス = 0x44 オフセット = バイナリ 00100(A2をブリッジ)
など
動作原理
このモジュールは、PCA9685コントローラーに基づいており、I2C通信と統合されたクロックを使用してPWM出力を制御できます。このモジュールには、ボードのアドレスを選択するための6つのブリッジがあり、同じバス上に最大62個のコントローラーを配置でき、合計992個のサーボモーター(アドレス0x40から0x7Fが利用可能)を制御できます。
調整可能な周波数と12ビットの分解能でPWM出力を駆動できます。このモジュールは、5Vおよび3.3Vのマイクロコントローラーと互換性があります。
Raspberry Pi / サーボへの電力供給
このドライブは2つの電源モジュールを統合しています。1つはMP1584電圧レギュレータモジュールの5V電源で、Raspberry Piに電力を供給するために使用され、RT9193-33電圧レギュレータモジュールによって得られる3.3V電源は、I2CロジックレベルとPWM信号ロジックレベルを決定するPWMチップに電力を供給するために使用されます。Piが接続されている場合、Raspberry Piへの電力はHATのオンボード電源スイッチによって制御されます。PiのPWR LEDを確認してください(Pi 2、3、4では赤いLEDです。Pi ZeroにはPWR LEDがありません。点滅するアクティビティLEDを探してください)。
もう1つのMP2482ENモジュールは、ステアリングギアとオンボードの5Vピンヘッダーに電力を供給し、オンボード電源インターフェースに接続された電源は、両方のモジュールに同時に電力を供給します。

2P XH2.54電源ソケットに接続

ネジ端子に接続
この電源は、ジャンクションボックスまたは2P XH2.54 DCインターフェースを介して接続できます。この電源は6〜18VDCである必要があります。電源を逆に接続した場合の逆極性保護がありますが、2P XH2.54 DCソケットまたは端子台のいずれかを使用する必要があり、両方を使用しないでください!(単一の20mA標準消費電流のLEDを点灯させるだけの場合は、Raspberry Pi USBを電源として使用できますが、ここではサーボを使用することを想定しています。)

USBアダプターから給電
注: Raspberry PiのUSB電源ポートのみを接続した場合、Raspberry PiとPCA99685、および3.3Vピンヘッダーは正常に動作しますが、HAT上のサーボ電源と5Vピンは動作しません。Raspberry PiのUSBポートとHAT電源ポートを同時に電源として使用しないでください!
消費電流要件
ほとんどすべてのサーボは、約5Vまたは6Vで動作するように設計されています。多くのサーボが同時に動作する場合(特に大型で強力なサーボ)、多くの電流が必要になることに注意してください。非常に小さなサーボでも、動作中は数百ミリアンペアを消費します。一部の高トルクサーボは、負荷がかかると1A以上を消費する可能性があります。
ここでは、2つの18650バッテリーを使用して電力を供給します。もちろん、6Vを超える他のバッテリーの組み合わせを選択したり、端子を介して電力を供給するために6〜18V DC電源アダプターを直接使用したりすることもできます。
安全上の注意
- リチウムイオン電池およびリチウムポリマー電池は非常に不安定です。適切に充電または使用されない場合、火災、人身傷害、または物的損害を引き起こす可能性があります。
- バッテリーを充電または放電するときは、極性を逆に接続しないでください。劣悪な充電器/充電パネルを使用してバッテリーを充電しないでください。
- 古いバッテリーと新しいバッテリーを混ぜて使用したり、異なるブランドのバッテリーを使用したりしないでください。
- リチウム電池を購入する際は、常に電池の仕様が拡張ボードと互換性があることを確認する必要があります。正式なメーカーの電池を選択し、エージングテストによって電池が安定して安全に動作することを確認してください。
- リチウム電池にはサイクル寿命の制限があり、時間の経過とともに劣化します。電池が最大サイクル寿命に達した場合、または2年以上動作した場合は、いずれか早い方で新しいものと交換する必要があります。
- 注意深く適切に配置し、可燃物や爆発物から離し、子供から遠ざけ、不注意な保管による安全事故を避けてください。
サーボの接続
ほとんどのサーボには、サーボHATヘッダーのヘッダーに直接接続できる標準の3ピンメスコネクタが付属しています。プラグをグランド線(通常は黒または茶色)を下段に、信号線(通常は黄色または白)を上段に合わせてください。
5Vで給電でき、3.3Vロジックレベル信号を受け入れることができるすべてのサーボで動作します。
サーボの追加
1つのボードに最大16個のサーボを接続できます。16個を超えるサーボを制御する必要がある場合は、次のページで説明するように、追加のボードをスタックできます。

LEDを使用したPWM HATのインストールとテスト
ステップ 1 – HATの接続
まず、Piの電源を切り、電源が入っていない状態で、HATを上部に接続して2×20ヘッダーに合わせ、Piの電源を入れます。

このボードを使用する前に、sudo raspi-config コマンドを使用してI2Cを有効にしてください
次のコマンドでI2Cアドレスを確認してください。
sudo i2cdetect -y 1
これにより、/dev/i2c-1のすべてのアドレスが検索され、Adafruit PWM/サーボHATが正しく接続され、デフォルトアドレスに設定されている場合(つまり、ボード上部の6つのアドレスハンダジャンパーのいずれもハンダ付けされていない場合)、次のように0x40(バイナリ1000000)に表示されるはずです。
これら両方のパッケージがインストールされ、i2cdetectが0x40のI2Cアドレスを見つけると、PythonでI2CおよびSMBusデバイスにアクセスするために必要なすべてが揃います。
OSOYOO PWM HATでPWMまたはサーボを制御するのは簡単です。次の2つのコマンドでサーボライブラリをインストールします。
sudo pip install --break-system-packages adafruit-circuitpython-pca9685
sudo pip install --break-system-packages adafruit-circuitpython-servokit
Python配線
まず、前のページで示されているとおりにHATを組み立てます。HATをPiに接続するための配線は必要ありません。以下の例は、Piに取り付けられたHATを示しています。
LEDを暗くするには、次のようにボードに配線します。注:HATが電流を約10mAに制限するため、LEDを流れる電流を制限するための抵抗を使用する必要はありません。
- LEDカソード/短い方の足をHATチャンネルGND/グランドに接続します。
- LEDアノード/長い方の足をHATチャンネルPWMに接続します。
LEDをPWM制御するために外部電源は必要ありません。
サーボを制御するには、前のページで示されているようにボードに配線し、HATに適切な外部電源を接続するために電源端子にバレルジャックを含めます。HATは外部電源なしではサーボに電力を供給しません!
LEDの調光
LEDをPCA9685ポート15に接続します
サンプルコード:
import time
from gpiozero import OutputDevice
from board import SCL, SDA
import busio
from adafruit_pca9685 import PCA9685
# Create the I2C bus interface.
i2c_bus = busio.I2C(SCL, SDA)
pwm = PCA9685(i2c_bus)
pwm.frequency = 50
LED =15 #LED connects to PCA9685 port 15
# Increase brightness:
for i in range(0xffff):
pwm.channels[LED].duty_cycle = i
# Decrease brightness:
for i in range(0xffff, 0, -1):
pwm.channels[LED].duty_cycle = i
LEDの調光の場合、通常、高速PWM信号周波数を使用する必要はなく、frequency属性を設定することでボードのPWM周波数を60hzに設定できます。
HATは、周波数を共有しながら独立したデューティサイクルを持つことができる16の個別のチャンネルをサポートしています。これにより、16個のLEDを個別に調光できます!
16ビットは多くの数値であるため、これらのforループには時間がかかります。ループの実行を停止し、REPLに戻るには、CTRL-Cを押します。
PWM HATを使用したCircuitPythonでのLEDの調光はこれで完了です!
サーボの制御
SG90サーボをpwm 0ポートに接続します。
サンプルコード testservo.py:
import time
import RPi.GPIO as GPIO
# Import the PCA9685 module.
from board import SCL, SDA
import busio
# Import the PCA9685 module.
from adafruit_pca9685 import PCA9685
from adafruit_servokit import ServoKit
kit = ServoKit(channels=16)
servo_lft = 135 #ultrasonic sensor facing 45 degree left
servo_ctr = 90 #ultrasonic sensor facing front
servo_rgt = 45 #ultrasonic sensor facing 135 degree right
kit.servo[0].angle = servo_lft
time.sleep(1)
print("facing right")
kit.servo[0].angle = servo_rgt
time.sleep(1)
print("facing center")
kit.servo[0].angle = servo_ctr
time.sleep(3)
これで、標準サーボと連続回転サーボの両方を制御する準備ができました。
実行
python testservo.py
サーボは左から右に回転し、中央で停止します
PWM HAT、Python、およびServoKitを使用した連続回転サーボの制御はこれで完了です!
完全なサンプルコード
"""Simple test for a standard servo on channel 0 and a continuous rotation servo on channel 1."""
import time
from adafruit_servokit import ServoKit
kit = ServoKit(channels=8)
kit.servo[0].angle = 180
kit.continuous_servo[1].throttle = 1
time.sleep(1)
kit.continuous_servo[1].throttle = -1
time.sleep(1)
kit.servo[0].angle = 0
kit.continuous_servo[1].throttle = 0
ライブラリリファレンスについては、以下のリンクをクリックしてください
データシート
FAQ
Arduinoでも使用できますか?
もちろんです!Arduinoを含む複数のマイクロコントロールボードでOSOYOO PWM HATを使用できます。唯一の条件は、メインコントロールチップがI2C通信をサポートしていることです。これにより、チップとPCA9685サーボドライバー間の通信が可能になり、複数のサーボを同時に制御できます。
I2Cアドレスをスキャンすると、なぜ2つのI2Cデバイスアドレスが表示されるのですか?
使用されている制御チップはPCA9685に対応しています。電源がオンになると、2つのI2Cアドレスが表示されます。1つはオンボード抵抗に従って構成されたアドレスで、デフォルトは0X40です。もう1つはALLCALLADRレジスタによって構成された0X70です。デモを再度実行して、レジスタの値を確認できます。
同じPWM HATを2枚スタックできますか?
スタックできますが、I2Cアドレスの抵抗を変更する必要があります。左側のI2Cアドレスで、デフォルトの上部抵抗をハンダごてで下部にハンダ付けします。異なる組み合わせにより異なるI2Cアドレスの組み合わせが生成され、合計で2の5乗の62の組み合わせがあります。
このHATはLEDにも使用できますか、それともサーボ専用ですか?
LEDやその他のPWM対応デバイスにも使用できます!LEDに3.3Vと220オームの直列抵抗で電力を供給しても問題ない場合は、信号ピンとGNDピンを使用してください。LEDに最大5Vの電力を供給したい場合は、V+と独自の抵抗とLEDを使用してください。
LEDで使用している場合、PWMを完全にオフにできないのはなぜですか?
LEDを完全にオフにしたい場合は、setPWM(pin, 4096, 0)を使用してください。setPWM(pin, 4095, 0)ではありません。
利用可能なデバイスがありません
接続を再確認してください。Raspberry Piでは、OSError: [Errno 121] Remote I/O error の読み出しで示される場合があります。
Raspberry Piでは、I2Cハードウェアが有効になっていることも確認してください。これは通常、Error: Failed to connect to I2C bus 1. の読み出しで示されます。
I2C接続の確認
Raspberry PiがI2Cを介してPWM HATと通信できるかどうかを確認する簡単な方法は、I2Cバスをpingすることです。Raspbian Stretchの最新リリースでは、i2ctoolsパッケージがプリインストールされているはずです。インストールされていない場合は、ターミナルで次のコマンドを実行してください。
sudo apt-get install i2ctools
i2ctoolsパッケージがインストールされたら、ターミナルで次のコマンドを使用してI2Cバスをpingできます。
i2cdetect -y 1
ターミナルにテーブルが出力されるはずです。PWM HATが正しく接続/動作している場合は、0x40のアドレス空間が40とマークされているのが表示されるはずです。
電流引き込みの問題
Raspberry Piはデフォルトでモジュールに5Vを供給するため、制御サーボの電力が大きすぎる場合(MG996R、DS3120MGなど)、Raspberry Piの5Vが引き下げられます。サーボが電源が処理できる以上の電流を引き込んでいる場合、PiサーボpHATは正しく動作せず、Raspberry Piが断続的に再起動/ブラウンアウトする可能性があります。
回転角度を正確に制御できますか?
いいえ、これはエントリーレベルです。
なぜ揺れるのですか?
わずかに揺れるのは正常です。サーボの実際の角度が最小物理角度よりも小さいため、その角度を維持するための電流が発生し、それが揺れを引き起こします。