нужна помощь с L293dne

Тема в разделе "Raspberry Pi", создана пользователем Mescaline, 13 окт 2014.

  1. Mescaline

    Mescaline Нуб

    Решил сделать Raspberry PI на гусеницах.

    Для этого приобрел:
    Мотор редуктор двойной
    площадку и гусеницы
    микросхему L293d
    макетную плату

    Подключил к L293d (пример тут)
    Два мотора используя pin'ы на микросхеме:
    Pin: 3, 6 и 11, 14 motor Левый/Правый
    Pin: 4, 5 и 12, 13 Земля
    Pin: 8, 9 +
    Pin: 2, 7 GPIO (25,24)
    Pin: 10, 15 GPIO (4, 17)

    Все это дело запитываю от четырех аккумуляторов АА 2500mAh питание подключено напрямую к микросхеме.

    В итоге ко всему этому запускаю простенький софт (python) найденый на просторах интернета.


    Когда начинаю проверять, мотор еле еле прокручивает гусеницу (почему то только одну).
    А то и вовсе не крутит.
    Второй мотор как не заставлял работать не получается.. Крутит еще слабее и то если зажать клавишу и держать.
    Подскажите пожалуйста, может я что то не так подключаю?
    И есть ли готовая плата для RPi b+ для управления двумя моторами?



    Вот код Python который я использовал (ВЗЯТО ТУТ) (с) :
    Код (Text):
    import RPi.GPIO as io
    io.setmode(io.BCM)
    import sys, tty, termios, time

    # These two blocks of code configure the PWM settings for
    # the two DC motors on the RC car. It defines the two GPIO
    # pins used for the input, starts the PWM and sets the
    # motors' speed to 0
    motor1_in1_pin = 4
    motor1_in2_pin = 17
    io.setup(motor1_in1_pin, io.OUT)
    io.setup(motor1_in2_pin, io.OUT)
    motor1 = io.PWM(4,100)
    motor1.start(0)
    motor1.ChangeDutyCycle(0)

    motor2_in1_pin = 24
    motor2_in2_pin = 25
    io.setup(motor2_in1_pin, io.OUT)
    io.setup(motor2_in2_pin, io.OUT)
    motor2 = io.PWM(4,100)
    motor2.start(0)
    motor2.ChangeDutyCycle(0)

    # Defining the GPIO pins that will be used for the LEDs on
    # the RC car and setting the output to false
    io.setup(18, io.OUT)
    io.output(18, False)

    io.setup(23, io.OUT)
    io.output(23, False)

    # The getch method can determine which key has been pressed
    # by the user on the keyboard by accessing the system files
    # It will then return the pressed key as a variable
    def getch():
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(sys.stdin.fileno())
            ch = sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        return ch

    # This section of code defines the methods used to determine
    # whether a motor needs to spin forward or backwards. The
    # different directions are acheived by setting one of the
    # GPIO pins to true and the other to false. If the status of
    # both pins match, the motor will not turn.
    def motor1_forward():
        io.output(motor1_in1_pin, True)
        io.output(motor1_in2_pin, False)

    def motor1_reverse():
        io.output(motor1_in1_pin, False)
        io.output(motor1_in2_pin, True)

    def motor2_forward():
        io.output(motor2_in1_pin, True)
        io.output(motor2_in2_pin, False)

    def motor2_reverse():
        io.output(motor2_in1_pin, False)
        io.output(motor2_in2_pin, True)

    # This method will toggle the lights on/off when the user
    # presses a particular key. It will then change the status
    # of the lights so it will know whether to turn them on or
    # off when it is next called.
    def toggleLights():

        global lightStatus

        if(lightStatus == False):
            io.output(18, True)
            io.output(23, True)
            lightStatus = True
        else:
            io.output(18, False)
            io.output(23, False)
            lightStatus = False

    # This method will toggle the direction of the steering
    # motor. The method will determine whether the user wants
    # to turn left or right depending on the key they press and
    # then make the appropriate adjustment. It works as a toggle
    # because the program cannot read multiple pressed keys at
    # the same time. The possible positions of the wheels are
    # "right", "centre" and "left". It will then update the
    # status of the wheel to access next time it is called.
    def toggleSteering(direction):

        global wheelStatus

        if(direction == "right"):
            if(wheelStatus == "centre"):
                motor1_forward()
                motor1.ChangeDutyCycle(99)
                wheelStatus = "right"
            elif(wheelStatus == "left"):
                motor1.ChangeDutyCycle(0)
                wheelStatus = "centre"

        if(direction == "left"):
            if(wheelStatus == "centre"):
                motor1_reverse()
                motor1.ChangeDutyCycle(99)
                wheelStatus = "left"
            elif(wheelStatus == "right"):
                motor1.ChangeDutyCycle(0)
                wheelStatus = "centre"

    # Setting the PWM pins to false so the motors will not move
    # until the user presses the first key
    io.output(motor1_in1_pin, False)
    io.output(motor1_in2_pin, False)
    io.output(motor2_in1_pin, False)
    io.output(motor2_in2_pin, False)

    # Global variables for the status of the lights and steering
    lightStatus = False
    wheelStatus = "centre"

    # Instructions for when the user has an interface
    print("w/s: acceleration")
    print("a/d: steering")
    print("l: lights")
    print("x: exit")

    # Infinite loop that will not end until the user presses the
    # exit key
    while True:
        # Keyboard character retrieval method is called and saved
        # into variable
        char = getch()

        # The car will drive forward when the "w" key is pressed
        if(char == "w"):
            motor2_forward()
            motor2.ChangeDutyCycle(99)

        # The car will reverse when the "s" key is pressed
        if(char == "s"):
            motor2_reverse()
            motor2.ChangeDutyCycle(99)

        # The "a" key will toggle the steering left
        if(char == "a"):
            toggleSteering("left")

        # The "d" key will toggle the steering right
        if(char == "d"):
            toggleSteering("right")

        # The "l" key will toggle the LEDs on/off
        if(char == "l"):
            toggleLights()

        # The "x" key will break the loop and exit the program
        if(char == "x"):
            print("Program Ended")
            break

        # At the end of each loop the acceleration motor will stop
        # and wait for its next command
        motor2.ChangeDutyCycle(0)

        # The keyboard character variable will be set to blank, ready
        # to save the next key that is pressed
        char = ""

    # Program will cease all GPIO activity before terminating
    io.cleanup()
     
    Последнее редактирование: 13 окт 2014
  2. Mescaline

    Mescaline Нуб

    т.е. когда я нажимаю "W" то левый мотор тужится что есть мочи но не может прокрутить гусеницу - тоже самое было с моим первым опытом когда я использовал мотор от CD-Rom и пытался прокрутить колесо.. еле еле ехала моя "страшная машинка".

    Нажал один раз w и все постоянно пытается ехать вперед. Нажал "S" тут же меняет направление и так же тужится в обратную стоорону.

    Что касается кнопок "A" и "D", то тут ещё сложнее ситуация.
    Нажимаю "А" моторчик пыхтит и ещё слабже пытается крутить гусеницу. Нажимаешь "D" и левая гусинеца останавливается и на этом все.. больше ни чего..

    П.С. - Пока тыкаешь A или D правый мотор по прежнему пытается крутить гусеницу в ту сторону в которую последний раз я нажал, либо W либо S и так пока не выключишь программу нажатием "X".

    Что касается светодиодов - (клавиша L) то вот тут все супер))) работают как надо!))
     
    Последнее редактирование: 13 окт 2014
  3. acos

    acos Официальный гик Администратор

    а
    ChangeDutyCycle()
    в каких пределах менять можно? От 0 до 100? или можно и побольше значение давать?