Notone arduino не работает

Функция tone, noTone в Ардуино

Arduino tone используется для генерации на выходе микроконтроллера ШИМ-сигнала с 50% заполнением и с заданной частотой. Для воспроизведения аудио сигнала к пину нужно подключить пьезопищалку или динамик через транзистор. Продолжительность сигнала может быть задана параметром в команде tone или генерация остановится при перезагрузке платы или при вызове функции noTone Arduino Uno.

Команда tone в Ардуино описание

Воспроизводиться на Ардуино может одновременно только один сигнал. Если аудио сигнал воспроизводится уже на каком то порту, то новый вызов функции tone() с номером другого порта ни к чему не приведет. Если функция tone() Arduino будет вызвана с номером того же порта, то будет воспроизводится сигнал с новой частотой. Т.е. воспроизводится может только одна частота сигнала и на одном пине.

Синтаксис

tone(pin, frequency)
tone(pin, frequency, duration)

Параметры

pin — номер порта вход/выхода, на котором будет генерироваться сигнал
frequency — частота сигнала в Герцах
duration — длительность сигнала в миллисекундах

Функция tone, noTone использует аппаратный таймер, поэтому использовать в скетче ШИМ (PWM) сигнал для пьезодинамика невозможно на портах выхода 3 и 11 (кроме платы Arduino Mega). Генерация сигнала является полуаппаратной, то есть пин Ардуино включается/выключается по прерыванию таймера (Timer 2), поэтому на высокой частоте звука, микроконтроллер может немного притормаживать.

Arduino tone пример программы

Arduino tone максимальная частота

Генерируемая частота звука зависит от размера таймера в плате Arduino. Для микроконтроллера Arduino Uno или Nano и минимальная частота воспроизводимого звука составляет 31 Гц, а максимальная частота tone – 65535 Гц. Диапазон воспринимаемых частот ухом обычного человека значительно меньше.

Источник

Arduino.ru

tone() and noTone()

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Мужики, подскажите в чем косяк. Походу я чего-то недопонял. Вот такой код для теста написал:

Проблема: после посылки любого символа в сЕриал пищалка начинает пищать, но не затыкается. Что я упустил?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Andrey-S, условие срабатывает на каждом круге loop, Вы же из буффера функции не забрали байт.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

А как только заберёте байт, она начнёт щелкать и замолкать и даже не подумает хоть немного попищать.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Я так понимаю, что между 11 и 12 строкой мне надо вставить что-то типа «char ch=Serial.read();». Если да, то эффекта ноль.. Даже следом дописал «Serial.flush();» Опять ноль. Или опять туплю?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Ладно. Изменил код на следующий:

Жму 1. Начинает пищать. Жму 2. Продолжает пищать НО с другой частотой. WTF. P.S. Использую монтажный модуль пьезодинамика, а не просто пьезодинамик (если это конечно важно)

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Читайте также:  Не работает лепестковый клапан хонда дио

dimax, Вы попали!

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Этот код пищит вначале пол секунды одной частотой а потом незатыкаясь другой. Видимо функция noTone() не глушит нифига. а почемуууу.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Andrey-S, что за динамик у вас? Вероятность что функция не работает -ниже чем вероятность что вы неправильно включили динамик )) PS такое может быть если у вас димнамик с пищалкой, и включаете вы его относительно плюсовой шины. Пока функция не проинициализирована — на пине Z состояние. Когда звук отыграл пин остаётся как выход.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Andrey-S, что за динамик у вас? Вероятность что функция не работает -ниже чем вероятность что вы неправильно включили динамик )) PS такое может быть если у вас димнамик с пищалкой, и включаете вы его относительно плюсовой шины. Пока функция не проинициализирована — на пине Z состояние. Когда звук отыграл пин остаётся как выход.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Andrey-S, что за динамик у вас? Вероятность что функция не работает -ниже чем вероятность что вы неправильно включили динамик )) PS такое может быть если у вас димнамик с пищалкой, и включаете вы его относительно плюсовой шины. Пока функция не проинициализирована — на пине Z состояние. Когда звук отыграл пин остаётся как выход.

