ステッピングモーター 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 秒かかっています。
とりあえず、ここまでで無事にモータを回すことができました!