Эффект эхо (echo) на микроконтроллере atmega32

Анализатор спектра на микроконтроллере ATmega32

В статье рассматривается конструкция простого анализатора спектра (0 – 10 кГц) на микроконтроллере Atmel AVR ATmega32. В качестве устройства отображения используется двухстрочный символьный ЖК индикатор. Основным моментом при реализации данного проекта является не аппаратная часть, а программная, точнее реализация дискретного преобразования Фурье (ДПФ) на 8-разрядном микроконтроллере. Сразу следует отметить, что автор не является экспертом в этой области и поэтому начал с основ – с простого дискретного преобразования Фурье. Алгоритм быстрого преобразования Фурье является не только быстрым, но и достаточно сложным.

Дискретное преобразование Фурье (в англоязычной литературе DFT, Discrete Fourier Transform) – это одно из преобразований Фурье, широко применяемых в алгоритмах цифровой обработки сигналов (его модификации применяются в сжатии звука в MP3, сжатии изображений в JPEG и др.), а также в других областях, связанных с анализом частот в дискретном (к примеру, оцифрованном аналоговом) сигнале. Дискретное преобразование Фурье требует в качестве входа дискретную функцию. Такие функции часто создаются путем дискретизации (выборки значений из непрерывных функций).

Принципиальная схема анализатора спектра звукового сигнала очень проста и условно ее можно разделить на цифровую часть и аналоговую.

Цифровая часть образована микроконтроллером и подключенным к нему ЖК индикатором. Микроконтроллер тактируется от кварцевого резонатора 16 МГц, в качестве опорного напряжения для АЦП микроконтроллера используется напряжение питания +5 В.
Шина данных ЖК индикатора подключена к порту C микроконтроллера (линии ввода/вывода PC0-PC3), шина управления подключена к порту D(PD5, PD6) микроконтроллера. Индикатор работает в 4-битном режиме. Переменный резистор номиналом 4.7 кОм используется для регулировки контрастности. Для работы с индикатором были созданы пользовательские символы для отображения 8 горизонтальных столбиков анализатора, эти пользовательские символы занимают все 64 Байта ОЗУ ЖК индикатора.

Микроконтроллер работает от внешнего кварцевого резонатора 16 МГц.

Аналоговая часть устройства – это самая важная часть и представляет собой предварительный усилитель сигнала электретного микрофона, выход которого подключается к каналу ADC0 встроенного в микроконтроллер АЦП. Уровень нуля на входе АЦП нам необходимо установить равным точно половине опорного напряжения, т.е. 2.5 В. В этом случае мы сможем использовать положительную и отрицательную полуволну сигнала, но его амплитуда не должна превышать установленный предел, т.е. коэффициент усиления должен быть точно настроен для предотвращения перегрузки. Всем вышеуказанным условиям отвечает распространенная микросхема низкопотребляющего операционного усилителя LM324.

Алгоритм ДПФ несколько медленнее в сравнении с быстрым преобразованием Фурье. Но наш анализатор спектра не требует высокой скорости, и если он способен обеспечить скорость обновления около 30 кадров в секунду, этого будет более чем достаточно для визуализации спектра звукового сигнала. В любом случае, в нашем варианте возможно достичь скорости 100 кадров в секунду, но это уже слишком высокое значение параметра для двухстрочного символьного ЖК индикатора и оно не рекомендуется. Частота дискретизации равна 20 кГц для 32 точечного дискретного преобразования Фурье и поскольку результат преобразования симметричен, нам нужно использовать только первую половину, т.е. первые 16 результатов. Следовательно, мы можем отображать частотный спектр в диапазоне до 10 кГц и разрешение анализатора составляет 10 кГц/16 = 625 Гц.

Автором конструкции были предприняты попытки увеличения скорости вычисления ДПФ. Если это преобразование имеет N точек, то мы должны найти N2/2 значений синуса и косинуса. Для нашего 32 точечного преобразования необходимо найти 512 значений синуса и косинуса. Но, прежде чем найти их нам необходимо вычислить угол (градусы), что займет некторое процессорное время, поэтому было решено использовать для этих вычислений таблицы значений. При расчетах в программе микроконтроллера не используются вычисления с плавающей точкой и числа двойной точности (double), так как это займет больше времени на обработку на 8-разрядном микроконтроллере. Вместо этого значения в таблицах поиска используются 16-разрядные данные целочисленного типа (integer), умноженные на 10000. Затем после выполнения преобразования результаты делятся на 10000. При таком подходе имеется возможность выполнять 120 32-точечных преобразований в секунду, что более чем достаточно для нашего устройства.

Демонстрация работы анализатора спектра на микроконтроллере ATmega32

Загрузки

Исходный код (программа микроконтроллера, таблицы данных синуса, косинуса и угла) – скачать

Перевод: Vadim по заказу РадиоЛоцман

Измерение расстояний с помощью микроконтроллера AVR и датчика HC-SR04

В этой статье мы рассмотрим схему для измерения расстояний, построенную с использованием ультразвукового датчика HC-SR04 и микроконтроллера ATmega32 (семейство AVR). Датчик HC-SR04 использует технологию под названием “ECHO” (эхо), то есть испускает ультразвуковой сигнал и потом анализирует отраженный от препятствий сигнал.

Принцип работы ультразвукового датчика HC-SR04

Мы знаем, что звуковые волны не могут проникать через твердые тела. Эти волны распространяются по воздуху со скоростью примерно 220 м/с. Когда они достигают нашего уха, мы слышим их как звук. Но когда эти колебания (звуковые волны) встречают на своем пути твердые тела это равносильно тому, что они встречают на своем пути непроходимую стену, поэтому они отражаются от них с такой же самой скоростью, с которой они распространялись до этого. Этот эффект называется эхо.

Ультразвуковой датчик HC-SR04 обеспечивает на своем выходе сигнал, пропорциональный дистанции до препятствия. Датчик генерирует звуковые колебания в ультразвуковом диапазоне (после получения управляющего импульса) и после этого ждет когда они вернутся к нему (эхо), отразившись от какого-нибудь препятствия. Затем, основываясь на скорости звука (220 м/с) и времени, необходимом для того чтобы эхо достигло источника (нашего датчика), датчик обеспечивает на своем выходе сигнал, пропорциональный расстоянию до препятствия.

Как показано на рисунке сначала нам нужно инициировать датчик для измерения расстояний, для этого на его триггерный контакт (trigger pin) необходимо подать логический сигнал высокого уровня длительностью не менее 10 мкс, после этого датчик генерирует серию звуковых колебаний и после получения отраженного сигнала (эхо) датчик обеспечивает на своем выходе сигнал, пропорциональный расстоянию между ним и препятствием.

Расстояние при этом рассчитывается по следующей формуле: distance (in cm) = width of pulse output (in uS) / 58. То есть дистанция (в сантиметрах) равна длительности выходного импульса датчика (в микросекундах), деленная на 58.

Необходимые компоненты

Аппаратное обеспечение

  1. Микроконтроллер ATmega32 (купить на AliExpress).
  2. Программатор AVR-ISP (купить на AliExpress), USBASP (купить на AliExpress) или другой подобный.
  3. Ультразвуковой датчик HC-SR04 (купить на AliExpress).
  4. JHD_162ALCD (ЖК дисплей 16×2) (купить на AliExpress).
  5. Конденсатор 1000 мкФ (купить на AliExpress).
  6. Резистор 10 кОм (2 шт.) (купить на AliExpress).
  7. Источник питания с напряжением 5 Вольт.

Программное обеспечение

  1. Atmel Studio версии 6.1 (или выше).
  2. Progisp или flash magic (необязательно).

Работа схемы

Схема устройства приведена на следующем рисунке.

В представленной схеме PORTB микроконтроллера ATmega32 соединен с портом данным жидкокристаллического (ЖК) дисплея. Если вы не хотите трогать фьюзы (FUSE BITS) микроконтроллера, то не используйте PORTC, поскольку PORTC содержит специальные функции (типы связи), которые можно деактивировать только с помощью изменения фьюзов.

В ЖК дисплее (если мы не хотим использовать черный цвет) можно задействовать только 14 его контактов: 8 контактов для передачи данных (7-14 или D0-D7), 2 контакта для подачи питания (1&2 или VSS&VDD или gnd&+5v), 3-й контакт для управления контрастностью, 3 контакта для управления (RS&RW&E).

В представленной схеме мы использовали только 2 контакта управления ЖК дисплея для лучшего понимания работы схемы. Бит контраста и READ/WRITE используются нечасто, поэтому они могут быть замкнуты на землю. Это обеспечивает ЖК дисплею максимальную контрастность и переводит его в режим чтения. Теперь нам всего лишь нужно контролировать контакты ENABLE и RS чтобы передавать на ЖК дисплей символы и данные. Также на нашем сайте вы можете прочитать более подробную статью о подключении ЖК дисплея к микроконтроллеру AVR ATmega32.

