не постоянное значение с аналогового входа как логические 1 и 0

Eugen
Offline
Зарегистрирован: 28.08.2021

 Всем привет!

Ни как не могу справиться с созданием автомикшера

задача устройства:

есть 2 аудио плеера. Пл1 и Пл2.

На Пл1 воспроизводится фоновая музыка.

На Пл2 воспроизводится речевое объявление.

Требуется на время звучания речевого объявления, плавно уменьшать громкость фоновой музыки.

Управление громкостью реализованно через микросхему pt2258

вот что у меня получилось:

#include <PT2258.h>
#include <Wire.h>
#define AUDIOPIN 0 // Аудиовход

PT2258 pt2258; // PT2258 Object


 int volume = 0; // громкость Пл1 (фоновая музыка) по умолчанию максимальная
 int val; /*макс СИГНАЛ РЕЧЕВОГО СООБЩЕНИЯ с Пл2
 int value; исходный/сырой сигнал с Пл2

 void setup() {

  ADCSRA &=0xFE;//настройка АЦП, частота 250 кГц
  ADCSRA |=0x06;

  Serial.begin(9600); //UART begin
  Wire.setClock(100000); // установка частоты синхронизации шины I2C 100KHz
  /*проверяем может ли Arduino обмениваться данными с микросхемой  PT2258 или нет*/
  if (!pt2258.init())
    Serial.println("PT2258 Successfully Initiated");
  else
    Serial.println("Failed to Initiate PT2258");

  /*инициализируем PT2258 и устанавливаем в ней уровни звука по умолчанию*/
  pt2258.setChannelVolume(volume, 0);
  pt2258.setChannelVolume(volume, 1);
}

      void loop() {
        

// пытаюсь отобрать только максимальные значения
unsigned int oldValue = value;
    value = analogRead(AUDIOPIN);
    if (value > oldValue) val=value;
  

 delayMicroseconds(10); // интервал опроса АЦП
    Serial.println(val);

  
  if (val > 560 ) /* если воспроизводится речевое сообщение с Пл2...( при отсутствии речевого сообщения уровень сигнала на А0 = 490 иногда скачет до 530 даем запас еще в 30)
  {
   while(volume < 30) { /*ЕСЛИ  громкость пл1(ФОНОВОЙ МУЗЫКИ) меньше -30 дб ( т.е. громкость 0 дб - максимальная )
   volume++;  /* устанавливаем громкость пл1 (плеера с фоновой музыкой) на -30 db (УБАВЛЯЕМ)
    Serial.print("volume: "); // выводим уровень звука в окно монитора последовательной связи
    Serial.println(volume);
    /*устанавливаем уровень звука для канала 1,2 */
    pt2258.setChannelVolume(volume, 0);
    pt2258.setChannelVolume(volume, 1);
    delay(50); /* для плавности
  }
}
  else /*иначе (если сигнал с (речевоге сообщение)  отсутствует  и значение val ~  равен 490 , что меньше 560  )

    while(volume > 0){ значение громкости б
   volume--; /* убавляем уровень до -30 дб
   delay(50);    
    Serial.print("volume: "); // выводим уровень звука в окно монитора последовательной связи
    Serial.println(volume);
    /*устанавливаем уровень звука для канала 1,2*/
    pt2258.setChannelVolume(volume, 0);
    pt2258.setChannelVolume(volume, 1);
    }
    
  }

 

Eugen
Offline
Зарегистрирован: 28.08.2021

Eugen пишет:

 Всем привет!

Ни как не могу справиться с созданием автомикшера

задача устройства:

есть 2 аудио плеера. Пл1 и Пл2.

На Пл1 воспроизводится фоновая музыка.

На Пл2 воспроизводится речевое объявление.

Требуется на время звучания речевого объявления, плавно уменьшать громкость фоновой музыки.

Управление громкостью реализованно через микросхему pt2258

вот что у меня получилось:

#include <PT2258.h>
#include <Wire.h>
#define AUDIOPIN 0 // Аудиовход

PT2258 pt2258; // PT2258 Object


 int volume = 0; // громкость Пл1 (фоновая музыка) по умолчанию максимальная
 int val; /*макс СИГНАЛ РЕЧЕВОГО СООБЩЕНИЯ с Пл2
 int value; исходный/сырой сигнал с Пл2

 void setup() {

  ADCSRA &=0xFE;//настройка АЦП, частота 250 кГц
  ADCSRA |=0x06;

  Serial.begin(9600); //UART begin
  Wire.setClock(100000); // установка частоты синхронизации шины I2C 100KHz
  /*проверяем может ли Arduino обмениваться данными с микросхемой  PT2258 или нет*/
  if (!pt2258.init())
    Serial.println("PT2258 Successfully Initiated");
  else
    Serial.println("Failed to Initiate PT2258");

  /*инициализируем PT2258 и устанавливаем в ней уровни звука по умолчанию*/
  pt2258.setChannelVolume(volume, 0);
  pt2258.setChannelVolume(volume, 1);
}

      void loop() {
        

// пытаюсь отобрать только максимальные значения
unsigned int oldValue = value;
    value = analogRead(AUDIOPIN);
    if (value > oldValue) val=value;
  

 delayMicroseconds(10); // интервал опроса АЦП
    Serial.println(val);

  
  if (val > 560 ) /* если воспроизводится речевое сообщение с Пл2...( при отсутствии речевого сообщения уровень сигнала на А0 = 490 иногда скачет до 530 даем запас еще в 30)
  {
   while(volume < 30) { /*ЕСЛИ  громкость пл1(ФОНОВОЙ МУЗЫКИ) меньше -30 дб ( т.е. громкость 0 дб - максимальная )
   volume++;  /* устанавливаем громкость пл1 (плеера с фоновой музыкой) на -30 db (УБАВЛЯЕМ)
    Serial.print("volume: "); // выводим уровень звука в окно монитора последовательной связи
    Serial.println(volume);
    /*устанавливаем уровень звука для канала 1,2 */
    pt2258.setChannelVolume(volume, 0);
    pt2258.setChannelVolume(volume, 1);
    delay(50); /* для плавности
  }
}
  else /*иначе (если сигнал с (речевоге сообщение)  отсутствует  и значение val ~  равен 490 , что меньше 560  )

    while(volume > 0){ значение громкости тише 0 дб
   volume--; /* прибавляем уровень до 0 дб
   
    Serial.print("volume: "); // выводим уровень звука в окно монитора последовательной связи
    Serial.println(volume);
    /*устанавливаем уровень звука для канала 1,2*/
    pt2258.setChannelVolume(volume, 0);
    pt2258.setChannelVolume(volume, 1);
delay(50); 

} }

 

прошу прощения не закончил

вообщем при таких условиях все работает хорошо

пока нет речевого сообщения громкость фоновой музыки пл1 максимум... когда появляется сигнал речевого сообщения, громкость фоновой музыки убавляется, но сразу же прибавляется потому, что аналоговый звуковой сигнал, при проигрывании, может принимать значения, в том числе и < 560, что соответствует отсутствию сигнала. 

надеюсь понятно выразился )

может я пошел вообще по неправильному пути... по сути мне нужно дискретное значение наличия или отсутствия звукового сигнала.

подскажите как тогда быть всю голову сломал уже

заранее спасибо

код из самого поста с ошибкой....актуальный см в этом сообщении

 

rkit
Offline
Зарегистрирован: 23.11.2016

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вам надо ориентироваться не на громкость речевого сообщения, а на сам факт его наличия. Т.е. громкость музыки уменьшается одновременно с включением речевого сообщения и увеличивается с его выключением.

Eugen
Offline
Зарегистрирован: 28.08.2021

