Оглавление:
- Шаг 1: материалы и конструкция
- Шаг 2: Припайка AVR к светодиодам и динамику
- Шаг 3: Программирование Attiny13a
- Шаг 4: Создание прошивки для Marioman
- Шаг 5: позволить мариоману расслабиться
Видео: Мигание, Пение, Мариоман: 5 шагов
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:55
Используйте 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 таким образом упрощает подключение к динамику (второе изображение), поскольку соединения находятся на двух нижних контактах. Для эстетики вы хотите, чтобы передняя часть микросхемы была обращена наружу, поэтому убедитесь, что динамик смотрит в ту же сторону, когда он прилагается.
Шаг 3: Программирование Attiny13a
Существует множество различных вариантов программирования AVR. Для этого проекта использовался USBtiny, который доступен в виде комплекта с сайта Ladyada https://www.ladyada.net/make/usbtinyisp/index.html Чтобы подключить AVR к программатору, вы можете либо подключите провода к гнездовой розетке и подключите их к макетной плате, либо, что еще лучше, получите дешевый программный адаптер AVR, например, этот.
Шаг 4: Создание прошивки для 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 часов, прежде чем разрядить литиевую таблетку. Единственный способ включить и выключить его - это вынуть батарейку типа «таблетка», прочная, указанная в материалах. хорошо для этого подходит. Можно добавить переключатель, но есть кое-что, что нужно сказать о его простоте.
Рекомендуемые:
Мигание контрольного светодиода с помощью потенциометра и OLED-дисплея: 6 шагов
Управление миганием светодиода с помощью потенциометра и OLED-дисплея: в этом руководстве мы узнаем, как управлять миганием светодиода с помощью потенциометра и отображать значение частоты импульсов на OLED-дисплее. Посмотрите демонстрационное видео
Как упростить мигание светодиодной ленты: 5 шагов
Как упростить мигание светодиодной ленты: как сделать так, чтобы светодиодная лента мигала легко
Светодиодное мигание глаз для робота: 6 шагов
Светодиодное мигание глаз для робота: это руководство посвящено миганию глаз робота с использованием светодиодной точечной матрицы
Arduino V3.2, эксперимент 1: мигание светом: 12 шагов
Arduino V3.2 Эксперимент 1: Мигание светом: Используя материалы, найденные в наборе Sparkfun (или на самом деле в любом другом наборе схем), вы можете мигать светодиодом с помощью некоторого базового кода в Adruino IDE
Мигание светодиода Raspberry Pi: 5 шагов (с изображениями)
Raspberry Pi LED Blink: теперь вы собираетесь изучить простейший проект, который вы можете построить с помощью Raspberry Pi. Если вы еще этого не знаете, я говорю о программе мигания, как показано на Arduino. Я использую очень распространенные вещи, о которых вы узнаете в следующем