はじめに

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は側面に**突き出すようには**設計されていません。

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電源アダプターを直接使用したりすることもできます。

安全上の注意

サーボの接続

ほとんどのサーボには、サーボ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)に表示されるはずです。

raspberry_pi_i2cdetect.png

これら両方のパッケージがインストールされ、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に設定できます。

pwm.frequency = 50

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を使用した連続回転サーボの制御はこれで完了です!

完全なサンプルコード

# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT

"""Simple test for a standard servo on channel 0 and a continuous rotation servo on channel 1."""
import time
from adafruit_servokit import ServoKit

# Set channels to the number of servo channels on your kit.
# 8 for FeatherWing, 16 for Shield/HAT/Bonnet.
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

ライブラリリファレンスについては、以下のリンクをクリックしてください

リソース

関連プロジェクト

OSOYOO PWM HAT v2.0

OSOYOO PWM HATの紹介

OSOYOO PWM HATの使用開始

ドキュメント

OSOYOO PWM HATの回路図

寸法

データシート

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が断続的に再起動/ブラウンアウトする可能性があります。

回転角度を正確に制御できますか?

いいえ、これはエントリーレベルです。

なぜ揺れるのですか?

わずかに揺れるのは正常です。サーボの実際の角度が最小物理角度よりも小さいため、その角度を維持するための電流が発生し、それが揺れを引き起こします。