1、理论

28BYJ 步进电机,5V,淘宝买5元左右一个;

驱动使用ULN2003;

减速步进电机

直径:28mm

电压:5V

步进角度:5.625 x 1/64

减速比:1/64

5线4相 可以用普通uln2003芯片驱动,也可以接成2相使用 可以配套开发板使用,直接插接,方便使用 步进电机在开发板上使用。


opmv_28BYJ步进电机代码以及测试_stm32

opmv_28BYJ步进电机代码以及测试_python_02

下面代码中

4096个脉冲,走360度
x----------------------1
1---------------------y
x=4093/360=11…xxxx
y=360/4096=0.088度/脉冲
一个脉冲,走0.088度。

所以写一个函数

moveDeg(方向,延时时间ms,角度)

{

将角度转为脉冲数量

判断正方向:走脉冲;

反方向:走反脉冲

}

*******************我是分割线

2、接线:

OPENMV的:(‘E7’,‘E8’,‘E9’,‘E10’)–ULN2003的IN1,IN2,IN3,IN4
OPENMV的(‘C4’,‘C5’,‘B0’,‘B1’)****–ULN2003的IN1,IN2,IN3,IN4

BY1=stepper28BY(‘E7’,‘E8’,‘E9’,‘E10’)

BY2=stepper28BY(‘C4’,‘C5’,‘B0’,‘B1’)

3、steps28BY .py的函数说明

函数1、引脚初始化__init__(self,p1,p2,p3,p4):

def __init__(self,p1,p2,p3,p4):
Step28BYJ_pin1 = Pin(p1, Pin.OUT_PP, Pin.OUT_PP)
Step28BYJ_pin2 = Pin(p2, Pin.OUT_PP, Pin.OUT_PP)
Step28BYJ_pin3 = Pin(p3, Pin.OUT_PP, Pin.OUT_PP)
Step28BYJ_pin4 = Pin(p4, Pin.OUT_PP, Pin.OUT_PP)
self.i1=Step28BYJ_pin1
self.i2=Step28BYJ_pin2
self.i3=Step28BYJ_pin3
self.i4=Step28BYJ_pin4

主函数中这么使用:stepper28BY是steps28BY文件的一个类。

from steps28BY import stepper28BY

BY1=stepper28BY(‘E7’,‘E8’,‘E9’,‘E10’)

BY2=stepper28BY(‘C4’,‘C5’,‘B0’,‘B1’)

**

2、 def __setStep(self,w1,w2,w3,w4):

**

函数说明:4个管脚的高低电平设置,0–低电平,1–高电平

def __setStep(self,w1,w2,w3,w4):

if w10:
self.i1.low()
else:
self.i1.high()
if w20:

self.i2.low()

else:

self.i2.high()

if w30:
self.i3.low()
else:
self.i3.high()
if w40:

self.i4.low()

else:

self.i4.high()

opmv_28BYJ步进电机代码以及测试_初始化_03

3. def __stop(self):

停止函数,4个管脚都是低电平。

def __stop(self):
self.__setStep(0,0,0,0)

4 def forward(self,delay,steps):

函数,正转(延时毫秒,总的节拍数(1-4096))

5、 def backward(self,delay,steps):

函数,反转(延时毫秒,总的节拍数(1-4096))

6、 def Move_Degree(self,dirtemp,delay,degtemp):

函数,转动角度(方向(1,正转,-1反转),延时,度数)

opmv_28BYJ步进电机代码以及测试_stm32_04

steps28BY.py

from pyb import Pin
import time

#一般步进电机28BYJ是减速比1:64
#实际测量减速比是63.684,而不是64
#这里记住,这里是但八拍,就是说,发出512个(8节拍),转动360度。
#512*8=4096,4096个节拍,跑360度。


class stepper28BY:


def __init__(self,p1,p2,p3,p4):
Step28BYJ_pin1 = Pin(p1, Pin.OUT_PP, Pin.OUT_PP)
Step28BYJ_pin2 = Pin(p2, Pin.OUT_PP, Pin.OUT_PP)
Step28BYJ_pin3 = Pin(p3, Pin.OUT_PP, Pin.OUT_PP)
Step28BYJ_pin4 = Pin(p4, Pin.OUT_PP, Pin.OUT_PP)
self.i1=Step28BYJ_pin1
self.i2=Step28BYJ_pin2
self.i3=Step28BYJ_pin3
self.i4=Step28BYJ_pin4


