ГЛАВА 7. РАБОТА МОДУЛЯ TRACKINGCAMС ADRUINO СОВМЕСТИМЫМ КОНТРОЛЛЕРОМ

Помимо интерфейса Dynamixel для работы с конструкторами Robotis как Dynamixel-совместимое устройство модуль TrackingCam обладает набором стандартных интерфейсов, таких как UART, SPI, I2C, с помощью которых его можно подключать к широкому кругу других вычислительных устройств.

Одним из самых популярных вычислительных модулей в наше время является аппаратная платформа Arduino, во-первых, обладающая широким набором популярных интерфейсов для обмена данными с периферийными устройствами, и во-вторых, доступная для программирования из простой среды разработки — Arduino IDE. Несмотря на существующее в настоящее время обильное разнообразие как оригинальных, так и китайских копий, а так же Arduino-совместимых и Arduino-подобных плат, все эти аппаратные платформы объединяет возможность их программирования из среды Arduino IDE.

Таким образом, процесс использования модуля TrackingCam c любой Arduino-подобной платой практически не отличается от использования модуля с оригинальной Arduino-платой. В качестве примера рассмотрим процесс работы с модулем технического зрения на примере использования оригинальной платы Arduino Mega 2560 и Arduino-подобной платой

  • программируемым контроллером «ТЕХНОЛАБ». Для обмена данными между модулем и платой остановимся на самом популярном интерфейсе обмена данными UART. Посколько и Arduino Mega 2560 и программируемый контроллер «ТЕХНОЛАБ» имеет несколько аппаратных интерфейсов UART, то при подключении необходимо понимать к какому именно каналу выполняется подключение модуля TrackingCam. В случае Mega2560 для подключения доступны интерфейсы UART1(Rx1/Tx1), UART2(Rx2/Tx2) и UART3(Rx3/Tx3), а в случае программируемого контроллера «ТЕХНОЛАБ» — UART1(Rx1/Tx1) и UART3(Rx3/Tx3), т.к. UART2 зарезервирован под установленный на борту Bluetooth модуль.

Подключение модуля TrackingCam осуществляется с помощью 4-ех проводного соединения, где 2 проводника осуществляют питание модуля, а остальные — обмен данными. Со стороны камеры подключение выполняется к выводам 10-пинового разъема, как это можно увидеть на рис. 7.1

Рис. 7.1 Схема расположения выводов UART интерфейса TrackingCam

К платам Arduino Mega2560 и ТЕХНОЛАБ телекамера подключается в соответствии с таблицей 7.1

TrackingCam Обозначение на плате Arduino Mega2560 Обозначение на плате ТЕХНОЛАБ Назначение
Контакт Цепь
2 +5 5V +5V Питание +5 В от Arduino
4 - GND GND Питание 0 В от Arduino
5 TX RX1 UART1 RXD UART TX Arduino RX телекамеры
6 RX TX1 UART1 TXD UART TX Arduino RX телекамеры

Таблица 7.1 Соединение выводов телекамеры TrackingCam и различных отладочных плат через интерфейс UART

Рис. 7.2 Вариант подключения TrackingCam к Arduino Mega 2560 Рис. 7.3 Вариант подключения TrackingCam к контроллеру ТЕХНОЛАБ

Несмотря на то, что камера имеет свободный 5-ти вольтовый вывод, от него нельзя брать питание для подключения дополнительных внешних устройств, таких как сенсоры или различные периферийные модули. На стороне Arduino Mega2560 подключение выглядит как показано на рисунке 7.2

На стороне программируемого контроллера «ТЕХНОЛАБ» подключение выполняется к линии UART1 выглядит как показано на рис 7.3

После подключения модуля можно приступать к работе с ним. Перед тем, как начать опрос модуля необходимо его настроить на распознавание какого-либо предмета, например, оранжевого шарика. Обратите внимание, что не рекомендуется одновременно осуществлять питание модуля и со стороны Arduino и со стороны ПК по USB-кабелю. Перед подключением модуля к ПК для настройки рекомендуется обесточить вычислительную платформу.

Когда модуль TrackingCam настроен на распознавание какого-либо предмета, его необходимо отключить от компьютера, и подключить к компьютеру платформу Arduino. После этого на нее сразу пойдет питание и она начнет свою работу в штатном режиме.

Для получения данных о распознанных областях напишем управляющую программу (скетч) в среде Arduino IDE. Несмотря на то, что модуль камеры подключен к платформе через интерфейс UART обмен данными ведется с помощью протокола Dynamixel, который необходимо реализовать. Для упрощения работы с модулем TrackingCam с помощью Arduino или Arduino-подобной платы разработана специальная библиотека, задача которой организовывать обмен данными по протоколу Dynamixel и выдавать полученные значения в удобочитаемом виде. Вне зависимости от типа платформы Arduino и Arduino-подобной платы существует одна версия библиотеки — для Mega-подобных плат и для UNO-подобных плат, которая называются TrackingCamDxlUart. Для работы с библиотекой рекомендуется использовать Arduino IDE версии не ниже 1.6.5.

