Приветствую, задумал сделать камертон из функции tone, воспользовался программой ArdBlock - но, как обычно ничего не получилось. Что необходимо: при включении Ардуино нано должно воспроизводить звук определенной частоты, по нажатию кнопки - частота меняется, и так 8 нажатий - девять разных частот, после последнего опять возврат на 1 частоту. Но вышло - вообще ничего не вышло, посмотрите код - знаю, все должно быть чуть сложней, но знаний нифига нет. Если не сложно - подскажите, заранее признателен! Код (C++): /******************************************************************************** *** *** *** ArduBlock | Technologies *** Site: http://ardublock.ru *** Developer: Petrov Vitaliy Nikolaevich *** Library: http://ardublock.ru/download/libraries.zip *** *** Mail: ardublock@mail.ru *** Books: http://ardublock.ru/index.php?id=books *** *** *********************************************************************************/ void setup() { pinMode(9, OUTPUT); pinMode(3,INPUT_PULLUP); } void loop() { tone(9,174,0); if (digitalRead(3)) { tone(9,367,0); } if (digitalRead(3)) { tone(9,448,0); } if (digitalRead(3)) { tone(9,174,0); } }
Код (C++): #define BUZZER 9 #define BUTTON 3 const byte count = 8; const unsigned int freq[count] = {174, 448, 722, 996, 1270, 1544, 1818, 2092}; byte pos = 0; void setup() { pinMode(BUZZER, OUTPUT); pinMode(BUTTON, INPUT_PULLUP); } void loop() { tone(BUZZER, freq[pos]); if (!digitalRead(BUTTON)) { pos++; if (pos == count) pos = 0; } }
Пасиб, Tomasina, движение есть, нажатие кнопки меняет тон! Правда, почему то не те частоты, которые написаны и при нажатии на кнопку тоже раздается какой-то звук. У меня подключен не бузер - а динамик, кнопка подтянута не к 3-му - а ко второму пину - это ведь не принципиально? Кнопку подключил по этой схеме:
камертон - это чистый эталонный звук. А МК выдаёт меандр со спектром, далеко-далеко убегающим вдаль. Что ничего общего с камертоном не имеет.
Согласен, можно сказать по другому - пищалка с переключением тонов ). А можете что-то сказать в отношении кода, предложенного Tomasina - почему то работает не правильно, при включении выдает первый тон с правильной частотой, но по нажатию кнопки - совсем какие-то случайные звуки, не соответствующие указанным частотам...
В исходном коде кнопка подключена к 3-му пину, почему в коде один пин, а на схеме другой - претензии не ко мне Динамик сколько Ом? Большинство динамиков напрямую нельзя подключать, надо простенький усилитель тока, хотя бы на одном транзисторе. Но раз сейчас работает, значит динамик скорее всего высокоомный. Частоты те, просто вы не успеваете их услышать. Переключение - процесс очень быстрый. Поясню: 7-я миллисекунда (после включения) - пищит первый тон. 2000-я миллисекунда - обнаружено нажатие кнопки, пищит второй тон. 2004-я миллисекунда - следующий цикл - кнопка еще не отпущена! (палец не может так быстро двигаться) - пищит третий тон. ... 2016-я миллисекунда - следующий цикл - кнопка все еще не отпущена! (палец только начал обратное движение) - пищит седьмой тон. То есть та какофония что слышится - это быстрое чередование тонов пока кнопка нажата. Вывод - надо контролировать не только нажатие кнопки, но и ее отпускание и только тогда разрешать повторную обработку кнопки и переключение на следующий тон. А этого в ТЗ не было
Гм, да, это логично - я в общем так и подумал, пытался очень быстро нажать - но и правда, так быстро нажать не получится. Надо прописать продолжительность нажатия - то есть, менять тон, если кнопка нажата не менее ... миллисекунд. А как это сделать?
Эврика! Добавил "delay(500);" ниже "pos++;" - и вроде заработало! Я правильно сделал - или есть более грамотный способ решения этой проблемы?
Просто с динамиком все нормально, собрал усилитель на транзисторе (верней, в качестве ключа) - и стало самопроизвольно перескакивать с ноты на ноту, без нажатия кнопки...