def __setStep(self,w1,w2,w3,w4):
if w1==0:
self.i1.low()
else:
self.i1.high()
if w2==0:
self.i2.low()
else:
self.i2.high()
if w3==0:
self.i3.low()
else:
self.i3.high()
if w4==0:
self.i4.low()
else:
self.i4.high()


def __stop(self):
self.__setStep(0,0,0,0)


#转动1圈,需要4096节拍
#输入5节拍。走5次。最多8节拍。
#首先判断steps=8的倍数,走完8节拍的倍数;
#然后判断余数,余数=7,走7节拍
#余数=6,走六步

def forward(self,delay,steps):

step8n=steps/8
step8L=steps%8
print("step8n=")
print(step8n)
print("step8L=")
print(step8L)

for i in range(0,step8n,1):
self.__setStep(1,0,0,0)
time.sleep(delay)
self.__setStep(1,1,0,0)
time.sleep(delay)
self.__setStep(0,1,0,0)
time.sleep(delay)
self.__setStep(0,1,1,0)
time.sleep(delay)

self.__setStep(0,0,1,0)
time.sleep(delay)
self.__setStep(0,0,1,1)
time.sleep(delay)
self.__setStep(0,0,0,1)
time.sleep(delay)
self.__setStep(1,0,0,1)
time.sleep(delay)


if step8L==0:
self.__stop()
return

if step8L==7:
self.__setStep(1,0,0,0)
time.sleep(delay)
self.__setStep(1,1,0,0)
time.sleep(delay)
self.__setStep(0,1,0,0)
time.sleep(delay)
self.__setStep(0,1,1,0)
time.sleep(delay)

self.__setStep(0,0,1,0)
time.sleep(delay)
self.__setStep(0,0,1,1)
time.sleep(delay)
self.__setStep(0,0,0,1)
time.sleep(delay)
self.__stop()
return

elif step8L==6:
self.__setStep(1,0,0,0)
time.sleep(delay)
self.__setStep(1,1,0,0)
time.sleep(delay)
self.__setStep(0,1,0,0)
time.sleep(delay)
self.__setStep(0,1,1,0)
time.sleep(delay)

self.__setStep(0,0,1,0)
time.sleep(delay)
self.__setStep(0,0,1,1)
time.sleep(delay)
self.__stop()
return
elif step8L==5:
self.__setStep(1,0,0,0)
time.sleep(delay)
self.__setStep(1,1,0,0)
time.sleep(delay)
self.__setStep(0,1,0,0)
time.sleep(delay)
self.__setStep(0,1,1,0)
time.sleep(delay)

self.__setStep(0,0,1,0)
time.sleep(delay)
self.__stop()
return

elif step8L==4:
self.__setStep(1,0,0,0)
time.sleep(delay)
self.__setStep(1,1,0,0)
time.sleep(delay)
self.__setStep(0,1,0,0)
time.sleep(delay)
self.__setStep(0,1,1,0)
time.sleep(delay)
self.__stop()
return

elif step8L==3:
self.__setStep(1,0,0,0)
time.sleep(delay)
self.__setStep(1,1,0,0)
time.sleep(delay)
self.__setStep(0,1,0,0)
time.sleep(delay)
self.__stop()
return

elif step8L==2:
self.__setStep(1,0,0,0)
time.sleep(delay)
self.__setStep(1,1,0,0)
time.sleep(delay)
self.__stop()
return

else:
self.__setStep(1,0,0,0)
time.sleep(delay)
self.__setStep(1,1,0,0)
time.sleep(delay)

self.__stop()
return


def backward(self,delay,steps):
step8n=steps/8
step8L=steps%8
print("step8n=")
print(step8n)
print("step8L=")
print(step8L)
for i in range(0,step8n,1):
self.__setStep(0,0,0,1)
time.sleep(delay)
self.__setStep(0,0,1,1)
time.sleep(delay)
self.__setStep(0,0,1,0)
time.sleep(delay)
self.__setStep(0,1,1,0)
time.sleep(delay)

