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