В схеме необходимо сделать следующие соединения с ЖК дисплеем:
PIN1 или VSS — земля
PIN2 или VDD или VCC — +5v питание
PIN3 или VEE — земля (обеспечивает максимальный контраст ЖК дисплею)
PIN4 или RS (Register Selection) – контакт PD6 микроконтроллера
PIN5 или RW (Read/Write) — земля (переводит ЖК дисплей в режим чтения что упрощает взаимодействие с ним для начинающих)
PIN6 или E (Enable) — контакт PD5 микроконтроллера
PIN7 или D0 — контакт PB0 микроконтроллера
PIN8 или D1 — контакт PB1 микроконтроллера
PIN9 или D2 — контакт PB2 микроконтроллера
PIN10 или D3 — контакт PB3 микроконтроллера
PIN11 или D4 — контакт PB4 микроконтроллера
PIN12 или D5 — контакт PB5 микроконтроллера
PIN13 или D6 — контакт PB6 микроконтроллера
PIN14 или D7 — контакт PB7 микроконтроллера

Читайте также  Первые цифровые оптические ультрафиолетовые датчики от silicon labs

В схеме мы использовали 8-битную связь (D0-D7) ЖК дисплея с микроконтроллером, хотя можно было ограничиться и 4-битной – но в этом случае код программы стал бы немного сложнее. Таким образом, мы использовали 10 контактов ЖК дисплея, 8 из которых будут использоваться для передачи данных и 2 для управления.

Ультразвуковой датчик HC-SR04 имеет 4 контакта:

  • PIN1 — VCC или +5V – контакт для подачи питающего напряжения;
  • PIN2 — TRIGGER – триггерный контакт. На него подается управляющий импульс для запуска работы датчика;
  • PIN3 — ECHO – на его выходе формируется выходной (эхо) сигнал;
  • PIN4 — GROUND – земля.

Контакт 3 (ECHO) датчика подсоединен к микроконтроллеру как источник внешнего прерывания – то есть к контакту INT0 (interrupt 0) или PD2 микроконтроллера.

Теперь, чтобы измерять расстояние с помощью датчика HC-SR04, мы должны выполнить следующую последовательность действий:

  1. Подать на триггерный вход датчика импульс длительностью не менее 12 мкс (с запасом, как говорится).
  2. После того как отраженный сигнал (эхо) вернется к датчику на его выходе ECHO появится сигнал высокого напряжения, которое мы в микроконтроллере должны обработать как внешнее прерывание и запустить счетчик времени.
  3. Как только на выходе ECHO датчика снова появится сигнал низкого напряжения (выходной импульс закончится) мы должны остановить счетчик времени.
  4. Таким образом, во время действия выходного импульса на контакте ECHO датчика счетчик времени микроконтроллера измеряет длительность этого импульса. Потом мы измеренную длительность этого импульса пересчитываем в расстояние.
  5. Измеренное расстояние отображается на ЖК дисплее 16×2.
    Для выполнения этой последовательности действий нам необходимо установить значения в ряде регистров, показанных на рисунке.

BLUE (синий, INT0 – внешнее прерывание 0): этот бит должен быть установлен в 1 для того чтобы разрешить обработку внешнего прерывания 0 (interrupt0). Если мы сделали это, то после этого мы можем отслеживать изменения логических уровней на контакте D2 микроконтроллера.

BROWN (коричневый, ISC00, ISC01): эти два бита настраиваются для контроля логических уровней на контакте D2 микроконтроллера, который в данной случае рассматривается как источник внешнего прерывания.

То есть, как мы уже говорили ранее, нам необходимо прерывание чтобы запустить наш счетчик времени и потом остановить его. Таким образом мы устанавливаем бит ISC00 в единицу и получаем прерывание когда имеем переход с логического LOW на HIGH на входе INT0, другое прерывание мы получаем когда имеем переход с логического HIGH на LOW.

RED (красный, CS10): это бит используется для того, чтобы активировать и деактивировать счетчик времени. И хотя он работает вместе с другими битами (CS11, CS12), нам они не важны поскольку в данном случае нам не нужно устанавливать предварительный делитель частоты.

Перед началом программирования микроконтроллера необходимо уяснить две важные вещи:

  • мы используем внутренний тактовый генератор микроконтроллера ATMEGA32A, который работает на частоте 1 МГц. Мы не используем здесь предварительный делитель частоты и не выполняем какой либо сложной обработки прерываний, поэтому нам не нужно никакой сложной установки регистров;
  • значение счетчика времени после завершения счета сохраняется в 16 битном регистре TCNT1 микроконтроллера.

Исходный код программы на языке С (Си) с пояснениями

