Зачем использовать несколько фильтров, выводящих тысячи значений, использовать один или два фильтра, которые могут выводить нормальное значение?
Проблема
Если цикл запускает только один смоделированный вывод и использует фильтр, он будет выводиться нормально (аналоговый 1600 ~ 2200, фильтр 0 ~ 500), но создание массива для хранения нескольких отфильтрованных смоделированных значений выводов вызовет проблемы, и вывод будет ненормальным (10000 ~ 80000).
Если аналоговый считывает шесть датчиков, то их значение равно 1600 ~2200.
Он использовал приведенный ниже код.
#include "EMGFilters.h"
#define SERIAL_TX_BUFFER_SIZE 4096 //修改串口接收缓冲区大小为2048
const int SensorInputPin[] = {A0, A1, A2, A3, A4, A5};
EMGFilters myFilter[6];
SAMPLE_FREQUENCY sampleRate = SAMPLE_FREQ_500HZ;
NOTCH_FREQUENCY humFreq = NOTCH_FREQ_50HZ;
void setup()
{
for (int i = 0; i < 6; i++)
{
myFilter[i].init(sampleRate, humFreq, true, true, true);
}
Serial.begin(115200);
Serial1.begin(250000);
analogReadResolution(12);
}
void loop()
{
long time = millis();
int x[6] = {0,0,0,0,0,0};
int analog[6] = {0,0,0,0,0,0};
for (int index = 0; index < 6; index++)
{
//x[index] = myFilter[index].update(analogRead(SensorInputPin[index]));
analog[index] = analogRead(SensorInputPin[index]);
}
while ((millis() - time) < 2)
{
delayMicroseconds(100);
}
Serial.printf("filter:%d %d %d %d %d %d analog:%d %d %d %d %d %d\n", x[0], x[1], x[2], x[3], x[4], x[5],analog[0],analog[1],analog[2],analog[3],analog[4],analog[5]);
Serial1.printf("<%d,%d,%d,%d,%d,%d>", x[0], x[1], x[2], x[3], x[4], x[5]);
}
Измените индекс<6
на индекс<2
и раскомментируйте \\x[index] = myFilter[index].update(analogRead(SensorInputPin[index]));
Это будет обычный вывод с использованием двух входов и фильтров.
Но изменение index=0;index<2
на index=0;index<6
будет ненормальным результатом.
Если изменить на index=3; index<4
или index= 2; index<3
... и т.д., это будет нормальный результат:
Скетч:
Схема XIAO MCU в формате HTML: https://files.seeedstudio.com/wiki/Seeeduino-XIAO/res/Seeeduino-XIAO-v1.0-SCH-191112.pdf
У меня нет схемы датчика.
Код фильтра: https://github.com/oymotion/EMGFilters/blob/master/EMGFilters.cpp
Я надеюсь, что каждый вывод моделирования будет выглядеть как первый Gif (обычный вывод), что я должен сделать, чтобы достичь этого?
@C.SH.K, 👍1
Обсуждение1 ответ
Лучший ответ:
Это ошибка в библиотеке фильтров, которую вы используете. Об этом уже сообщалось (может быть, вами?).
Как предположили Majenko и chrisl в комментариях, суть проблемы заключается
в том, что вам нужен один фильтр на входной канал. Использование нескольких экземпляров
EMGFilters
кажется очевидным решением. Увы, библиотека сохраняет
состояние фильтра в глобальных переменных, что по сути означает, что все ваши шесть
объектов фильтра ссылаются на один и тот же фактический фильтр.
ДА. Это моя проблема. Как мне предотвратить ссылки на глобальные переменные одного и того же фильтра? Нужно ссылаться на "EMGFilters1.h", "EMGFilters2.h" ... и т.д.?, @C.SH.K
@C.SH.K: Нет. Вы должны исправить библиотеку или подождать, пока авторы исправят ее. Если вы хотите сделать это самостоятельно, просто превратите состояние фильтра в данные экземпляра. C.f. мой комментарий к вашей проблеме., @Edgar Bonet
@C.SH.K: Или вы можете использовать ветку из [этого запроса на извлечение] (https://github.com/oymotion/EMGFilters/pull/4 )., @Edgar Bonet
Спасибо! Решена насущная проблема!, @C.SH.K
[Изображение](https://i.stack.imgur.com/ckaNR.png ) [Изображение 2](https://i.stack.imgur.com/uzcRR.gif ) После использования вашего файла некоторые пины занимают странное место, некоторые ЭМГ выводят десятки тысяч значений, некоторые - обычный вывод. Раньше, с необработанным кодом фильтра, он печатался бы следующим образом[Before index=0;index<1...etc](https://aws1.discourse-cdn.com/arduino/original/4X/0/5/8/05885f12cbba1c227d4f4349a169a8979a2f8caa.gif), @C.SH.K
О. Просто плохой контакт с датчиком ОБЛАСТЬ датчика, которую я купил, слишком велика, поэтому сухому электроду нелегко полностью соприкасаться с кожей при касании руки, которая склонна к смещению базовой линии., @C.SH.K
- Как написать неблокирующий код, для опроса датчика на 100 Гц
- Какой датчик лучше всего подходит для обнаружения препятствий с помощью световозвращателя?
- Подключение двух датчиков к одному аналоговому выводу
- Подключение MPU6050 к Arduino Lilypad
- AD8232 - Измерение частоты сердечных сокращений только при касании USB-разъема. Проблема с заземлением?
- Шум в Analog Read Serial от инструментального усилителя (ina122p)
- Сопряжение LM35 и MQ2 с Arduino
- Проблема с некоторыми датчиками, но не с сервоприводами
Вам нужен один фильтр на вход ...?, @Majenko
Вы не предоставили никакого контекста о том, что вы на самом деле измеряете, но я поддерживаю Majenko с предположением, что вам нужен один фильтр на аналоговый вход. Кроме того, я не совсем понимаю описание вашей проблемы. Если это из-за языкового барьера, возможно, вам сможет помочь кто-нибудь, кто лучше говорит по-английски, и поможет с формулировкой вопроса., @chrisl
@Majwnko да. Есть ли какой-нибудь способ решить эту проблему?, @C.SH.K
@chrisl Мне очень жаль, возможно, я не так свободно владею английским, как моим родным языком. Я надеюсь, что каждый результат моделирования будет выглядеть как первый Gif-файл., @C.SH.K
В настоящее время вы используете только один фильтр:
myFilter
. Но вы можете определить несколько фильтров таким же образом и поместить их в массив для использования в цикле for. Что-то вроде этого:EMGFilters myFilters[6];
(определите массив из 6 EMGFilters). Вsetup()
:for(int i=0;i<6;i++) myFilters[i].init(SampleRate, humFreq, true, true, true);
. И в цикле for:envelopes[i * 6 + x] = square(myFilters[x].update(analogRead(SensorInputPin[x])));
., @chrislНо я думаю, вам также нужно подумать о том, что вы выводите. В настоящее время вы пытаетесь вывести значения отдельных датчиков в каждой новой строке. Последовательный плоттер интерпретирует это как новые точки данных того же сигнала, хотя на самом деле у вас есть 6 точек данных, по одной для каждого сигнала. Я думаю, что последовательный плоттер поддерживает построение нескольких строк, когда вы печатаете точки данных в одной строке, разделенной пробелом., @chrisl
@chrisl Я попытался создать фильтр для смоделированного вывода, но результат по-прежнему ненормальный (сообщение было обновлено, и изображение было загружено). Функция цикла выводит данные нормально, только если у нее есть только одна строка команды quare(myFilter.update(analogRead(SensorInputPin[на вход])))`. Я не понимаю, почему только одна строка должна выводиться нормально., @C.SH.K
@chrisl Я обнаружил ошибку с использованием третьего аналогового ввода, как вы думаете, в чем причина? Я измерил третий аналоговый вход отдельно и не обнаружил никаких проблем. Кажется, что до тех пор, пока я использую третий вывод, независимо от того, что это за третий аналоговый вывод, он выдает тысячи значений. Проблема была обновлена., @C.SH.K
Какую плату Arduino вы используете? Вы предполагаете, что каждое целое число имеет длину 2 байта, это верно, если вы используете Arduino Uno, но это будет не так, если вы используете Arduino на основе STM32 или SAMD, для них
Int
равен 4 байтам., @hcheung@chrisl Привет, я восстановил сообщение., @C.SH.K
@hcheung Хорошо. Я был обновлен., @C.SH.K