self.__setStep(0,1,0,0)
time.sleep(delay)
self.__setStep(1,1,0,0)
time.sleep(delay)
self.__setStep(1,0,0,0)
time.sleep(delay)
self.__setStep(1,0,0,1)
time.sleep(delay)

if step8L==0:
self.__stop()
return

if step8L==7:
self.__setStep(0,0,0,1)
time.sleep(delay)
self.__setStep(0,0,1,1)
time.sleep(delay)
self.__setStep(0,0,1,0)
time.sleep(delay)
self.__setStep(0,1,1,0)
time.sleep(delay)

self.__setStep(0,1,0,0)
time.sleep(delay)
self.__setStep(1,1,0,0)
time.sleep(delay)
self.__setStep(1,0,0,0)
time.sleep(delay)
self.__stop()
return

if step8L==6:
self.__setStep(0,0,0,1)
time.sleep(delay)
self.__setStep(0,0,1,1)
time.sleep(delay)
self.__setStep(0,0,1,0)
time.sleep(delay)
self.__setStep(0,1,1,0)
time.sleep(delay)

self.__setStep(0,1,0,0)
time.sleep(delay)
self.__setStep(1,1,0,0)
time.sleep(delay)

self.__stop()
return
if step8L==5:
self.__setStep(0,0,0,1)
time.sleep(delay)
self.__setStep(0,0,1,1)
time.sleep(delay)
self.__setStep(0,0,1,0)
time.sleep(delay)
self.__setStep(0,1,1,0)
time.sleep(delay)

self.__setStep(0,1,0,0)
time.sleep(delay)

self.__stop()
return

if step8L==4:
self.__setStep(0,0,0,1)
time.sleep(delay)
self.__setStep(0,0,1,1)
time.sleep(delay)
self.__setStep(0,0,1,0)
time.sleep(delay)
self.__setStep(0,1,1,0)
time.sleep(delay)

self.__stop()
return

if step8L==3:
self.__setStep(0,0,0,1)
time.sleep(delay)
self.__setStep(0,0,1,1)
time.sleep(delay)
self.__setStep(0,0,1,0)
time.sleep(delay)

self.__stop()
return

if step8L==2:
self.__setStep(0,0,0,1)
time.sleep(delay)
self.__setStep(0,0,1,1)
time.sleep(delay)


self.__stop()
return

else:
self.__setStep(0,0,0,1)
time.sleep(delay)

self.__stop()
return
#dirtemp=1正转,=-1,反转 deg=90
#painum=deg/0.088
#print(deg,painum)
#BY1.forward(1,painum)

def Move_Degree(self,dirtemp,delay,degtemp):
painum=degtemp/0.088
if dirtemp==1:
self.forward(delay,painum)
else:
self.backward(delay,painum)

4 main.py

import sensor, image, time,utime
from steps28BY import stepper28BY #导入库
#sensor.reset()
#sensor.set_pixformat(sensor.RGB565)
#sensor.set_framesize(sensor.QVGA)
#sensor.skip_frames(time = 2000)
clock = time.clock()
BY1=stepper28BY('E7','E8','E9','E10') #电机1初始化
BY2=stepper28BY('C4','C5','B0','B1')#电机2初始化

#4096---360
#x------1
#1------y y=360/4096=0.087度,一个节拍0.087度
#x=4096/360=11.38

#BY1.forward(1,1024)
#deg=90
#painum=deg/0.088
#print(deg,painum)
#BY1.forward(1,painum)

BY1.Move_Degree(1,1,180) #电机1转动,正方向,延时毫秒,180度
time.sleep(1000)
BY1.Move_Degree(-1,1,180) #电机1转动,反方向,延时毫秒,180度
time.sleep(1000)


BY2.Move_Degree(1,1,180) #电机2转动,正方向,延时毫秒,180度
time.sleep(1000)
BY2.Move_Degree(-1,1,180)#电机2转动,反方向,延时毫秒,180度
time.sleep(1000)

while(True):
clock.tick()
#img = sensor.snapshot()
# print(clock.fps())