RaspberryPi Picoでステッピングモータを使ってみる

コンピュータ、組み込み

Raspberry Pi Pico を使ってステッピングモータを制御します。
安価で単純制御ができる ULN2003ドライバ と28BJY-48ステッピングモータを紹介します。

紹介するもの

駆動テストモジュール ULN2003

特徴

マイコンからの信号を、モータ電源電圧に変換してモータに出力します。
ステッピングモータ 28BYJ-48とセット売りされていることが多いので一緒に説明します。

外観

ステッピングモータ 28BYJ-48

特徴

安価で入手性がよい。
4相式5V駆動。
回転速度は遅いが、位置決め精度や再現性が高い。

製品情報

定格電圧5V
ステップ角5.625 x 1/64

外観

使ってみて

回転軸が中心に無いので若干モヤモヤします。

今回ステッピングモータ用のライブラリを使用しないで、単純なGPIOの信号を入力しました。
それでも強力なトルクと精度のある位置決めができます。

高価なドライバでは高速回転で高い分解能の制御ができるようですが、ステッピングモータの基本制御を学ぶには十分なドライバだと思います。

電子工作では高速回転のDCモータや、簡単角度制御のサーボモータもあります。
高トルクで位置決め精度の高いステッピングモータですが、モータ制御の中では若干敷居は高めだと感じました。

準備

使うもの

名称(型番)用途
Motor Driver
ULN2003
モータを回してもらいます。
Stepping Motor
28BYJ-48
回ってもらいます。
制御マイコン基板
YD-RP2040
回転数や方向を指示するマイコン基板。
ブレッドボードマイコン基板、電源を配置する。
5V取り出しモジュールモータの電源にUSBの5Vを使用します。

ライブラリ

Arduino IDEのボードマネージャからYD-RP2040用のライブラリのインストールとボードの選択をします。

検索RP2040
ボードライブラリRaspberry Pi RP2040 Boards(x.x.x)※1
選択するボードRaspberry Pi RP2040 Boards(x.x.x) > Generic RP2040
変更する設定Tools > Flash Size > xxMB(no FS)※2
※1 x.x.x oct/2022 バージョン2.5.2を使用して動作確認をしています
※2 xx は 使用されるボードのメモリサイズを選択する

動作

TB6612FNG(md08a)の配線

YD-RP2040配線色ULN2003配線色28BYJ-48配線色5V電源
GP0IN1
GP1IN2
GP2IN3
GP3IN4
XHコネクタ5線直接
+plus+plus
-minus-minus
5V電源には、USBから5V取り出しモジュールを使用しています。

スケッチ 28BYJ-48 + ULN2003(Pattern1)

2相励磁で回転させます。
5.256deg * (1/64) = 4096 ですが、2048Stepで一周(360degree)します。


/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license

About Licence
当サイトで掲載しているスケッチのライセンスについて OSSの利用について 当サイトで掲載しているスケッチおよびプログラム(以下プログラム)は、Open Source Software(以下OSS)を利用しています。誰でも当サイトに掲載されて...
【スケッチの説明】 GPIO 0, 1, 2, 3 出力可能基板で使用できます。 参考として Raspberry Pi Pico, YD-RP2040 SteppingMotor を回転させます。 1回転(360deg)ごとに一旦停止を繰り返します。 Steppinモータは 28BYJ-48 モータドライバは ULN2003 を使用します。 GPIO出力を4状態を1サイクルにして2048Step で1回転します。 ステップ角 5.625deg * (1/64) : ステップの2相零時により2048 Step で1回転します。 【ライブラリ】 適宜 参考として Raspberry Pi RP2040 Boards(2.3.2) > Generic RP2040 【準備】 Raspberry Pi Pico -> ULN2003 GP0 -> IN1 GP1 -> IN2 GP2 -> IN3 GP3 -> IN4 ULN2003 <- 5V電源 + -> + - -> - 【バージョン情報】 2022/10/21 : 新規 **********************************************************************/ #define P0 0 #define P1 1 #define P2 2 #define P3 3 #define WAIT 2 //Stepごとのウエイト。小さいと早く回転する。大きいと遅く回転する。 //電源電圧が低かったり、ウエイトが小さすぎると脱調(空転)します。 void setup() { pinMode(P0,OUTPUT); //4相分出力設定 pinMode(P1,OUTPUT); pinMode(P2,OUTPUT); pinMode(P3,OUTPUT); } void loop() { int i; //2048 Step で360degree for(i = 0; i < 2048; i ++) { //i を割った余りを評価。つまり(0, 1, 2, 3 のいずれか) switch(i % 4) { case 0: digitalWrite(P0, HIGH); digitalWrite(P1, LOW); digitalWrite(P2, LOW); digitalWrite(P3, LOW); break; case 1: digitalWrite(P0, LOW); digitalWrite(P1, HIGH); digitalWrite(P2, LOW); digitalWrite(P3, LOW); break; case 2: digitalWrite(P0, LOW); digitalWrite(P1, LOW); digitalWrite(P2, HIGH); digitalWrite(P3, LOW); break; case 3: digitalWrite(P0, LOW); digitalWrite(P1, LOW); digitalWrite(P2, LOW); digitalWrite(P3, HIGH); break; } delay(WAIT); //Step ウエイト } //1週ごとのウエイト delay(1000); }

