цифровая электроника
вычислительная техника
встраиваемые системы

 
» » Управляем двигателями через последовательный порт, не используя микроконтроллер



Управляем двигателями через последовательный порт, не используя микроконтроллер

Автор: Mike(admin) от 21-03-2014, 07:58

Для того, чтобы сделать робота вам не нужны Arduino, PIC или другие микроконтроллеры, поскольку свой проект вы можете подсоединить к USB-порту компьютера или ноутбука через адаптер «USB-последовательный порт». Можно и напрямую, если компьютер оснащен последовательным портом. Это позволит управлять шасси непосредственно с ноутбука, не используя дополнительных плат вроде Arduino.


Управляем двигателями через последовательный порт

Адаптер можно приобрести за небольшие деньги, поэтому он может стать хорошей альтернативой платам с микроконтроллерами.


Что потребуется:


  • Адаптер последовательного порта

  • Драйвер двигателя (TA7291P или подобный)

  • Один или два коллекторных двигателя (в этом проекте используются 3-вольтовые движки)

  • Два резистора 1 КОм

  • Ноутбук. Не знаете какой выбрать ноутбук? В данном случае подойдет самый обычный, лишь бы был хотя бы один порт USB.

Если у вас не 5-вольтовый двигатель, то также понадобится либо резистор 5 Ом 2 Вт, либо 100 или 50-омные резисторы 0,25 Вт.


Шаг 1: разбираемся с разъемом последовательного порта


Стандартный разъем порта RS-232 имеет 9 выводов, но нам нужны только три. В общем случае последовательный порт посылает 5-вольтовые сигналы, сообщающие о готовности передачи сообщения, и эти самые сообщения. Вместо отправки сообщений мы просто воспользуемся 5-вольтовым логическим уровнем. Вывод передачи данных TD можно использовать, но это потребует микросхемы-декодера (например, регистра сдвига) или транзистора для усиления слабого тока. При этом логическим нулем будет высокий уровень напряжения, а логической единицей – низкий.


Разъем RS-232

Если не использовать TD (вывод передачи данных), то, в принципе, нам потребуются выводы DTR, RTS и GND (земля).


Шаг 2: схема


Теперь нам нужно «обвязать» драйвер двигателя. Если у вас 3-вольтовые двигатели, то есть одна проблема – TA7291P для работы нужно 4.5 В. Можно взять другие двигатели или задействовать резистор для ограничения тока. Резистор должен быть номиналом от 2 до 5 В и мощностью 2 Вт. Можно также соединить параллельно резисторы 0,25 Вт (20 резисторов 100 Ом или 10 резисторов 50 Ом). В итоге всё нужно соединить так, как показано на схеме (первая для двух двигателей, вторая для одного).


Управляем двигателями через последовательный порт

Управляем двигателем через последовательный порт

Шаг 3: базовая (проверочная) программа


Теперь осталось написать только программу. В данном случае используется Python, но ее можно написать на любом удобном для вас языке. Проследите за тем, чтобы название порта совпадало с используемым портом (в данном случае COM6).



import time
import serial

###инициализация последовательного порта
#для windows (измените COM6 на ваш вариант)
#ser = serial.Serial("COM6", 2400)

#для linux (измените /dev/ttyUSB0 на ваш вариант)
ser = serial.Serial("/dev/ttyUSB0", 2400)

ser.open() #открываем соединение

#пока RTS и DTR сбрасываем
ser.setRTS(False)
ser.setDTR(False)
print("initialization finished")

###основной цикл
c = 1
while c:
   ser.setRTS(False)
   ser.setDTR(True)
   time.sleep(2)
   ser.setRTS(True)
   ser.setDTR(False)
   time.sleep(2)

Шаг 4: простая программа


Если к одному мосту вы подключили два двигателя, то с помощью приведенной ниже программы вы сможете вращать их в определенном направлении.



import time
import serial

###инициализация последовательного порта
#для windows (измените COM6 на ваш вариант)
#ser = serial.Serial("COM6", 2400)

#для linux (измените /dev/ttyUSB0 на ваш вариант)
ser = serial.Serial("/dev/ttyUSB0", 2400)

ser.open() #открываем соединение

#пока RTS и DTR сбрасываем
ser.setRTS(False)
ser.setDTR(False)
print("initialization finished")

### функция для вращения вперед (для одного моста с двумя моторами)
def move_forward(times):
   while times > 0:
      ser.setRTS(True)
      ser.setDTR(False)
      time.sleep(0.2)
      ser.setRTS(False)
      ser.setDTR(True)
      time.sleep(0.2)
      times -= 1

###основной цикл
c = 1
while c:
   move_forward(6)
   time.sleep(2)



© digitrode.ru


<Источник>




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий