fum125’s diary

IT全般に関する技術メモなど

ステッピングモーター 28BYJ-48 を DRV8835 で回してみる (5)

pigpio を使ってみた。

今回、GPIO の制御に pigpio を使ってみます。

下準備

さて、まずは pigpio ライブラリをダウンロード&インストールしておきます。

$ sudo apt install pigpio

次に、pigpiod デーモンを動かしておきます。

$ sudo pigpiod

以上で下準備はOKです。

初期化処理

  • pigpio を使うように初期設定しておきます。
  • ラズパイ 17番ピンを MODE 設定用として使います。また、27、22、23、24番ピンをモータ制御用に使うように宣言しておきます。
  • MODE = 0 を設定します。
import pigpio 
from time import sleep

pi = pigpio.pi()

# 使用するピン番号に名前を付けておきました。
MODE = 17        # IN/IN(0) まはた Phase/Enable(1) モードの切り替え用
AIN1 = 27        # GPIO27 - A IN 1 の制御用
AIN2 = 22        # GPIO22 - A IN 2 の制御用
BIN1 = 23        # GPIO23 - B IN 1 の制御用
BIN2 = 24        # GPIO24 - B IN 2 の制御用

# 各GPIOピンを、出力用として使用することを指定しておきます。
pi.set_mode(MODE, pigpio.OUTPUT)
pi.set_mode(AIN1, pigpio.OUTPUT)
pi.set_mode(AIN2, pigpio.OUTPUT)
pi.set_mode(BIN1, pigpio.OUTPUT)
pi.set_mode(BIN2, pigpio.OUTPUT)

# MODE = 0 で使用します。
pi.write(MODE, 0)

1相励磁でモータを回してみる

最初は1相励磁で回してみました。
A → B → /A → /B の順番に 1 を送ってみます。

sleep 間隔は、脱調しないか様子を見ながら、適当に調整です。

このモータは出力軸1周が2048ステップだから、for ループを 2048÷4=512 回せば、出力軸1周するはずです。

# インターバルを 5ミリ秒とする。
intval = 0.005

for i in range(1, 512):      # 以下の4ステップを 512回 (= 2048÷4) まわす。
    # A を 5ms ON にする。
    pi.write(AIN1,1)
    sleep(intval)
    pi.write(AIN1,0)

    # B を 5ms ON にする。
    pi.write(BIN1,1)
    sleep(intval)
    pi.write(BIN1,0)

    # /A を 5ms ON にする。
    pi.write(AIN2,1)
    sleep(intval)
    pi.write(AIN2,0)

    # /B を 5ms ON にする。
    pi.write(BIN2,1)
    sleep(intval)
    pi.write(BIN2,0)

想定通り、1周回りました。
計算上は 0.005秒×2048 = 10.24秒かかるはずですが、実測では約14.3秒かかりました。

2相励磁でモータを回してみる

今度は2相励磁で制御してみます。

各出力を2個ペアにして、「A+B → B+/A → /A+/B → /B+A」の順番に1を送ってみます。
出力軸1周のステップ数は一相励磁と同じはずなので、for ループを 2048÷4=512回まわしてみます。

# インターバルを 5ミリ秒とする。
intval = 0.005

# 都合上、最初に A だけ ON にしておく。
pi.write(AIN1,1)

for i in range(1, 512):
    
    # A と B だけ ON にする。 既にA はON済なので、B を ON にする。
    pi.write(BIN2,0)
    pi.write(BIN1,1)
    sleep(intval)
    
    # B と /A だけ ON にする。既にB はON済なので、/A を ON にする。
    pi.write(AIN1,0)
    pi.write(AIN2,1)
    sleep(intval)
    
    # /A と /B だけ ON にする。既に/A はON済なので、/B を ON にする。
    pi.write(BIN1,0)
    pi.write(BIN2,1)
    sleep(intval)
    
    # /B と A だけ ON にする。既に/B はON済なので、A を ON にする。
    pi.write(AIN2,0)
    pi.write(AIN1,1)
    sleep(intval)

二相励磁も、期待通りに回りました。
こちらも、1周回るのに 約14.2秒かかっています。

1-2相励磁でモータを回してみる

最後に、1-2相励磁で制御してみます。
2相励磁のパターンに、1相の処理を入れていきます。

まぁ、先の2相励磁も、瞬間的には1-2相励磁になってはいるのですが。

# インターバルを 5ミリ秒とする。
intval = 0.005

# 都合上、最初に /B だけ ON にしておく。
pi.write(BIN2, 1)

for i in range(1, 512):
    
    # A を ON にする。 -> これで /B と A が ON になる。
    pi.write(AIN1,1)
    sleep(intval)
    
    # /B を OFF にする。 -> これで、A だけが ON になる。
    pi.write(BIN2,0)
    sleep(intval)
    
    #  B を ON にする。 -> これで A と B が ON になる。
    pi.write(BIN1,1)
    sleep(intval)

    # A を OFF にする。 -> これで、B だけが ON になる。
    pi.write(AIN1,0)
    sleep(intval)
    
    # /A を ON にする。 -> これで、B と /A が ON になる。
    pi.write(AIN2,1)
    sleep(intval)
    
    # B を OFF にする。 -> これで、/A だけが ON になる。
    pi.write(BIN1,0)
    sleep(intval)
    
    # /B を ON にする。 -> これで、/A と /B が ON になる。
    pi.write(BIN2,1)
    sleep(intval)
    
    # /A を OFF にする。 -> これで、/B だけが ON になる。
    pi.write(AIN2,0)
    sleep(intval)

1-2相励磁も、期待通りに回りました。
こちらは、1周回るのに 約25.3 秒かかっています。

とりあえず、ここまでで無事にモータを回すことができました!