Программа для рассматриваемой схемы представлена следующим фрагментом кода на языке С (Си). Комментарии к коду программу поясняют принцип работы отдельных команд.

Урок 7.1 Генерация звука при помощи AVR микроконтроллера

Порадовать глаз различными миганием светодиодов мы уже умеем, а почему бы нам еще и не порадовать слух. В данном уроке мы рассмотрим как сгенерировать звук при помощи таймера AVR, вывести ее на динамик, и в конце концов сделаем некоторое подобие midi плеера. Чтож за дело…

Итак для сборки понадобится Atmega8, стандартная обвязка (кварц на 8МГц, 2 конденсатора на 22пФ) и пьезоизлучатель без внутреннего генератора, например HC0903A.

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

Достаточно просто, поэтому сразу переходим к теории. Чтобы создать звук нам нужно заставить колебаться мембрану динамика с определенной частотой. Каждой ноте соответствует своя частота, например ноте До 1 октавы, соответствует частота 261Гц. Т.е. дрыгая ногой микроконтроллера, подключенной к динамику, со скоростью 261 раз в секунду мы будем слышать звучание этой ноты. Для тех кто не силен в музыкальной теории, звук ближе от 1кГц и выше будет более писклявый, ниже 300Гц будет басить.

Перейдем к реализации. Как заставить ногу дрыгаться с такой скоростью? В этом нам поможет таймер, работу которого мы изучили в предыдущих уроках. В данном случае, нам пригодится timer1. Принцип формирования частоты таков: таймер тикает, до тех пор пока его значение не совпадет OCR1A. В в момент совпадения OCR1A, с текущим значением таймера происходит прерывание (выполняется функция) в котором текущее состояние PORTB.3 инвертируется (включается/отключается), таким образом мы получаем «пульсирующий» сигнал(мендр). Регулируя OCR1A мы изменяем частоту. Все, никаких сложностей.

Код исполняемый в прерывании:

interrupt [TIM1_COMPA] void timer1_compa_isr(void)
<
PORTB.3=!PORTB.3;
>

Теперь, нужно соотнести каждой ноте частоты и по очереди их воспроизводить, т.е. создать массив со значениями, которые по очереди будем подставлять в OCR1A. Прошивка далеко не идеальна, но вполне работоспособна. Доступна тут.

На последок видео, подобрал первое что в голову пришло: марио и танчики)))

46 комментариев: Урок 7.1 Генерация звука при помощи AVR микроконтроллера

Добрый день. Я хотел сгенерировать звук с частотой 500 герц. Создавая проект в CV, настраиваю таймер: в clock value ставлю 8000000khz. Ставлю галочку в compare a match. И перевожу 500 в 1F4. Генерю. Пишу код PORTB.3=!PORTB.3;.А в итоге получается щелк с большой задержкой. Что делать? Больше кодов не писал.

Можете мне скинуть пример генерации одного звука?

Почитайте 5 урок, там все написано. Вам только и нужно настроить прерывание по совпадению. Не забывайте про фьюзы, если камень с завода не перепрошивался, то на нем будет 1МГц.

Дело в том что это все стимулировалось в протеусе. Я делаю все как в 5 уроке. Но результат такой и был «щелк с длинной задержкой». И нужно ли таймер нужно запускать в коде и останавливать?

про протеус можете забыть, он считает не в реальном времени, поэтому и результат соответствующий

Электронный ревербератор (эффект “эхо/объемный звук”)

Юрий Садиков
г. Москва

Электронный ревербератор BM2061 (NM2061) – это устройство обработки звука, при помощи которого можно придавать фонограмме эффекты “эха” и “объемного звука”. Предусмотрена возможность регулировки задержки сигнала до 100 мс. В качестве входного источника сигнала можно использовать линейный выход звуковоспроизводящего устройства или микрофон. Ревербератор послужит основой для самодельного усилителя-караоке! Устройство имеет небольшие габариты, малое потребление тока, прост в сборке и настройке.

Общий вид устройства представлен на рис.2, схема электрическая принципиальная – рис.3.

Технические характеристики

Напряжение питания: 9–12 В
Ток потребления: 20 мА
Частотный диапазон: 100–12000 Гц
Выходной сигнал: 250 мВ
Размеры печатной платы: 64х56 мм

Рисунок 2. Общий вид устройства

Рисунок 3. Схема электрическая принципиальная

Ревербератор состоит из двух объединенных блоков: блока предусилителя и блока самого ревербератора.

