tone(); noTone();

leks
Offline
Зарегистрирован: 22.10.2017
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Arduino UNO
//
////////////////////////
//
// Универсальная программа проигрывания мелодий – пример моя мелодия/
//

unsigned int n = 0;
unsigned int k = 0;
unsigned int j = 0;
unsigned int r = 0;
unsigned int s = 0;
unsigned int h = 0;

int tabl [189] ={ 532,6,3,  532,6,3,  440,6,3,
                         523,12,3,  440,6,3,  523,12,3,
                         440,6,3,  494,12,6,  494,6,3,
                         494,6,3,  415,6,3,  494,12,3,
                         415,6,3,  494,12,3,  415,6,3,
                         440,12,6,  659,6,3,  659,6,3,
                         554,6,3,  659,12,3,  554,6,3,
                         659,12,3,  554,6,3,  587,12,6,
                         698,6,3,  587,6,3,  494,6,3,
                         523,12,3,  440,6,3,  415,6,3,
                         370,6,3,   415,6,3,  440,12,24,
                         523,4,2,   523,4,2,  494,4,2,
                         440,4,2,  494,4,2,  523,4,2,
                         587,8,2,   523,4,2,  587,12,2,
                         587,8,2,   523,4,2,  587,12,2,
                         523,8,2,    494,4,2,  523,12,2,
                         523,4,2,   523,4,2,  494,4,2,
                         440,4,2,  494,4,2,  523,4,2,
                         587,8,2,   523,4,2,  587,12,2,
                         587,8,2,   523,4,2,  494,4,2,
                          440,4,2,  415,4,2,  440,12,24};  // зашифрованные данные нот, длительности нот и пауз

void setup()
{
        pinMode(14, OUTPUT);//"вывод на котором играет мелодия"
        digitalWrite(14, LOW);
         pinMode(15, OUTPUT);
        digitalWrite(15, HIGH);//управляющий вывод (1-мелодия звучит, 0-нет)
 }

void loop()
{
  //if(millis()>10000){ pinMode(14, INPUT);}//выключи пищалку???!!!
   for (h = 20; h <=40; h=h+10) // смена темпа звучания
      {

          for (n = 0; n <189; n=n+3)
            {
                k=tabl[n]; // нота-частота звука
                j=tabl[n+1]; // условная длительность звучания
                s=tabl[n+2]; // условная длительность паузы

               tone (14, k, h*j) ;
               r=h*(j+s);
               delay(r);
       }
    }
  
}

//
// Конец /
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Такой вопрос возник. К "сервоходу" хочется добавить пищалку так чтобы выключать её с отдельного вывода. Реализовал это аппаратно на самодельном модуле. Проверил на таком скетче. Смотрел на него и подумал, а если вывод 14 объявить как вход, скажем через 10 секунд - мелодия должна прерваться... А она играет не прекращая. Где я ошибаюсь в своих рассуждениях?

leks
Offline
Зарегистрирован: 22.10.2017

Прочитал внимательно первые строки, понял , что генерация звука идёт на порт вне зависимости вход он или выход.

http://arduino.ru/Reference/Tone

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

Файл tone.cpp

// frequency (in hertz) and duration (in milliseconds).

