Модуль WTV020-SD-16P возможно ли использовать в одном скече с гироскопом ( без delay)

Lexan
Offline
Зарегистрирован: 12.02.2016

Доброго времени суток!

Ребят запустил скеч: Nano + гиро MPU6050+2кнопки+2реле(одна из реле выключается через 30сек). И решил озвучить нажатие кнопок, и некоторые моменты измерений гироскопа. Но возникло пару вопросов по модулю. Так как сколько я видел примеров, рабочих скечей с этим модулем, все они используют delay так как вродебы нужно время на воспроизведение файла AD4. 

В общем вопрос токой, возможно ли использовать модуль WTV020-SD-16P без паразитной функцыи delay и не вредя нормальной работе гироскопа???

В отдельном скече WTV020-SD-16P я запускал, AD4 читает с этим проблем нет. Но этот скеч использует delay.

Lexan
Offline
Зарегистрирован: 12.02.2016

Ну неужели весь скеч обязательно должен остановится, чтобы модуль воспроизвел один трек?? Треки у меня разные от 4 секунд до 1минуты...

Lexan
Offline
Зарегистрирован: 12.02.2016

Пробовал запускать треки без delay в скече с MPU6050 но скеч сразу зависает.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Цитата:
В общем вопрос токой, возможно ли использовать модуль WTV020-SD-16P без паразитной функцыи delay и не вредя нормальной работе гироскопа???
Да, возможно

Цитата:
Ну неужели весь скеч обязательно должен остановится, чтобы модуль воспроизвел один трек??
Нет, не обязательно

Lexan
Offline
Зарегистрирован: 12.02.2016

А каким образом это возможно реализовать?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Вместо delay() используют millis(). Как бы на живом скетче проще показать, чем излагать теорию.

Lexan
Offline
Зарегистрирован: 12.02.2016

Нужно чтобы после нажатия кнопки1 (BUTTON_01.click_down) воспроизвёлся один раз трек wtv020sd16p.playVoice(0);  длинной 3сек.

А по нажатию кнопки2 (BUTTON_02.click_down) трек wtv020sd16p.playVoice(1); тоже 3 сек.

 

Araris
Offline
Зарегистрирован: 09.11.2012

Замените wtv020sd16p.PlayVoice(); 

на wtv020sd16p.asyncPlayVoice();

Lexan
Offline
Зарегистрирован: 12.02.2016

Попробовал прописал прямо в кнопку wtv020sd16p.asyncPlayVoice(0); не воспроизвелось...

if (BUTTON_01.click_down) 
   {
      wtv020sd16p.asyncPlayVoice(0);
    if (relayEnable == false)    // если до этого реле было выключено
    {
      Serial.println("Relay ON");
      relayEnable = true;        // разрешаем включение реле
      relayStartTime = millis(); // запускаем счетчик времени
    }
    Serial.println("Relay1 ON\n");            // пишем в порт
    k = true;                                 //копируем значение X по нажатию и отдаем его переменной kalXold
    kalXold = kalmanX.getAngle(accXangle, gyroXrate, (double)(micros()-timer)/1000000); 
   }   

 

 

 

Потом попробовал здесь (здесь почемуто воспроизвелось но только после закрытия порта монитора:) т.е получается после остановки ардуидны)

 
 
if (k == true)
     {
       wtv020sd16p.asyncPlayVoice(0);     
      if (abs(kalXold - kalAngleX) > 5) // есле kalXold бельше или меньше 5 то...
      {
        
       if (relay2Enable == false)   // если до этого реле №2 было выключено 
    {
      Serial.println("Relay2 ON");
      relay2Enable = true;      // разрешаем включение Реле №2
      relay2StartTime = millis(); // запускаем счетчик времени
    } 
      Serial.println("Relay2 ON\n");   // пишем в порт 
      }
     }

 

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

т.е. если пишешь

wtv020sd16p.playVoice(0);
delay(3000);

то воспроизводит, а если

wtv020sd16p.playVoice(0);

то зависает...

А если меняешь на wtv020sd16p.asincPlayVoice(0); то молчит, так?

Лог последовательного порта можешь показать?

Lexan
Offline
Зарегистрирован: 12.02.2016

Andy пишет:

т.е. если пишешь

wtv020sd16p.playVoice(0);
delay(3000);

то воспроизводит, а если

wtv020sd16p.playVoice(0);

то зависает...

А если меняешь на wtv020sd16p.asincPlayVoice(0); то молчит, так?

 

Когда использую delay вся программа начинает тупить со скоростью указанной в delay. И нечего не воспроизводится.

А когда убераю delay, то со страшной скоростью мегает светодиод TX на дуине и не воспроизводит. Но скеч вроде не зависает и показания гироскопа в норме. Но уже после закрытия порта и сталобыть отключения ардуины воспроизводится этот трек ))

Такое ощущение как будто зависает не сама дуня а модуль wtv020sd16p. 

И в динамиках, чётко в такт лампочке TX на дуне слышны пощелкивания....

Как будтобы пытается запустить трек со скоростью 20 раз в секунду, и сама себе мешает этим...

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Есть подозрение, что эта функция вызывается многократно. Попробуй так, объяви boolean ena=true; добавь в loop

if (ena)
{
  ena=false;
  wtv020sd16p.playVoice(0);
}

Будет проигрываться один раз?

А нет ли конфликта?

#define BUZZER 6

int busyPin = 6;  //подключение вывода "занятости" модуля к пину 4

 

Lexan
Offline
Зарегистрирован: 12.02.2016

Ребят, пробовал добавить вторую функцию на одну кнопку, но почемуто срабатывает две функцый почти одновременно. Хоть держи кнопку хоть нажимай. В чём может быть причина?

Функция1

if (BUTTON_02.click_down)   // Отключение... 
   {
    if (ena2) //Если ena2...
   {
    ena2=false;
    wtv020sd16p.asyncPlayVoice(2);
   }
     kalYold = 0; //обнуляем переменную
     kalXold = 0; //обнуляем переменную
     k = false;
    relayEnable = false;                      //выключаем реле1
    relay2Enable = false;                    //выключаем реле2
      Serial.println("Relay1 OFF\n");     // пишем в порт
      Serial.println("Relay2 OFF\n");    // пишем в порт
      ena = true;          
   }

 

Функцыя 2

if (BUTTON_02.retention)  // Кнопка с задержкой
   {
      relay3Enable = false;        // Выключаем  реле3
      relay3StartTime = millis();
   }