Это я понимаю, но какреализовать не знаю.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Eugen пишет:

Это я понимаю, но какреализовать не знаю.

детектировать, сгладить через фильтр 15ком, 10мкф, скомпарировать в уровень лог.1

rkit
Offline
Зарегистрирован: 23.11.2016

ua6em пишет:

сгладить через фильтр 15ком, 10мкф

Не надо никаких фильтров. И компаратор лишний.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ТС! Только не нужно делать пиковый детектор и задержку. Иначе импульсная помеха в канале - щелчок случайный - вызовет затихание музыки на время задержки.

Нужно оценить наличие сообщения по интегралу за разумный промежуток времени - хотя бы 50-100 мс.

Вообще покажи осциллограммы с входа A0 без сообщения и с ним - я тебе детектирующий кусок кода бэээз-платно подарю, от души! ;)) Если выложишь сюда осциллограммы - это обязательное условие. Сними так, чтобы на экране ослика уложилось хотя бы 50 мс, то есть разрешение по времени примерно 5 мс/деление, тут от ослика зависит.

И еще приведи схему входа. Звуковой сигнал двуполярный, на пин А0 ты его со смещением подаешь или через диод? Нарисуй, короче.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

wdrakula пишет:

 я тебе детектирующий кусок кода бэээз-платно подарю, от души! ;)) Если выложишь сюда осциллограммы - это обязательное условие.

интриган )))

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ua6em пишет:

wdrakula пишет:

 я тебе детектирующий кусок кода бэээз-платно подарю, от души! ;)) Если выложишь сюда осциллограммы - это обязательное условие.

интриган )))

Стимулирую профессиональный рост контингента. ;))

Eugen
Offline
Зарегистрирован: 28.08.2021

wdrakula пишет:

ТС! Только не нужно делать пиковый детектор и задержку. Иначе импульсная помеха в канале - щелчок случайный - вызовет затихание музыки на время задержки.

Нужно оценить наличие сообщения по интегралу за разумный промежуток времени - хотя бы 50-100 мс.

Вообще покажи осциллограммы с входа A0 без сообщения и с ним - я тебе детектирующий кусок кода бэээз-платно подарю, от души! ;)) Если выложишь сюда осциллограммы - это обязательное условие. Сними так, чтобы на экране ослика уложилось хотя бы 50 мс, то есть разрешение по времени примерно 5 мс/деление, тут от ослика зависит.

И еще приведи схему входа. Звуковой сигнал двуполярный, на пин А0 ты его со смещением подаешь или через диод? Нарисуй, короче.

да пожалуйста

https://youtu.be/mEzJHS-iEjM

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Eugen пишет:

да пожалуйста

https://youtu.be/mEzJHS-iEjM

ОК, дорогой. Я посмотрел. Завтра немного занят, но может найду полчасика написать тебе детектор. Если нет, то послезавтра.

Резюме такое - на входе А0 звуковой сигнал со смещением в 2.5В амплитудой примерно 2В, так?

Мне достаточно.

Еще можешь указать размер задержки восстановления громкости фона. 1 сек, 0.5 сек? По мне, так 1 сек - нормально.

Eugen
Offline
Зарегистрирован: 28.08.2021

Все верно,задержка на восстановление 1 сек тоже годится.

Если можно код прокомментируйте пожалуйста, чтобы мне понять его суть (так сказать, чтобы был толк и прокачка опыта =)) и при необходимости я бы смог его подредактировать, а не просто вставить.

Буду ждать!

Заранее спасибо!

Upper
Offline
Зарегистрирован: 23.06.2020

Я не понял, зачем вам value и oldValue, можно просто смотреть на уровень сигнала. Если от 450 до 530, то голоса нет, иначе есть.
Если вас устраивает ваш алгоритм определения наличия речи, то:

