звуковой файл

Тема в разделе "Arduino & Shields", создана пользователем espilya, 7 фев 2017.

  1. espilya

    espilya Нерд

    вот например хочу я чтобы воспроизводилась определенная мелодия а потом после нее крутился сервопривод и все это происходило после того как расстояние будет меньше 20см . я это делаю вот так
    if (distance_sm < 20)
    {
    mp3_play (1); // Воспроизвести файл "mp3/0001.mp3
    myservo.write(180);
    delay (350);
    myservo.write(30);
    delay (300);
    }
    но файл воспроизводится и потом через секунду выключается.
    как сделать чтобы он не выключался до окончания файла?
     
  2. Tim308

    Tim308 Нерд

    "но файл воспроизводится и потом через секунду выключается.
    как сделать чтобы он не выключался до окончания файла?"
    Какая-то ахинея.Пять минут пытался въехать в смысле этих предложений и не получилось .
     
  3. sslobodyan

    sslobodyan Гик

    Все здесь понятно описано.
    Дело в том, что проверка на сближение постоянно вам дает сработку и вы снова и снова перезапускаете воспроизведение файла.
     
  4. espilya

    espilya Нерд

    имею ввиду если файл длится минуту, то как сделать чтобы он звучал минуту а не 5 секунд. ну то есть чтобы до конца звучал
     
  5. espilya

    espilya Нерд

    как тогда сделать чтобы проверка на сближение не делалась до тех пор пока не окончатся(не сделают то что нужно) команды?
     
  6. sslobodyan

    sslobodyan Гик

    А каким образом вы узнаете, что ваши команды выполнились? Показывайте ваш код.
     
  7. espilya

    espilya Нерд

    никаким. я только вижу(звук и движение сервопривода) то что они выполнились
     
  8. espilya

    espilya Нерд

    Код (C++):
    #include <SoftwareSerial.h>
    #include <DFPlayer_Mini_Mp3.h>
    #include <Servo.h>

    const int Trig = 6;
    const int Echo = 7;
    Servo myservo;
    //int pos = 180;    // variable to store the servo position
    void setup () {
      Serial.begin (9600);
      pinMode(Trig, OUTPUT);
      pinMode(Echo, INPUT);
      myservo.attach(9);
      mp3_set_serial (Serial);  
      delay (100);
      mp3_set_volume (26);
      delay (100);
    }

    unsigned int time_us = 0;
    unsigned int distance_sm = 0;

    void loop () {

      digitalWrite(Trig, HIGH);
      delayMicroseconds(10);
      digitalWrite(Trig, LOW);
      time_us = pulseIn(Echo, HIGH);
      distance_sm = time_us / 58;
      Serial.println(distance_sm);

      if (distance_sm < 20)  
      {
        mp3_play (1);  // Воспроизвести файл "mp3/0001.mp3
       
     
    myservo.write(170);
      delay (300);
    myservo.write(0);
      delay (150);
      myservo.write(180);
      delay (100);
      myservo.write(0);
      delay (150);
      myservo.write(180);
      delay (100);
      myservo.write(0);
      delay (100);

        delay (1000);
      }
     
    }
     
  9. sslobodyan

    sslobodyan Гик

    Ну тогда подумайте, по каким признакам контроллер поймет, что можно дальше контролировать дистанцию. Это либо прошедшее время (сами определите сколько), или анализ ножки 16 Busy (0-играем, 1-ждем), или шлем запрос mp3_wait_state и анализируем ответ (попробуйте сами посмотреть что выдается в "глухом" и "говорящем" состоянии). После будем принимать решение как это запрограммировать.
     
  10. espilya

    espilya Нерд

    Давайте сделаем через анализ ножки 16 Busy. Я еще поменяю дальномер на другой датчик движения, он будет работать как реле; есть движение - дает сигнал он, нету движение - нет сигнала
     
  11. sslobodyan

    sslobodyan Гик

    Нет проблем.
    Код (C++):

    if (distance_sm < 20 AND digitalRead(pinBusy)==HIGH)
     
    Естественно, вначале определите pinBusy и настройте на вход.
     
  12. espilya

    espilya Нерд

    сделал так. так как на ваш код он ворчал.
    Код (C++):
    if ((distance_sm < 20) && (digitalRead(busyPin)==HIGH))  
    настроил, тоесть добавил вот это:

    Код (C++):
    int busyPin = 4; // busy

    pinMode(busyPin, INPUT); // busy это добавил в  "void setup"
     
    все также не работает, работает но звуковой файл звучит только пол секунды а потом выключается. Пытался после "mp3_play (1); // Воспроизвести файл "mp3/0001.mp3" добавлять delay "(100);" но он только увеличивал немного продолжительность воспроизведение файла.
    может я не так настроил пин?
     
  13. ostrov

    ostrov Гуру

    Я уже писал про кривизну библиотеки DFPlayer и публиковал тут код собственного производства, который не глючит и работает хоть в синхронном режиме с осмотром пина BUSY, хоть в асинхронном, хоть в смешанном. Поищите, месяца не прошло.
     
    arkadyf нравится это.
  14. sslobodyan

    sslobodyan Гик

    А вы подключили этот плеер на TX и RX хардварного усарта? Если да ( вот ведь mp3_set_serial (Serial); ), то ни в коем случае нельзя использовать Serial.println(distance_sm); . Если нужны отладочные сообщения, то только через SoftwareSerial, иначе реакция плеера не предсказуема.
     
  15. espilya

    espilya Нерд

    Искал, не нашел:( Вы выложили его в этом форуме? Создали отделенную тему или в сообщение к теме выложили?
     
  16. espilya

    espilya Нерд

    Сейчас попробовал без Serial.println(distance_sm);, разницы никакой.
    "А вы подключили этот плеер на TX и RX хардварного усарта?" Да, я подключил напрямую RX-TX и TX-RX
     
  17. sslobodyan

    sslobodyan Гик

    Проверьте только плеер
    Код (C++):
    int cnt=1;

    void loop () {
        if ( digitalRead(busyPin)==HIGH ) {
            mp3_play(cnt);
            cnt += 1;
        }
    }
     
    Должен последовательно проиграть 1.мр3, 2мр3, 3.мр3 и т.д.
     
  18. espilya

    espilya Нерд

    плеер работает, я его до этого проверял.
    А может быть что из за того что все это(сервопривод, плеер, динамик, ардуино, дальномер) подключено к компьютеру и питается только он него, может быть то что не хватает плееру питание и он выключается?
     
  19. ostrov

    ostrov Гуру

    arkadyf нравится это.
  20. sslobodyan

    sslobodyan Гик

    Очень может быть. Чудес не бывает. Есть контакты, питание, внешние помехи, кривые программы.
    Плеер управляется по уарту, значит посылка по тому же уарту любых других данных может восприниматься ним как команда. Если вы убрали все другие Serial.print`ы, то остается только питание. Сервы в рывке могут отжирать до ампера тока. Просто отключите физически серву не меняя код.
     
    arkadyf нравится это.