Оглавление:

Мигание, Пение, Мариоман: 5 шагов
Мигание, Пение, Мариоман: 5 шагов

Видео: Мигание, Пение, Мариоман: 5 шагов

Видео: Мигание, Пение, Мариоман: 5 шагов
Видео: Красивое пение || 🎄 Рождество стучится тихо в двери ❄ (Молодежный хор) 2024, Сентябрь
Anonim
Мигает, Пение, Мариоман
Мигает, Пение, Мариоман

Используйте attiny13a, два светодиода и динамик для поздравительной открытки, чтобы создать мигающего мариомана, который играет музыкальную тему Super Mario Brothers. Это может быть простой и недорогой проект для тех, кто ищет интересный способ проникнуть в программирование AVR! ноты песен генерируются прямоугольной волной, выводимой на единственный вывод микроконтроллера AVR. Светодиоды, которые чередуются на каждой ноте, подключены к 2 контактам одного и того же чипа.

Шаг 1: материалы и конструкция

Материалы и конструкция
Материалы и конструкция

1 attiny13a

www.mouser.com/Search/ProductDetail.aspx?qs=sGAEpiMZZMvu0Nwh4cA1wRKJzS2Lmyk%252bEP0e%2f7dEeq0%3d Стоимость: 1,40 доллара США.

  • 2 светодиода - подойдут любые светодиоды
  • 1 литиевая батарейка типа таблетка

www.sparkfun.com/commerce/product_info.php?products_id=338Стоимость: 2,00 доллара США.

1 держатель для монетоприемников

www.sparkfun.com/commerce/product_info.php?products_id=8822Стоимость: 1,25 доллара США.

1 маленький динамик из музыкальной открытки

Общая стоимость материалов ~ 5 долларов США. Два светодиода были прикреплены непосредственно к двум контактам attiny13A. Два контакта используются для каждого светодиода, второй контакт устанавливается на низкий уровень для использования в качестве заземления. Ограничение тока контактов ввода / вывода на AVR предотвратит чрезмерное потребление светодиодов, поэтому нет необходимости в подключении резистора. Используемый динамик типичен для музыкальной поздравительной открытки, подойдет любой небольшой динамик, учитывая, что он выводит прямоугольный сигнал, не слишком важно беспокоиться о динамике или качестве звука.

Шаг 2: Припайка AVR к светодиодам и динамику

Припайка AVR к светодиодам и динамику
Припайка AVR к светодиодам и динамику
Припайка AVR к светодиодам и динамику
Припайка AVR к светодиодам и динамику

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

Шаг 3: Программирование Attiny13a

Программирование Attiny13a
Программирование Attiny13a

Существует множество различных вариантов программирования AVR. Для этого проекта использовался USBtiny, который доступен в виде комплекта с сайта Ladyada https://www.ladyada.net/make/usbtinyisp/index.html Чтобы подключить AVR к программатору, вы можете либо подключите провода к гнездовой розетке и подключите их к макетной плате, либо, что еще лучше, получите дешевый программный адаптер AVR, например, этот.

Шаг 4: Создание прошивки для Marioman

Создание прошивки для Marioman
Создание прошивки для Marioman

Attiny13A имеет 1 Кбайт программируемой флеш-памяти и 64 байта SRAM. Прикрепленный tar-файл содержит исходный файл, а также скомпилированную прошивку для загрузки. Для создания музыки использовались три массива в коде c.

  • freq - частоты каждой ноты
  • length - длина каждой ноты
  • delay - пауза между каждой нотой

В частотном массиве не указаны фактические частоты, а скорее значение, которое нужно поместить в регистр TTCROB для генерации прямоугольной волны на выводе PB0. Вот краткое описание вычислений и конфигурации выводов для генерации прямоугольной волны:

  • В attiny13A установлен внутренний генератор на 9,6 МГц.
  • Внутренние часы для ввода-вывода - это осциллятор, деленный на 8 или 1,2 МГц.
  • Внутренний таймер установлен в 8-битном регистре для подсчета каждого тактового цикла с предварительным масштабом до 8.
  • В результате один тик равен 1 / (1,2 МГц / 8) = 0,006667 мс.
  • Attiny13A настроен на сравнение того, что находится в 8-битном регистре TCCR0B с таймером, и переключение вывода, когда они совпадают.
  • Например, для генерации прямоугольной волны на частоте 524 Гц (на одну октаву выше среднего C) с периодом 1,908 мс.

1.908 мс = 286 тактов (1.908 /.0067). Разделите 286 на 2, чтобы переключить вывод на t / 2 (286/2 = 143). Поместите 143 в регистр TTCR0B, чтобы сгенерировать эту заметку. Это весь необходимый код. чтобы настроить таймер, выполните сравнение и выведите прямоугольный сигнал:

TCCR0A | = (1 << WGM01); // настраиваем таймер 1 для режима CTC TCCR0A | = (1 << COM0A0); // переключаем OC0A на совпадение сравнения TCCR0B | = (1 << CS01); // предварительное масштабирование clk / 8 TTCR0B = 143; // генерируем прямоугольную волну с частотой 524 ГцДля задержки тонов и пауз между ними использовалась простая функция задержки.

недействительный сон (int мс) {int cnt; для (cnt = 0; cnt <(мс); cnt ++) {int i = 150; while (i--) {_asm ("NOP"); }}}Он отсчитывается от 150, где каждый цикл NOP составляет примерно 0,006667 мс. Последнее, что делает код, - это перебирает массивы, генерирует музыку и мигает двумя светодиодами. Это выполняется в непрерывном цикле for с помощью следующего кода.

const uint8_t freq PROGMEM = {… данные}; const uint8_t length PROGMEM = {… data}; const uint8_t delay PROGMEM = {… data};… while (1) {for (cnt = 0; cnt < 156; cnt ++) {OCR0A = pgm_read_byte (& freq [cnt]); output_toggle (PORTB, PB3); output_toggle (PORTB, PB4); сон (pgm_read_byte (& length [cnt])); output_toggle (PORTB, PB3); output_toggle (PORTB, PB4); // остановка таймера TCCR0B = 0; сон (pgm_read_word (& delay [cnt])); // запускаем таймер TCCR0B | = (1 << CS01); // clk / 8 prescale}}В массивах частот / длин / задержек 156 элементов, этот цикл пересекает их. Контакты PB3 и PB4 переключаются, поэтому они будут чередоваться с каждой нотой. Первый сон - это длина ноты, которую мы играем после установки соответствующего значения в регистре OCR0A. Второй сон - это пауза между играемыми нами нотами. В приведенном выше коде вы могли заметить две функции pgm_read_byte () и pgm_read_word (), а также ключевое слово PROGMEM. Со встроенным чипом, таким как attiny, объем SRAM очень ограничен, в данном случае всего 64 байта. Массивы, которые мы используем для всех данных частоты / задержки / длины, намного больше 64 байтов и поэтому не могут быть загружены в память. Использование специальной директивы PROGMEM avr-gcc предотвращает загрузку этих больших массивов данных в память, вместо этого они читаются из флэш-памяти.

Шаг 5: позволить мариоману расслабиться

На видео выше показан Мариоман в действии. Средняя потребляемая мощность составляет около 25 мА, поэтому он может моргать и издавать звуки в течение примерно 10 часов, прежде чем разрядить литиевую таблетку. Единственный способ включить и выключить его - это вынуть батарейку типа «таблетка», прочная, указанная в материалах. хорошо для этого подходит. Можно добавить переключатель, но есть кое-что, что нужно сказать о его простоте.

Рекомендуемые: