tone(); noTone();
- Войдите на сайт для отправки комментариев
Ср, 14/11/2018 - 21:35
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // 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 секунд - мелодия должна прерваться... А она играет не прекращая. Где я ошибаюсь в своих рассуждениях?
Прочитал внимательно первые строки, понял , что генерация звука идёт на порт вне зависимости вход он или выход.
http://arduino.ru/Reference/Tone
Файл tone.cpp
Обратите внимание на строку 15.
Другими словами, чудес не бывает, - сигнал на выходе появляется только в режиме OUTPUT.
Теперь ясно почему "мой input" сработал на такой короткий отрезок времени. Интересная логика, зачем эта 15 строка?, почему этим даётся приоритет "tone() перед INPUT"?
Вообще-то считается, что если пользователь вызывает функцию tone(), то хочет добиться при этом вполне конкретного результата. И, соответственно, заставлять его делать какие-либо предварительные настройки перед вызовом tone() - это плохая идея. tone() должна уметь делать все сама.
Потом, ваша фраза о "приоритете" выглядит немного странно. Какой-либо приоритет возможен между сравнимыми сущностями, здесь же - сущности принципиально разных порядков. INPUT - это режим работы одного из узлов контроллера, tone() - функция, совершающая определенное действие. Чтобы выполнить это действие, ей необходимо настроить все нужные ей для работы узлы. Иначе она работать не будет. Более того, эти настройки имеют еще и побочные эффекты, т.е. эффекты никак не связанные с воспроизведением тона, но влияющие на работу контроллера, например, на возможность использования PWM на некоторых пинах.
И, кстати, tone() - это функция в основном для новичков. Уж слишком "жестко" она работает и слишком много имеет ограничений и побочных эффектов. Когда, по мере освоения микроконтроллеров новички начинают разбираться с устройством конкретного контроллера, они, как правило, перестают использовать tone() и переходят на менее универсальные, но имеющие меньше побочных эффектв и ограничений средства.
Да, я пробовал уже и без неё. Но хочется приделать к квадроподу, чтобы ходил по кнопке под мелодию или без неё. Пока так перебил исходный скетч тренировычный...
Ясно, что придётся использовать под "кнопку" ещё один пин и самодельный модуль.
побочные эффекты, т.е. эффекты никак не связанные с воспроизведением тона, но влияющие на работу контроллера, например, на возможность использования PWM на некоторых пинах.
и не только это, есть ещё и недокументированная неприятность, на которую я наступил совсем недавно: tone() корёжит функцию delayMicroseconds(),
т.е. в куске
tone(p,f); delayMicroseconds(t); noTone(p);
время задержки раза в два больше предписанного.
Так что в моем скетче надо отказываться или от tone(), или от delayMicroseconds(), или от обеих сразу.
Приделал к квадроподу модуль-пищалку по такой схеме. Всё работает как задумано, мелодия сама по себе, хождение само по себе, но при выключении ( на вывод 15 логический 0) в капсуле слышны лёгкие шорохи. Как можно подправить схему, чтоб без них обойтись.
Рискну предложить два возможных решения: аппаратное и программно-аппаратное (ни то, ни другое не проверялось)
- поставить в эимттер транзистора диод в прямом направлении.
- убрать из схемы диод VD1 и переводить вывод 15 не в "1", а в высокоимпедансное состояние.
Решение оказалось верное. Поставил такой же диод как и в базовой цепи - шум,треск исчез. Получается что даже 0,12-0,32 В (замерял вольтметром на разных экземплярах) "прямого падения на диоде" достаточно чтоб "транзистор шумел".