Сегодня мы продолжили наше исследование Румбы. В прошлый раз мы научились управлять ей при помощи Arduino. Следующим шагом мы решили попробовать поуправлять Румбой непосредственно с компьютера.
Однако мы сразу же столкнулись с проблемой: мы не можем передавать сигнал непосредственно по сериал-порту на Румбу, т. к. от компьютера по Rx идёт 12 В, а Румба просит 5 В. Нужен специальный преобразователь. Не найдя такового под рукой, мы, конечно же, решили воспользоваться Arduino. Arduino легко справляется с этой задачей.
Т.е. мы соединили Ардуино с Румбой так же, как описано в прошлой статье. А Ардуино через USB подключили к компьютеру. Чтобы отправленные нами сигналы попадали на Румбу, мы залили на Ардуино код, который просто берёт любой отправленный на Rx сигнал и переправляет его на Румбу:
#include <SoftwareSerial.h> SoftwareSerial myserial(10, 11); void setup() { Serial.begin(19200); myserial.begin(19200); } void loop() { if(Serial.available() > 0) { byte b = Serial.read(); myserial.write(b); } if(myserial.available() > 0) { byte b = myserial.read(); Serial.write(b); } }
Кстати, в setup, думаю, можно дописать специальную команду, указанную в спецификации к Roomba SCI (он же Roomba ROI) на стр.2 (METHOD 2), которая трижды подаёт и убирают напряжение с dd-пина с периодом от 50 до 500 мс. Это позволит Румбе перейти в режим работы на скорости 19200. Тогда setup будет выглядеть так:
void setup() { Serial.begin(19200); myserial.begin(19200); pinMode(2, OUTPUT); //Wake up digitalWrite(2, LOW); delay(100); digitalWrite(2, HIGH); delay(2000); //Change to 19200 baud rate for(int i = 0; i < 3; i++){ digitalWrite(2, LOW); delay(250); digitalWrite(2, HIGH); delay(250); } }
После всего этого мы написали на Python код (см. ниже), который отправляет серии байтовых команд на румбу, как описано в спецификации к Roomba SCI на стр.9.
Скажем, команда старт — 128 — в 16-ричной системе равна 80. Её мы и подаём первой. Скорость мы сделали равной 200 мм/с (первые два байта после команды \x89 означают скорость вращения колёс, вторые — радиус поворота вокруг оси). Вообще, максимальная скорость, как видно из спецификации — 500 мм/с . Т.е. за секунду Румба может проехать полметра. Вот, собственно, сам код:
import serial import time ser = serial.Serial(‘/dev/ttyACM0’, 19200, timeout=0.1) print “Starting…” ser.open() time.sleep(3) if(ser.isOpen()): #start ser.write(“\x80”) time.sleep(0.5) #control ser.write(“\x82”) time.sleep(0.5) #move forvard ser.write(“\x89\x00\xc8\x80\x00”) time.sleep(1) #move backward ser.write(“\x89\xff\x38\x80\x00”) time.sleep(1) #turn right ser.write(“\x89\x00\xc8\x00\x01”) time.sleep(1) #turn left ser.write(“\x89\x00\xc8\xff\xff”) time.sleep(1) #stop ser.write(“\x00\x00\x00\x00\x00”) time.sleep(1) #power off ser.write(“\x85”) else: print “Something wrong :(“ print “That’s all” ser.close()
Обратите внимение, что в serial выбран порт ttyACM0. У вас, возможно, будет ttyS0 (если ваша Ардуино работает через COM-порт). Ну или, в зависимости от ОС, может быть что-нибудь ещё.
Также мы обнаружили важную особенность работы через USB-порт (в отличие от COM-версий Ардуино): этот порт инициализируется около трёх секунд. Поэтому всё, что отправляется в это вермя, Румба просто не может прочитать. В том числе и команду контроля (ser.write(“\x82”)). То есть если убрать time.sleep(3) после ser.open(), то Румба не поедет!
После запуска этого кода наша Румба станцевала маленький, но очень красивый танец.
Итак, мы научились подавать на Румбу сигналы с компьютера. Этого вполне достаточно, чтобы экспериментировать с лекциями С. Трана или собрать боевого робота:
Фото взято отсюда
UPD: немного подкорректировал статью под USB-версию Ардуино (CraftDuino, FreeDuino или Arduino UNO), так как она более распространена
0 комментариев на «“Turtlebot: как научить Румбу общаться с компьютером”»
отлично! правда, я писал программу управления на С++, а в остальном — прямо один в один — даже такую же фотку румбы с ножом хотел использовать 🙂
Здорово 🙂
Может, имеет смысл добавить твой код на C++ к этой статье?
На подходе ещё одна статья — на этот раз уже про ROS. Написали тестовый ROS-node для управления Roomba.
я уже включил этот код в состав своего кроссплатформенного мини-фреймворка заточенного для роботов 🙂
в ближайшее время постараюсь написать краткую заметку об этом и выложить наработки 🙂
Здорово! Тоже хочу сделать своего TurtleBot’а, у меня как раз все компоненты есть: румба, подаренная на день рождения, и кинект от иксбокса
Хорошо.
Мы написали три поста по работе с румбой.
Планируем выложить третий, окончательный, в котором будет туториал по сборке и установке ПО для создания тёртлбота. Правда, к сожалению, уже неделю всё время съедают другие проекты.
Надеюсь, к концу этой недели сделаем и выложим.
Если у тебя будут какие-нибудь результаты, пиши сюда в комментарии, будем очень признательны 🙂