Рис. 7.4 Библиотека TrackingCamDxlUart для Arduino IDE

Прежде чем начать использование библиотеки, ее необходимо интегрировать в среду разработки. Это делается стандартным способом — в среде Arduino IDE необходимо выбрать пункт меню Скетч — затем Подключить библиотеку, а затем Добавить .ZIP библиотеку... В открывшемся диалоговом окне потребуется указать местонахождение zip-архива с библиотекой и, выбрать ее, нажав кнопку Выбрать. После чего в окне вывода среды появится сообщение об успешном добавлении библиотеки. В результате этих действий библиотека будет интегрирована в среду и появится в списке установленных библиотек, а так же появятся примеры применения этой библиотеке в меню Файл — Примеры — TrackingCamDxlUart (рис. 7.4).

Рассмотрим примеры подробнее. Для использования модуля TrackingCam в качестве примеров предложено рассмотрение двух основных режимов использования модуля: получения информации о распознанных однотонных областях (Blobs), относящихся к одному предмету, либо же получение данных о распознанных объектах композиции нескольких одноцветных областей. Начнем с примера получения данных о распознанных одноцветных областях.

Поскольку весь процесс обмена данными с камерой по протоколу Dynamixel реализован в библиотеке, то прежде всего в новом скетче необходимо эту библиотеку подключить. Эта команда будет выглядеть следующим образом:

#include «TrackingCamDxlUart.h»

После этого необходимо проинициализировать модуль технического зрения, путем присвоения ему уникального имени:

TrackingCamDxlUart trackingCam;

Таким образом, при необходимости, можно подключить несколько модулей к одной плате и обращаться к каждой из них в отдельности по присвоенному уникальному имени. Следующим шагом необходимо выполнить подключение к модулю и ПК для вывода данных на экран. Обратите внимание на этот шаг если при разработке собственной программы возникнет необходимость выводить какие-либо отладочные данные на экран ПК, то уже не потребуется еще раз устанавливать соединение с помощью Serial.begin(). Подключение модуля TrackingCam выполняется в основной функции скетча void setup с помощью функции TrackingCamDxlUartInit, которой надо указать следующие параметры:

CAM_ID — ID модуля, как Dynamixel-совместимого устройства — по умолчанию — 51.

Serial_port — номер UART, к которому выполняется подключение модуля1, если подключение выполнено к UART1(Rx1/Tx1), 2 — если к UART2(Rx2/ Tx2), 3 — если к UART3(Rx3/Tx3). Так же возможно подключение к порту 0 — UART(Rx/Tx), однако, здесь необходимо помнить что этот порт, как правило, зеркалирован с USB выходом Arduino-платы. По умолчанию используется UART1.

CAM_BaudRate — скорость на которой ведется обмен данными между модулем и Arduino-платой. Для настройки этого параметра со стороны камеры необходимо использовать приложение TrackingCam App и в окне Setup указать тип соединения по UART — Full Duplex и скорость обмена данными. По умолчанию рекомендуется скорость 115200.

PC_BaudRate — скорость обмена данными между Arduino-платой и компьютером через USB соединение. Рекомендуется 115200.

TrackingCamTimeout — время ожидания отклика камеры — по умолчанию 30 мс.

Поскольку подключение выполняется строго определенного модуля — по уникальному присвоенному ему имени (trackingCam), то в результате команда подключения будет выглядеть следующим образом:

trackingCam.TrackingCamDxlUartInit(51, 1, 115200, 115200, 30);

На этом процесс подключения камеры закончен. С ней можно обмениваться данными. Обмен данными будет реализован в функции void loop, т.к. это бесконечный процесс. Для этого необходимо внутри функции void loop объявить и инициализировать переменную для хранения в ней информации о количестве найденных областей:

uint8_t n=0;

Затем вызовем функцию, отвечающую за получение информации о распознанных областях. В качестве аргумента эта функция возвращает количество распознанных областей, которое мы и запишем в созданную ранее переменную. Выглядеть эта часть кода будет следующим образом:

n = trackingCam.TrackingCamDxl_ReadBlobs();

Для информативности выведем на экран количество найденных областей:

Serial.println(n);

И в случае если это количество больше нуля выведем информацию о первой найденной области. Для этого используем конструкцию

if (n)

{

...

}

внутрь которой на место ... поместим последовательность функций Serial. print() в следующих формах:

Получение номера области:

Serial.print(trackingCam.blob[0].type, DEC);

Пробел между данными:

Serial.print(« «);

Получение номера шаблона соответствия:

Serial.print(trackingCam.blob[0].dummy, DEC);

Центр распознанной области по оси Х:

Serial.print(trackingCam.blob[0].cx, DEC);

Центр распознанной области по оси Y:

Serial.print(trackingCam.blob[0].cy, DEC);

Площадь распознанной области:

Serial.print(trackingCam.blob[0].area, DEC);

Отступ слева:

Serial.print(trackingCam.blob[0].left, DEC); Отступ справа:

Serial.print(trackingCam.blob[0].right, DEC);

Отступ сверху:

Serial.print(trackingCam.blob[0].top, DEC);

Отступ снизу:

Serial.print(trackingCam.blob[0].bottom, DEC);

Перед завершением цикла void loop рекомендуется добавить паузу в 20 мс с помощью

delay(20);

для организации задержки между опросами модуля и тем самым повышения стабильности выдачи результатов. На этом программа для обмена данными с модулем TrackingCam и получения данных о распознанных однотонных областях готова.

Следующий пример предназначен для обмена данными с модулем и получения информации о распознанных объектах. Код этого примера отличается от предыдущего только названием функции получения

данных — в данном случае используется TrackingCamDxl_ReadObjects() вместо TrackingCamDxl_ReadBlobs() и в массиве с данными распознанных областей здесь он называется obj[i]. Так же различия заключаются в выводе данных в данном случае данные выводятся о всех найденных объектах, и поэтому используется цикл for для перебора всех объектов. Что касается данных, которые можно получить об объекте, то здесь они следующие:

Serial.print(trackingCam.obj[i].type, DEC);

Тип объекта:

Центр объекта по оси Х:

Serial.print(trackingCam.obj[i].cx, DEC);

Serial.print(trackingCam.obj[i].cy, DEC);

Центр объекта по оси Y:

Serial.print(trackingCam.obj[i].angle, DEC);

Угол поворота объекта:

Serial.print(trackingCam.obj[i].obj_size, DEC);

Размер объекта:

Таким образом пример получения данных о распознанных объектах подобен примеру получения данных о распознанных областях. Полный исходный код примеров представлен ниже:

TrackingCamDxlUart_ReadBlobs.ino 
#include «TrackingCamDxlUart.h»

TrackingCamDxlUart trackingCam; 
void setup() {

/*TrackingCamDxlUartInit(CAM_ID, Serial_port, CAM_BaudRate, PC_BaudRate, TrackingCamTimeout);

- CAM_ID - default 51
- Serial_port:
- Serial (Rx\Tx) - 0
- Serial1 (Rx1\Tx1) - 1
- Serial2 (Rx2\Tx2) - 2
- Serial3 (Rx3\Tx3) - 3
- CAM_BaudRate - default 115200
- PC_BaudRate - default 115200
- TrackingCamTimeout - in ms - default 30

- /

trackingCam.TrackingCamDxlUartInit(51, 1, 115200, 115200, 30);

}

void loop() { uint8_t n = 0;

//read data about blobs

n = trackingCam.TrackingCamDxl_ReadBlobs();

//print numbers of blobs Serial.println(n);

//print information about first blob if(n)

{

Serial.print(trackingCam.blob[0].type, DEC); Serial.print(« «); Serial.print(trackingCam.blob[0].dummy, DEC); Serial.print(« «); Serial.print(trackingCam.blob[0].cx, DEC); Serial.print(« «); Serial.print(trackingCam.blob[0].cy, DEC); Serial.print(« »); Serial.print(trackingCam.blob[0].area, DEC); Serial.print(« »); Serial.print(trackingCam.blob[0].left, DEC); Serial.print(« »); Serial.print(trackingCam.blob[0].right, DEC); Serial.print(« »); Serial.print(trackingCam.blob[0].top, DEC); Serial.print(« »); Serial.print(trackingCam.blob[0].bottom, DEC); Serial.print(« »);

}

delay(20); // delay in between reads for stability

}

TrackingCamDxlUart_ReadObjects.ino #include «TrackingCamDxlUart.h»

TrackingCamDxlUart trackingCam; void setup() {

/*

- TrackingCamDxlUartInit(CAM_ID, Serial_port, CAM_BaudRate, PC_BaudRate, TrackingCamTimeout);
- CAM_ID - default 51
- Serial_port:
- Serial (Rx\Tx) - 0
- Serial1 (Rx1\Tx1) - 1
- Serial2 (Rx2\Tx2) - 2
- Serial3 (Rx3\Tx3) - 3
- CAM_BaudRate - default 115200
- PC_BaudRate - default 115200
- TrackingCamTimeout - in ms - default 30

*/

trackingCam.TrackingCamDxlUartInit(51, 1, 115200, 115200, 30);

}

void loop() { uint8_t n = 0;

//read data about objects

n = trackingCam.TrackingCamDxl_ReadObjects();

//print numbers of objects Serial.println(n);

//print information about all objects Serial.println(«\nAll objects:»); for(int i = 0; i < n; i++)

{

Serial.print(trackingCam.obj[i].type, DEC); Serial.print(« «); Serial.print(trackingCam.obj[i].cx, DEC); Serial.print(« «); Serial.print(trackingCam.obj[i].cy, DEC); Serial.print(« «); Serial.print(trackingCam.obj[i].angle, DEC); Serial.print(« «); Serial.print(trackingCam.obj[i].obj_size, DEC); Serial.println(« »);

}

delay(20); // delay in between reads for stability

}


Center-nav

← Назад | Оглавление | Вперёд →