В этом примере показано, как оценить Остающийся срок полезного использования (RUL) зубчатой передачи сервопривода посредством потоковой передачи в реальном времени данных о сервоприводе от основанной на Arduino системы сбора данных до ThingSpeak и с ThingSpeak на механизм оценки RUL, запускающийся в MATLAB.
Моторный текущий анализ подписи (MCSA) текущего сигнала, управляющего сервоприводом хобби, используется, чтобы извлечь частотный диапазон (спектральные) функции из нескольких необходимых областей частоты, показательных из отказов двигателя и зубчатой передачи. Комбинация функций используется, создают Медицинский индикатор (HI) для последующей оценки RUL.
MCSA является полезным методом для диагноза отказов, которые вызывают крутящий момент или колебания скорости зубчатой передачи сервомотора, которые в свою очередь приводят к коррелированым моторным текущим изменениям. MCSA, как доказывали, был идеален для моторного анализа отказа как, только моторный текущий сигнал требуется для анализа, который избавляет от необходимости дополнительное и дорогое оборудование обнаружения. Обнаружение отказа механизма с помощью традиционных датчиков вибрации сложно, особенно в случаях, где зубчатая передача не легкодоступна для инструментирования с акселерометрами или другими датчиками вибрации.
Этот пример иллюстрирует, как создать потоковую передачу данных реального времени, извлечение признаков и систему оценки RUL с помощью простых, стандартных компонентов, подходящих для образовательных упражнений лаборатории или для прототипирования промышленного применения. Чтобы запустить этот пример без оборудования, используйте sendSyntheticFeaturesToThingSpeak
функция, чтобы сгенерировать синтетические данные.
Упрощенный рабочий процесс, чтобы создать систему потоковой передачи данных и механизм оценки RUL включает следующие шаги:
Разработайте оборудование и систему сбора данных с помощью стандартных компонентов.
Потоковые данные реального времени от микроконтроллера как ООН Arduino к MATLAB.
Обработайте данные реального времени в MATLAB, чтобы извлечь функции и передать функции потоком к облаку с помощью ThingSpeak.
Передайте данные об облаке потоком к механизму оценки и визуализации RUL в MATLAB.
В данном примере данные об электрическом токе были собраны от стандартного сервомотора хобби Futaba S3003, который был изменен для непрерывного вращения. Сервомоторы преобразуют высокую скорость внутреннего двигателя постоянного тока к высокому крутящему моменту в их выходном вале. Чтобы достигнуть этого, сервомоторы состоят из двигателя постоянного тока, набора нейлона или металлических пар механизма и схемы управления. Схема управления была демонтирована, чтобы смочь применяться, постоянное 5-вольтовое напряжение к двигателю постоянного тока ведет непосредственно, и позвольте току через двигатель постоянного тока быть проверенным через текущий резистор обнаружения.
Второй, противостоящий сервомотор с его терминалами двигателя постоянного тока, шунтируемыми вместе через низкоомный резистор, использовался, чтобы сгенерировать загрузку противопоставления высокого крутящего момента для сервомотора драйвера, чтобы ускорить ухудшение зубчатой передачи и вызвать большие изменения моторного текущего сигнала для анализа MCSA.
Сервомотор Futaba S3003 состоит из четырех пар запутывающих нейлоновых механизмов, как проиллюстрировано в рисунке ниже. Шестерня P1 на вале двигателя постоянного тока поймала в сети со ступенчатым механизмом G1. Шестерня P2 является прессованной частью ступенчатого механизма G1 и поймал в сети со ступенчатым механизмом G2. Шестерня P3, который является прессованной частью механизма G2, поймала в сети со ступенчатым механизмом G3. Свяжите P4, который прессуется с G3, сетками с итоговым механизмом G4, который присоединен к выходному валу. Ступенчатый механизм устанавливает G1 и P2, G2 и P3, и G3 и P4 являются свободными механизмами вращения то есть, они не фиксируются к их соответствующим валам. Набор механизмов обеспечивает 278:1 сокращение, идущее от частоты вращения двигателя приблизительно 6 117 об/мин приблизительно к 22 об/мин в выходном вале, когда двигатель постоянного тока управляется на уровне 5 вольт.
Следующая таблица обрисовывает в общих чертах зубное количество и теоретические значения выходной скорости, частот mesh механизма и совокупного сокращения механизма в каждой mesh механизма.
Скорость вращения выходного вала сервомотора была измерена с помощью инфракрасного фотопрерывателя наряду с 40 мм в диаметре, 3-D распечатал tacho колесо с 16 пазами. Эти шестнадцать пазов на колесе равномерно распределены, и фотопрерыватель IR был помещен таким образом, что было точно шестнадцать импульсов на вращение колеса. Сервомоторы и фотопрерыватель были сохранены на месте распечатанным 3-D, монтируется.
Ведущий двигатель постоянного тока управлялся на уровне постоянных 5 вольт, и с четырьмя парами механизмов, обеспечивающих 278:1 сокращение скорости, выходная скорость вала имела среднее значение 22 об/мин. Колебания выходной скорости и соответствующих изменений в моторном токе из-за запутывающего механизма и зубное ухудшение механизма в зависимости от времени получались датчиками для последующего анализа в MATLAB.
Текущее потребление через обмотки двигателя постоянного тока было вычислено с помощью закона Ома путем измерения падения напряжения через 0,5 Ома, резистора на 0,5 Вт. Поскольку изменение в текущих значениях измерения слишком было мало для высококачественного обнаружения, текущий сигнал был усилен 20 раз с помощью усилителя интерфейса датчика одно предоставления (Аналоговые устройства AD22050N). Усиленный текущий сигнал был затем отфильтрован с помощью сглаживающегося пятого порядка эллиптический фильтр lowpass (Максим MAX7408), чтобы сглаживать его и устранить шум прежде, чем отправить его в контакт аналого-цифрового конвертера (ADC) на ООН Arduino. Угловая частота фильтра сглаживания была помещена приблизительно в 470 Гц, чтобы обеспечить вполне достаточное затухание на частоте Найквиста (750 Гц) аналого-цифрового конвертера.
Электронная схема была понята на прототипной печатной плате (PCB) с помощью небольшого количества дополнительных пассивных компонентов как показано в изображении ниже.
Когда блок-схема показывает ниже, Arduino ООН произвела текущий сигнал через вход ADC в частоте дискретизации на 1 500 Гц и передала ее потоком к компьютеру, наряду с импульсами тахометра, по каналу последовательной передачи, запускающемуся на скорости в бодах 250 000 бит/с.
Для данных в этом примере последовательное сообщение кодировалось на ООН Arduino как три 8-битных двоичных значения на выборку данных (текущий + tacho), чтобы повысить эффективность последовательной передачи с компьютером.
ООН Arduino закодировала моторный ток и tacho импульсные значения в бинарный буфер для КПД и отправила пакеты данных к компьютеру, состоящему из 16 384 (2^14) выборки каждые 5 минут. Данные были отправлены от ООН Arduino на уровне 1 500 Гц с помощью простого протокола данных, состоящего из маркеров начала и конца вокруг байтов данных для легкой экстракции пакетов данных в коде MATLAB.
Смотрите присоединенный файл эскиза Arduino servo_data_producer.ino
для получения дополнительной информации и передавать данные потоком к MATLAB от вашей настройки оборудования.
Можно использовать скрипт MATLAB, чтобы выбрать пакеты последовательных данных от ООН Arduino с соответствующими скоростями в бодах и последовательными числами COM-порта.
Во-первых, откройте последовательный порт для связи с вашим Arduino или эквивалентным оборудованием. Можно использовать serialportlist
команда, чтобы найти последовательный COM-порт. В данном примере ООН Arduino находится на COM4
. Используйте скорость в бодах 250 000 бит/с.
port = "COM4";
baudRate = 250000;
Установите соответствующий тайм-аут и используйте правильный терминатор строки данных из кода Arduino, содержавшегося в файле servo_data_producer.ino
. В данном примере используйте тайм-аут 6 минут. Затем очистите буфер последовательного порта использование flush
.
s = serialport(port,baudRate,'Timeout',360); configureTerminator(s,"CR/LF"); flush(s);
Теперь считайте и обработайте закодированный поток данных от Arduino с соответствующим количеством циклов чтения. В данном примере используйте 10 циклов чтения. Для получения дополнительной информации смотрите функцию поддержки readServoDataFromArduino
если в разделе Supporting Functions.
count = 0; countMax = 10; while (count < countMax) try count = count + 1; fprintf("\nWaiting for dataset #%d...\n", count); readServoDataFromArduino(s); catch e % Report any errors. clear s; throw(e); end end
Теперь используйте clear
команда, чтобы закрыть последовательный порт.
clear s;
Если данные передаются потоком в MATLAB, можно использовать readServoDataFromArduino
скрипт, чтобы создать матрицу данных, чтобы сохранить последний пакет данных о сервоприводе. Для получения дополнительной информации смотрите функцию поддержки readServoDataFromArduino
если в разделе Supporting Functions.
readServoDataFromArduino(s)
Результирующее расписание содержит метку времени, моторные текущие, и tacho импульсные значения для последнего набора данных, переданного потоком от ООН Arduino.
Используйте processServoData
функционируйте, чтобы вывести расписание с соответствующими физическими единицами измерения.
T = processServoData(X)
Получившееся расписание обеспечивает удобный контейнер для извлечения прогнозирующих функций из моторных данных.
Если у вас нет необходимого оборудования, можно запустить этот пример с помощью sendSyntheticFeaturesToThingSpeak
функция, чтобы сгенерировать синтетические данные.
От каждого нового набора данных вычислите номинальную скорость, чтобы обнаружить частоты интереса к зубчатой передаче и совпадать с ними правильно частотам на их спектрах мощности.
F = extractFeaturesFromData(T);
Используя значение частоты дискретизации 1 500 Гц в tachorpm
команда, вычислите номинальную скорость выходного вала. Для этого экземпляра значение об/мин составляет постоянных приблизительно 22 об/мин.
tP = T.TachoPulse; rpm = tachorpm(tP,Fs,'PulsesPerRev',16,'FitType','linear'); rpm = mean(rpm);
Частота вращения двигателя наряду с физическими параметрами наборов механизма, включите конструкцию диапазонов частот отказа, которая является важным необходимым условием для вычисления спектральных метрик. Используя зубное количество механизмов диска в зубчатой передаче и номинальном об/мин, сначала вычислите частоты интереса. Частоты интереса являются фактическими выходными значениями скорости в Герц, значения которого были близко к теоретическим значениям, перечисленным в таблице ниже.
Затем создайте диапазоны частот для всех выходных скоростей, которые включают следующие частоты интереса с помощью faultBands
команда. Выбранные основные частоты, гармоники и боковые полосы обсуждены более подробно в Анализировать Данных о Зубчатой передаче и Извлечении Спектральные Функции Используя пример Live Editor Тэскса. В частности, важные частоты отказа, чтобы контролировать в сервосистеме были идентифицированы можно следующим образом:
Сначала шесть гармоник FS1 с 0:1 боковыми полосами FS2
1-е, 2-е, и 4-е гармоники FS2 с 0:1 боковыми полосами FS3
3-я гармоника FS3
% Number of gear and pinion teeth. G4 = 41; G3 = 35; G2 = 50; G1 = 62; P4 = 16; P3 = 10; P2 = 10; P1 = 10; % Shaft speeds in Hz. FS5 = rpm / 60; FS4 = G4 / P4 * FS5; FS3 = G3 / P3 * FS4; FS2 = G2 / P2 * FS3; FS1 = G1 / P1 * FS2; % Generate the fault bands of interest. FB_S1 = faultBands(FS1, 1:6, FS2, 0:1); FB_S2 = faultBands(FS2, [1 2 4], FS3, 0:1); FB_S3 = faultBands(FS3, 3); FB = [FB_S1; FB_S2; FB_S3];
Используйте faultBandMetrics
команда наряду со спектральной плотностью мощности (pwelch
команда) моторного текущего сигнала вычислить в общей сложности 85 спектральных метрик.
Вычислите спектр мощности моторных текущих данных.
mC = T.MotorCurrent; [ps,f] = pwelch(mC,[],[],length(mC),Fs);
Вычислите спектральные метрики для всех полос отказа.
metrics = faultBandMetrics(ps,f,FB);
metrics = metrics{:, [4 13 85]}; % Select significant metrics.
Выберите функции, чтобы отследить из вычисленных метрик. Выберите некоторые из значительных единиц, таких как пиковая амплитуда спектра в первых и вторых гармониках вала 1 скорость (FS1).
features = [metrics,mean(mC),rpm];
Обратите внимание на то, что средний моторный ток и средняя скорость в об/мин двигателя также зарегистрированы как дополнительные функции.
Если различные функции вычисляются из данных реального времени в пакетах каждые 5 минут, отправляют их в ThingSpeak как часть того же скрипта MATLAB для "облачного" хранилища и остающегося анализа срока полезного использования.
Отправьте значения функции в канал ThingSpeak как отдельные поля с помощью sendFeaturesToThingSpeak
функция.
sendFeaturesToThingSpeak(features)
Вот пример канала ThingSpeak, который сконфигурирован со многими полями, чтобы сохранить значения функции. Канал служит удобным репозиторием данных и платформой визуализации.
Канал ThingSpeak обеспечивает функцию в реальном времени, контролирующую инструментальную панель для того, чтобы отследить изменения в значениях функции. Это также действует как источник данных для функции, обрабатывающей, такой как остающиеся оценки срока полезного использования.
Если у вас нет настройки оборудования, чтобы генерировать признаки от сервопривода, можно сгенерировать синтетические значения функции, чтобы проиллюстрировать расчет последующих оценок RUL с помощью следующего примера кода. У вас могут быть отдельные экземпляры MATLAB, работающего на различных машинах, чтобы читать и записать данные к ThingSpeak.
hasArduino = false; % Set to true when using Arduino UNO. if ~hasArduino % Set timer to send new feature data every minute. tmr1 = timer('ExecutionMode','fixedSpacing','Period',60); tmr1.TimerFcn = @(~,~) sendSyntheticFeaturesToThingSpeak(); tmr1.start(); return; end
Отдельный скрипт MATLAB, который может также быть развернут как скомпилированное приложение MATLAB или как развернутое Веб-приложение, может использоваться, чтобы считать функции сервопривода из ThingSpeak и вычислить оценки в реальном времени метрики RUL. Для этого экземпляра создайте первоначальную экспоненциальную модель ухудшения и периодически обновляйте модель, когда значения новой возможности становятся доступными.
% Set timer to check for new data every minute and update the RUL model, mdl. tmr2 = timer('ExecutionMode','fixedSpacing','Period',60); tmr2.TimerFcn = @(~,~) readFeaturesFromThingSpeak(mdl,channelID,readKey); tmr2.start();
Каждый новый набор функций используется, чтобы обновить экспоненциальную модель ухудшения и вычислить оценки в реальном времени RUL.
В данном примере примите, что обучающие данные не являются историческими данными, а скорее наблюдениями в реальном времени за условием компонента, как получено функциями, вычисленными на предыдущих шагах. Экспоненциальная модель ухудшения (exponentialDegradationModel
) подходит для этого типа оценки RUL в реальном времени и визуализации. Модель RUL использует медицинский индекс, чтобы указать на систему системы и порога, чтобы оценить RUL системы. В данном примере порог находится на Total Band Power
функция сервопривода, как вычислено на предыдущих шагах. Общая мощность полосы получает изменения в спектральной энергии в частотах полосы отказа, сопоставленных с важными областями частоты зубчатой передачи сервопривода.
Создайте экспоненциальную модель ухудшения с произвольными предшествующими данными о распределении и заданным шумовым отклонением.
Задайте время жизни и имена переменной данных для данных о наблюдении из подмножества таблицы данных, считанной из ThingSpeak. Затем используйте каждую функцию значения, чтобы предсказать RUL компонента с помощью текущего пожизненного значения, сохраненного в модели.
channelID = 1313749; % Replace with the channel ID to write data to. readKey = 'KYIDUZ1ENDT3TGG0'; % Replace with the read API key of your channel. % Read most recent degradation data from ThingSpeak. T = thingSpeakRead(channelID,'ReadKey',readKey,'OutputFormat','timetable'); % Construct the exponential degradation model using Total Band Power as the % health index. mdl = exponentialDegradationModel( ... 'Theta', 1, 'ThetaVariance', 100, ... 'Beta', 1, 'BetaVariance', 100, ... 'NoiseVariance', 0.01, ... 'LifeTimeVariable', T.Properties.DimensionNames{1}, ... 'DataVariables', T.Properties.VariableNames{3}, ... 'LifeTimeUnit', "hours"); % Set timer to check for new data every minute. tmr2 = timer('ExecutionMode','fixedSpacing','Period',60); tmr2.TimerFcn = @(~,~) readFeaturesFromThingSpeak(mdl,channelID,readKey); tmr2.start();
Скрипт MATLAB отслеживает доступные данные функции на канале ThingSpeak и обновляет модель RUL, когда значения новой возможности становятся доступными, таким образом, предусматривая возможность оценки и визуализации RUL в реальном времени.
Функция поддержки readServoDataFromArduino
чтения и процессы закодированные потоки данных от ООН Arduino.
function readServoDataFromArduino(s) % Reads and processes encoded data streams from Arduino. % Find start of encoded data stream. str = readline(s); N = sscanf(str, "BEGIN:%d"); % Expected number of data points (should be 16384). % Acquire new data until the end of data stream. if ~isempty(N) && N > 0 X = zeros(N,2); % Read and store encoded binary data. disp("Reading servo motor data..."); for k = 1:N % Read three bytes each time containing motor current and tacho pulse values. x = [read(s,1,"uint16"), read(s,1,"uint8")]; X(k,:) = double(x); end % Find end of encoded data stream. readline(s); % Remove CR/LF from data stream. str = readline(s); if str == "END" disp("Processing servo data..."); T = processServoData(X); disp('Extracting features...'); F = extractFeaturesFromData(T); disp('Sending features to ThingSpeak...'); sendFeaturesToThingSpeak(F); else error('Error reading end-of-file marker from serial port.'); end end end
Функция поддержки processServoData
преобразует матрицы необработанных данных в расписание с соответствующими именами переменных и физическими единицами измерения.
function T = processServoData(X) % Converts raw data matrix to a timetable with appropriate variable names and % physical units. Fs = 1500; % Sampling rate. Rsens = 0.5; % Current sense resistor value in ohm. Kamp = 20; % Sensor amplifier gain. count2volt = 5/1024; % Scaling factor between digital reading to analog voltage. T = timetable('SampleRate', Fs); T.MotorCurrent = X(:,1) * count2volt / Kamp / Rsens * 1000; % Convert to mA. T.TachoPulse = X(:,2); % On/off tacho pulse values. T.Properties.VariableUnits = {'mA', 'level'}; end
Функция поддержки extractFeaturesFromData
извлечения показывают из данных о сервоприводе временного интервала в формате таблицы.
function features = extractFeaturesFromData(T) % Extracts up to 8 features from time-domain servo data provided in table % format. Fs = 1500; % Sampling rate. % Average motor speed. tP = T.TachoPulse; rpm = tachorpm(tP, Fs, 'PulsesPerRev', 16, 'FitType', 'linear'); rpm = mean(rpm); % Number of gear and pinion teeth. G4 = 41; G3 = 35; G2 = 50; G1 = 62; P4 = 16; P3 = 10; P2 = 10; P1 = 10; % Shaft speeds in Hz. FS5 = rpm / 60; FS4 = G4 / P4 * FS5; FS3 = G3 / P3 * FS4; FS2 = G2 / P2 * FS3; FS1 = G1 / P1 * FS2; % Generate the fault bands of interest. FB_S1 = faultBands(FS1, 1:6, FS2, 0:1); FB_S2 = faultBands(FS2, [1 2 4], FS3, 0:1); FB_S3 = faultBands(FS3, 3); FB = [FB_S1; FB_S2; FB_S3]; % Compute the power spectrum of the motor current data. mC = T.MotorCurrent; [ps,f] = pwelch(mC, [], [], length(mC), Fs); % Compute spectral metrics for all fault bands. metrics = faultBandMetrics(ps, f, FB); metrics = metrics{:, [4 13 85]}; % Select significant metrics. % Pick features to track. features = [metrics, mean(mC), rpm]; end
Функция поддержки sendFeaturesToThingSpeak
отправляет значения функции в канал ThingSpeak как отдельные поля.
function sendFeaturesToThingSpeak(features) % Sends feature values to a ThingSpeak channel as separate fields. % Configure the Channel ID and the Write API Key values. channelID = 1313749; % Replace with your channel ID to write data to. writeKey = 'X96MRW1TTZC1XNV3'; % Replace with the write API key of your channel. % Write the features to the channel specified by the 'channelID' variable. fields = 1:numel(features); % Up to 8 features thingSpeakWrite(channelID, features, 'Fields', fields, 'WriteKey', writeKey); end
Функция поддержки readFeaturesFromThingSpeak
чтения показывают значения от канала ThingSpeak, когда новые данные становятся доступными путем отслеживания меток времени последних считываний данных. Функция также обновляет модель RUL с помощью значений новой возможности и строит предсказанные значения RUL.
function readFeaturesFromThingSpeak(mdl, channelID, readKey) % Read feature values from ThingSpeak to update the RUL estimation. persistent timestamp persistent hplot if isempty(timestamp) % Start with last ten days of data. timestamp = dateshift(datetime, "start", "day", -10); end % Read recent data from all fields. disp('Reading features from ThingSpeak...'); T = thingSpeakRead(channelID, 'ReadKey', readKey, ... 'OutputFormat', 'timetable', 'DateRange', [timestamp, datetime]); if ~isempty(T) T = T(T.Timestamps > timestamp, :); % Only keep most recent data. end if ~isempty(T) T = T(T.Timestamps > timestamp, :); % Only keep most recent data. timestamp = T.Timestamps(end); % Update time stamp for most recent data. % Set RUL degradation threshold. threshold = 10; % The training data is not historical data, but rather real-time observations % of the servo motor features. N = height(T); estRUL = hours(zeros(1,N)); for i = 1:N update(mdl, T(i,:)) estRUL(i) = predictRUL(mdl, threshold); end % Visualize RUL over time. if isempty(hplot) || ~isvalid(hplot) hplot = plot(T.Timestamps(:)', estRUL, 'r-o'); title('Estimated RUL at Time t') xlabel('Time, t') ylabel('Estimated RUL') else hplot.XData = [hplot.XData, T.Timestamps(:)']; hplot.YData = [hplot.YData, estRUL]; end end end
Когда сервопривод и ООН Arduino не будут доступны, чтобы сгенерировать значения функции, используйте функцию поддержки sendSyntheticFeaturesToThingSpeak
чтобы обеспечить синтетический продукт показывают данные, чтобы проиллюстрировать потоковую передачу значений функций к ThingSpeak.
function sendSyntheticFeaturesToThingSpeak() % Generate synthetic features and send them to ThinkSpeak. persistent bandPower if isempty(bandPower) bandPower = 5; end % Simulate motor features and fault band metrics. motorCurrent = 308+12*rand(1); % between [308 320] mA rpm = 20+3*rand(1); % between [20 23] rpm bandPower = bandPower + rand(1)/2; % bandPower degradation metrics = [rand(1), rand(1), bandPower]; features = [metrics, motorCurrent, rpm]; disp('Sending features to ThingSpeak...'); sendFeaturesToThingSpeak(features) end
faultBands
| faultBandMetrics
| exponentialDegradationModel
| pwelch
| tachorpm