Когда мой шаговый двигатель вращается в правильном направлении, у него большие шаги - PullRequest
0 голосов
/ 03 апреля 2020

Для моего финального проекта мне нужно сделать 2D-плоттер. Я использую существующий принтер: Creality Ender 3. Я также использую Raspberry Pi 4.

У меня проблема со всеми моими шаговыми двигателями. Когда они поворачивают направо, ступени больше, чем при повороте налево. Вот мой код:

Я голландец, но я попытаюсь объяснить это.

  1. Сначала я загружаю изображение, проверяю черные пиксели и помещаю их в list.

  2. далее я использую новый список, чтобы расположить координаты, чтобы он стал плавными линиями.

  3. затем я перенесу свой принтер в дом положение.

  4. Затем я начинаю печатать. Я печатаю пиксель / пиксель чертежа и не использую pwm, а только шаги.

  5. Теперь у меня проблема в том, что в правильном направлении двигатели движутся дальше. поэтому мой рисунок испорчен.

    Я не знаю, что делать, не могли бы вы, ребята, помочь мне?

    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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...