Решил сделать 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()
т.е. когда я нажимаю "W" то левый мотор тужится что есть мочи но не может прокрутить гусеницу - тоже самое было с моим первым опытом когда я использовал мотор от CD-Rom и пытался прокрутить колесо.. еле еле ехала моя "страшная машинка". Нажал один раз w и все постоянно пытается ехать вперед. Нажал "S" тут же меняет направление и так же тужится в обратную стоорону. Что касается кнопок "A" и "D", то тут ещё сложнее ситуация. Нажимаю "А" моторчик пыхтит и ещё слабже пытается крутить гусеницу. Нажимаешь "D" и левая гусинеца останавливается и на этом все.. больше ни чего.. П.С. - Пока тыкаешь A или D правый мотор по прежнему пытается крутить гусеницу в ту сторону в которую последний раз я нажал, либо W либо S и так пока не выключишь программу нажатием "X". Что касается светодиодов - (клавиша L) то вот тут все супер))) работают как надо!))
а ChangeDutyCycle() в каких пределах менять можно? От 0 до 100? или можно и побольше значение давать?