Указатель воздушной скорости "Своими руками" АРДУИНО

По поводу шумов. Можно написать код, но он будет усреднять показания датчико, но и замедлять реакцию.

У нас в лабе неофициально висит похожая задачка. Очень хочется запустить один советский аппаратик, переделанный на современную элементную базу, жутко реагирующую на ЭМ-помехи. Сигнал нужно сглаживать, правда скорость не критична. =)

А что это за папка со скетчами приборов со всего интернета?
Я в отпуске,  со всего интерната собирал скетчи разных приборов. Вот и насобирал.https://yadi.sk/d/C7P70D8K3MTS8q
 
Не пойму ни как - датчик аналоговый, в чем проблема повесить на выходе примитивный фильтр? Ни у парапланеристов в ссылках, ни у Петра на видео цифры не скачут... 
Датчик цифровой. Но  не в этом дело, аналоговый сигнал в любом случае надо оцифровывать, на борту ли датчика или в ином месте. Принципиально одно - ни одно из сделанных измерений (хоть линейкой, хоть микрометром) не дает истинного значения. ("семь раз отмерь...")

Ни у парапланеристов в ссылках, ни у Петра на видео цифры не скачут...
Потому, что  производится обработка потока получаемых данных, дабы найти эту истину.
 
Датчик цифровой...

Забавно выглядит "цифровой" сигнал на вашей картинке  🙂  Собственно как минимум 2 примера нормальной работы приборов выше приведено, в сети таких примеров еще больше. В таком случае с Вашей стороны спор ради спора, или какую цель Вы преследуете?
 
спор ради спора, или какую цель Вы преследуете?
Вы меня слышите?

Вы можете привести еще миллион примеров с адекватными показаниями. Потому, что
производится обработка потока получаемых данных

Дабы ясность внести BMP - цифровой, MPXV - аналоговый.
 
int sensorPin = A0;                     // номер аналогового входа

                                        // функция считывает аналоговый вход заданное количество раз
                                        // и возвращает отфильтрованное значение
int readMean(int pin, int samples){
                                        // переменная для хранения суммы считанных значений
  int sum = 0;
                                         // чтение и складывание значений
  for (int i = 0; i < samples; i++){
    sum = sum + analogRead(pin);
  }
                                        // делим сумму значений на количество измерений
  sum = sum/samples;
                                        // возвращаем среднее значение
  return sum;
}



Вот это Вы хотите увидеть в коде???
 
спор ради спора, или какую цель Вы преследуете?
Вы меня слышите?

Вы можете привести еще миллион примеров с адекватными показаниями. Потому, что
производится обработка потока получаемых данных

Дабы ясность внести BMP - цифровой, MPXV - аналоговый.
Дык в чем проблема, если обработка производится без дополнительной навески? Т.е. достаточно имеющихся аппаратных ресурсов. И не просто достаточно - а достаточно с ИЗБЫТКОМ...
 
Этот датчик аналоговый. 
Я в этом не шарю, но справедливости ради вродь как сам датчик естественно аналоговый, но он вмонтирован в бошевскую микруху АЦП прямо на плате датчика. По сути-то это конечно ни чего не меняет - как Вы и показали на видео - примитивный кусок программы легко справляется со сглаживанием сигнала. В цифре он идет уже "чистенький"
 
DiKey, Вы не обижайтесь. Многим на сайте интересны эти проекты на ардуине. Уже скачали порядка 80 раз эту папку. Если Вы очень хороший программист, помогите людям. Практически. Многие бы хотели поменять будильники на цифровые приборы, но денег нет или не шарят как написать программу. На всём сайте я не нашёл ветку, где описывалось изготовление и скетчи. У меня у самого  приборка в будильниках.
 
примитивный кусок программы легко справляется со сглаживанием сигнала
Вот это Вы хотите увидеть в коде???

А вот с этого момента и начинается самое интересное.
Фильтр простого скользящего среднего, медианный, Калмана, Чебышева?
Частота выборки, статистические характеристики потока данных, скорость работы микропроцессора, разрядность, наличие математики с плавающей точкой. После этого начинаются практические работы по отработке временных характеристик различных реализаций кода и/или типа фильтров.
Так, что если найдете "минутку" - поэкспериментируйте - увлекательное дело, уверяю вас, часов эдак ...дцать (а может и больше) пролетят  незаметно.