Если результат чтения АЦП говорит, что есть голос, устанавливаете счетчик МУЗЫКА_ВЫКЛ = N, где N зависит от длительности цикла, и того какую паузу между словами вы считаете окончанием сообщения. Если loop длится 50 мс и пауза равна 1 сек, то N = 20

Если результат чтения АЦП говорит, что нет голоса и МУЗЫКА_ВЫКЛ > 0. то уменьшаете МУЗЫКА_ВЫКЛ на 1.

Если МУЗЫКА_ВЫКЛ > 0 значит музыка должна быть выключена, если МУЗЫКА_ВЫКЛ == 0, то можно включать музыку.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а если поставить германиевый диод между электролитом и средней точкой минусом на среднюю точку, всё одно экспериментируешь

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

 Вы это все серьезно?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Внимательно прочти комментарии.


// пин аудио входа
const byte auxIn = A0;
//пороговое значение среднего квадрата, поставил 4000, но нужно подобрать на месте
const float treshold = 4e3;

//максимальная и минимальная громкость. Шаг изменение громкости
const int vMAX = 0;
const int vMIN = -30;
const int vSTEP = 1;
//задержка между изменениями на один шаг. Если всего 30 шагов по 30мс то вместе выйдет 900мс
const int vStepTime = 30;



void setup() {
  Serial.begin(115200);

}

void loop() {
  //Voice messege detected
  static byte vm = false;
  //просто счетчик интегрирования
  static int i = 0;
  //промежуточная сумма интеграла
  static float si = 0;
  //сам интеграл
  static float s = 0;
  //отметка времени последней коррекции громкости
  static uint32_t lastVolCor = millis();
  //Олд Миллис - старая метка времени
  static uint32_t om = millis();
  //Нью Миллис - текущее время
  uint32_t nm = millis();

  //текущаяя громкость
  static int volume = vMAX;
  //новая громкость
  int newvolume = volume;

  //интеграл от квадрата амплитуды
  //512 - уровень ноля, ПРОВЕРЬ, как у тебя!!!! может чуть поправить, если резисторы в делителе не идеально равны
  si += pow(analogRead(auxIn) - 512.0, 2);
  i++;

  //посчитали за 50 мс и сохранили среднее в "s"
  if (nm - om > 50) {
    om = nm;
    s = si / i;
    si = 0;
    i = 0;
  }

  //проверили на пороговое значение
  if (s > treshold) vm = true;
  else if (vm == true) {
    //настала тишина и нужно постепенно поднимать громкость
    vm = false;
    lastVolCor = nm;
  }

  //заметили начало войс месседж и приглушили музыку
  if (vm)  newvolume = vMIN;
  else if (volume != vMAX && (nm - lastVolCor > vStepTime)) {
    //каждые vStepTime увеличиваем громкость на vSTEP, если тишина и громкость еще не полная
    newvolume = volume + vSTEP;
    lastVolCor = nm;
  }

  //******************************************************//
  //вот СЮДА, вместо (или в дополнение к) печати громкости поставишь управление своей микросхемой
  if (newvolume != volume) {
    volume = newvolume;
    Serial.print("Volume = ");
    Serial.println(volume);
  }

}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

три раза прочитал код чтобы понять идею )))

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ua6em пишет:

три раза прочитал код чтобы понять идею )))

;)))

Ты никогда не станешь хорошо играть "в эмбеддера"  пока не прочувствуешь кожей, что loop() это цикл. 

Никаких идей нет, все автоматы так и пишутся:

в каждом проходе loop() просматриваешь список элементарных действий и делаешь намеченные. Чтобы не путаться в последовательности всегда сперва намечаешь действие флагом, а потом исполняешь его по флагу, тогда твой код нечувствителен к размещению блоков. Автоматный способ мышления: проверка - флаг - действие.

Часто флаг может быть неявным, например установка временной метки.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

wdrakula пишет:

ua6em пишет:

три раза прочитал код чтобы понять идею )))

;)))

Ты никогда не станешь хорошо играть "в эмбеддера"  пока не прочувствуешь кожей

я не об этом, так как электронщик в большей степени размышлял как почистить сигнал от шумов, ты жеж математик и, математическая реализация (я о pow) )))
направление мысли разное...
да, о 512, не надо гадать, посмотреть в мониторе порта при отсутствии сигнала самое видимо точное

Serial.println(analogRead(auxIn));

 

Eugen
Offline
Зарегистрирован: 28.08.2021

Всем привет!

Конечно же огромное спасибо всем участникам темы и отдельное спасибо тов. wdrakula

Ваш код отлично мне подошел... правда пришлось его немного модернизировать. Мое устройство дополнилось парой потенциометров для гибкой настройки некоторых параметров.

вот что у меня получилось:

прошу прощения за дебильную подробность комментариев в коде, это на случай склероза... т.к. оч редко ваяю на ардуинке

#include <PT2258.h>
#include <Wire.h>
PT2258 pt2258; // PT2258 Object
const byte auxIn = A0;// пин аудио входа

const int trashHoldInPin = A2;  // пин потенциометра порога срабатывания в управляющем сигнале
const int intensiveVolInPin = A1;  // пин потенциометра интенсивности подавления громкости управляемого сигнала

// пины индикаторов работы
const int ledPin2 =  2;
const int ledPin3 =  3;
const int ledPin4 =  4;
const int ledPin5 =  5;
const int ledPin6 =  6;

//максимальная и минимальная громкость. Шаг изменение громкости
int vMIN;
const int vMAX = 0;
const int vSTEP = 1;
const int vStepTime = 22;
static int volume = 0;
int treshold; //порог срабатывания

//переменная для проверки уровня отсутствия управляющего сигнала
int sensorValue; 

void setup() {
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin5, OUTPUT);
  pinMode(ledPin6, OUTPUT);
  
  ADCSRA &=0xFE; //настройка АЦП, частота 250 кГц
  ADCSRA |=0x06;
 
  Wire.setClock(100000); // установка частоты синхронизации шины I2C 100KHz
  
  //Serial.begin(9600); // открываем serial port (для отладки)
  /*проверяем может ли Arduino обмениваться данными с микросхемой  PT2258 или нет*/
  //if (!pt2258.init())
    //Serial.println("PT2258 Successfully Initiated");
  //else
    //Serial.println("Failed to Initiate PT2258");
  
  /*инициализируем PT2258 и устанавливаем в ней уровни звука по умолчанию*/
  pt2258.setChannelVolume(volume, 0);
  pt2258.setChannelVolume(volume, 1);
}

