↓これが到着しまして、とりあえず動かしてみることにしました。
■モータ仕様確認
・モータはNEMA17 です。
これまでにテストしたSteppingモータと概ね同仕様ですので、
↓モータドライバも同じにしました。
■モータドライバ
■制御CPU
以前の↓記事
ラズパイ3B+Python3で動作させていましたが、
今回はCPUをRaspberryPi_PICO_Wを使い、Micropythonで動作させました。
■配線状況
左からRPPWH、TB6600 、リニアスライドです。
リニアスライドの左にフォトインタラプタを4個並べて
両端検知と動作検知に使う予定ですが、今回は使っていません。
RPPWHの下側にもう一つRPPWHがありますが、
これは将来用で今回は使っていません。
↑RPPWHまわり
・RPPWHへの給電:PCと繋いだUSB
・ロック付き押しボタンSW4点、左から順に・・・
ena設定用:GP18、押すとenaがONになり、モータを廻せる。
回転方向設定用;GP19、ON/OFFで回転方向が逆になる。
両端検知1用(GP20、接続していますが今回は使っていません)
両端検知2用(GP21、接続していますが今回は使っていません)
・TB6600との接続は上述の記事と同じです。
pulseの「-」:GP02に接続
dirの「-」:GP03に接続
enaの「-」:GP04に接続
TB6600のSignalの+はRPPWHの3V3に接続
■動作結果
良好に動作しました。
まるでNCマシンのようなボールねじユニットのウィーーンという動作音でした。
実際にはTB6600のディップスイッチを間違って設定していて、
適正な動作になるまで少し時間ロスしました。
1回転あたりのパルス数とパルス周波数が低いとゴゴゴ〜と振動が大きいですが、
1600pulse/rot、周波数1kHz程度まで上げると一気に動作が滑らかになりました。
■動作確認用プログラム
# 単独でも動きますが、Thonnyで起動停止とパラメータ確認すること
# test_linear_slide,py
#■制御プログラム(リニアスライドユニット用)
# Linear Sliding length 100mm
# Stepping moter : 2pahse-bipoler NEMA17
# Stepping moter driver : TB6600
# CPU : RaspberryPi PICO-W
# Edit by kabayon date:20241220
# Coding : utf-8
# ライブラリ:micropythonの標準ライブラリのみ
from time import sleep
import time
from machine import Pin , PWM
# set standerd value of signal
signal_high = 1
signal_low = 0
# set GPIO Pin-number
GP00 = 0
GP01 = 1
GP02 = 2
GP03 = 3
GP04 = 4
GP05 = 5
GP18 = 18
GP19 = 19
GP20 = 20
GP21 = 21
# 動作端検出用フォトインタラプタのオブジェクト設定
sw_ena = Pin(GP18, Pin.IN, Pin.PULL_UP)
sw_direction = Pin(GP19, Pin.IN, Pin.PULL_UP)
ls01 = machine.Pin(GP20, Pin.IN, Pin.PULL_UP)
ls02 = machine.Pin(GP21, Pin.IN, Pin.PULL_UP)
# Stepping motor driverへ信号出力するピンのオブジェクト設定
pin_pulse = Pin(GP02, Pin.OUT)
pin_direction = Pin(GP03, Pin.OUT)
pin_ena = Pin(GP04, Pin.OUT)
# ■TB6600ドライバ信号初期値
# DIR = HIGHで正転、DIR = LOWで逆転。
# status_direction = signal_high
# ENA = HIGHでトルク発生、ENA = LOWでトルクフリー
# status_ena = signal_high
# ■基本動作パラメータ設定
# ボールねじピッチ長さ(mm単位)
length_lead = 4
# 減速比を設定。モータ単体ならば1
ratio_gear = 1
# 1mm移動時のモータ主軸の総回転数設定
length_drive_1mm = 1
num_rotate_1mm = ratio_gear * length_drive_1mm / length_lead
# 1mm移動時のパルス数
num_pulse_1rotation = 1600
num_pulse_1mm = int( num_rotate_1mm * num_pulse_1rotation )
# パルス幅を秒単位で指定。値を小さくする程高速で回転する。
width_pulse = 0.0005
# ■動作繰り返し
while True:
status_sw_ena = sw_ena.value()
status_sw_direction = sw_direction.value()
status_ls01 = ls01.value()
status_ls02 = ls02.value()
print("ena:",status_sw_ena,"dir:",status_sw_direction,"ls01:",status_ls01,"ls02:",status_ls02)
time.sleep(1)
# 移動長さ
length_drive = 50
# 移動パルス数
count_pulse = length_drive * num_pulse_1mm
print("num_pulse_1mm ",num_pulse_1mm,"count pulse ",count_pulse)
#time.sleep(1)
print("start driving")
for j in range( 0 , count_pulse ):
pin_ena.value( sw_ena.value() )
pin_direction.value( sw_direction.value() )
pin_pulse.value( signal_low )
time.sleep( width_pulse )
pin_pulse.value( signal_high )
time.sleep( width_pulse )
今回は以上です。
次回以降、
フォトインタラプタによる両端検出
スライドユニットの連続動作に
に取り組みます。