это активный зумер, ему не нужна функция TONE, он работает от 0 или 1

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Valera19701, но а как же тогда менять частоту без функции tone()? Может мне выпаять просто сам пьезоэлемент оттуда и напрямую врубить?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Andrey-S, во первых тут не корректно применять слово «пьезо», это обычный электромагнитный излучатель. Генератор звук.частоты в нём встроен. С функцией tone() он никак не совместим. Покупайте другой.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Valera19701, но а как же тогда менять частоту без функции tone()? Может мне выпаять просто сам пьезоэлемент оттуда и напрямую врубить?

не получится, у него внутри генератор, вам надо пассивный зумер, можно с компа спереть

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Динамик такой примерно

Блин, ну, вот нельзя отвечать новичку пока он не приведёт точное оборудование, схему включения и скетч! Нельзя — потреря времени!

Мало ли что китаец написал, что он passive? Вы + на корпусе видите?

Это активный зуммер. Если подать на него питание, он заверищит. Средняя нога для включения и для громкости через ШИМ. Попробуйте подключить его к GND, +5, а среднюю ногу к какому-нибудь ШИМ-порту и поподавайте на этот порт шим разной скважности. Наверняка, громкость будет меняться.

Источник

Генерирование и чтение сигналов

Начнём с самого простого: генерация импульса заданной длины, такое часто бывает нужно. Проще всего сделать это на delay() и delayMicroseconds() :

Читайте также:  Не работает генератор тойота ипсум

Нужно помнить, что digitalWrite() сам по себе выполняется в районе 3.6 мкс (58 тактов процессора). Для ускорения можно использовать например библиотеку directIO или прямую работу с регистрами портов.

Генерирование квадратного сигнала

Программное

Квадратный сигнал может быть использован для тактирования и управления, а также для генерации звука через усилитель. Самый базовый пример, Blink, по сути тоже является генератором квадратного сигнала:

Если заменить 1000 например на 10 , то получится квадратный сигнал с частотой 50 Гц. Этот способ называется программной генерацией сигнала, то есть микроконтроллер своими силами считает время и сам вручную дёргает ногой. Это как мешает работе остального кода, так и остальной код может сбивать частоту. Такую генерацию можно сделать более мене асинхронной на миллисе:

На практике такой способ используется редко, потому что на высокой частоте остальной код программы будет мешать генерации и частота будет плавать.

Функция tone()

В ядре Arduino есть встроенная функция для полуаппаратной генерации квадратного сигнала – tone(pin, frequency, duration) :

  • pin – цифровой пин, с которого будет генерироваться сигнал.
  • frequency – частота в Герцах. Диапазон 31.. 8’000’000 Гц, целые числа. С увеличением частоты растёт шаг изменения реальной частоты.
  • duration – продолжительность сигнала в миллисекундах. Опциональный параметр, если не указывать – сигнал будет генерироваться всё время.

Для ручной остановки генерации сигнала можно вызвать noTone() . Также у генерации при помощи tone() есть особенности:

  • Генерация является полуаппаратной: пин дёргается МК “вручную” по прерыванию таймера, что на высокой частоте может чуть тормозить код.
  • Генерация использует Timer 2, перенастройка или использование его для других целей (включая ШИМ на пинах D3 и D11 у Nano) отключит активную генерацию или изменит её частоту.
    • При вызове tone() таймер перенастраивается на генерацию, то есть можно использовать таймер в своих целях между вызовами tone() .
  • Генерация работает только на одном пине в один момент времени, причём для включения генерации на другом пине нужно сначала отключить текущую генерацию, то есть вызвать noTone() .

ШИМ сигнал

Аппаратный таймер позволяет генерировать квадратный сигнал аппаратно и полностью асинхронно работе остального кода, не тратя ни такта процессорного времени: время считается самим таймером, и сам же таймер управляет состоянием ноги МК. Для генерации ШИМ сигнала в среде Arduino есть функция analogWrite(pin, duty) , подробнее мы говорили в ней в уроке про ШИМ. Чтобы сделать ШИМ квадратным, нужно запустить его с duty , равной 128 . Что касается частоты полученного сигнала, то Ардуино настраивает таймеры так, что частота в зависимости от таймера может быть 490 или 980 Гц. Частоту можно изменить с довольно большим шагом, об этом мы говорили в уроке про увеличение частоты ШИМ.

