Камертон на несколько частот по нажатию кнопки

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем dmb, 5 июл 2020.

  1. dmb

    dmb Нерд

    Приветствую, задумал сделать камертон из функции 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);

        }

    }
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    Код (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;
      }
    }
     
    NikitOS нравится это.
  3. dmb

    dmb Нерд

    Пасиб, Tomasina, движение есть, нажатие кнопки меняет тон! Правда, почему то не те частоты, которые написаны и при нажатии на кнопку тоже раздается какой-то звук. У меня подключен не бузер - а динамик, кнопка подтянута не к 3-му - а ко второму пину - это ведь не принципиально? Кнопку подключил по этой схеме: knopka02.png
     
    Последнее редактирование: 6 июл 2020
  4. parovoZZ

    parovoZZ Гуру

    камертон - это чистый эталонный звук. А МК выдаёт меандр со спектром, далеко-далеко убегающим вдаль. Что ничего общего с камертоном не имеет.
     
  5. dmb

    dmb Нерд

    Согласен, можно сказать по другому - пищалка с переключением тонов ). А можете что-то сказать в отношении кода, предложенного Tomasina - почему то работает не правильно, при включении выдает первый тон с правильной частотой, но по нажатию кнопки - совсем какие-то случайные звуки, не соответствующие указанным частотам...
     
  6. DetSimen

    DetSimen Гуру

    Прямо к пину? А динамик на сколько Ом?
     
  7. Tomasina

    Tomasina Сушитель лампочек Модератор

    В исходном коде кнопка подключена к 3-му пину, почему в коде один пин, а на схеме другой - претензии не ко мне ;)

    Динамик сколько Ом? Большинство динамиков напрямую нельзя подключать, надо простенький усилитель тока, хотя бы на одном транзисторе. Но раз сейчас работает, значит динамик скорее всего высокоомный.

    Частоты те, просто вы не успеваете их услышать. Переключение - процесс очень быстрый.
    Поясню:
    7-я миллисекунда (после включения) - пищит первый тон.
    2000-я миллисекунда - обнаружено нажатие кнопки, пищит второй тон.
    2004-я миллисекунда - следующий цикл - кнопка еще не отпущена! (палец не может так быстро двигаться) - пищит третий тон.
    ...
    2016-я миллисекунда - следующий цикл - кнопка все еще не отпущена! (палец только начал обратное движение) - пищит седьмой тон.
    То есть та какофония что слышится - это быстрое чередование тонов пока кнопка нажата.

    Вывод - надо контролировать не только нажатие кнопки, но и ее отпускание и только тогда разрешать повторную обработку кнопки и переключение на следующий тон. А этого в ТЗ не было :D
     
    NikitOS нравится это.
  8. dmb

    dmb Нерд

    Гм, да, это логично - я в общем так и подумал, пытался очень быстро нажать - но и правда, так быстро нажать не получится. Надо прописать продолжительность нажатия - то есть, менять тон, если кнопка нажата не менее ... миллисекунд. А как это сделать?
     
    Последнее редактирование: 6 июл 2020
  9. dmb

    dmb Нерд

    Эврика! Добавил "delay(500);" ниже "pos++;" - и вроде заработало! Я правильно сделал - или есть более грамотный способ решения этой проблемы?
     
  10. Daniil

    Daniil Гуру

    Совершенству нет предела, по каким критериям оценить грамотность? Если вас устраивает, то хорошо.
     
  11. dmb

    dmb Нерд

    Просто с динамиком все нормально, собрал усилитель на транзисторе (верней, в качестве ключа) - и стало самопроизвольно перескакивать с ноты на ноту, без нажатия кнопки...
     
  12. parovoZZ

    parovoZZ Гуру

    Просадки по питанию, которые негативно влияют на МК. Нужна развязка по питанию.
     
  13. DetSimen

    DetSimen Гуру

    Закрывающий резистор ему в базу, килоОм на 10
     
  14. dmb

    dmb Нерд

    Все получилось, Tomasina большой респект!
     
    Последнее редактирование: 9 июл 2020