Данная статья демонстрирует, как использовать MATLAB и Instrument Control Toolbox для работы с различными внешними устройствами на примере переносного приемника GPS компании Garmin с последовательным интерфейсом RS-232.
Trent Jarvi, MathWorks
Многие пользователи MATLAB, которые анализируют данные, разрабатывают и проверяют алгоритмы или создают приложения, покидают среду MATLAB для импорта данных с внешнего оборудования. Этот дополнительный шаг снижает эффективность работы, вынуждая пользователей вручную переносить данные из одной среды в другую, а также обучаться работе в нескольких средствах программного обеспечения.
Данная статья демонстрирует, как использовать MATLAB и Instrument Control Toolbox для работы с различными внешними устройствами на примере переносного приемника GPS компании Garmin с последовательным интерфейсом RS-232. Здесь объясняется, как наладить обмен данными и взаимодействовать с последовательными устройствами, а также сгенерировать скрипт MATLAB, который может быть передан другим пользователям, повторно использован или добавлен в приложения, разработанные в MATLAB.
Используемый в этой статье код MATLAB доступен для загрузки.
GPS приемник компании Garmin.
Устройства с последовательным интерфейсом RS-232, такие как приемники GPS и инструменты, такие как осциллографы и генераторы сигналов, могут быть настроены и управляться из MATLAB с Instrument Control Toolbox (рис. 1). Наш пример использует 12-канальное устройство GPS потребительского класса серии ETrex обычно используемое при пешем туризме и плавании на малых судах. В примере используется протокол обмена данными Национальной Ассоциации Морской Электроники (NMEA) 183, который должен работать с любым GPS устройством, поддерживающим последовательное соединение. Вы можете использовать другие протоколы, в том числе и запатентованный протокол компании Garmin, если имеете доступ к спецификациям.
Рис. 1. Устройство GPS, подключенное к MATLAB.
Обнаружение и подключение к оборудованию.
Чтобы найти последовательные устройства и инструменты, доступные для связи, можно использовать следующие команды MATLAB: instrhwinfo, instrfind и serial. В качестве альтернативы можно воспользоваться интерактивным графическим инструментом TMTool, поставляемым с Instrument Control Toolbox, который позволяет находить, настраивать и управлять устройствами и инструментами без написания скриптов в MATLAB (рис. 2). Сначала мы посмотрим на доступное оборудование с помощью иерархического древа.
Рис. 2. Запуск TMTool из MATLAB.
Захват данных с устройства обычно требует установить соединение с ним по поддерживаемому интерфейсу связи. С помощью TMTool мы можем настраивать, управлять и собирать данные с устройств по устоявшимся интерфейсам, включая последовательный, GPIB, TCP/IP и UDP (рис. 3). TMTool также пригоден для связи с инструментами с помощью драйверов VISA, LXI, IVI и VXIplug&play.
Рис 3. Интерфейс TMTool.
Настройка последовательных устройств в MATLAB.
На рис. 4 раскрыта ветвь с последовательными портами, доступными для связи. GPS приемник настроен на передачу данных в формате NMEA – стандартную опцию для потребительского GPS оборудования.
После подключения приемника к порту COM1 выбираем окно с настройками (Configure) и устанавливаем их в соответствии с параметрами последовательного порта. NMEA определяет три параметра: скорость передачи 4800 б/с, 8 бит данных, 1 стоп бит и отсутствие бита четности.
Рис. 4. Настройка параметров последовательного порта.
Открываем соединение по последовательному порту после настройки его параметров. Статус соединения изменяется на «Подключено» (Connected), извещая нас о том, что теперь возможно взаимодействие с устройством GPS с помощью диалогового окна Communicate. Стандарт NMEA определяет передачу данных в виде строк, состоящих из символов ASCII и символа перехода на новую строку. С помощью раскрывающегося меню настраиваем параметры приема данных (Receiving data) в соответствии с этими требованиями.
Рис. 5. Сбор последовательных данных в TMTool.
Теперь можно передавать данные оборудованию и получать ответы. Все что нужно для нашего примера – считывать данные, поступающие от GPS. Можно проверить, верность установленного соединения и доступность интересующих нас данных, нажав несколько раз кнопку Read и наблюдая в журнале сообщений, что верно отформатированные строки были захвачены. После нескольких попыток координаты GPS появляются в результатах вместе с несколькими другими типами данных NMEA. В завершение мы закроем соединение с устройством GPS, чтобы это также отразилось в скрипте MATLAB, записывающем все наши действия в TMTool. Этот скрипт мы будем использовать в дальнейшем.
Повторное использование сессии.
Единожды настроив порт и чтение данных из устройства, мы можем повторить все эти действия, просто сохранив автоматически сгенерированный скрипт из TMTool в m-файл под названием get_gps_location.m (рис. 6).
Рис. 6. Автоматически сгенерированный из TMTool скрипт MATLAB.
Обработка данных GPS.
Мы настроили оборудование и записали данные, однако в них есть много лишней, не относящейся к местоположению информации, такой как путевые отметки и время снятия отсчетов. Мы можем добавить функции, выполняющие фильтрацию потока данных, в автоматически сгенерированный скрипт для работы с оборудованием.
% Create a serial port object.
obj1 = instrfind('Type','serial','Port','COM4','Tag','');
% Create the serial port object if it does not exist
% otherwise use the object that was found.
if isempty(obj1)
obj1 = serial('COM4');
else
fclose(obj1);
obj1 = obj1(1);
end
% Set BaudRate at 4800.
obj.BaudRate = 4800;
% Connect to instrument object, obj1.
fopen(obj1);
% We only want the strings with $GPGLL…
data='';
while isempty(strmatch('$GPGLL',data))
data = fscanf(obj1);
end
% Parse the string to obtain coordinates
[lat,data] = strtok(data,',');
[lat,data] = strtok(data,',');
[nsCardinal,data] = strtok(data,',');
[long,data] = strtok(data,',');
[ewCardinal,data] = strtok(data,',');
lat = str2double(lat);
long = str2double(long);
% Display the results
disp({lat,nsCardinal,long,ewCardinal});
% Free the serial port
fclose(obj1);
Для захвата и обработки данных GPS достаточно просто запустить скрипт MATLAB_GPS_example.m из командной строки.
Создание универсального драйвера.
Только что рассмотренный подход будет достаточным для некоторых приложений, однако можно добиться еще большей автоматизации процесса обработки, добавив скрипт MATLAB к драйверу многократного использования. Это можно сделать с помощью инструмента для создания драйверов MIDEdit, входящего в состав Instrument Control Toolbox (рис. 7). Данный инструмент позволяет включить низкоуровневые команды в команды более высокого уровня, с которыми проще и удобнее работать. После запуска MIDEdit из командной строки, создадим новый драйвер с помощью контекстного меню FileNew.
Рис. 7. Создание драйвера с функцией getLocation с помощью MIDEdit.
В демонстрационных целях мы создадим драйвер в MATLAB, имеющий всего две функции: настройку устройства GPS и получение расположения. Однако MIDEdit позволяет создавать и более продвинутые драйверы, состоящие из сотен строк кода.
Для настройки устройства мы воспользуемся уже рассмотренным скриптом, который устанавливает скорость передачи данных и открывает порт. В MIDEdit выберем окно Connect в разделе Initialization and Cleanup и установим опцию Function style в значение M-code. Теперь скопируем скрипт из TMTool в функцию, созданную в редакторе драйверов. Отметим, что последовательный интерфейс может быть получен из переменной obj подаваемой в эту функцию. Скрипт MATLAB настроен на использование последовательного порта.
Чтобы считать GPS координаты, выберем раздел Function в MIDEdit и добавим новую функцию getLocation(). Эта функция будет получать широту, долготу и сторону света. В панели редактора MATLAB кода вставим скрипт, считывающий строки NMEA. Как и в первом примере, изменим функцию getLocation() так, чтобы она находила в потоке данных только GPS координаты и возвращала их в виде массива. Мы могли бы добавить больше функций для нахождения каждого типа информации NMEA. В завершение сохраним драйвер в workspace как nmeareveiver.mdd.
Использование универсального драйвера.
Драйвер готов к использованию с GPS устройством. В TMTool раскроем вкладку Instrument Drivers и создадим новый объект интерфейса (interface object) щелкнув правой кнопкой по вкладке interface object. Выбираем последовательный порт в раскрывающемся меню Interface object type и выбираем порт, к которому подключено устройство. Объект интерфейса будет настроен, открыт и считан согласно процессу, описанному в предыдущих секциях, но в этот раз мы будем использовать драйвер инструмента для задач захвата и анализа данных.
Теперь создадим новый объект устройства (device object) во вкладке Device Object и выберем драйвер nmeareceiver.mdd. Затем мы подключим GPS устройство к последовательному порту через интерфейс объекта. Интерфейс можно изменить, если устройство и драйвер поддерживают больше одного интерфейса. После завершения этих операций nmeareceiver появится под вкладкой Device Object.
Теперь мы можем подключиться к GPS с помощью кнопки Connect. В окне функций запустим функцию getLocation(), в результате чего будет считано текущее расположение. Результаты могут быть экспортированы в workspace для дальнейшего анализа.
Когда вы выполняете действия с драйвером в TMTool, автоматически генерируется cкрипт MATLAB. Как и в прошлом примере при работе с GPS устройством без драйвера, этот сгенерированный скрипт позволяет повторно использовать проделанную работу для связи с устройством.
% Create a SERIAL object.
interfaceObj = serial('COM4');
% Create a device object.
deviceObj = icdevice('nmeareceiver.mdd', interfaceObj);
% Connect device object to hardware.
connect(deviceObj);
% Call the getLocation function.
invoke(deviceObj, 'getLocation');
%...
% Disconnect device object from hardware.
disconnect(deviceObj);
Можно повысить пригодность драйвера к повторному использованию, добавив функции для отметки высот, даты, времени и точек маршрута. Драйвер может быть передан пользователям, которым не нужно разбираться в деталях как взаимодействовать с их устройствами.
Итоги.
Для демонстрации настройки и захвата данных с внешних устройств из среды MATLAB, было выбрано устройство GPS. Мы использовали графические инструменты из Instrument Control Toolbox и не писали скриптов вручную. Затем мы показали, как повторно использовать проделанную работу по настройке оборудования с помощью автоматически сгенерированных скриптов и как добавить дополнительный функционал через драйверы. Использование MATLAB повышает эффективность работы, исключая необходимость изучения и ручного переноса данных из других видов программного обеспечения.