スケッチ 28BYJ-48 + ULN2003(Pattern2)

フルステップで回転させます。
5.256deg * (1/64) = 4096で一周(360degree)します。
2相励磁の倍の分解能ですが、回転速度は半分になります。

/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license

About Licence
当サイトで掲載しているスケッチのライセンスについて OSSの利用について 当サイトで掲載しているスケッチおよびプログラム(以下プログラム)は、Open Source Software(以下OSS)を利用しています。誰でも当サイトに掲載されて...
【スケッチの説明】 GPIO 0, 1, 2, 3 出力可能基板で使用できます。 参考として Raspberry Pi Pico, YD-RP2040 SteppingMotor を回転させます。 1回転(360deg)ごとに一旦停止を繰り返します。 Steppinモータは 28BYJ-48 モータドライバは ULN2003 を使用します。 GPIO出力を8状態を1サイクルにして4096Step で1回転します。 ステップ角 5.625deg * (1/64) = 4096 【ライブラリ】 適宜 参考として Raspberry Pi RP2040 Boards(2.3.2) > Generic RP2040 【準備】 Raspberry Pi Pico -> ULN2003 GP0 -> IN1 GP1 -> IN2 GP2 -> IN3 GP3 -> IN4 ULN2003 <- 5V電源 + -> + - -> - 【バージョン情報】 2022/10/21 : 新規 **********************************************************************/ #define P0 0 #define P1 1 #define P2 2 #define P3 3 #define WAIT 2 //Stepごとのウエイト。小さいと早く回転する。大きいと遅く回転する。 //電源電圧が低かったり、ウエイトが小さすぎると脱調(空転)します。 void setup() { pinMode(P0,OUTPUT); //4相分出力設定 pinMode(P1,OUTPUT); pinMode(P2,OUTPUT); pinMode(P3,OUTPUT); } void loop() { int i; //4096 Step で360degree for(i = 0; i < 4096; i ++) { //i を割った余りを評価。つまり(0, 1, 2, 3, 4, 5, 6, 7のいずれか) switch(i % 8) { case 0: digitalWrite(P0, HIGH); digitalWrite(P1, LOW); digitalWrite(P2, LOW); digitalWrite(P3, LOW); break; case 1: digitalWrite(P0, HIGH); digitalWrite(P1, HIGH); digitalWrite(P2, LOW); digitalWrite(P3, LOW); break; case 2: digitalWrite(P0, LOW); digitalWrite(P1, HIGH); digitalWrite(P2, LOW); digitalWrite(P3, LOW); break; case 3: digitalWrite(P0, LOW); digitalWrite(P1, HIGH); digitalWrite(P2, HIGH); digitalWrite(P3, LOW); break; case 4: digitalWrite(P0, LOW); digitalWrite(P1, LOW); digitalWrite(P2, HIGH); digitalWrite(P3, LOW); break; case 5: digitalWrite(P0, LOW); digitalWrite(P1, LOW); digitalWrite(P2, HIGH); digitalWrite(P3, HIGH); break; case 6: digitalWrite(P0, LOW); digitalWrite(P1, LOW); digitalWrite(P2, LOW); digitalWrite(P3, HIGH); break; case 7: digitalWrite(P0, HIGH); digitalWrite(P1, LOW); digitalWrite(P2, LOW); digitalWrite(P3, HIGH); break; } delay(WAIT); //Step ウエイト } //1週ごとのウエイト delay(1000); }

結果

結果は2相励磁です。
Stepウエイトは2msで動かしていますが、これ以上速く(ウエイトを小さく)すると脱調(空転)してしまいます。

モータパルス周波数では500Hzですので、台形加速するまでもなく垂直起動できます。

コメント

タイトルとURLをコピーしました