void tone(uint8_t _pin, unsigned int frequency, unsigned long duration)
{
  uint8_t prescalarbits = 0b001;
  long toggle_count = 0;
  uint32_t ocr = 0;
  int8_t _timer;

  _timer = toneBegin(_pin);

  if (_timer >= 0)
  {
    // Set the pinMode as OUTPUT
    pinMode(_pin, OUTPUT);
    
    // if we are using an 8 bit timer, scan through prescalars to find the best fit 
...

Обратите внимание на строку 15.

Другими словами, чудес не бывает, - сигнал на выходе появляется только в режиме OUTPUT.

leks
Offline
Зарегистрирован: 22.10.2017

Теперь ясно почему "мой input" сработал на такой короткий отрезок времени. Интересная логика, зачем эта 15 строка?, почему этим даётся приоритет "tone() перед INPUT"?

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

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

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

И, кстати, tone() - это функция в основном для новичков. Уж слишком "жестко" она работает и слишком много имеет ограничений и побочных эффектов. Когда, по мере освоения микроконтроллеров новички начинают разбираться с устройством конкретного контроллера, они, как правило, перестают использовать tone() и переходят на менее универсальные, но имеющие меньше побочных эффектв и ограничений средства.

leks
Offline
Зарегистрирован: 22.10.2017
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Arduino UNO
//
////////////////////////
//
// Универсальная программа проигрывания мелодий – пример моя мелодия/
//

unsigned int u = 0;//переменная смены нот,длительностей и пауз
unsigned int h = 20;//переменная смены темпа мелодии
long Y=0;
int tabl [189] ={ 532,6,3,  532,6,3,  440,6,3,
                         523,12,3,  440,6,3,  523,12,3,
                         440,6,3,  494,12,6,  494,6,3,
                         494,6,3,  415,6,3,  494,12,3,
                         415,6,3,  494,12,3,  415,6,3,
                         440,12,6,  659,6,3,  659,6,3,
                         554,6,3,  659,12,3,  554,6,3,
                         659,12,3,  554,6,3,  587,12,6,
                         698,6,3,  587,6,3,  494,6,3,
                         523,12,3,  440,6,3,  415,6,3,
                         370,6,3,   415,6,3,  440,12,24,
                         523,4,2,   523,4,2,  494,4,2,
                         440,4,2,  494,4,2,  523,4,2,
                         587,8,2,   523,4,2,  587,12,2,
                         587,8,2,   523,4,2,  587,12,2,
                         523,8,2,    494,4,2,  523,12,2,
                         523,4,2,   523,4,2,  494,4,2,
                         440,4,2,  494,4,2,  523,4,2,
                         587,8,2,   523,4,2,  587,12,2,
                         587,8,2,   523,4,2,  494,4,2,
                          440,4,2,  415,4,2,  440,12,24};  // зашифрованные данные нот, длительности нот и пауз

void setup()
{
        pinMode(14, OUTPUT);//"вывод на котором играет мелодия"
        digitalWrite(14, LOW);
         pinMode(15, OUTPUT);
        digitalWrite(15, HIGH);//управляющий вывод (1-мелодия звучит, 0-нет)
 }

void loop()
{
 
 
   if(millis()-Y>h*(tabl[u+1]+tabl[u+2])){Y=millis();u=u+3;if(u>=189){u=0;h=h+10;}
   if(h>40){h=20;}
   // tabl[u]; нота-частота звука
   //tabl[u+1]; условная длительность звучания
   //tabl[u+2]; условная длительность паузы
  tone (14,tabl[u],h*tabl[u+1]);}
}

//
// Конец /
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Да, я пробовал уже и без неё. Но хочется приделать к квадроподу, чтобы ходил по кнопке под мелодию или без неё. Пока так перебил исходный скетч тренировычный...

Ясно, что придётся использовать под "кнопку" ещё один пин и самодельный модуль.

SLKH
Offline
Зарегистрирован: 17.08.2015

andriano пишет:

побочные эффекты, т.е. эффекты никак не связанные с воспроизведением тона, но влияющие на работу контроллера, например, на возможность использования PWM на некоторых пинах.

и не только это, есть ещё и недокументированная неприятность, на которую я наступил совсем недавно: tone()  корёжит функцию delayMicroseconds(),

т.е. в куске

tone(p,f); delayMicroseconds(t); noTone(p);

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

Так что в моем скетче надо отказываться или от tone(), или от delayMicroseconds(), или от обеих сразу. 

 

leks
Offline
Зарегистрирован: 22.10.2017

leks
Offline
Зарегистрирован: 22.10.2017

Приделал к квадроподу модуль-пищалку по такой схеме. Всё работает как задумано, мелодия сама по себе, хождение само по себе, но при выключении ( на вывод 15 логический 0) в капсуле слышны лёгкие шорохи. Как можно подправить схему, чтоб без них обойтись.

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

Рискну предложить два возможных решения: аппаратное и программно-аппаратное (ни то, ни другое не проверялось)

- поставить в эимттер транзистора диод в прямом направлении.

- убрать из схемы диод VD1 и переводить вывод 15 не в "1", а в высокоимпедансное состояние.

leks
Offline
Зарегистрирован: 22.10.2017

Решение оказалось верное. Поставил такой же диод как и в базовой цепи - шум,треск исчез. Получается что даже 0,12-0,32 В (замерял вольтметром на разных экземплярах) "прямого падения на диоде" достаточно чтоб "транзистор шумел".