•  

    Новостная рассылка

    Подпишитесь и получайте самые свежие новости.
    Подписаться на новостную рассылку
  • Управление внешним оборудованием из MATLAB

    14 апреля 2014 года
    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, если имеете доступ к спецификациям.

    34.jpg
    Рис. 1. Устройство GPS, подключенное к MATLAB.

    Обнаружение и подключение к оборудованию.
    Чтобы найти последовательные устройства и инструменты, доступные для связи, можно использовать следующие команды MATLAB: instrhwinfo, instrfind и serial. В качестве альтернативы можно воспользоваться интерактивным графическим инструментом TMTool, поставляемым с Instrument Control Toolbox, который позволяет находить, настраивать и управлять устройствами и инструментами без написания скриптов в MATLAB (рис. 2). Сначала мы посмотрим на доступное оборудование с помощью иерархического древа.

    2.jpg
    Рис. 2. Запуск TMTool из MATLAB.

    Захват данных с устройства обычно требует установить соединение с ним по поддерживаемому интерфейсу связи. С помощью TMTool мы можем настраивать, управлять и собирать данные с устройств по устоявшимся интерфейсам, включая последовательный, GPIB, TCP/IP и UDP (рис. 3). TMTool также пригоден для связи с инструментами с помощью драйверов VISA, LXI, IVI и VXIplug&play.

    3.jpg
    Рис 3. Интерфейс TMTool.

    Настройка последовательных устройств в MATLAB.
    На рис. 4 раскрыта ветвь с последовательными портами, доступными для связи. GPS приемник настроен на передачу данных в формате NMEA – стандартную опцию для потребительского GPS оборудования.
    После подключения приемника к порту COM1 выбираем окно с настройками (Configure) и устанавливаем их в соответствии с параметрами последовательного порта. NMEA определяет три параметра: скорость передачи 4800 б/с, 8 бит данных, 1 стоп бит и отсутствие бита четности.

    4.jpg
    Рис. 4. Настройка параметров последовательного порта.

    Открываем соединение по последовательному порту после настройки его параметров. Статус соединения изменяется на «Подключено» (Connected), извещая нас о том, что теперь возможно взаимодействие с устройством GPS с помощью диалогового окна Communicate. Стандарт NMEA определяет передачу данных в виде строк, состоящих из символов ASCII и символа перехода на новую строку. С помощью раскрывающегося меню настраиваем параметры приема данных (Receiving data) в соответствии с этими требованиями.

    5.jpg
    Рис. 5. Сбор последовательных данных в TMTool.

    Теперь можно передавать данные оборудованию и получать ответы. Все что нужно для нашего примера – считывать данные, поступающие от GPS. Можно проверить, верность установленного соединения и доступность интересующих нас данных, нажав несколько раз кнопку Read и наблюдая в журнале сообщений, что верно отформатированные строки были захвачены. После нескольких попыток координаты GPS появляются в результатах вместе с несколькими другими типами данных NMEA. В завершение мы закроем соединение с устройством GPS, чтобы это также отразилось в скрипте MATLAB, записывающем все наши действия в TMTool. Этот скрипт мы будем использовать в дальнейшем.

    Повторное использование сессии.
    Единожды настроив порт и чтение данных из устройства, мы можем повторить все эти действия, просто сохранив автоматически сгенерированный скрипт из TMTool в m-файл под названием get_gps_location.m (рис. 6).

    6.jpg
    Рис. 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 из командной строки, создадим новый драйвер с помощью контекстного меню FileNew.

    7.jpg
    Рис. 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 повышает эффективность работы, исключая необходимость изучения и ручного переноса данных из других видов программного обеспечения.

    Загрузить скрипты, используемые в этой статье
    Поддерживаемое оборудование для Instrument Control Toolbox

    Связанные продукты