void loop() {
  
  //sensorNonValue = analogRead(auxIn); //для проверки уровня отсутствия управляющего сигнала
  //Serial.print("sensor = ");          //для проверки уровня отсутствия управляющего сигнала
  //Serial.println(sensorValue);        //для проверки уровня отсутствия управляющего сигнала

  digitalWrite(ledPin2, HIGH); // индикатор готовности устройства
  
  treshold = analogRead(trashHoldInPin);// читаем значения с ручки управления трэшхолдом
  treshold = map(treshold, 0, 1023, -70, 500); // Перемасштабируем значения (-70 для смещения ноля на потенциометре)
 
  //Voice messege detected
  static byte vm = false;
  //просто счетчик интегрирования
  static int i = 0;
  //промежуточная сумма интеграла
  static float si = 0;
  //сам интеграл
  static float s = 0;
  //отметка времени последней коррекции громкости
  static uint32_t lastVolCor = millis();
  //Олд Миллис - старая метка времени
  static uint32_t om = millis();
  //Нью Миллис - текущее время
  uint32_t nm = millis();

  //текущая громкость
  static int volume = vMAX;
  //новая громкость
  int newvolume = volume;

  //интеграл от квадрата амплитуды
  /*507 - уровень ноля (зависит от разности плеч 
   в делителе на входе управляющего сигнала 
   проверяется при отсутствии сигнала, кодом с 
   комментариями "//для проверки уровня отсутствия 
   управляющего сигнала") проверить и подставить фактический*/
  si += pow(analogRead(auxIn) - 507.0, 2);
  i++;
  
  //посчитали за 50 мс и сохранили среднее в "s"
  if (nm - om > 50) {
    om = nm;
    s = si / i;
    si = 0;
    i = 0;
  }

  //проверили на пороговое значение
  if (s > treshold) vm = true;
  else if (vm == true) {
    //настала тишина и нужно постепенно поднимать громкость
    vm = false;
    lastVolCor = nm;
    }

  vMIN = analogRead(intensiveVolInPin); // читаем значение с ручки управления минимальной громкостью управляемого сигнала
  vMIN = map(vMIN, 0, 1023, 5, 45); // Перемасштабируем значения 

  //заметили начало войс месседж и приглушили музыку
  if (vm)  newvolume = vMIN;
  else if (volume != vMAX && (nm - lastVolCor > vStepTime)) {
    
  //каждые vStepTime уменьшаем значение переменной newvolume на vSTEP, если тишина и громкость еще не полная.
  //уменьшая значение переменной - происходит увеличение фактической громкости
  //т.к. в pt2258 отрицательная громкость назначается положительным значением, например: -79дб = 79
  newvolume = volume - vSTEP;
  lastVolCor = nm;
  }
  
  //******************************************************//
  if (newvolume != volume) {
    volume = newvolume;
    
    pt2258.setChannelVolume(volume, 0); // устанавливаем в pt2258 уровни громкости на левый канал управляемого сигнала
    pt2258.setChannelVolume(volume, 1); // устанавливаем в pt2258 уровни громкости на правый канал управляемого сигнала
    
    //Serial.print("Volume = "); // для проверки управляемого уровня громкости
    //Serial.println(volume);    // для проверки управляемого уровня громкости
    
    // индикация срабатывания
    digitalWrite(ledPin4, HIGH);
    delay (10);
    digitalWrite(ledPin4, LOW);
  
    // индикация состояния управления  
      if (volume > 0){
    digitalWrite(ledPin6, HIGH);
    digitalWrite(ledPin3, LOW);
    }
      else {
    digitalWrite(ledPin6, LOW);
    digitalWrite(ledPin3, HIGH);
  }
 } 
}

Все работает, я счастлив, но осталось пару вопросов:

1) Как я понял значение трэшхолда Вы указали похоже в щестнадцатиричной системе? но тогда не вяжется значение в функции и в комментарии или это опечатка?

//пороговое значение среднего квадрата, поставил 4000, но нужно подобрать на месте
const float treshold = 4e3;

2) Как показала практика у чисто речевого сообщения, в отличие от музыки, есть абсолютные паузы (между словами) длительностью до 600 млсек. Их я не могу компенсировать, ни компрессией ни нормализацией. В этих паузах управляемый сигнал сразу же стремиться прибавиться.

Можно ли побороть это?

Можно ли сделать это увеличив время подсчета среднего значения, пожертвовав временем возврата громкости после окончания сообщения?


//посчитали за 50 мс и сохранили среднее в "s"
  if (nm - om > 50) {
    om = nm;
    s = si / i;
    si = 0;
    i = 0;

3) При попытке решения вышеописанного вопроса, аудио редактированием, меня посетила мысль сделать субтоновую подложку по верх голоса. Для начала я решил сгенерировать низкочастотный синус (ниже 20 Гц, чтобы ушам не мешал) и подать на вход вместо речи. Результат меня озадачил, тон даже в 2 (два)Гц отлично распознается ардуинкой, как устойчивый сигнал...

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

