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