Raspberry Pi Pico WとPWMでサーボを制御する

サーボは、Raspberry Piでパルス幅変調(PWM)を使うことを学ぶ最も基本的な方法の1つです。この記事では、Raspberry Pi Pico Wでこれを行う方法を紹介します。

PWMチュートリアルの目的

ピコWとPWMによるサーボ
  • PWMでサーボの角度を制御する方法をご紹介します
  • Pico Wでサーバーを立ち上げる
  • サーバーからサーボを制御するスライダー付きのウェブページを配信

必要な部品

  • Raspberry Pi Pico W ヘッダー付き
  • ジャンパー線
  • サーボ(今回はタワープロ製マイクロサーボSG90を使用しています。)

パルス幅変調とは?

子どもたちは、電気を何度もつけたり消したりすることを面白がっています。

子供にとっては、スイッチを入れると電気がついたり消えたりするのがとても面白いのです。親は面白くないかもしれませんが、これは私たち全員にとって勉強になる瞬間なのです。

もし、あなたやあなたのお子さんがそうした経験があるなら、それは原始的なパルス幅変調を体験したことになります。

Raspberry Piを使えば、これを簡単に自動化することができます。要するに、ある期間に何回「ON」にしてほしいかをRaspberry Piに指示するのです。

これにより、LEDを調光することができます。

ピコックピットGPIO PWMリモートコントロール
PiCockpitのPWM機能でLEDの輝度をトグルする

また、サーボのアームの角度を制御することができます。

PWMの重要な概念:デューティサイクル

デューティ・サイクルとは、基本的に回路が "High "の状態を保つ時間、つまり回路がオンになっている時間のことです。

そこで、回路が半分の時間だけオンになっているとします。したがって、デューティサイクルは50%であると言うことができる。

常にオンにしていると、そのデューティサイクルは100%になり、逆に、常にオフにしていると、0

デューティサイクル図 スパークファン (CC BY-SA 4.0)

子供が一定の速度で電気をつけたり消したりする例に戻ると、照明が完全に点灯したり消えたりしないのは、特定の時間だけ電圧を出力しているからなのです。

LEDの場合、LEDが一定時間点灯した後、電源が引き込まれ、再び電源が供給される、この繰り返しを意味します。

そのため、LEDが完全に明るくなることはなく、また、完全に暗くなる時間もありません。

PWMによるSG90サーボ制御

すべてのサーボが同じように動作するわけではないので、ここでは慎重にならざるを得ない。このチュートリアルは、タワープロSG90マイクロサーボに特化したものです。

SG90は180度回転ですが、サーボによっては120度回転のサーボもあります。ラジコンホビーのサーボは120度サーボの可能性が高いので、範囲外の信号を与えるとサーボを破損する可能性があるので、操作したいサーボのデータシートを確認してください。

ルクアパーツの「SG90」のデータシートです。

ルクサーパーツの「SG90」のデータシートです。 おそらく最も詳細なデータシートです。PDFはこちら

データシートには、どの色がプラス、アース、シグナルに対応するかと、パルス周波数/デューティサイクルの2つの重要なことが書かれています。

  • ブラウン=ネガティブ
  • 赤=ポジティブ
  • オレンジ色=信号

また、パルス周波数/デューティサイクルについては

  • 20msまたは50Hzのデューティサイクルが必要です。
  • 1msの信号=0度
  • 2msの信号=180度回転した信号
1ms, の信号で、サーボを 0 度回転させます。

つまり、msごとにサーボは更新を探すことになる。2ms の信号を送り続ければ、全回転(180 度)のままです。1.5msにすると90度回転し、1msにすると0度回転になります。

2ms の信号で、サーボを 180 度回転させる。

サーボとPico Wを接続する

私たちのコードを使用するために、あなたは、次のように接続する必要があります。 GPIO 0への信号線.信号線は、SG90のオレンジ色の線です。

そして、赤い線を ビービーエス (これで5Vになります)。データシートからわかるように、SG50の動作電圧は4.8V〜6Vなので、Pico Wの3.3V端子では使えません。

Pico Wのサーボ制御のコード化

することができます。 コードはこちら をGitHubでご覧ください。

コードを見てみましょう。

main.pyという、起動時に実行させたいファイルの命名規則に従って、サーボのクラスを作成し、インスタンス化します。


class Servo:
    def __init__(self, MIN_DUTY=300000, MAX_DUTY=2300000, pin=0, freq=50):
        self.pwm = machine.PWM(machine.Pin(pin))
        self.pwm.freq(freq)
        self.MIN_DUTY = MIN_DUTY
        self.MAX_DUTY = MAX_DUTY
        
    def rotateDeg(self, deg):
        if deg < 0:
            deg = 0
        elif deg > 180:
            deg = 180
        duty_ns = int(self.MAX_DUTY - deg * (self.MAX_DUTY-self.MIN_DUTY)/180)
        self.pwm.duty_ns(duty_ns)

servo = Servo()

サーボクラスは、MicroPythonで利用可能なmachine.PWMクラスを使用しています。 ドキュメントはこちらをご覧ください。

この例では、Pico Wをアクセスポイントとして使用しています。それを実現するためのコードを以下に示します。

ssid = 'Servo-Control'
password = 'PicoW-Servo'

ap = network.WLAN(network.AP_IF)
ap.config(essid=ssid, password=password)
ap.active(True)

while ap.active() == False:
  pass

print('Connection successful')
print(ap.ifconfig())

最初の2行からわかるように、探しているSSIDは サーボ制御 で、パスワードは PicoW-Servo.

WiFiネットワークにサインオンしたら、Pico WのIPアドレスにアクセスします。デフォルトでは192.168.4.1になっています。または、ThonnyのログでPicoのIPアドレスを確認することもできます。

Webページとサーボはどのように通信しているのですか?

サーボスライダー制御

Pico W の IP アドレスにログオンすると、Github リポジトリにある index.html ファイルが送信されます。

index.htmlファイルには、以下の重要な行があります。

 <form id="form">
            <input type="range" class="slider" min="0" max="180" value="slider_value" name="servo" id="servo">
            <output></output>
        </form>

ご覧のように、スライダーであるオブジェクトがあります。

回転の度合いを表示するもある。

JavaScriptの部分はを更新し、Pico Wがデータを取り込んでサーボを回転できるようにURLを更新する。

要素と要素はの親要素を持ちます。

フロントエンドのスクリプトはこんな感じです。