Аппаратный таймер

Можно вручную настроить аппаратный таймер на генерацию квадратного сигнала. Тонкости настройки регистров таймера мы в рамках этих уроков не разбираем, но это можно сделать и при помощи библиотеки, например GyverTimers. Работу библиотеки мы разбирали в уроке о прерываниях таймера. Данная библиотека позволяет настроить генерацию квадратного сигнала с максимально возможной точностью и частотой, а также поднять на одном таймере генерацию двух или трёх (Arduino MEGA) меандров со смещением по фазе. Пример:

Читайте также:  Телевизор витязь не работает плей маркет

ШИМ сигнал

Аппаратный

Для генерации ШИМ сигнала с заданным заполнением есть стандартная функция analogWrite(pin, duty) , подробнее обсуждали в уроке про ШИМ сигнал, а частоту можно изменить перенастройкой таймера, как в уроке об увеличении частоты ШИМ. На самом деле таймеры позволяют настроить ШИМ сигнал с более точной или более высокой частотой и другими диапазонами заполнения (до 10 бит), но в ядре Arduino это не предусмотрено. Если такое будет нужно, можно воспользоваться библиотекой GyverPWM. Пример:

Программный

Программная генерация ШИМ сигнала может пригодиться, если не хватает лишнего таймера или частота ШИМ низкая и не повлияет на остальной код, а он на неё. Шим сигнал на миллисе можно организовать вот таким образом:

Полуаппаратный ШИМ

Можно снизить нагрузку на процессор, отдав счёт времени аппаратному таймеру. Примеры на базе GyverTimers:

Если не хватает количества стандартных ШИМ-выходов, можно поднять полуаппаратный ШИМ на таймере на несколько пинов сразу:

Библиотека Servo

Как известно, RC сервоприводы управляются при помощи ШИМ сигнала с частотой

50 Гц и длительностью импульса от

2500 микросекунд. В стандартной библиотеке Servo.h реализована генерация полуаппаратного ШИМ сигнала, причём количество пинов можно менять во время работы. Библиотеку можно использовать как генерацию ШИМ, если его параметры подходят для использования.

Чтение сигналов

Чтение цифрового сигнала сводится к измерению времени между его импульсами, то есть изменениями состояния HIGH-LOW: так можно измерить период и частоту квадратного сигнала, заполнение и частоту ШИМ и вообще любой другой сигнал.

Функция pulseIn()

В ядре Ардуино есть готовые функции для измерения импульсов:

    pulseIn(pin, value, timeout) – для импульсов от 10 мкс до

3 минут, работает на счёте тактов процессора, лучше работает при отключенных прерываниях, более точно измеряет короткие импульсы.
pulseInLong(pin, value, timeout) – для импульсов от 10 мкс до

3 минут, основано на micros() (т.е. на Таймере 0), не работает при отключенных прерываниях, более точно измеряет длинные импульсы.

Измеренная мной точность на коротких импульсах: 0.5 мкс

Обе функции возвращают длину импульса в микросекундах. Возвращают 0, если импульса не было и был достигнут тайм-аут. Обе функции блокирующие, то есть останавливают выполнение кода, пока не поймают импульс или не завершатся по тайм-ауту. Аргументы:

  • pin – цифровой пин (GPIO), на котором ожидается импульс.
  • value – направление импульса, HIGH или LOW .
  • timeout – тайм-аут ожидания импульса в микросекундах. Необязательный параметр, по умолчанию равен 1’000’000 мкс (1 секунда).

Как это работает: пусть мы настроили импульс на HIGH , функция будет ожидать изменение значения с LOW на HIGH . Если скачок с LOW на HIGH не произошёл за время, установленное тайм-аутом, функция завершит выполнение и вернёт 0.

Для превращения длины импульса (мкс) в частоту (Гц) достаточно поделить на него секунду (точнее, 1’000’000 мкс).

Измеряем сигналы вручную

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

Библиотека тахометра

Также предлагаю использовать класс тахометра, оформленный в виде библиотеки. Скачать можно с гитхаб. Также прикладываю здесь:

Источник

Оцените статью