Для моего финального проекта мне нужно сделать 2D-плоттер. Я использую существующий принтер: Creality Ender 3. Я также использую Raspberry Pi 4.
У меня проблема со всеми моими шаговыми двигателями. Когда они поворачивают направо, ступени больше, чем при повороте налево. Вот мой код:
Я голландец, но я попытаюсь объяснить это.
Сначала я загружаю изображение, проверяю черные пиксели и помещаю их в list.
далее я использую новый список, чтобы расположить координаты, чтобы он стал плавными линиями.
затем я перенесу свой принтер в дом положение.
Затем я начинаю печатать. Я печатаю пиксель / пиксель чертежа и не использую pwm, а только шаги.
Теперь у меня проблема в том, что в правильном направлении двигатели движутся дальше. поэтому мой рисунок испорчен.
Я не знаю, что делать, не могли бы вы, ребята, помочь мне?
from PIL import Image
import RPi.GPIO as GPIO
import pygame, time, sys
from math import sqrt
from pygame.locals import *
pygame.init()
GPIO.setmode(GPIO.BOARD)
start_time = time.time()
image = Image.open('test_pillow.png')
Rgb_im = image.convert('RGB')
Xw, Yh = Rgb_im.size
#
bestuurpinnenX = [11, 12, 13, 15]
bestuurpinnenY = [16, 18, 19, 21]
bestuurpinnenZ = [22, 23, 24, 26]
controlepinX = 3
GPIO.setup(controlepinX, GPIO.IN)
controlepinY = 5
GPIO.setup(controlepinY, GPIO.IN)
controlepinZ = 7
GPIO.setup(controlepinZ, GPIO.IN)
for pin in bestuurpinnenX:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, 0)
for pin in bestuurpinnenY:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, 0)
for pin in bestuurpinnenZ:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, 0)
#
fullstep = [
[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],
[1,0,0,0]]
pygame.display.set_caption("2D Plotter")
scherm = pygame.display.set_mode((Xw, Yh))
ListX = []
ListY = []
MoveX = []
MoveY = []
Add = 1
Run = 1
Test = 1
Check0 = 1
scherm.fill((255, 255, 255))
pygame.display.update()
for x in range(1, Xw):
for y in range(1, Yh):
(r, g, b) = Rgb_im.getpixel((x,y))
if (r<40) and (g<40) and (b<40):
ListX.append(x)
ListY.append(y)
print("black pixels scanned.")
x = ListX[0]
y = ListY[0]
MoveX.append(x)
MoveY.append(y)
ListX[0] = 0
ListY[0] = 0
while (len(MoveX) != (len(ListX))):
Check0 = 1
for i in range(1, len(ListX)):
if (ListX[i-1] != 0) and (Check0 == 1):
Check0 = 0
x = ListX[i-1]
y = ListY[i-1]
j = -1
while j != len(ListX):
j = j+1
Test = 1
if (ListX[j-1] == 0):
Test = 0
if Test == 1:
pygame.event.get()
x2 = ListX[j-1]
y2 = ListY[j-1]
Distance = round(sqrt((x2-x)*(x2-x))+sqrt((y-y2)*(y-y2)), 1)
if (Distance < 2):
for p in range(1, len(MoveX)):
Add = 1
if (x2 == MoveX[p-1]) and (y2 == MoveY[p-1]):
Add = 0
if Add == 1:
MoveX.append(x2)
MoveY.append(y2)
ListX[j-1] = 0
ListY[j-1] = 0
x = x2
y = y2
#print("x: {0},y: {1},Distance : {2},Run:{3}".format(MoveX[Run-1], MoveY[Run-1], Distance, Run))
Run = Run + 1
j = -1
if ((Run) == (len(ListX)-1)):
MoveX.append(ListX[Run])
MoveY.append(ListY[Run])
ListX[Run] = 0
print("Moving lists loaded.")
def Setup():
global phaseX; global phaseY; global phaseZ
global width; global height;
phaseX = 0
phaseY = 0
phaseZ = 0
MotorX(20000, 1)
MotorY(20000, 0)
MotorZ(20000, 1)
Init()
def Init():
MotorZ(1500, 0)
MotorX(1200, 0)
MotorY(700, 1)
MotorX(x, 1)
MotorY(y, 0)
MotorZ(200, 1)
def MotorX(StepX, StateX):
global phaseX; global width; global height;
if True:
while (StepX != 0) and (StateX == 0):
StepX -= 1
for pin in range(4):
GPIO.output(bestuurpinnenX[pin], fullstep[phaseX][pin])
time.sleep(0.001)
phaseX += 1
if phaseX > 7:
phaseX = 0
while (StepX != 0) and (StateX == 1):
StepX -= 1
if GPIO.input(controlepinX) == 0:
return
for pin in range(4):
GPIO.output(bestuurpinnenX[pin], fullstep[phaseX][pin])
time.sleep(0.001)
phaseX -= 1
if phaseX < 1:
phaseX = 7
def MotorY(StepY, StateY):
global phaseY; global width; global height;
if True:
while (StepY != 0) and (StateY == 0):
StepY -= 1
if GPIO.input(controlepinY) == 0:
return
for pin in range(4):
GPIO.output(bestuurpinnenY[pin], fullstep[phaseY][pin])
time.sleep(0.001)
phaseY += 1
if phaseY > 7:
phaseY = 0
while (StepY != 0) and (StateY == 1):
StepY -= 1
for pin in range(4):
GPIO.output(bestuurpinnenY[pin], fullstep[phaseY][pin])
time.sleep(0.001)
phaseY -= 1
if phaseY < 1:
phaseY = 7
def MotorZ(StepZ, StateZ):
global phaseZ; global width; global height;
if True:
while (StepZ != 0) and (StateZ == 0):
StepZ -= 1
for pin in range(4):
GPIO.output(bestuurpinnenZ[pin], fullstep[phaseZ][pin])
time.sleep(0.001)
phaseZ += 1
if phaseZ > 7:
phaseZ = 0
while (StepZ != 0) and (StateZ == 1):
StepZ -= 1
if GPIO.input(controlepinZ) == 0:
return
for pin in range(4):
GPIO.output(bestuurpinnenZ[pin], fullstep[phaseZ][pin])
time.sleep(0.001)
phaseZ -= 1
if phaseZ < 1:
phaseZ = 7
Setup()
for i in range(len(MoveY)):
MoveY[i] =round(MoveY[i] * 8 / 9.11, 0)
for i in range (1, len(MoveX)):
x2 = x
y2 = y
x = MoveX[i-1]
y = MoveY[i-1]
Distance = sqrt((x-x2)**2 + (y-y2)**2)
if (Distance > 1.5):
MotorZ(100, 0)
if x<x2:
MotorX((x2-x)*7,1)
else:
MotorX((x-x2)*8,0)
if y<y2:
MotorY((y2-y)*7,1)
else:
MotorY((y-y2)*8,0)
MotorZ(87, 1)
if x<x2:
MotorX(7, 1)
elif x>x2:
MotorX(8, 0)
if y2<y:
MotorY(8, 0)
elif y2>y:
MotorY(7, 1)
pygame.draw.rect(scherm, ((0, 0, 0)), ((x, y), (1, 1)))
pygame.display.update()
pygame.event.get()
difference = time.time() - start_time
time.sleep(5)
pygame.display.quit()
difference = round(difference, 0)
print("It took {0} senconds to print".format(difference))
sys.exit()