• Регистрация
alky
alky +22.01
н/д

Использование Matlab с самодельными устройствами

08.12.2019

У любого начинающего радиолюбителя рано или поздно возникает необходимость не просто собирать и анализировать данные на своем самодельном устройстве, но и как-то передавать их на ПК. Во всех случаях встает проблема – а с помощью чего делать ПО для ПК? Освоить построение графиков в языках программирования зачастую стоит несколько дней времени, да и при необходимости что-то изменить возникнут определенные проблемы. Есть разные способы обойти это, и сегодня мы рассмотрим, каким боком к этой проблеме относится Matlab.

Для тех, кто предпочитает читать - добро пожаловать под кат!

Для тех, кому ближе видеоформат, предлагаю посмотреть мой плейлист с видео о получении и передаче данных между Matlab и самодельным устройством, а также созданию и настройке виртуального устройства, если настоящего на руках нет, а тестировать код для обработки в Matlab уже хочется:

Matlab и ваши самодельные устройства

У любого начинающего радиолюбителя рано или поздно возникает необходимость не просто собирать и анализировать данные на своем самодельном устройстве, но и как-то передавать их на ПК. Причины могут быть разными: от требований проекта до сложности обработки. Разными могут быть и задачи на ПК: от банального построения графика до сложных математических алгоритмов обработки. Во всех случаях встает проблема – а с помощью чего делать ПО для ПК? Освоить построение графиков в языках программирования зачастую стоит несколько дней времени, да и при необходимости что-то изменить возникнут определенные проблемы. Есть разные способы обойти это, и сегодня мы рассмотрим, каким боком к этой проблеме относится Matlab.

Для тех, кто не знает, Matlab – это огромный математический пакет со своим языком программирования. В него встроено множество математических функций и алгоритмов, он хорошо работает с матрицами и векторами. Кроме того, как и в любом матпакете, наиболее часто используемые операции здесь реализованы так, чтобы их было легко применить. Так, построить график можно одной короткой строчкой plot(x,y). Но многие скажут, а какое отношение может иметь матпакет к реальным устройствам? Он вообще для других целей. Тут правда, работа с устройствами – не основная задача Matlab, но тем не менее, эта задача может быть решена, а как только она решена, мы можем в полной мере использовать все удобства Matlab в обработке данных.

 

Начнем-с

Перейдем ближе к делу. Первое, что нужно определить – интерфейс, по которому будет подключаться устройство. В данной статье мы рассмотрим только один вариант – последовательный порт (он же COM порт). Есть проекты, где поднимается USB прямо на микроконтроллере, но это более продвинутый вариант. Обычно для новичков характерно использование преобразователей из UART, который есть почти в любом микроконтроллере, в USB в режиме виртуального COM порта. Реализуется это обычно на микросхемах FT232/FT230, CP2102/CP2104, CH334 или другие. В Matlab подключение к порту производится с помощью функции Serial. Однако, прежде чем ее использовать, нужно провести некоторую подготовительную работу.

 

Подготовительный этап

В первую очередь прежде чем пытаться что-либо делать в Matlab нужно удостовериться, что ваше устройство опозналось системой и выяснить номер порта. Это можно сделать в штатном диспетчере устройств.

Рисунок 1 – пример диспетчера устройств

Далее в самом Matlab необходимо выбрать рабочую директорию и создать скрипт, который будет заниматься обработкой данных. В самом скрипте есть несколько опциональных строк кода, которые вы можете использовать или не использовать на ваше усмотрение.

%% PREPARE

close all;

clear;

instrreset;

clc;

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

Вторая строка позволяет закрыть все открытые ранее окна. Полезно, если вы перезапускаете скрипт, в котором у вас выводилось много графиков в разных окнах.

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

Четвертая строка в данном скрипте самая важная и ее отсутствие вызывает самые тяжелые проблемы. Она принудительно закрывает все открытые ранее порты. Без нее вы можете попасть в ситуацию, когда вы пытаетесь подключиться к заведомо существующему порту, но упорно получаете ошибку, что невозможно подключиться. Это может быть по тому, что вы прошлый раз уже открыли порт, а потом скрипт завершился без закрытия порта. Вы очистили переменные, у вас более нет ссылки на порт, но он все еще открыт, а закрыть штатно вы его уже не можете. В таком случае instrreset будет палочкой-выручалочкой.

Ну и последняя строка позволит очистить командное окно, чтобы старые команды вам не мешались.

Если что-то из этого вам не требуется, можете удалить строку или закомментировать. Комментирование на языке Matlab делается одним символом «%». Многострочное комментирование с помощью «%{» и «%}». Отмечу только, что эти метки должны стоять на отдельных строках. Закомментировать кусок кода внутри строки нельзя.

Работа с портом

Наконец-то, мы дошли до работы с портом. Для создания объекта, который будет обеспечивать взаимодействие с портом, воспользуемся функцией serial. А далее работа с полученным объектом идет так же, как и с обычным файлом – функциями fopen/fclose, fread, fwrite.

s = serial('COM3', 'baudrate', 115200);

fopen(s);

Кроме названия порта функция serial принимает еще целый ряд настроек, но обычно достаточно только указания скорости. Задание значения происходит последовательной записью в качестве аргумента сначала названия параметра, а потом – его значения. Например, название – ‘baudrate’, значение – 115200.

Для примера давайте представим, что у нас есть устройство, которое высылает нам данные пакетами следующего вида: 2 байта – метка начала пакета, оба равны 170. Далее 3 байта – значение с датчика. Пример кода ниже позволит постоянно читать приходящие данные и выводить последние 100 из них на график.

vals = [];

times = 1:100;

 

while (1)

    if fread(s,1) == 170

        if fread(s,1) == 170

            b = fread(s,3);

            b = uint8(b);

            val = typecast([b(3), b(2), b(1), 0],'int32');

            val = double(val);

            vals = [vals; val];

            if length(vals)>100

                vals = vals(end-99:end);

            end

            plot(times(1:length(vals)), vals, '.-b');

            drawnow;

        end

    end

end

Сначала мы ищем в потоке приходящих данных метку начала (170), если наткнулись на нее, не спешим радоваться, а смотрим, следует ли за ней вторая половина метки, которая тоже равна 170. Если да, то читаем 3 байта данных, приводим их к без знаковым байтам. С помощью приведения типов typecast преобразуем набор байтов в целое 32-битное число. При этом недостающий старший байт просто берем нулевым. При необходимости приводим значение к числу с плавающей точкой двойной точности (double), которое является типом по-умолчанию в Matlab. Добавляем число в массив, который при необходимости обрезаем. Строим график значения от номера. drawnow позволит сразу перерисовать график.

Небольшую демонстрацию, как это работает, вы можете увидеть в одном из моих видеоуроков:

О том, как можно симулировать устройство с помощью com0com, а так же много других интересных вещей, полезных при использовании Matlab для работы с устройствами, вы найдете в плейлисте на моем канале на YouTube:

 

 

Теги

    08.12.2019

    Комментарии