4) Для функциональной гибкости своего автомикшера, я решил оснастить его потенциометрами пока, что двумя. 1 - управление порогом срабатывания и 2 - управление глубиной "компрессии" (можно так сказать), но вместе с глубиной компрессии у меня получается управляется и скорость возвращения (сустейн) т.к. чем глубже я подавляю муз сигнал, тем большее количество шагов используется. А в нашем случае vSTEP длится vStepTime.

Я пробовал привязывать значение vStepTime к vMIN инверсируя и масштабирую его функцией map(),

int vStepTime;
....
vMIN = analogRead(intensiveVolInPin); // читаем значение с ручки управления минимальной громкостью управляемого сигнала
  vMIN = map(vMIN, 0, 1023, 5, 45); // перемаштабируем значения
  vStepTime = map(vMIN, 5, 45, 180, 20); // цепляем значение длительности шага изменения громкости к минимальной гр., инверсируем и и перемаштабируем его
...

но наверное (очень наверное! P.S. прошу сильно не пинать) из за нелинейности потенциомерта у меня получалось, что в крайних положениях произведение количества шагов и их длительности укладывалось в 900 милсек, а в средних положениях превышало в разы примерно до 3 сек.

Возможно ли это как-то реализовать линейную зависимость, что бы возврат с любой минимальной громкости длился всегда 900 милсек?

 

Eugen
Offline
Зарегистрирован: 28.08.2021

Прошу сильно не пинать если очень криво выражаюсь, в электронике и программировании я большой новичок!

Eugen
Offline
Зарегистрирован: 28.08.2021

В продолжение ночного монолога...

Вопрос №4 отпал сам собой... "Ларчик просто открывался"




int vStepTime;
 ... 
vMIN = analogRead(intensiveVolInPin); // читаем значение с ручки управления минимальной громкостью управляемого сигнала 
vMIN = map(vMIN, 0, 1023, 5, 45); // перемаштабируем значения
vStepTime = 900 / vMIN;
 ...
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

wdrakula!
Был Граф стал Товарищ )))

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ua6em пишет:

wdrakula!
Был Граф стал Товарищ )))

;)) Главное, чтобы Интернационал петь не заставляли!

===========

ТС, дорогой. Прости, но дальше сам, если бесплатно. 

И еще 4e3 это не неизвестная "шыснацатиричная" форма, а просто число в "научном" формате он же "экспоненциальная запись", читается "четыре на десять в третьей".

Ну нельзя быть таким дремучим! ;))

===========================

...добавлено позже...

ЗЫ: задумался, что я почувствовал от заплесневелого обращения "тов."... Да пипец какой-то, если честно! Руки потянулись искать комсомольский значок. Билет-то я торжественно спустил в сортир в 1986 году, года поступил на МехМат. На учет пытались заставить встать, этим и допекли. Послал нахер и выкинул билет.

Совок издох, и я очень надеюсь, что без возможности воскреснуть!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

wdrakula пишет:

Совок издох, и я очень надеюсь, что без возможности воскреснуть!

это уж врядли )))

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

Да, и про конденсатор тоже лихо

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Alexey_Rem пишет:

Да, и про конденсатор тоже лихо

?????

 

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

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

 
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Для начала следовало бы посмотреть осциллограмму этого сигнала. 

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

Опять же, схемы нет, - какой там конденсатор, и каково сходное сопротивление следующего каскада - неизвестно.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

Для начала следовало бы посмотреть осциллограмму этого сигнала. 

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

Опять же, схемы нет, - какой там конденсатор, и каково сходное сопротивление следующего каскада - неизвестно.

всё там было (я о ролике) )))
если не изменяет память, то 8 килоом реактивности вполне адекватно будут себя вести на 2 герцах

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Alexey_Rem пишет:

Да, и про конденсатор тоже лихо

Ну не знает ТС, что конденсатор переменку пропускает пуще водопада. Что лихого то в этом?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Нет, ну при указанных в видео номиналах частота среза составит 3 Гц, т.е. подаваемые 2 Гц будут завалены всего на несколько дБ.