Блок предусилителя выполнен на ОУ 4558 или 358 (DA1). Коэффициент усиления выбран около 40 дБ (определяется отношением R10/R7) в расчете работы предусилителя напрямую с микрофоном. Если в качестве источника сигнала используется линейный выход звуковоспроизводящего оборудования (250 мВ), рекомендуется снизить коэффициент усиления до 6 дБ (резистор R7 = 22 кОм). Потенциометр R11 предназначен для регулировки уровня сигнала, снимаемого с предусилителя. При использовании электретного микрофона переключатель SW1 необходимо замкнуть, а при использовании динамического микрофона – разомкнуть.

Читайте также  Как поменять проводку в квартире без штробления?

Блок ревербератора выполнен на базе специализированной ИМС HT8970, состоящей из дельта-модулятора/демодулятора, необходимых фильтров, генератора и участка памяти емкостью 20 Kb. ИМС может работать в одном из двух режимов — «эхо»(echo) или «объемный звук»(surround).

При использовании эффекта «эхо»(echo) необходимо установить все электронные компоненты согласно перечню и принципиальной схеме. Потенциометром R13 устанавливается время задержки эффекта «эхо», а R23 определяет глубину эффекта (глубина обратной связи). Переключатель SW2 необходимо замкнуть, а SW3 необходимо перемкнуть джампером в положении 1-2.

При использовании эффекта «объемный звук»(surround), переключатель SW2 необходимо разомкнуть, а SW3 необходимо перемкнуть джампером в положении 2-3. Или просто не устанавливать элементы С22, С23, С24, R23 и R18. Потенциометром R13 устанавливается время задержки эффекта «объемный звук».

Напряжение питания подается на контакты Х3(+), Х4(-). Микрофон (лин. выход) подключается к контактам Х1(+), Х2(-).

Устройство имеет стандартный линейный выход (разъем XP1 – тип “тюльпан”). К нему можно подключить, например, усилитель мощности или последующий каскад обработки сигнала.

Конструктивно ревербератор выполнен на печатной плате из фольгированного стеклотекстолита с размерами 64х56 мм. Конструкция предусматривает установку платы в корпус, для этого на плате имеются монтажные отверстия под винты 2,5 мм.

Для удобства подключения питающего напряжения и источника сигнала на плате предусмотрены посадочные места под штыревые контакты или клеммные винтовые зажимы.

Чертеж печатной платы приведен на рис.4 и рис.5. Перечень элементов — в таблице.

Рисунок 4. Чертеж печатной платы (вид сверху)

Рисунок 5. Чертеж печатной платы (вид снизу)

Таблица. Перечень компонентов

Позиция Номинал Количество
C1 0,47 мкФ 1
C2 0,68 мкФ 2
C3, С8, С12 220 мкФ/16. 25 В 3
C4 1 мкФ/16. 25 В 1
C5 22 мкФ/16. 25 В 1
C6 39 пФ 1
C7, C11, C15, C16 0,1 мкФ 4
C9, C11, C15, C16 4,7 мкФ/16. 25 В 4
C13 5600 пФ 1
C17, С18, С21 560 пФ 3
C19, С20 0,047 1
С22 0,033 1
C24, С25 10 мкФ/16. 25 B 2
DA1 4558/358 1
DA2 78L05 1
DA3 HT8970 1
R1, R15, R16, R20 10 кОм 5
R2, R4, R5, R8, R24 4,7 кОм 5
R3, R9 1 кОм 2
R6, R10 47 кОм 2
R7 560 кОм 1
R11, R23 22 кОм 2
R12 100 кОм 1
R13 47 кОм 1
R14, R19, R21, R22 15 кОм 4
R17 12 кОм 1
R18 13 кОм 1
Микрофон электретный 1
Видеоразъем K366G(RP4) 1
Штыревой 2-контактный разъем PLS-40 1
Штыревой 3-контактный разъем PLS-40(RP4) 1
Съемная перемычка (джампер) 1
Клеммный 2-контактный разъем ED500V-2*5 2

