机械臂的控制

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°,这个度数仅仅是步进电机轴的转动角度,最终我们需要计算出电机转动多少次对应机械臂的关节转动多少角度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值