По поводу вышеприведенного куска кода:
вы каждый раз будете накапливать порцию - получать среднее? А среднее между двумя средними, скажем, двух порций, как?
 
 
int sensorPin = A0;                     // номер аналогового входа

                                        // функция считывает аналоговый вход заданное количество раз
                                        // и возвращает отфильтрованное значение
int readMean(int pin, int samples){
                                        // переменная для хранения суммы считанных значений
  int sum = 0;
                                         // чтение и складывание значений
  for (int i = 0; i < samples; i++){
    sum = sum + analogRead(pin);
  }
                                        // делим сумму значений на количество измерений
  sum = sum/samples;
                                        // возвращаем среднее значение
  return sum;
}

-это  типа так делать нельзя?

Таким проектом баловался на макетке, с год назад. Показания обрабатывал примерно таким кодом как выше. Если возвращаться к проекту то только с Калмановской фильтрацией.
 
У меня в проекте была ещё и SD карта на которую писались данные о скорости и высоте.
Скорость вычислял по формулам(помню была заморочка с ними)
Останов проекта вызван затыком в конечном виде прибора и
  перестановкой приоритетов использования свободного времени .
Мне лично больше нравятся стрелочные указатели т.к. на солнце светодиодные индикаторы не видно а ж.к. индикаторы боятся низких температур.
   В общем заткнулся на управлении шимом автомобильного указателя скорости по причине отсутствия оного под рукой.
 
kerbx сказал(а):
Мне лично больше нравятся стрелочные указатели т.к. на солнце светодиодные индикаторы не видно а ж.к. индикаторы боятся низких температур.
В общем заткнулся на управлении шимом автомобильного указателя скорости по причине отсутствия оного под рукой. 

Можно поставить обычный щеточный моторчик и управлять им как сервой. Как вариат мелкие шаговики от дисководов или сидиромов, но тут есть риск потерять позцию стрелки от вибрации.
 
   В общем заткнулся на управлении шимом автомобильного указателя скорости по причине отсутствия оного под рукой.
Спидометр с шим - это какой - от первых десяток? Сейчас вроде везде стрелки шаговыми моторчиками крутят...
 
примитивный кусок программы легко справляется со сглаживанием сигнала
Вот это Вы хотите увидеть в коде???

... А среднее между двумя средними, скажем, двух порций, как?
 
а откуда там возьмется большая разница между этими двумя средними? В конце концов обновление показаний на приборе вполне достаточно раз в секунду - за такое время любые средние выровняются.
 
Спасибо топикстартеру. Дело полезное. Думаю о таком же, но с подключением к спидометру от Уаз Hunter (там частотное управление). Получится УС-160 )

Жаль только что критики "обиженные" ветку засрут.
 
а откуда там возьмется большая разница между этими двумя средними? В конце концов обновление показаний на приборе вполне достаточно раз в секунду - за такое время любые средние выровняются
Я даже вам график показал. Порция выборок в районе пика "внизу" даст одну среднюю, "вверху" - другую.

Pasha5584 сказал(а):
"обиженные" ветку засрут
А обиженные это я? Чем вы меня обидели, vocvark11? Хоть узнать...
 
Авиаторы, не "бздим" ;D качаем пока этот скетч не сильно они и прыгают. Я пробовал. Думаю на днях разберусь с этим  фильтром. Он тем более у меня есть. Только его правильно надо воткнуть. Вот он. Фильтр


// переменные для калмана
float varVolt = 0.25;  // среднее отклонение (ищем в excel)
float varProcess = 0.05; // скорость реакции на изменение (подбирается вручную)
float Pc = 0.0;
float G = 0.0;
float P = 1.0;
float Xp = 0.0;
float Zp = 0.0;
float Xe = 0.0;
// переменные для калмана

void setup() { 

}

void loop() {
  int var;
  int fil_var = filter(var);
}

float filter(float val) {  //функция фильтрации
  Pc = P + varProcess;
  G = Pc/(Pc + varVolt);
  P = (1-G)*Pc;
  Xp = Xe;
  Zp = Xp;
  Xe = G*(val-Zp)+Xp; // "фильтрованное" значение
  return(Xe);
}
 
Назад
Вверх