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 |
※2 xx は 使用されるボードのメモリサイズを選択する
動作
TB6612FNG(md08a)の配線
YD-RP2040 | 配線色 | ULN2003 | 配線色 | 28BYJ-48 | 配線色 | 5V電源 |
---|---|---|---|---|---|---|
GP0 | 緑 | IN1 | ||||
GP1 | 紫 | IN2 | ||||
GP2 | 茶 | IN3 | ||||
GP3 | 黄 | IN4 | ||||
XHコネクタ | 5線 | 直接 | ||||
+plus | 赤 | 赤 | +plus | |||
-minus | 黒 | 黒 | -minus |
スケッチ 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ですので、台形加速するまでもなく垂直起動できます。
コメント