Raspberry Pi Pico(PicoW)を使用したステッピングモーターの使い方を詳しく紹介します。
プログラミング言語は今回は「Python」を使用し「MicroPython」と「CircuitPython」のサンプルプログラム(コピペ)を準備していますので、「コピペ」で実行して動作確認してみましょう。
「ラズパイPico」の開発環境の準備や端子配列等の基本情報、基本的なプログラムについては、以下のリンクで詳しく紹介しています。
1.準備するもの
・Raspberry Pi Pico(PicoW)
・開発環境(Thonny)
・ステッピングモーター(28BYJ-48)
・駆動基板(トランジスタアレーULN2003AN搭載)
2.配線図
3.MicroPythoのサンプルプログラム(コピペ)
・1相励磁
・2相励磁
・1-2相励磁(二次元配列で励磁パターン指定)
・応用編、全励磁パターン動作確認(正逆、可変速)
4.CircuitPythonのサンプルプログラム(コピペ)
・1相励磁
・2相励磁
・1-2相励磁(二次元配列で励磁パターン指定)
・応用編、全励磁パターン動作確認(正逆、可変速)
5.動作確認
6.まとめ
1.準備するもの
・Raspberry Pi Pico(PicoW)
「Raspberry Pi Pico(PicoW)」とは、電源投入ですぐに使用できて初心者でも比較的簡単にプログラミングが体験できるマイコンボードです。
「Raspberry Pi Pico(PicoW)」の外観は下画像のようになります。
端子配列は以下のようになります。(公式サイトより抜粋)
・開発環境(Thonny)
プログラムを書き込むための開発環境として「Thonny」を使用します。
「Raspberry Pi Pico(PicoW)」の開発環境はいくつかありますが「Thonny」はプログラミング言語として「Python(MicroPython & CircuitPython)」が使用でき、手軽にプログラムの作成、実行ができます。
開発環境の準備については、以下のリンクで詳しく紹介しています。
・ステッピングモーター(28BYJ-48)
ステッピングモーターは5Vで駆動できるものとして最も入手性の良い「28BYJ-48」を使用します。
マイコンボードでのステッピングモータの動作紹介では、ほぼコレが使われてますね。
安くて駆動用の基板もセットで売られていることがほとんどなので、ステッピングモータの動作確認には最適です。
外観
外観は下写真のようになります。
仕様
主な仕様は以下の通りです。
項目 | 仕様 |
---|---|
相数 | 4相(2相ユニポーラ) |
制御方法 | 1-2相励磁(1相、2相励磁可) |
ギヤ比 | 1/64 |
電圧 | DC5V |
巻線抵抗 | 22Ω±7%/相 |
1パルス(ステップ) 駆動角度 | 1-2相励磁:モーター単体 5.625° ※出力軸 5.625°/64 ≒ 0.088° 1相、2相励磁:モーター単体 11.25° ※出力軸 11.25°/64 ≒ 0.176° |
モータ単体1回転 パルス(ステップ)数 | 1-2相励磁:64パルス 1相、2相励磁:32パルス |
出力軸1回転 パルス(ステップ)数 | 1-2相励磁:4096パルス 1相、2相励磁:2048パルス |
無負荷最大応答周波数 | 1000pps(1ms)※1-2相励磁 |
無負荷起動最大応答周波数 | 500pps(2ms)※1-2相励磁 |
起動トルク | 800gf.cm / 5VDC 400pps(2.5ms)※1-2相励磁 |
制御方法について
今回使用するステッピングモーター(28BYJ-48)の構造は「2相ユニポーラ型」と呼ばれ以下のようなモデル図で表されます。
モーターの中央には回転するローターがあり、これは磁石になっています。
ローターの周りには2相のコイルがあり、コイルの中央(センタータップ)からは配線が引き出されています。
中央の配線には「電源+(5V)」を接続し、A〜Dの各配線を「電源ー(0V)」にすることで、各コイルに流れる電流を制御することができます。
コイルに電流を流すと磁力が発生します。各コイルの電流を効率よくON/OFFすることで「回転磁界」を発生させ、ローター(磁石)を回転させることができます。
電流の流れ(ON/OFF)を切り替えて「回転磁界」を発生させる「制御方法」には「1相励磁」「2相励磁」「1-2相励磁」があり、コイルA〜Dの配線を「電源ー(0V)」にするタイミングを以下表のように制御することで、モーターを回転させています。
1相励磁
消費電力は小さいがトルクが低く高速回転には向かない、振動も発生しやすく実用的ではない。
2相励磁
1相励磁に比べて回転が安定して、大きなトルクが得られるが消費電力は2倍になる。
1-2相励磁
1パルスごとの回転角度が「1相、2相励磁」に比べて半分になり、細かい制御が可能で振動も少ないため、基本的にこの制御が使用される。
・駆動基板(トランジスタアレーULN2003AN搭載)
今回使用する「ステッピングモーター(28BYJ-48)」を動作させるためには、このモーターとほぼセット販売されている下写真のような基板を使用します。
モーターのドライバ基板というほどでもないですが、トランジスタアレー「ULN2003AN」が実装されていて、どのコイルが励磁されているかを確認できる「LED(赤)」もコイルごとに4つ実装されています。
モーター(28BYJ-48)の配線に付属のコネクタ(JST製XH)をそのまま挿して使用できます。
2.配線図
配線図は下図のようになります。
モーター用の電源「5V」は「ラズパイPico」とは別で取るようにしています。
実際にブレッドボードを使用して各部品を接続したものは下写真のようになります。
3.MicroPythoのサンプルプログラム(コピペ)
「MicroPython」を使用したサンプルプログラムは以下になります。
コピペで貼り付けて書き込んで実行してください。
※下コード(黒枠)内の右上角にある小さなアイコンのクリックでコピーできます。
・1相励磁
「MicroPython」を使用した「1相励磁」のプログラムは以下になります。
実行するとすぐにモーターは回転し続けます。
from machine import Pin # 入出力用モジュールを準備
import utime # タイマーモジュールを準備
# 出力ピン設定
outA = Pin(18, Pin.OUT) # コイル出力A
outB = Pin(19, Pin.OUT) # コイル出力B
outC = Pin(20, Pin.OUT) # コイル出力C
outD = Pin(21, Pin.OUT) # コイル出力D
interval_time = 10 # インターバル時間設定(ms)
# 1相励磁 動作(1ステップ動作角度 11.25°)
while(True): # ずっと実行
outA.value(1) # パルス出力実行A〜D
outB.value(0)
outC.value(0)
outD.value(0)
utime.sleep_ms(interval_time) # 出力インターバル時間(ms)
outA.value(0)
outB.value(1)
outC.value(0)
outD.value(0)
utime.sleep_ms(interval_time)
outA.value(0)
outB.value(0)
outC.value(1)
outD.value(0)
utime.sleep_ms(interval_time)
outA.value(0)
outB.value(0)
outC.value(0)
outD.value(1)
utime.sleep_ms(interval_time)
・2相励磁
「MicroPython」を使用した「2相励磁」のプログラムは以下になります。
実行するとすぐにモーターは回転し続けます。「1相励磁」よりトルクが大きくなります。
from machine import Pin # 入出力用モジュールを準備
import utime # タイマーモジュールを準備
# 出力ピン設定
outA = Pin(18, Pin.OUT) # コイル出力A
outB = Pin(19, Pin.OUT) # コイル出力B
outC = Pin(20, Pin.OUT) # コイル出力C
outD = Pin(21, Pin.OUT) # コイル出力D
interval_time = 10 # インターバル時間設定(ms)
# 1相励磁 動作(1ステップ動作角度 11.25°)
while(True): # ずっと実行
outA.value(1) # パルス出力実行A〜D
outB.value(1)
outC.value(0)
outD.value(0)
utime.sleep_ms(interval_time) # 出力インターバル時間(ms)
outA.value(0)
outB.value(1)
outC.value(1)
outD.value(0)
utime.sleep_ms(interval_time)
outA.value(0)
outB.value(0)
outC.value(1)
outD.value(1)
utime.sleep_ms(interval_time)
outA.value(1)
outB.value(0)
outC.value(0)
outD.value(1)
utime.sleep_ms(interval_time)
・1-2相励磁(二次元配列で励磁パターン指定)
「MicroPython」を使用した「1-2相励磁」のプログラムは以下になります。
実行するとすぐにモーターは回転し続けます。「1相、2相励磁」より滑らかに回転します。
励磁パターンが8パターンに増えたので「二次元配列」に格納して指定するようにしています。
from machine import Pin # 入出力用モジュールを準備
import utime # タイマーモジュールを準備
# 出力ピン設定
outA = Pin(18, Pin.OUT) # コイル出力A
outB = Pin(19, Pin.OUT) # コイル出力B
outC = Pin(20, Pin.OUT) # コイル出力C
outD = Pin(21, Pin.OUT) # コイル出力D
# 変数宣言
interval_time = 10 # インターバル時間設定(ms)
pattern_number = 0 # 励磁パターン番号
# 励磁パターン指定二次元配列
puls_pattern = [[1, 0, 0, 0], [1, 1, 0, 0], [0, 1, 0, 0], [0, 1, 1, 0],[0, 0, 1, 0], [0, 0, 1, 1], [0, 0, 0, 1], [1, 0, 0, 1]]
last_index = len(puls_pattern) - 1 # 励磁パターン配列の要素数を取得
# 1-2相励磁 動作(1ステップ動作角度 5.625°)
while(True):
# 励磁パターン切り替え処理
if pattern_number != last_index: # パターン番号が励磁パターン配列の要素数でなければ
pattern_number += 1 # パターン番号 +1
else: # パターン番号が励磁パターン配列の要素数なら
pattern_number = 0 # パターン番号0リセット
# 出力実行
outA.value(puls_pattern[pattern_number][0]) # パルス出力実行A〜D
outB.value(puls_pattern[pattern_number][1])
outC.value(puls_pattern[pattern_number][2])
outD.value(puls_pattern[pattern_number][3])
utime.sleep_ms(interval_time) # 出力インターバル時間(ms)
・応用編、全励磁パターン動作確認(正逆、可変速)
「MicroPython」を使用して「全励磁パターン」の動作確認ができるプログラムは以下になります。
「sw1(赤)」を押すと回転方向を切り替えることができます。(本体LEDのON/OFFも切り替わる)
「sw2(白)」を押すと「1相励磁」、「sw3(青)」を押すと「2相励磁」、「sw4(黄)」を押すと「1-2相励磁」で動作します。
「ボリューム」を回すことで回転速度を変えることができます。
from machine import Pin, ADC # 入出力とアナログ入出力用モジュールを準備
import utime # タイマーモジュールを準備
# 入力ピン設定(スイッチ1〜4の入力設定)
sw1 = Pin(0, Pin.IN, Pin.PULL_UP) # スイッチのピン番号を指定してswとして入力設定(プルアップ)
sw2 = Pin(4, Pin.IN, Pin.PULL_UP)
sw3 = Pin(11, Pin.IN, Pin.PULL_UP)
sw4 = Pin(15, Pin.IN, Pin.PULL_UP)
# アナログ入力ピン設定
adc_speed = ADC(Pin(28)) # モータ速度指示電圧用アナログ入力番号を設定
# 出力ピン設定
led = Pin("LED", Pin.OUT) # 本体LEDピンをledとして出力に設定
out1 = Pin(18, Pin.OUT) # コイル出力A
out2 = Pin(19, Pin.OUT) # コイル出力B
out3 = Pin(20, Pin.OUT) # コイル出力C
out4 = Pin(21, Pin.OUT) # コイル出力D
# 変数宣言
sw1_state = False # SW1の状態保持用
direction = True # 回転方向(True:正転、False:逆転)
pattern_number = 0 # 励磁パターン番号
# モーター制御パルス出力関数 **************************************
def outputPuls(direction, interval_time):
print(interval_time) # インターバル時間(ms)表示
global pattern_number # 励磁パターン番号指定用
last_index = len(puls_pattern) - 1 # 励磁パターン配列の要素数を取得
# 回転方向切り替え処理
if direction: # 回転方向が正転なら
if pattern_number != last_index: # パターン番号が励磁パターン配列の要素数でなければ
pattern_number += 1 # パターン番号 +1
else: # パターン番号が励磁パターン配列の要素数なら
pattern_number = 0 # パターン番号0リセット
else: # 回転方向が正転なら
if pattern_number != 0: # パターン番号が0でなければ
pattern_number -= 1 # パターン番号 -1
else: # パターン番号が0なら
pattern_number = last_index # パターン番号に最終要素番号をセット
# 出力実行
out1.value(puls_pattern[pattern_number][0]) # パルス出力実行1〜4
out2.value(puls_pattern[pattern_number][1])
out3.value(puls_pattern[pattern_number][2])
out4.value(puls_pattern[pattern_number][3])
utime.sleep_ms(interval_time) # 出力インターバル時間(ms)
# メイン処理 ---------------------------------------------------------
led.value(1) # 本体LEDを点灯
while(True):
adc_val = adc_speed.read_u16() # ボリュームのアナログ入力(ADC)値を取得
interval_time = int((adc_val * 1000) / 65536) # アナログ値をインターバル時間に換算(0〜1000)
# スイッチ1:モーター回転方向切り替え
if not sw1.value() and sw1_state == False: # スイッチ1が押されていて、スイッチ1の状態がFalseなら
sw1_state = True # スイッチ1の状態をTrueへ
direction = not direction # 回転方向切り替え
led.value(direction) # 回転方向性点なら本体LED点灯
print("Direction", direction)
if sw1.value(): # スイッチ1が押されてなければ
sw1_state = False # スイッチ1の状態をFalseへ
# スイッチ2:1相励磁 動作
if not sw2.value(): # スイッチ2が押されていれば
if pattern_number > 3:
pattern_number = int(pattern_number / 2)
puls_pattern = [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]] # 励磁パターン指定二次元配列
outputPuls(direction, interval_time) # モーター制御パルス出力関数(回転方向,インターバル時間)
# スイッチ3:2相励磁 動作
if not sw3.value(): # スイッチ3が押されていれば
if pattern_number > 3:
pattern_number = int(pattern_number / 2)
puls_pattern = [[1, 1, 0, 0], [0, 1, 1, 0], [0, 0, 1, 1], [1, 0, 0, 1]] # 励磁パターン指定二次元配列
outputPuls(direction, interval_time) # モーター制御パルス出力関数(回転方向,インターバル時間)
# スイッチ4:1-2相励磁 動作
if not sw4.value(): # スイッチ4が押されていれば
puls_pattern = [[1, 0, 0, 0], [1, 1, 0, 0], [0, 1, 0, 0], [0, 1, 1, 0],[0, 0, 1, 0], [0, 0, 1, 1], [0, 0, 0, 1], [1, 0, 0, 1]] # 励磁パターン指定二次元配列
outputPuls(direction, interval_time) # モーター制御パルス出力関数(回転方向,インターバル時間)
4.CircuitPythonのサンプルプログラム(コピペ)
「CircuitPython」を使用したサンプルプログラムは以下になります。
コピペで貼り付けて書き込んで実行してください。
※下コード(黒枠)内の右上角にある小さなアイコンのクリックでコピーできます。
・1相励磁
「CircuitPython」を使用した「1相励磁」のプログラムは以下になります。
実行するとすぐにモーターは回転し続けます。
import digitalio # 入出力ピン制御用モジュールを準備
from board import * # boardモジュールからすべてのピンの定義を準備
import time # 時間に関連する操作を行うためのモジュールを準備
# 出力ピン設定
outA = digitalio.DigitalInOut(GP18) # コイル出力A
outA.direction = digitalio.Direction.OUTPUT
outB = digitalio.DigitalInOut(GP19) # コイル出力B
outB.direction = digitalio.Direction.OUTPUT
outC = digitalio.DigitalInOut(GP20) # コイル出力C
outC.direction = digitalio.Direction.OUTPUT
outD = digitalio.DigitalInOut(GP21) # コイル出力D
outD.direction = digitalio.Direction.OUTPUT
interval_time = 0.01 # インターバル時間設定(sec)
# 1相励磁 動作(1ステップ動作角度 11.25°)
while(True): # ずっと実行
outA.value = True # パルス出力実行A〜D
outB.value = False
outC.value = False
outD.value = False
time.sleep(interval_time) # 出力インターバル時間(ms)
outA.value = False
outB.value = True
outC.value = False
outD.value = False
time.sleep(interval_time)
outA.value = False
outB.value = False
outC.value = True
outD.value = False
time.sleep(interval_time)
outA.value = False
outB.value = False
outC.value = False
outD.value = True
time.sleep(interval_time)
・2相励磁
「CircuitPython」を使用した「2相励磁」のプログラムは以下になります。
実行するとすぐにモーターは回転し続けます。「1相励磁」よりトルクが大きくなります。
import digitalio # 入出力ピン制御用モジュールを準備
from board import * # boardモジュールからすべてのピンの定義を準備
import time # 時間に関連する操作を行うためのモジュールを準備
# 出力ピン設定
outA = digitalio.DigitalInOut(GP18) # コイル出力A
outA.direction = digitalio.Direction.OUTPUT
outB = digitalio.DigitalInOut(GP19) # コイル出力B
outB.direction = digitalio.Direction.OUTPUT
outC = digitalio.DigitalInOut(GP20) # コイル出力C
outC.direction = digitalio.Direction.OUTPUT
outD = digitalio.DigitalInOut(GP21) # コイル出力D
outD.direction = digitalio.Direction.OUTPUT
interval_time = 0.01 # インターバル時間設定(sec)
# 2相励磁 動作(1ステップ動作角度 11.25°)
while(True): # ずっと実行
outA.value = True # パルス出力実行A〜D
outB.value = True
outC.value = False
outD.value = False
time.sleep(interval_time) # 出力インターバル時間(ms)
outA.value = False
outB.value = True
outC.value = True
outD.value = False
time.sleep(interval_time)
outA.value = False
outB.value = False
outC.value = True
outD.value = True
time.sleep(interval_time)
outA.value = True
outB.value = False
outC.value = False
outD.value = True
time.sleep(interval_time)
・1-2相励磁(二次元配列で励磁パターン指定)
「CircuitPython」を使用した「1-2相励磁」のプログラムは以下になります。
実行するとすぐにモーターは回転し続けます。「1相、2相励磁」より滑らかに回転します。
励磁パターンが8パターンに増えたので「二次元配列」に格納して指定するようにしています。
import digitalio # 入出力ピン制御用モジュールを準備
from board import * # boardモジュールからすべてのピンの定義を準備
import time # 時間に関連する操作を行うためのモジュールを準備
# 出力ピン設定
outA = digitalio.DigitalInOut(GP18) # コイル出力A
outA.direction = digitalio.Direction.OUTPUT
outB = digitalio.DigitalInOut(GP19) # コイル出力B
outB.direction = digitalio.Direction.OUTPUT
outC = digitalio.DigitalInOut(GP20) # コイル出力C
outC.direction = digitalio.Direction.OUTPUT
outD = digitalio.DigitalInOut(GP21) # コイル出力D
outD.direction = digitalio.Direction.OUTPUT
# 変数宣言
interval_time = 0.01 # インターバル時間設定(sec)
pattern_number = 0 # 励磁パターン番号
# 励磁パターン指定二次元配列
puls_pattern = [[1, 0, 0, 0], [1, 1, 0, 0], [0, 1, 0, 0], [0, 1, 1, 0],[0, 0, 1, 0], [0, 0, 1, 1], [0, 0, 0, 1], [1, 0, 0, 1]]
last_index = len(puls_pattern) - 1 # 励磁パターン配列の要素数を取得
# 1-2相励磁 動作(1ステップ動作角度 5.625°)
while(True):
# 励磁パターン切り替え処理
if pattern_number != last_index: # パターン番号が励磁パターン配列の要素数でなければ
pattern_number += 1 # パターン番号 +1
else: # パターン番号が励磁パターン配列の要素数なら
pattern_number = 0 # パターン番号0リセット
# 出力実行
outA.value = puls_pattern[pattern_number][0] # パルス出力実行A〜D
outB.value = puls_pattern[pattern_number][1]
outC.value = puls_pattern[pattern_number][2]
outD.value = puls_pattern[pattern_number][3]
time.sleep(interval_time) # 出力インターバル時間(ms)
・応用編、全励磁パターン動作確認(正逆、可変速)
「CircuitPython」を使用して「全励磁パターン」の動作確認ができるプログラムは以下になります。
「sw1(赤)」を押すと回転方向を切り替えることができます。(本体LEDのON/OFFも切り替わる)
「sw2(白)」を押すと「1相励磁」、「sw3(青)」を押すと「2相励磁」、「sw4(黄)」を押すと「1-2相励磁」で動作します。
「ボリューム」を回すことで回転速度を変えることができます。
import digitalio # 入出力ピン制御用モジュールを準備
import analogio # アナログ入出力制御用モジュールを準備
from board import * # boardモジュールからすべてのピンの定義を準備
import time # 時間に関連する操作を行うためのモジュールを準備
# 入力ピン設定(スイッチ1〜4の入力設定)
sw1 = digitalio.DigitalInOut(GP0) # スイッチのピン番号を指定してsw1〜4として設定
sw1.direction = digitalio.Direction.INPUT # sw1〜4を入力モードに設定
sw1.pull = digitalio.Pull.UP # 内部プルアップ抵抗を有効化
sw2 = digitalio.DigitalInOut(GP4)
sw2.direction = digitalio.Direction.INPUT
sw2.pull = digitalio.Pull.UP
sw3 = digitalio.DigitalInOut(GP11)
sw3.direction = digitalio.Direction.INPUT
sw3.pull = digitalio.Pull.UP
sw4 = digitalio.DigitalInOut(GP15)
sw4.direction = digitalio.Direction.INPUT
sw4.pull = digitalio.Pull.UP
# 出力ピン設定
led = digitalio.DigitalInOut(LED) # 本体LEDのピンをledに設定
led.direction = digitalio.Direction.OUTPUT # ledを出力モードに設定
outA = digitalio.DigitalInOut(GP18) # コイル出力A
outA.direction = digitalio.Direction.OUTPUT
outB = digitalio.DigitalInOut(GP19) # コイル出力B
outB.direction = digitalio.Direction.OUTPUT
outC = digitalio.DigitalInOut(GP20) # コイル出力C
outC.direction = digitalio.Direction.OUTPUT
outD = digitalio.DigitalInOut(GP21) # コイル出力D
outD.direction = digitalio.Direction.OUTPUT
# アナログ入力ピン設定
adc_speed = analogio.AnalogIn(A2) # モータ速度指示電圧用アナログ入力番号を設定
# 変数宣言
sw1_state = False # SW1の状態保持用
direction = True # 回転方向(True:正転、False:逆転)
pattern_number = 0 # 励磁パターン番号
# モーター制御パルス出力関数 **************************************
def outputPuls(direction, interval_time):
print(interval_time) # インターバル時間(ms)表示
global pattern_number # 励磁パターン番号指定用
last_index = len(puls_pattern) - 1 # 励磁パターン配列の要素数を取得
# 回転方向切り替え処理
if direction: # 回転方向が正転なら
if pattern_number != last_index: # パターン番号が励磁パターン配列の要素数でなければ
pattern_number += 1 # パターン番号 +1
else: # パターン番号が励磁パターン配列の要素数なら
pattern_number = 0 # パターン番号0リセット
else: # 回転方向が正転なら
if pattern_number != 0: # パターン番号が0でなければ
pattern_number -= 1 # パターン番号 -1
else: # パターン番号が0なら
pattern_number = last_index # パターン番号に最終要素番号をセット
# 出力実行
outA.value = puls_pattern[pattern_number][0] # パルス出力実行A〜D
outB.value = puls_pattern[pattern_number][1]
outC.value = puls_pattern[pattern_number][2]
outD.value = puls_pattern[pattern_number][3]
time.sleep(interval_time) # 出力インターバル時間(ms)
# メイン処理 ---------------------------------------------------------
led.value = True # 本体LEDを点灯
while(True):
adc_val = adc_speed.value # ボリュームのアナログ入力(ADC)値を取得
interval_time = adc_val / 65536 # アナログ値をインターバル時間に換算(0〜1000)
# スイッチ1:モーター回転方向切り替え
if not sw1.value and sw1_state == False: # スイッチ1が押されていて、スイッチ1の状態がFalseなら
sw1_state = True # スイッチ1の状態をTrueへ
direction = not direction # 回転方向切り替え
led.value = direction # 回転方向性点なら本体LED点灯
print("Direction", direction)
if sw1.value: # スイッチ1が押されてなければ
sw1_state = False # スイッチ1の状態をFalseへ
# スイッチ2:1相励磁 動作
if not sw2.value: # スイッチ2が押されていれば
if pattern_number > 3:
pattern_number = int(pattern_number / 2)
puls_pattern = [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]] # 励磁パターン指定二次元配列
outputPuls(direction, interval_time) # モーター制御パルス出力関数(回転方向,インターバル時間)
# スイッチ3:2相励磁 動作
if not sw3.value: # スイッチ3が押されていれば
if pattern_number > 3:
pattern_number = int(pattern_number / 2)
puls_pattern = [[1, 1, 0, 0], [0, 1, 1, 0], [0, 0, 1, 1], [1, 0, 0, 1]] # 励磁パターン指定二次元配列
outputPuls(direction, interval_time) # モーター制御パルス出力関数(回転方向,インターバル時間)
# スイッチ4:1-2相励磁 動作
if not sw4.value: # スイッチ4が押されていれば
puls_pattern = [[1, 0, 0, 0], [1, 1, 0, 0], [0, 1, 0, 0], [0, 1, 1, 0],[0, 0, 1, 0], [0, 0, 1, 1], [0, 0, 0, 1], [1, 0, 0, 1]] # 励磁パターン指定二次元配列
outputPuls(direction, interval_time) # モーター制御パルス出力関数(回転方向,インターバル時間)
5.動作確認
サンプルプログラムの「応用編」以外は、実行するとすぐにモーターが動作し始めます。
駆動基板上の4つのLEDで、どのコイルが励磁されているかが確認できるので、プログラム内の「interval_time(インターバル時間)」を長くすることで、コイルへの出力が切り替わる様子が確認できます。
今回使用したステッピングモーターの出力軸はギヤ比が1/64で回転が遅く変化がわかりにくいため、下写真のように分解してモーター単体で動作確認した動画を用意しました。
写真左上のモーター本体中央にあるのが回転する磁石のローター(φ10mm程)です。
「interval_time(インターバル時間)」を長くすると、1ステップごとに「1相、2相励磁」は「11.25°」、「1-2相励磁」は「5.625°」で動作していることが確認できます。
6.まとめ
「Raspberry Pi Pico(PicoW)」を使用したステッピングモーターの使い方を「Python」のサンプルプログラムを使って詳しく紹介しました。
ステッピングモーターにもいくつか種類がありますが、今回使用したものはPM(パーマネントマグネット)型の「2相ユニポーラ型」で、制御方法には「1相励磁」「2相励磁」「1-2相励磁」があります。
構造がシンプルで制御も比較的簡単なため、基本的なステッピングモータの動作原理の確認には最適です。
今回使用したステッピングモーター「28BYJ-48」は安価で入手でき、簡単なプログラムで動作確認できるため、実際に動かしながら動作確認してみると、その仕組みがよく理解できると思います。
エンコーダーで現在位置を確認しながら制御できるサーボモーターには劣りますが、ステッピングモーターはエンコーダー無しでコイルへの励磁パターンを切り替えるだけで一定の角度で動作させることができます。
簡易的な位置決め動作を安価でシンプルに実現したい場合はステッピングモーターで十分な用途も多いので、用途に応じて使い分けていきましょう。
コメント