Foto positive
by Raven
Почитать
Случайно о фото
Цифровые изображения и их свойстваДавайте поговорим о разрешении изображений. А точнее - цифровых изображений. Термин "Разрешение" так часто и не всегда к месту используют, что создалась немалая путаница. Любит наука измерять, даже больше чем изучать. И разрешению придумали свою мерку. Да вот беда, мерок придумали далеко не одну. "Разрешением" называют настолько различные параметры изображений, что измеряют его теперь в dpi, ppi, lpi, и даже в MP (мегапикселах). |
Подробнее ... |
R/C: Случайная статья
Продолжаем строить гусеничного робота. |
Подробнее ... |
Строим гусеничного Bluetooth-робота с камерой. Часть 3 |
19.01.2012 12:26 |
В предыдущих сериях: (Под катом бонус - 2 видео) Разделим задачу на простые этапы:
Поскольку у нас используется готовый MotorShield а не голый H-bridge или L293D/L298N, то ничего особенно сложного изобретать не придется. Мы вспользуемся библиотекой AFMotor. Если у вас Motorshield V3 и вам нужна шина SPI — возьмите модифицированный вариант. Комментарии я по привычке чаще всего пишу по-английски, так проще и короче. Объявляем переменные для управления моторами. к 4му порту подключен правый мотор, к 3му — левый.
в зависимости от заданного направления и скорости коммандуем моторам вращаться (для левого мотора):
Для правого мотора то же самое:
lDirection (или rDirection) принимает значения:0 — остановить мотор 1 — вращение вперед 2 — вращение назад. Управление сервоприводами камерыДля управления сервоприводами объявляем два объекта panServo(отвечает за вращение камеры) и tiltServo (отвечает за наклон). Так как сервопривод механический и поворачивается не моментально, то введем переменную для задержки, требуемой приводу для отработки команды на поворот (15 мсек вполне достаточно)
previousMillis и currentMillis используются для того, чтобы в цикле управления не ждать тупо, когда отработает серво. Проверяем — если со времени последней команды не прошло 15 мсек, то командовать сервой бесполезно — она еще занята.Кусок, отвечающий за вращение камеры:
Прием по bluetooth и исполнение команд движения и управления сервоприводами камерыBluetooth модуль с точки зрения Arduino — просто последовательный (UART) порт.Поэтому мы будем в цикле опрашивать проверять — пришло ли что-то от компьютера. Если в буфере что-то нашлось, то ищем в потоке начало пакета — байт $FF (крайние положения сервоприводов и значения скоростей двигателей 255 практически бесполезны — сервы упираются раньше, а скорость 250-255 не отличается, поэтому в потоке такое значение будет встречаться крайне редко и это позволит нам выловить начало пакета, можно увеличить надежность, усложнив алгоритм, но нам вполне хватит и этого). Обнаружив заголовок, принимаем байт, в котором закодировано направление двигателей по 2 бита на двигатель. Затем считываем скорости двигателей — по 1 байту на двигатель (lSpeed, rSpeed) и положения сервоприводов камеры (pan, tilt).
Дальше выделяем направления для правого и левого двигателей
и если направление или скорость изменились с последней принятой команды, то устанавливаем скорости двигателей и вращаем камеру.Вот и весь основной рабочий цикл:
Как видите, проще уже практически некуда :)Скачать скетч можно со страницы проекта в Google code. Исполнять команды мы шасси научили. Теперь надо научиться отправлять их. Кому лень разбираться в программировании или неохота ставить Delphi, могут скачать скомпилированный вариант (работает с джойстиком Logitech Extreme 3D Pro или китайским геймпэдом EasyTouch). С остальными идем дальше :) Нам понадобится:
Вычисление скорости моторов для задания направления движенияДвижение вперед и назад сложностей не вызывает — просто задаем одинаковые скорости левого и правого моторово и одинаковое направление.Для поворотов в движении вводим понятие Steer — значение отклонения от прямого движения. Скорости двигателей вычисляем для движения вперед и назад так:
То есть при движении вперед из скорости левого двигателя отклонение вычитаем, к скорости правого — прибавляем. Получается эффект подтормаживания одной из гусениц и шасси плавно поворачивает, не останавливаясь полностью. При движении назад знаки просто меняются.Ну и проверяем, не вышла ли скорость за максимально допустимые значения. В частности, это пригодится тем, у кого питание моторов напряжением выше чем им положено — просто ограничьте максимальную скорость и моторы будут целы. Примеры по управлению: ехать вперед — направление обоим моторам «1», скорость одинаковую ехать назад — направление обоим моторам «2», скорость одинаковую для поворота в вдвижении влево/вправо задаем направление одинаковое, скорости разные. Поворачивает в сторону, скорость которой меньше. для поворота на месте — скорость одинаковая, направление моторов разное — развернется вокруг центра. остановка — обоим моторам направление «0» Передача управляющих пакетов по bluetoothПри добавлении bluetooth модуля в ПК образуется 2 виртуальных COM порта — один входящий, один исходящий.Для подключения к роботу нужно всего навсего открыть исходящий порт. Можно определить в списке портов в настройках bluetooth или методом перебора — при подключении к правильному программа не будет ругаться и светодиод на модуле перестает мигать — соединение установлено, можно считать, что мы подключены напрямую к роботу.
Для удобства я написал небольшой класс TRCTank, который реализует все действия по связи с роботом.
Connect и Disconnect по сути просто открывают/закрывают порт ну и проверяют, текущее состояние, чтобы не пытаться открыть открытый или закрыть закрытый порт. Чтобы послать команду роботу формируем заголовок, который будет ловить робот (у нас байт с кодом 255). А затем записываем команды в том порядке, как их ждет робот. Получается такая структура
В функции отправки команды единственный момент, который стоит упомянуть — упаковка направлений для обоих двигателей в один байт смещением на 2 бита. Остальное очевидно.
Подключение джойстика для удобства управленияК сожалению, документации по работе с HID устройствами толковой в интернете не так много. В итоге я перебрал кучу устаревших кодов, которые отправляют к работе еще через midi порт или рассматривают джойстики как устройство с 2мя осями и 4 кнопками. Меня такой вариант не устраивал. Информации по компоненту TjvJoystick вообще нигде не было, поэтому наткнулся я на него случайно. А жаль, к этому моменту я уже написал свой компонент :) Так что если не поленитесь разобраться, то можете воспользоваться готовым компонентом из JEDI VCL.Я же работаю с HID устройством напрямую и анализирую Report от него побайтово. Зато доступны все оси джойстика (у EasyTouch их 4) и все кнопки (10-12 у моих джойстиков). Работает это так: с помощью компонента TjvHIDDeviceController на форме мы получаем список HID устройств в системе и выводим в комбобокс. Выбранный девайс отдаем объекту класса TRjoystick вызовом SelectJoystickByID(VID, PID: Word); (Выбирается по VendorID и ProductID — их можно посмотреть например в диспетчере устройств системы). Класс TRjoystick выполняет checkout, получая возможность принимать репорты от джойстика, расшифровывает значения, устанавливает свойства кнопок и осей и вызывает процедуру обработчика. В нашей программе обработчик выглядит так:
Сначала приводим сырые значения координат осей к диапазону скоростей -256..256 и направлений -127..128. Поскольку при линейном управлении на малых значениях скоростей моторам не хватит сил сдвинуть с места робота, то вводим небольшие мертвые зоны (опытным путем) — двигаться будет только начиная с некоторого значения скорости. (ApplyDeadZone(Speed,DeadX); ApplyDeadZone(Steer,DeadY);) После того, как учли руль направления, проверяем, что скорости не вылезли за диапазон, показываем на форме ползунками наглядно скорости моторов. Затем в зависимости от положения шляпы меняем направление камеры или центруем ее, также проверяем ограничения (сервы упираются механически обычно раньше, чем достигают цифровых пределов управления). отображаем положение камеры на другой паре ползунков, выводим скорости и отправляем команду танку.
В коде есть еще различные эксперименты, куски, отвечающие за сохранение выбранных порта и джойстика, сохранение и загрузку пределов управления и центровки камеры, есть возможность вернуть управление не джойстиком, а непосредственно дергая за ползунки скорости и направления. Но это не касается основной задачи управления. Можете пользоваться кодом как вам больше нравится, даже можете «устроить BolgenOS» если захочется :) Скачать исходники R BT RC Tank можно на сайте проекта в Google code. Я попытался снять процесс управления от первого лица, но съемка экрана камерой — неблагодарное занятие, вышло довольно посредственно. Но общий смысл понятен. |
Комментарии
RSS лента комментариев этой записи