Материал опубликован в журнале Левша 2004`11.

Как сделать эхо эффект

Самые распространенные эффекты, которые используются в электронной танцевальной музыке (и не только) – это реверберация и эхо эффект (дилэй). В этой статье пойдет речь именно об эхо эффекте.

Эхо – это физическое явление, возникающее вследствие отражения исходного звука от предметов. Наш слуховой аппарат воспринимает звук, отраженный от предметов и таким образом мы слышим несколько искажённую копию исходного сигнала.

Эхо эффект – это эмуляция эхо с помощью специальных приборов пространственной обработки. Такие приборы называют дилэем (delay – задержка).

Более подробную информацию вы можете узнать прочитав статью «Дилэй — эффект эха» .

Как сделать эхо эффект

Как я уже сказал, для эмуляции эхо необходимо использовать специальный прибор – дилэй.

Давайте рассмотрим процесс создания эхо эффекта с помощью:

— VST плагина от компании Waves SuperTap 2.

Вы можете использовать любой другой плагин.

Основные параметры приборов одинаковы. Они могут отличаться какими-то дополнительными настройками.

Fruity Delay Bank – это плагин формата fruity, имеющий 8 банков для создания различных комбинаций эхо эффектов.

Обрабатывать я буду короткий вокальный сэмпл из библиотеки «Mutekki Media Dance Ultra Voice Vol. 1». Звучит он следующим образом:

Перенесу этот сэмпл в Playlist и направлю на первый канал микшера.

Повешу на канал Send 1 плагин Fruity Delay Bank и настрою его таким образом:

Time stereo offset – 31,4 ms left;

Feedback stereo separation – 0;

Я сделал именно такие настройки, чтобы вы могли более явно услышать эффект. Однако, при работе над треком может возникнуть необходимость в более коротких задержках и эффект станет не таким выраженным.

Наложу немного реверберации для более приятного звучания.

Повешу в разрыв Insert 1 плагин Fruity Reverb и настрою его.

Выберу пресет Cathedral и установлю регулятор Reverb в положение 15%.

Теперь попытаюсь воссоздать тот же эффект используя плагин от компании Waves – SuperTap 2. Таким образом, я хочу в очередной раз подчеркнуть простую истину. Не важно, какой плагин вы используете главное, чтобы вам было удобно им пользоваться, и он создавал нужный эффект.

SuperTap 2 – это дилэй, включающий в себя возможность настройки параметров 2 задержек и обратной связи. Есть аналогичный плагин SuperTap 6 с возможностью использования 6 задержек. Однако его использование в данном случае нецелесообразно.

Повешу плагин SuperTap 2 на канал Send 2 и замьютирую канал Send 1.

Настрою SuperTap 2 следующим образом:

Sync – Auto (синхронизация с проектом);

Direct On/Off – Off (сухой сигнал);

Rotate Tap 1: -45;

Rotate Tap 2: 45;

Feedback Gain: 60;

Feedback Rotate: 0:

Feedback Delay: 8.

Как видим первый и второй варианты очень похожи.

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

Примеры на Си для микроконтроллеров Atmel AVR

Здесь представлены примеры различных программ на языке Си для микроконтроллеров Atmel AVR. Все примеры написаны под микроконтроллер ATmega16, поэтому при переносе на другие МК семейства AVR это нужно учитывать. Тактовая частота микроконтроллера во всех примерах 8 МГц (используется тактирование от внутреннего генератора). Код примеров разбит на блоки и снабжен комментариями. Проекты написаны в среде Eclipse (инструкция по установке и настройке Eclipse для AVR) и легко могут быть импортированы в Eclipse. Также можно использовать данные проекты и в среде AVR studio (изменится только структура файлов проекта). При обнаружении ошибок просьба сообщить на почту.

Blink – Самый простой пример. К порту C подключены 8 светодиодов. Светодиоды зажигаются логической единицей на линии порта. В цикле светодиоды порта включаются и выключаются. Свеобразный аналог Hello World в мире встраиваемых систем.

IO Ports – В данном примере рассматривается работа с портами ввода-вывода. К порту C подключены 8 светодиодов (линии 0-7). К линии 2 порта D подключена кнопка, с подтяжкой на землю. При нажатии кнопка выдает на линию 0 порта С уровень логической единицы. Цикл программы организован следующим образом: при запуске включается бегущий огонь, сначала загорается светодиод на линии 0 порта C, затем на линии 1 и т.д. По достижении линии 7 направление бегущего огня меняется (от 7 к 0). При нажатии на кнопку бегущий огонь останавливается и загораются одновременно все светодиоды. После повторного нажатия на кнопку бегущий огонь продолжает перемещаться с места остановки.

Dynamic Indication – В данном примере рассматривается работа с 7-сегментным индикатором. В моём случае он имеет 4 разряда (цифры). Поскольку у меня на плате установлены транзисторы для управления разрядами, то управление осуществляется выводом логической единицы и на разряды и на сегменты. Схема подключения следующая: к линиям 0-7 порта C подключены сегменты индикатора, а к линиям 0-3 порта В разряды индикатора. При запуске на индикатор выводятся цифры 1 2 3 4.

UART – В данном примере рассматривается периферийного модуля UART (универсальный асинхронный приёмопередатчик). Модуль UART можно настроить как на работу с прерываниями, так и без них (вручную, путём работы с флагами). Пример работает следующим образом: при получении байта, МК переходит в обработчик прерывания (используется только прерывание по приёму данных) и разбирает численное значение байта (0-255) на цифры, которые и выводятся на 7-сегментный индикатор. Схема подключения аналогична предыдущему примеру. Передача осуществляется по двум линиям UART (порт D линии 0-1), к которым необходимо подключить линии RX и TX преобразователя USB-UART. Для настройкки без прерываний необходимо обнулить бит RXCIE в регистре UCSRB и вручную опрашивать интерфейс в основном цикле программы.

Читайте также  Открытая проводка в деревянном доме

Clock – В данном примере рассматривается реализация простых часов с 7-сегментным индикатором и парой кнопок. Только здесь уже требуется 6 разрядов, хотя секунды можно опустить. Кнопки с подтяжкой на землю. При нажатии кнопка выдает на линию высокий логический уровень. Индикатор подключается как и в предыдущих примерах (сегменты к порту C, разряды к порту B), а кнопки к линиям 2-3 порта D. Кнопка используется PD2 для установки минут, а PD3 для установки часов. По нажатию каждой из кнопок увеличивается значение соответствующего разряда (минуты или часы).

DS18B20 – В данном примере рассматривается работа с цифровым датчиком температуры DS18B20. Показания температуры выводятся на 7-сегментный индикатор. Вывод DQ датчика поключен к ноге (пину) PD5. Линия должна быть подтянута к плюсу питания резистором на 4.7-10 кОм (согласно документации). Датчик опрашивается каждые 5 секунд. Температура выводится на 4-разрядный индикатор: знак, два разряда на целуюю часть и один на вещественную. Документация к датчику здесь.

DHT11 – В данном примере рассматривается работа с датчиком температуры и влажности DHT11. Показания температуры выводятся на 7-сегментный индикатор. Вывод DATA (также SDA) датчика поключен к ноге (пину) PD5. Линия должна быть подтянута к плюсу питания резистором на 4.7-10 кОм (согласно документации). Датчик опрашивается каждые 5 секунд. Измеряются температура и влажность, но на дисплей выводится только влажность (целое двухзначное число). Документация к датчику здесь.

DHT22 – В данном примере рассматривается работа с датчиком температуры и влажности DHT22. По сравнению с DHT11 данный датчик обладает большей точностью и более широким диапазоном измерений. Показания температуры выводятся на 7-сегментный индикатор. Вывод DATA (также SDA) датчика поключен к ноге (пину) PD5. Линия должна быть подтянута к плюсу питания резистором на 4.7-10 кОм (хотя согласно документации это и необязательно). Датчик опрашивается каждые 5 секунд. Измеряются температура и влажность, но на дисплей выводится только влажность (вещественное двухзначное число с одним знаком после запятой). Документация к датчику здесь.

BMP180 – В данном примере рассматривается работа с цифровым датчиком температуры и атмосферного давления BMP180. Показания атмосферного давления выводятся на 7-сегментный индикатор. Датчик подключаетсяпо интерфейсу I2C. Линии SDA и SCL должны быть подтянуты к плюсу питания резисторами на 4.7-10 кОм. Датчик опрашивается каждые 10 секунд. Измеряются температура и давление, но на дисплей выводится только атмосферное давление в мм. ртутного столба (целое число). Документация к датчику здесь.

BH1750 – В данном примере рассматривается работа с цифровым датчиком освещенности BH1750. Показания освещенности выводятся на 7-сегментный индикатор. Датчик подключается по интерфейсу I2C. Линии SDA и SCL должны быть подтянуты к плюсу питания резисторами на 4.7-10 кОм. Датчик опрашивается каждые 5 секунд. Документация к датчику здесь.

ADC Indication – Данный пример аналогичен примеру с UART. Отличие в том, что байт берется с линии 0 порта А (линия 0 АЦП, ADC0). Микроконтроллер по таймеру производит аналого-цифровое преобразование напряжения на линии 0 порта А, (младшие 2 бита отбрасываются как шум). При измерении используется внутренняя опора 5 В. К линии PD2 порта D подключена кнопка, которая определяет режим вывода показаний. При нажатии на кнопку выводится результат измерений в виде числа от 0 до 255. Если кнопка не нажата, то результат измерений переводится в вольты и выводится на индикатор (с точностью до десятых).

Fast PWM – В данном примере показана настройка аппаратного ШИМ (широтно-импульсная модуляция, англ. PWM). К линиям 4 и 5 порта D подключены светодиоды, а к линиям 2-3 и 6-7 порта D – кнопки каналов A и B соответственно. Кнопки с подтяжкой на землю (при нажатии кнопка выдает на линию порта уровень логической единицы) Кнопки на линях 2 и 3 соответственно увеличивают и уменьшают коэффициент заполнения ШИМ (меняется яркость светодиода) канала А. Кнопки на линях 6 и 7 соответственно увеличивают и уменьшают коэффициент заполнения ШИМ канала B. Число сравнения для каждого из каналов меняется в диапазоне от 0 до 255. Для канала А шаг изменения равен 10, для канала В шаг равен 5.

HCSR04 – В данном примере рассматривается работа с ультразвуковым датчиком расстояния HCSR04. К линии PD3 подключен вывод Trigger датчика, а к линии PD2 вывод Echo. Поключение 7-сегментного индикатора аналогично предыдущим примерам. МК периодически опрашивает датчик и определяет расстояние до препятсвия в сантиметрах. После этого число разбивается на цифры и выводится на дисплей. Документация к датчику здесь.

Matrix Keyboard – В данном примере показана работа с матричной клавиатурой. Микроконтроллер динамически опрашивает клавиатуру, а затем определяет номер нажатой клавиатуры. Размер поля 3 на 3 – получаем 9 кнопок. Нажатие первых 8-ми приводит к зажиганию светодиода на соответствующей линии порта А, нажатие 9-ой кнопки зажигает все светодиоды порта А. Матричная клавиатура подключается к линиям 0-5 порта С (три столбца и три строки). В архиве схема и печатная плата матричной клавиатуры (Diptrace).

Shift Register – В данном примере рассматривается работа с модулем SPI на примере сдвигового регистра 74HC595. К регистру подключены светодиоды, в качестве линии CS используется линия 4 порта B (вывод not SS). Линия DS (14 нога) регистра идет к MOSI (PB5), линия SHCP (11 нога) к линии SCK (PB7), линия STCP (12 нога) к линии SS (PB4). Линии MR (10 нога) и OE (13 нога) должны быть подтянуты к высокому и низкому логическим уровням соответственно. По таймеру микроконтроллер меняет состояние светодиодов: поочерёдно горят то чётные светодиоды, то нечётные. Если при этом передать байт по UART’у, то он будет выведен в порт на светодиоды. Чтобы обратно переключиться в режим мигания необходимо послать по UART’у 0x00 (ноль). Документация к микросхеме 74HC595 здесь.

SG-90 Servo – В данном примере рассматривается работа с сервоприводом SG-90. Используется аппаратный ШИМ. Линия ШИМ сервпопривода подключена к каналу А аппаратного ШИМ. Кнопки поворота подключены к линиям PD2 и PD3. Кнопка на линии PD2 увеличивает длительность импульса, кнопка на линии PD3 уменьшает длительность импульса. Длительность импульса меняется от 1 до 2 мс. Описание сервомотора здесь.

RGB Lamp – В данном примере рассматривается работа с трехцветным RGB-светодиодом. Реализовано плавное переливание цветов с использованием программного ШИМ. Линии красного, зеленого и синего цветов подключаются соответственно к линиям 2, 3 и 4 порта D.

TSOP4836 NEC – В данном примере рассматривается работа с фотоприемником TSOP4836 и протоколом передачи NEC, который широко используется в инфракрасных пультах дистанционного управления. При получении команды на дисплей выводится ее код. Поключение 7-сегментного индикатора аналогично предыдущим примерам. Описание фотоприемника здесь.

WS2812 Ring – В данном примере рассматривается работа со светодиодами WS2812 с встроенным ШИМ-контроллером. К контроллеру подключено такое кольцо из 16 светодиодов (количество светодиодов в кольце можно указать в коде). Библиотека для работы с WS2812 не моя (взята на гитхабе и немного допилена, копирайт сохранён). В программе сначала задается массив цветов (красный, зеленый, синий), а затем в цикле реализуется их сдвиг и плавным изменением интенсивности. Линия IN первого светодиода подключается к линии PD2 порта D. Описание светодиодов здесь.

MFRC522 RFID – В данном примере рассматривается работа со считывателем RFID карточек MFRC522. Cчитыватель подключён к контроллеру по стандартной схеме. Библиотека для работы с MFRC522 не моя (взята на гитхабе и немного допилена, копирайт сохранён). При запуске контроллер определяет тип ридера и отправляет данные в UART. Затем идет непрерывная проверка обнаружения RFID устройств. При поднесении карточки или брелка считывается его адрес и отправляется в UART (адрес 32 бита, 4 байта). Описание считывателя здесь.