1.A4988扩展板
说明:
-EN:使能,低电平生效
-Z.DIR:Z轴的电机转动方向,高电平、低电平方向不同
-Y.DIR:Y轴的电机转动方向,高电平、低电平方向不同
-X.DIR:X轴的电机转动方向,高电平、低电平方向不同
-Z.STEP:Z轴的电机转动,每1个脉冲转动一步(不同电机步的幅度不同,当前视频中使用的是1.8°)
-Y.STEP:Y轴的电机转动,每1个脉冲转动一步(不同电机步的幅度不同,当前视频中使用的是1.8°)
-X.STEP:X轴的电机转动,每1个脉冲转动一步(不同电机步的幅度不同,当前视频中使用的是1.8°)
from mahine import Pin,PWM
import time
#使能
en_pin=Pin(12,Pin.OUT)
en_pin.vslue(1)
time.sleep(0.5)
en_pin.value(0)
#x轴
x_dir=1
x_pin=Pin(16,Pin.OUT)
x_pin.duty(x_dir)
x_pwm=PWM(Pin(26))
x_pwm.freq(500)
x_pwm.duty(512)
#y轴
y_dir=1
y_pin=Pin(27,Pin.OUT)
y_pin.duty(y_dir)
y_pwm=PWM(Pin(25))
y_pwm.freq(500)
y_pwm.duty(512)
#z轴
z_dir=1
z_pin=Pin(14,Pin.OUT)
z_pin.duty(z_dir)
z_pwm=PWM(Pin(17))
z_pwm.freq(500)
z_pwm.duty(512)
time.sleep(3)
en_pin.value(1)
2.控制电机的转速
from machine import Pin,PWM
import time
import machine
#旋钮默认减
btn_function=False
#使能
en_pin=Pin(12,Pin.OUT)
en_pin.value(1)
time.sleep(0.5)
en_pin.value(0)
pwm_rate=300
#X轴
x_dir=1
x_pin=Pin(16,Pin.OUT)
x_pin.duty(x_dir)
x_pwm=PWM(Pin(26))
x_pwm.freq(pwm_rate)
x_pwm.duty(512)
def handler(self,*args):
'''
中断回调函数
'''
global pwm_rate
print('55555555')
if btn_function:
pwm_rate+=10
else:
pwm_rate-=10
print('pwm_rate=%d'%pwm_rate)
x_pwm.freq(pwm_rate)
def handler2(self,*args):
'''
中断回调函数
'''
global btn_function
print('66666666')
btn_function=not btn_function
p4=machine.Pin(4,machine.Pin.IN,machine.Pin.PULL_UP)
p4.irq(trigger=machine.Pin.IRQ_RISING,handlerr=handler)# 配置中断信息
p34=machine.Pin(34,machine.Pin.IN,machine.Pin.PULL_UP)
p34.irq(trigger=machine.Pin.IRQ_RISING,handlerr=handler2)# 配置中断信息
while True:
print('running...方向%d'%x_pin.value())
time.sleep(1)
3.控制步进电机转动角度
3.1控制电机转动90度
from machine import Pin,PWM
import time
from machine import Pin
import machine
import utime
#使能
en_pin=Pin(12,Pin.OUT)
en_pin.value(1)
time.sleep(0.5)
en_pin.value(0)
#创建x轴Pin对象
axis_x_pin=Pin(26,Pin.OUT)
#定义变量
time_value=1
num_cycle=0
for i in range(50): #1次1.8度,50次就是90度
#模拟发送pwm
axis_x_pin.value(1)
utime.sleep_us(time_value*1000)
axis_x_pin.value(0)
utime.sleep_us(time_value*1000)
num_cycle+=1
print(num_cycle)
en_pin.value(1) #关闭使能引脚
3.2控制电机转动360度
from machine import Pin,PWM
import time
from machine import Pin
import machine
import utime
#使能
en_pin=Pin(12,Pin.OUT)
en_pin.value(1)
time.sleep(0.5)
en_pin.value(0)
#创建x轴Pin对象
axis_x_pin=Pin(26,Pin.OUT)
#定义变量
time_value=1
num_cycle=0
for i in range(200): #1次1.8度,50次就是90度
#模拟发送pwm
axis_x_pin.value(1)
utime.sleep_us(time_value*1000)
axis_x_pin.value(0)
utime.sleep_us(time_value*1000)
num_cycle+=1
print(num_cycle)
en_pin.value(1) #关闭使能引脚
4.旋钮控制机械臂3个轴
from machine import Pin,PWM
import time
from machine import Pin
import machine
import utime
#使能
en_pin=Pin(12,Pin.OUT)
en_pin.value(1)
time.sleep(0.5)
en_pin.value(0)
#第1轴
x_dir=1
x_pin=Pin(16,Pin.OUT)
x_pin.duty(x_dir)
#Pin对象
axis_x_pin=Pin(26,Pin.OUT)
#第2轴
y_dir=1
y_pin=Pin(27,Pin.OUT)
y_pin.duty(y_dir)
#Pin对象
axis_y_pin=Pin(25,Pin.OUT)
#第3轴
z_dir=1
z_pin=Pin(14,Pin.OUT)
z_pin.duty(z_dir)
#Pin对象
axis_x_pin=Pin(17,Pin.OUT)
#定义变量
time_value=20
btn_fuction=0 #0/1对应 第1轴 2/3对应第2轴 4/5对应第3轴
def handler(self,*args):
'''
中断回调函数
'''
global tiime_value
print('旋钮转动')
if btn_function==0 or btn_function==1:
x_dir=0 if btn_function%2==0 else 1
x_pin.value(x_dir)
#模拟发送pwm
axis_x_pin.value(1)
utime.sleep_us(time_value*1000)
axis_x_pin.value(0)
utime.sleep_us(time_value*1000)
elif btn_function==2 or btn_function==3:
y_dir=0 if btn_function%2==0 else 1
y_pin.value(y_dir)
#模拟发送pwm
axis_y_pin.value(1)
utime.sleep_us(time_value*1000)
axis_y_pin.value(0)
utime.sleep_us(time_value*1000)
elif btn_function==4 or btn_function==5:
z_dir=0 if btn_function%2==0 else 1
z_pin.value(z_dir)
#模拟发送pwm
axis_z_pin.value(1)
utime.sleep_us(time_value*1000)
axis_z_pin.value(0)
utime.sleep_us(time_value*1000)
def handler2(self,*args):
'''
中断回调函数
'''
global btn_function
print('切换...')
btn_function+=1
btn_function=btn_function%6 #取到的结果在0-5之间
print('btn_function的值:',btn_function)
p4=machine.Pin(4,machine.Pin.IN,machine.Pin.PULL_UP)
p4.irq(trigger=machine.Pin.IRQ_RISING,handlerr=handler)# 配置中断信息
p34=machine.Pin(34,machine.Pin.IN,machine.Pin.PULL_UP)
p34.irq(trigger=machine.Pin.IRQ_RISING,handlerr=handler2)# 配置中断信息
while True:
time.sleep(1)
print('running...')
5.桌面程序控制机械臂
from machine import Pin,PWM
import time
from machine import Pin
import machine
import utime
import socket
import network
#使能
en_pin=Pin(12,Pin.OUT)
en_pin.value(1)
#第1轴
x_dir=1
x_pin=Pin(16,Pin.OUT)
x_pin.duty(x_dir)
#Pin对象
axis_x_pin=Pin(26,Pin.OUT)
#第2轴
y_dir=1
y_pin=Pin(27,Pin.OUT)
y_pin.duty(y_dir)
#Pin对象
axis_y_pin=Pin(25,Pin.OUT)
#第3轴
z_dir=1
z_pin=Pin(14,Pin.OUT)
z_pin.duty(z_dir)
#Pin对象
axis_x_pin=Pin(17,Pin.OUT)
#定义变量
time_value=10
lock_status=False #False为锁定,True锁定
relative_position=[0,0,0] #第1/2/3轴相对于锁定的位置转动的脉冲次数
def do_connect():
'''连接wifi'''
wlan=network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('connecting to network...')
wlan.connect('dongfeiqiu','wangmingdong1225')
i=1
while not wlan.isconnected():
print('正在连接...{}'.format(i))
i+=1
time.sleep(1)
print('network config:',wlan.ifconfig())
def main():
global lock_status
#连接wifi
do_connect()
#创建UDP
udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#绑定本地信息
udp_socket.bind(('0.0.0.0',7788))
#接收网络数据
while True:
recv_data,sender_info=udp_socket.recvfrom(1024)
print('{} 发送{}'.format(sender_info,recv_data))
recv_data_str=recv_data.decode('utf-8')
cmd=int(recv_data_str[0])
data=int(recv_data_str[2:])
if cmd==0:
if data==0:
print('锁定')
relative_position[0]=0
relative_position[1]=0
relative_position[2]=0
lock_status=True
en_pin.value(0) #打开使能
else:
print('解锁...')
lock_status=False
en_pin.value(1) #关闭使能
elif lock_status and cmd==1:
print('第1轴...',data)
if data==relative_position[0]:
continue
#方向
x_dir=0 if data>relative_position[0] else 1
x_pin.value(x_dir)
pwm_times=abs(data - relative_position[0])
relative_position[0]=data
for i in range(pwm_times):
#模拟发送pwm
axis_x_pin.value(1)
utime.sleeep_us(time_value*1000)
axis_x_pin.value(0)
utime.sleeep_us(time_value*1000)
elif lock_status and cmd==2:
print('第2轴...',data)
if data==relative_position[0]:
continue
#方向
y_dir=0 if data>relative_position[1] else 1
y_pin.value(y_dir)
pwm_times=abs(data - relative_position[1])
relative_position[1]=data
for i in range(pwm_times):
#模拟发送pwm
axis_y_pin.value(1)
utime.sleeep_us(time_value*1000)
axis_y_pin.value(0)
utime.sleeep_us(time_value*1000)
elif lock_status and cmd==3:
print('第3轴...',data)
if data==relative_position[2]:
continue
#方向
z_dir=0 if data>relative_position[2] else 1
z_pin.value(y_dir)
pwm_times=abs(data - relative_position[2])
relative_position[2]=data
for i in range(pwm_times):
#模拟发送pwm
axis_z_pin.value(1)
utime.sleeep_us(time_value*1000)
axis_z_pin.value(0)
utime.sleeep_us(time_value*1000)
else:
if lock_status is False:
print("未锁定...运动命令无效")
else:
print("未知数据类型...")
if __name__ == "__main__":
main()
6.机械臂关键角度与电机脉冲关系
6.1目的
在后面的逆向运动学计算中,需要用到角度,说的通俗一点想要控制机械臂的控制触手达到范围内的任意xyz位置,最终得到的是各个关节的角度
我们也知道当前我的步进电机1个脉冲是1.8°,这个度数仅仅是步进电机轴的转动角度,最终我们需要计算出电机转动多少次对应机械臂的关节转动多少角度