- •Введение Создайте свой собственный светодиодный 3d Куб
- •1. Требующиеся навыки
- •Шаг 2: Список компонентов
- •Шаг 3: Заказ компонентов
- •Шаг 6: Анатомия светодиодного куба
- •Шаг 7: Размер куба и требующиеся порты ввода-вывода
- •Шаг 8: расширение порта io, больше мультиплексирования
- •Шаг 9: расширение порта io, альтернативное решение
- •Шаг 10: требования к источнику питания
- •Шаг 11: Купите электропитание
- •Шаг 12: создание источника питания
- •Шаг 13: выбор светодиодов
- •Шаг 14: выбор резисторов
- •Шаг 19: Сборка куба: Требования к пайке
- •Шаг 20: Сборка куба: проверка светодиодов
- •Шаг 21: Сборка куба: пайка слоёв
- •Начните с верхнего ряда.
- •Шаг 22: Сборка куба: Проверка слоя
- •Шаг 23: Сборка куба: Выравнивание контактов
- •Шаг 24: Сборка куба: Подгибание контактов
- •Шаг 25: Сборка куба: Спаивание слоев вместе
- •Шаг 26: Сборка куба: Создание базы
- •Шаг 27: Сборка куба: Установка куба
- •Шаг 28: Сборка куба: Элементы катода
- •Шаг 29: Сборка куба: Подключение кабеля
- •Шаг 30: Сборка контроллера: Расположение
- •Шаг 31: Сборка контроллера: Тактовая частота
- •Шаг 32: Сборка контроллера: советы по пайке платы
- •Шаг 33: Сборка контроллера: Питание terminal и фильтрующих конденсаторов
- •Шаг 34: Сборка контроллера: гнезда ic, резисторы и разъёмы
- •Шаг 35: Сборка контроллера: шины питания и мощность ic
- •Шаг 37: Сборка контроллера: адрес селектора
- •Шаг 38: Сборка контроллера: плата avr
- •Шаг 39: Постройте контроллер: множество Транзистора
- •Шаг 40: Постройте контроллер: Кнопки и состояние светодиодов
- •Шаг 41: Постройте контроллер: rs 232
- •Шаг 42: Сборка контроллера: Сделайте rs 232 кабелями
- •Шаг 43: Постройте контроллер: подключите платы
- •Шаг 44: Постройте контроллер: подключите куб
- •Шаг 45: Программируйте avr: Установите биты плавкого предохранителя
- •Шаг 46: Программа avr с тестовым кодом
- •Шаг 47: Проверьте куб
- •Шаг 48: Программирование avr с реальным кодом
- •Шаг 49: программное обеспечение: Введение
- •Шаг 50: программное обеспечение: Как это работает
- •Шаг 51: программное обеспечение: инициализация io (ввода-вывода)
Шаг 49: программное обеспечение: Введение
Программное обеспечение написано в C и собрано с общедоступным компилятором avr-gcc. Это - главная причина, по которой мы используем Atmel AVR микроконтроллеры. Ряд PIC от Microchip - также хороший выбор, но компилятор C стоит очень дорого, а в бесплатных версиях есть ограничения на размер кода.
Программное обеспечение на AVR состоит из двух главных компонентов, подпрограммы прерывания работы куба и кода для создания анимаций.
Создавать мультипликации в монохромном режиме при низком разрешении очень трудно.
Если бы дисплей имел более высокое разрешение и больше цветов, мы могли бы использовать функции sin() и cos() чтобы сделать необычную усладу для глаз. С двумя цветами и низким разрешением, мы должны использовать многое из if() и for(), чтобы сделать что-то существенное.
В следующих нескольких шагах мы расскажем вам, как сделать работающие анимации. Нашей целью является дать вам знания того, как вы можете самостоятельно делать анимация и вдохновить вас на создпние собственных!
Шаг 50: программное обеспечение: Как это работает
Программное обеспечение состоит из прерываний и эффектов.
Связь между этими двумя происходит через множество вокселей (воксел - аналог пикселов для трехмёрного пространства). У этого множества есть немного для каждого светодиода в светодиодном кубе. Мы будем называть это как множество куба или буфер куба.
Множество куба состоит из 8x8 байтов. Так как каждый байт составляет 8 битов, это дает нам буфер, который равняется 8 вокселей широких, 8 вокселей высоких и 8 вокселей, глубоких (1 байт глубиной).
Прерывание читает из множества куба в данных интервалах и показывает информацию о светодиодном кубе.
Мы не использовали синхронизацию или двойную буферизацию, так как есть только один производитель (или эффекты, или вход от RS232) и один потребитель (код прерывания, который обновляет куб). Это означает, что некоторые воксели мог быть из следующего или предыдущего "кадра", но это не проблема, так как частота кадров очень высока.
Работая с микроконтроллерами важен размер кода. Чтобы сохранить размер кода и сделать код более читаемым, мы постарались написать многоразовый код так часто, насколько это возможно.
Шаг 51: программное обеспечение: инициализация io (ввода-вывода)
Первым делом после загрузки ATmega вызывает функцию ioinit ()
Эта функция настраивает порты IO, таймеры, прерывания и последовательные передачи данных. Все порты IO на ATmega двунаправлены. Они могут использоваться или в качестве входа или в качестве выхода. Мы формируем все как выходы, кроме контактов IO, где две кнопки связаны. Контакт RX для последовательного порта автоматически становится входом, когда USART RX включена.
1) DDRx устанавливает руководство данных булавок IO. (Регистр Руководства данных). 1 продукция средств, 0 средств введены.
2) После того, как directionality формировался, мы устанавливаем все продукции в 0 к энергичному любое мигание LEDs и т.д. прежде, чем перерыв начался.
3) Для булавок, формируемых как входы, PORTx укусил, изменяет его функцию. Урегулирование 1 в бите регистра PORTx позволяет внутреннему напряжению резистор. Порт потянулся до VCC. Кнопки связаны между портом и GND. То, когда кнопка нажата, соответствующий PINx укусил, читает логику 0.
4) Таймер 2 формируется, и перерыв таймера позволил. Это покрыто отдельным шагом.
5) Последовательные коммуникации формируются и позволяются. Это также покрыто отдельным шагом.
Шаг 52: программное обеспечение: выбор Способа и случайное семя
Когда мы сначала начали писать эффекты и отлаживать их, мы заметили, что функции, используя случайные числа показали те же самые мультипликации каждый раз. Это было случайно в порядке, но та же самая случайная последовательность каждый раз. Оказывается генератором случайных чисел в ATmega, должен быть отобран со случайным числом, чтобы создать истинные случайные числа.
Мы написали небольшую функцию, вызванную bootwait (). Эта функция служит двум целям.
1) Создайте случайное семя. 2) Прислушайтесь к прессе кнопки, чтобы выбрать режим работы.
Это делает следующее:
1) Прилавок набора x к 0.
2) Начните бесконечную петлю, в то время как (1).
3) Прилавок приращения x одним.
4) Используйте x в качестве случайного семени.
5) Задержка некоторое время и набор красный статус вовлечены.
6) Проверьте на прессу кнопки. Если главная кнопка нажата, функция возвращается 1. Если кнопка PGM нажата это returnes 2. Заявления возвращения выходят из функции, таким образом заканчивающей бесконечную петлю.
7) Задержитесь снова и установите зеленый, вовлек.
8) Проверьте на прессу кнопки снова.
9) Петля навсегда, пока кнопка не нажата.
Петли петли очень быстро, таким образом, вероятность, что Вы остановите его в той же самой ценности x два раза подряд, очень отдаленна. Это - очень простой, но эффективный способ получить хорошее случайное семя.
Bootwait () вызывают от основного () функцию и ее возвращаемое значение, назначенное на переменную i.
Если я == 1, главная петля начинает петлю, которая показывает эффекты, произведенные ATmega. Если я == 2, это вступает в способ RS232 и ждет данных от компьютера.
Шаг 53: программное обеспечение: рутина Перерыва
Сердце ВЕДОМОГО кодекса куба - рутина перерыва.
Каждый раз этот перерыв пробеги, куб очищен, данные для нового слоя загружены на множество замка, и новый слой включен. Это остается на до следующего раза пробеги перерыва, где куб очищен снова, данные для следующего слоя загружены на множество замка, и следующий слой включен.
У ATmega32 есть 3 таймера/прилавка. Они могут собираться учитываться непрерывно и вызвать рутину перерыва каждый раз, когда они достигают определенного числа. Прилавок перезагружен, когда рутину перерыва называют.
Мы используем Timer2 с предварительным скалером 128, и Продукция Сравнивают ценность 10. Это означает, что прилавок увеличен 1 для каждого 128-ого цикла CPU. Когда Timer2 достигает 10, он перезагружен к 0, и рутину перерыва называют. С частотой CPU 14745600 Гц 128 предварительных скалеров и продукция сравниваются 10, рутину перерыва называют каждым 1408-ым циклом центрального процессора (128*11) или 10472.7 раза в секунду. Это показывает один слой за один раз, таким образом, требуется 8 пробегов перерыва, чтобы потянуть весь куб однажды. Это дает нам уровень освежительного напитка 1309 футов в секунду (10472.7/8). При этом уровне освежительного напитка ВЕДОМЫЙ куб - 100%-ая свободная вспышка. Некоторые могли бы сказать, что 1300 футов в секунду - излишество, но рутина перерыва довольно эффективна. При этом высоком уровне освежительного напитка это только использует приблизительно 21% времени центрального процессора. Мы можем иметь размеры, это, прилагая осциллограф к продукции позволяет линию (OE). Это потянулось высоко в начале каждого перерыва и низко в конце, таким образом, это дает довольно хороший признак времени, проведенного в рутине перерыва.
Прежде, чем любые рассчитанные перерывы могут начаться, мы должны настроить Таймер 2. Это сделано в ioinit () функция.
TCCR2 (Регистр команд Прилавка Таймера 2) является 8-битным регистром, который содержит параметры настройки для источника часов таймера и режима работы. Мы выбираем источник часов с 1/128 предварительным скалером. Это означает, что Таймер/прилавок 2 является incrementet 1 каждым 128-ым циклом центрального процессора.
Мы устанавливаем его в способ CTC. (Ясный на Таймере Сравниваются). В этом способе встречная ценность TCNT2 непрерывно по сравнению с OCR2 (Продукция Сравнивают Регистр 2). Каждый раз, когда TCNT2 достигает ценности, сохраненной в OCR2, это перезагружено к 0 и начинает учитываться от от 0. В то же самое время перерыв вызван, и рутину перерыва называют.
Для каждого пробега перерыва имеет место следующее:
1) Все транзисторы слоя выключены.
2) Продукция позволяет (OE) потянулась высоко, чтобы повредить продукцию от множества замка.
3) Петля пробегает меня = 0-7. Для каждого прохода байт - outputed на Шине данных, и i+1 - outputed на адресной шине. Мы добавляем +1, потому что 74HC138 имеет активные низкие выпуски продукции и 74HC574, линия часов вызвана на возрастающем краю (переход от низко до высокого).
4) Продукция позволяет, потянулся низко, чтобы позволить продукцию fro множество замка снова.
5) Транзистор для текущего слоя включен.
6) current_layer увеличен или перезагружен к 0, если он перемещается вне 7.
Вот именно. Рутина перерыва довольно проста. Я уверен, что есть некоторая оптимизация, которую мы, возможно, использовали, но не ставя под угрозу человеческую удобочитаемость кодекса. С целью этого instructable мы думаем, что удобочитаемость - разумный обмен для небольшого увеличения работы.
Примечания изображения
1. Продукция напряжения рутины перерыва Позволяет высоко, бегая, чтобы повредить продукцию множества замка.
Примечания изображения
1. Слой 0 находится на 2. Слой 1 находится на 3. У моего осциллографа нет 8 каналов, таким образом, я могу только показать первые два слоя. 4. Продукция от линий транзистора слоя.
Примечания изображения Примечания изображения 1. Рутина перерыва управляет примерно 21% времени. Это оставляет остающееся 1. Исследование продукции позволяет 79% для кодекса эффекта!
Примечания изображения 1. Если Вы перемещаете камеру, делая снимок какого-либо устройства POV, Вы можете видеть действие POV. Я переместил камеру очень быстро в эту картину. Все же Вы можете только видеть эффект. С более низким уровнем освежительного напитка точки и места были бы более длинными
Шаг 54: программное обеспечение: функции Низкого уровня
Мы сделали небольшую библиотеку низкого уровня графическими функциями. Есть три главных причины для выполнения этого.
След памяти
Самый легкий способ обратиться к каждому voxel был бы через трехмерное буферное множество. Как это:
неподписанный куб случайной работы [x] [y] [z]; (случайная работа означает, что 8-битное число, неподписанное, означает, что это - диапазон, от 0 до 255. подписанный-128 к +127),
В пределах этого множества каждый voxel был бы представлен целым числом, где 0 выключено, и 1 идет. Фактически, Вы могли использовать все целое число и иметь 256 различных уровней яркости. Мы фактически попробовали это сначала, но оказалось, что у нашего eBay LEDs было очень мало изменения в яркости относительно рабочего цикла. Эффект не был достаточно примечателен, чтобы стоить проблемы. Мы пошли для монохромного решения. На и прочь.
С монохромным кубом и трехмерным буфером, мы потратили бы впустую 7/8 используемой памяти. Самый маленький объем памяти, который Вы можете ассигновать, составляет один байт (8 битов), и Вы только нуждаетесь в 1 бите, чтобы представлять на и прочь. 7 битов для каждого voxel были бы потрачены впустую. 512 * (7/8) = 448 байтов потраченной впустую памяти. Память недостаточна на микро диспетчерах, таким образом, это - подоптимальное решение.
Вместо этого мы создали буфер, который похож на это:
неподписанный куб случайной работы [z] [y];
В этом буфере X осей представлены в пределах каждого из байтов в буферном множестве. Это может быть довольно запутывающим, чтобы работать с, который приносит нам к второй причине создания библиотеки из функций рисования низкого уровня:
Кодовая удобочитаемость
Урегулирование voxel с координатами x=4, y=3, z=5 потребует следующего кодекса:
куб [5] [3] | = (0x01 <<4);
Вы можете видеть, как это могло привести к некоторой серьезной голове, царапающей, пытаясь отладить Ваш кодекс эффекта ;)
В draw.c мы сделали связку функций, которая берет x, y, z как аргументы и делает это волшебство для Вас.
Урегулирование того же самого voxel как в примере выше сделано с setvoxel (4,3,5), который является _a lot_ легче читать!
draw.c содержит еще много функций как это. Рисунок линии, рисунок самолета, рисунок коробки, заполняясь и т.д. Взгляните в draw.c и ознакомьте себя с различными функциями.
Повторно используемый кодовый и кодовый размер
Как Вы можете видеть в draw.c, некоторые функции довольно большие. Письмо, которые кодируют много раз внутренние функции эффекта, подняло бы большую память программы. У нас только есть 32 КБ, чтобы работать с. Его также скучный, чтобы написать тот же самый кодекс много раз ;)
Шаг 55: программное обеспечение: Куб действительное пространство
Теперь, когда у нас есть буфер куба, и миленькая коллекция низкого уровня тянут функции, чтобы населить его, мы должны договориться, какие пути то, что, и что произошло и что снижается ;)
С этого времени родное положение ВЕДОМОГО куба будет с кабелями, выходящими налево.
В этой ориентации Ось Y идет слева направо. X осей идут по всей длине. Ось Z идет от основания до вершины.
Координаты в этом instructable всегда представляются как x, y, z.
Положение 0,0,0 - нижний левый передний угол. Положение 7,7,7 - верхний правый дальний угол.
Почему мы использовали Ось Y для левого/правильного и X для спины/фронта? Разве это не должно быть наоборот? Да, мы думаем так также. Мы проектировали ВЕДОМЫЙ куб, который будет рассматриваться с "фронта" с кабелями, выходящими спина. Однако, это было довольно непрактично, имея ВЕДОМЫЙ куб на столе, это было более практично, чтобы иметь кабели, выходящие сторона и имеющие куб и диспетчера рядом. Все функции эффекта разработаны, чтобы быть рассмотренными от этой ориентации.
Примечания изображения 1. 0,0,0
Примечания изображения Примечания изображения
1. 7,0,0 1. 0,7,0
Примечания изображения Примечания изображения 1. 0,0,7 1. Сделанный маленький обман отмечает, программируя ;)
Шаг 56: программное обеспечение: пусковая установка Эффекта
Мы хотели легкий способ управлять эффектами в неподвижном заказе или случайном заказе. Решение состояло в том, чтобы создать функцию пусковой установки эффекта.
launch_effect.c содержит функцию launch_effect (международный эффект).
В функции есть выключатель () заявление, которое вызывает соответствующие функции эффекта, основанные на числе launch_effect (), с назвали.
В launch_effect.h определен EFFECTS_TOTAL. Мы устанавливаем его одно число выше, чем самое большое количество в выключателе () заявление.
Запуск эффектов один за другим является теперь простым вопросом просто перекручивания через числа и звонящий launch_effect (), как это:
в то время как (1)
для (i=0; я <EFFECTS_TOTAL; я ++) {
launch_effect (i);
}
}
Этот кодекс образует петли через все эффекты в возрастающем заказе навсегда. Если Вы хотите, чтобы куб показал эффекты в случайном заказе, просто используйте следующий кодекс:
в то время как (1) {
launch_effect (рэнд () %EFFECTS_TOTAL);
}
%EFFECTS_TOTAL после того, как рэнд () держит случайную ценность между 0 и EFFECTS_TOTAL-1.
Шаг 57: программное обеспечение: Эффект 1, дождь
Позволяет началу с одним из самых простых эффектов.
В effect.c Вы найдете функцию effect_rain (международные повторения).
Этот эффект добавляет капли дождя к верхнему слою куба, затем позволяет им падать к нижнему слою.
У большинства эффектов есть основное для () петля что петли от i=0 до меня <повторения. effect_rain (международные повторения) только берет один аргумент, который является числом повторений.
В итеративной петле функция делает следующее:
1) Создайте случайное число между 0 и 3, позволяет, называют его n здесь.
2) Образуйте петли для () петля n количество раз.
3) Для каждого повторения этой петли поместите пиксель в слой 7 (z=7) наугад x и координаты y.
4) Задержка некоторое время
5) Переместите содержание всего куба вдоль Оси Z-1 положением. Это перемещает все вниз один уровень.
Это - довольно простой эффект, но он работает!
Шаг 58: программное обеспечение: Эффект 2, самолет boing
Другой простой эффект, effect_planboing (международный самолет, международная скорость).
Этот эффект тянет самолет вдоль указанной оси, тогда перемещает его от положения 0 до 7 на оси и назад снова. Это очень просто, но это действительно производит глубину 3-ьего ВЕДОМОГО куба :)
У этой функции нет итеративной петли. Вместо этого это называют дважды для каждой оси в launch_effect ().
Вот то, что это делает:
1) Для () - петля i от 0 до 7.
2) Очиститесь куб с заполняются (0x00);
3) Назовите setplane (), чтобы потянуть самолет вдоль желаемой оси в положении i. Самолет фактически не продвинут определенная ось, это оттянуто на других двух осях. Если Вы определяете AXIS_Z, самолет оттянут на оси X и Y. Просто легче думать о нем тот путь. Вместо того, чтобы назвать константы PLANE_XY, PLANE_YZ и т.д.
4) Задержка некоторое время.
5) Повторите ту же самую петлю со мной идущий от 7 до 0.
Очень простой, но очень прохладный эффект!
Шаг 59: программное обеспечение: Эффект 3, sendvoxels случайный Z
Этот эффект посылает voxels вверх и вниз по Оси Z как подразумевение.
пустота sendvoxels_rand_z () берет три аргумента. Повторения - количество раз, voxel повышен или вниз. Задержка - скорость движения (более высокие средства задержки более низкая скорость). Ожидание - задержка между каждым voxel, который посылают.
Это - то, как это работает:
1) Куб очищен с, заполняются (0x00);
2) Петля через все 64 положения вдоль X/Y и беспорядочно набора voxel или в Z=0 или в Z=7.
3) Войдите в главную итеративную петлю
4) Выберите случайные координаты для X и Y между 0 и 7. Если X и координаты Y идентичны предыдущим координатам, это повторение пропущено.
5) Проверьте, ли voxel в этой координате X/Y в Z=0 или Z=7, и пошлите его в противоположную сторону, используя sendvoxel_z ().
6) Задержитесь некоторое время и спасите координаты этого повторения, таким образом, мы можем проверить их против случайных координат в следующем повторении. Выглядело странным переместить тот же самый voxel дважды подряд.
Фактическое движение voxels сделано другой функцией, sendvoxel_z. Причина этого, то, что несколько других эффектов делают ту же самую вещь только по-разному.
Функция sendvoxel_z () берет четыре аргумента. X и координаты Y. Z координата, это - предназначение и может или быть 0 или 7. Задержка, которая управляет скоростью.
Это - то, как это работает:
1) Для () - петля i от 0 до 7.
2) Если предназначение равняется 7, мы устанавливаем ii в 7-1, таким образом делая ii перемену меня. Очистите voxel в Z = ii+1. Спускаясь, ii+1 - предыдущий voxel.
3) Если предназначение 0, позвольте ii, равны мне. Ясный ii-1. Когда перемещение вверх,-1 является предыдущим voxel.
4) Установите voxel в z=ii.
5) Ждите некоторое время.
Шаг 60: программное обеспечение: Эффект 4, коробка shrinkgrow и woopwoop
wireframe коробка - хорошая геометрическая форма, чтобы показать в монохроме 8x8x8 ВЕДОМЫЙ куб. Это дает очень хороший 3-ий эффект. Мы сделали две функции мультипликации коробки для ВЕДОМОГО куба. Effect_box_shrink_grow () тянет wireframe коробку, заполняющую весь куб, затем сокращает его вниз к одному voxel в одном из 8 углов. Мы вызываем эту функцию одно время для каждого из этих 8 углов, чтобы создать хороший эффект. Effect_box_woopwoop () тянет коробку, которая начинается как 8x8x8 wireframe коробка, заполняющая весь куб. Это тогда сжимается вниз к 2x2x2 коробка в центре куба. Или наоборот если растут, определен.
Вот то, как effect_box_shrink_grow () работает.
Требуется четыре аргумента, число повторений, вращения, щелчка и задержки. Вращение определяет вращение вокруг Оси Z в 90 интервалах степени. Щелчок> 0 щелчков куб вверх тормашками-.
Чтобы сделать функцию максимально простой, это просто тянет коробку от 0,0,0 до любого пункта вдоль диагонали между 0,0,0 и 7,7,7 тогда функции зеркала оси использования от draw.c, чтобы вращать его.
1) Войдите в главную итеративную петлю.
2) Вступите для () петля, идущая от 0 до 15.
3) Набор xyz к 7-i. Это делает xyz переменой меня. Мы хотим сократить коробку сначала, затем вырасти. xyz - пункт вдоль диагонали. Мы просто использовали одну переменную с тех пор x, y, и z все равны вдоль этой диагонали.
4) Когда я = 7, коробка сжалась к 1x1x1 коробка, и мы не можем больше сокращать его. Если я больше, чем 7, xyz установлен в i-8, который делает путешествие xyz от 0 до 7, когда я путешествую от 8 до 15. Мы сделали эту уловку, чтобы избежать иметь два для петель, whith одно движение от 7-0 и один от 0-7.
5) Сведите куб на нет и задержитесь немного, чтобы удостовериться, что гашение предоставлено на кубе. Повредите рутину перерыва. Мы делаем это, потому что функции зеркала занимают немного времени. Не повреждая перерывы, wireframe коробка вспыхнула бы кратко в оригинальном вращении прежде, чем быть показанным вращаемого.
6) Потяните wireframe, окружают его оригинальное вращение. сторона коробки всегда в 0,0,0 в то время как другие путешествия вдоль диагонали.
7) Сделайте вращения. Если щелчок - greather, чем 0, куб превращен перевернутым. гниль берет число от 0 до 3, где 0 0 углов вращения вокруг Z, и 3 270 степеней. Чтобы получить 270 степеней, мы просто отражаем приблизительно X и Y.
8) Позвольте перерывам показать теперь вращаемый куб.
9) Задержка некоторое время тогда очищает куб.
Другая функция, вовлеченная в wireframe эффект коробки, является effect_box_woopwoop (). Имя woopwoop просто казалось естественным, когда мы сначала видели эффект, предоставленный на кубе ;)
Функция woopwoop только делает одно повторение и берет два аргумента, задержку, и вырасти. Если растут, больше, чем 0, запуски коробки как 2x2x2 коробка, и вырастите к 8x8x8 коробка.
Вот то, как это работает:
1) Очистите куб, заполняя буфер 0x00;
2) Для () - петля от 0 до 3.
4) Набор ii мне. Если растут, определен, мы заставляем его в 3-i полностью изменять его.
5) Потяните wireframe коробку, сосредоточенную вдоль диагонали между 0,0,0 и 7,7,7. Один угол коробки использует координаты 4+ii на всех топорах, перемещающихся от 4-7. Другое угловое использование, 3-ii на всех топорах, перемещающихся от 3-0.
6) Задержка некоторое время, затем очистите куб.
Эти две функции используются в качестве одного единственного эффекта в пусковой установке эффекта. Сначала сокращение растет, эффект называют 8 раз, один для каждого угла, тогда woopwoop называют четыре раза, два сокращают и выращивают циклы.
Чтобы начать сокращение выращивают функцию, мы использовали для петли с некоторыми опрятными уловками побитовой обработки внутри, чтобы избежать писать 8 линий кодекса.
Второй аргумент сокращения растет, функции вращение, в 4 шагах. Мы считаем от 0 до 7, таким образом, мы не можем просто питаться i в функцию. Мы используем % оператора модуля, чтобы держать число в диапазоне 0-4. Оператор модуля делится на число, определяет и возвращает остаток.
Третий аргумент - щелчок. Когда щелчок = 0, кубом не щелкают.> 0 щелчков. Мы используем bitwise И оператор, чтобы только прочитать бит 3 из меня.
Логические операторы - насущная необходимость знать о, работая с микро диспетчерами, но это выходит за рамки этого instructable. Парни в Помешанных на AVR разместили некоторую большую информацию об этой теме. Вы можете читать больше в http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=37871
Шаг 61: программное обеспечение: Эффект 5, ось updown randsuspend
Это - один из наших любимых эффектов. voxels, беспорядочно приостановленный в кубе, дает хорошую 3-ью глубину, особенно если Вы двигаете своей головой, рассматривая эффект.
64 voxels начинаются на одной из стен стороны. Тогда им всем назначают случайное на полпути предназначение между стеной стороны, которую они начали в и стена на противоположной стороне.
Функция тогда петли, 8 раз двигая поближе каждый voxel к на полпути предназначение. После 8 повторений voxels приостановлены на различных расстояниях от того, где они начали. Функция тогда паузы некоторое время, таким образом имя axis_updown_randsuspend ;). Это тогда петли, 8 раз снова перемещающие voxels один шаг ближе к их заключительному предназначению на противоположной стене каждый раз.
Фактический рисунок voxel сделан в отдельной функции, draw_positions_axis (), таким образом, он может использоваться в различных эффектах. Например, voxels мог быть приостановлен на полпути в неслучайном образце. Мы оставим его до Вас, чтобы создать ту функцию эффекта!:D
Вы, возможно, заметили, что описание для этого эффекта было менее определенным. Мы поощряем Вас загружать исходный код и прочитывать функции самих. Держите текст выше в памяти, читая кодекс и попытайтесь выяснить то, что все делает.
Шаг 62: программное обеспечение: Эффект 6, stringfly
8x8 о самом маленьком размере, требуемом отдавать значащий текстовый шрифт, таким образом, мы просто должны были сделать просто это!
Мы загрузили 8x5 растровый шрифт, который мы ранее использовали с графическим ЖК-монитором в память EEPROM и создали некоторые функции, которые взяли случайную работу ASCII в качестве аргумента и возвратили битовый массив характера.
Функция stringfly2 берет любую последовательность ASCII и показывает ее как характеры, летящие через куб.
Это начинается, помещая характер позади куба, затем использует изменение () функция, чтобы переместить содержание куба к Вам, заставляя текст полететь.
Шаг 63: программное обеспечение: RS 232 входа
Чтобы произвести самые удивительные эффекты, мы используем настольный компьютер. Компьютеры могут сделать вычисления с плавающей запятой и наполнить как этот намного более быстрый, чем микро диспетчер. И Вы не должны повторно программировать микро диспетчера для каждого эффекта, который Вы делаете, или каждый раз, когда Вы хотите проверить или отладить что-то.
Интерфейс USART в ATmega формируется, чтобы работать в 38400 бодах с одним битом остановки и никакой паритет. У каждого байта, который посылают в конечном счете, есть бит начала, и остановка укусила, таким образом, 10 битов посылают, чтобы передать 8 битов. Это дает нам полосу пропускания 3840 байт в секунду. Буфер куба составляет 64 байта. Синхронизирующие байты составляют структуру 2 байтов за куб. В 38400 бодах мы в состоянии послать приблизительно 58 кадров в секунду. Более чем достаточно для гладких мультипликаций.
0xff используется в качестве характера спасения и помещает функцию rs232 в способ спасения. Если следующий байт - 0x00, координаты для буфера вернулись 0,0. Если следующий байт - 0xff, он добавлен к буферу. Чтобы послать 0xff, Вы просто посылаете его дважды.
rs232 функционируют просто петли навсегда. Сброс необходим, чтобы войти в автономный способ куба снова.
Шаг 64: программное обеспечение PC: Введение
Куб просто получает двоичных данных через RS232. Эти данные могли легко быть произведены многими различными языками программирования, как питон, perl или даже php.
Мы приняли решение использовать C для программного обеспечения PC, так как микро программное обеспечение диспетчера написано в C. Таким образом, эффекты из микро кодекса диспетчера могут просто быть приклеены копией в программное обеспечение PC.
Точно так же, как в микро кодексе диспетчера, этот кодекс также делает две вещи. Где у микро диспетчера есть рутина перерыва, которая тянет содержание куба [] [] на ВЕДОМЫЙ куб, у программного обеспечения PC есть нить, которая непрерывно посылает данные в ВЕДОМЫЙ куб.
Шаг 65: программное обеспечение PC: Куб updater нить
В cube.c у нас есть функция, вызванная cube_push (). Это берет 64 байтовых массива и посылает ему вниз последовательную линию к ВЕДОМОМУ кубу.
Это также обращается с форматированием, посылая каждый 0xff байт дважды, потому что 0xff - наш характер спасения. 0xff и 0x00 посылают сначала, чтобы перезагрузить ВЕДОМЫЕ кубы внутренний x и прилавки y.
В main.c у нас есть функция cube_updater (). Эта функция начата как отдельная нить, используя pthread_create (). Главная нить и куб updater нить разделяют область памяти rs232_cube [8] [8]. Куб updater нить является только некоторое время истинной петлей, которая называет cube_push () много раз.
Первая попытка нити updater, оказалось, создала некоторое мерцание в мультипликациях. После некоторой отладки мы узнали, что структуры передавались прежде, чем они были полностью привлечены функциями эффекта. Мы вообще делаем заполнение (0x00), тогда некоторый кодекс, чтобы потянуть новые пиксели. Если структура будет передана прямо то после заполнения (0x00), куб высветит пустую структуру для 1/60-ого выхода секунды.
Это не было проблемой в кодексе, бегущем на ВЕДОМОМ кубе, так как у этого есть уровень освежительного напитка более чем 1000 футов в секунду, но в 60 футах в секунду Вы можете заметить его.
Чтобы преодолеть это, мы создаем двойной буфер и синхронизируем два буфера в пункте вовремя, где функция эффекта закончила тянуть структуру. К счастью все функции эффекта используют delay_ms () функция, чтобы сделать паузу между законченными структурами. Мы просто помещаем memcpy () внутри там, чтобы скопировать буфер куба к буферу rs232. Это работает красиво. Больше мерцания!
Шаг 66: программное обеспечение PC: <http://www.instructables.com/id/Led-Cube-8x8x8/step67/PC-Software-Effect-2-sidewaves/> Эффект 1, рябь
Это - первый эффект, который мы сделали <http://www.instructables.com/id/Led-Cube-8x8x8/step67/PC-Software-Effect-2-sidewaves/> для программного обеспечения PC, и мы думаем, что это оказалось очень хорошим.
В то время как это может походить на сложное <http://www.instructables.com/id/Led-Cube-8x8x8/step67/PC-Software-Effect-2-sidewaves/> эффект, это действительно нет!
Все управление функций эффекта <http://www.instructables.com/id/Led-Cube-8x8x8/step67/PC-Software-Effect-2-sidewaves/> на микро диспетчере главным образом использует если () заявления, чтобы создать эффекты. Эффекты на программное обеспечение PC построены немного отличающиеся. Мы используем много греха (), потому что () и другая математика функционирует <http://www.instructables.com/id/Led-Cube-8x8x8/step67/PC-Software-Effect-2-sidewaves/> здесь. Большинство координат вычислено как координаты с плавающей запятой, тогда приглашаемые на однотипные роли в целые числа прежде, чем быть оттянутым на кубе.
Эффект, который Вы видите в видео <http://www.instructables.com/id/Led-Cube-8x8x8/step67/PC-Software-Effect-2-sidewaves/>, является фактически просто волной синуса eminating от центра куба, x=3.5, y=3.5.
Вот то, как это работает: <http://www.instructables.com/id/Led-Cube-8x8x8/step67/PC-Software-Effect-2-sidewaves/>
1) Петля посредством повторения <http://www.instructables.com/id/Led-Cube-8x8x8/step67/PC-Software-Effect-2-sidewaves/> прилавок.
2) Петля через все 64 x и <http://www.instructables.com/id/Led-Cube-8x8x8/step67/PC-Software-Effect-2-sidewaves/> y координаты.
3) Вычислите расстояние между <http://www.instructables.com/id/Led-Cube-8x8x8/step67/PC-Software-Effect-2-sidewaves/> центр куба и координата x/y.
4) Координата z вычислена <http://www.instructables.com/id/Led-Cube-8x8x8/step67/PC-Software-Effect-2-sidewaves/> с грехом () основанный на расстоянии от центра + итеративный прилавок. Результат состоит в том, что волна синуса перемещается из центра как итеративные увеличения прилавка. <http://www.instructables.com/id/Led-Cube-8x8x8/step67/PC-Software-Effect-2-sidewaves/>
Смотрите, как легкий, который был! <http://www.instructables.com/id/Led-Cube-8x8x8/step67/PC-Software-Effect-2-sidewaves/>
Шаг 67: программное обеспечение PC: <http://www.instructables.com/id/Led-Cube-8x8x8/step67/PC-Software-Effect-2-sidewaves/> Эффект 2, sidewaves
Это - в основном то же самое <http://www.instructables.com/id/Led-Cube-8x8x8/step67/PC-Software-Effect-2-sidewaves/> функция как функция ряби.
Единственная разница - координаты <http://www.instructables.com/id/Led-Cube-8x8x8/step67/PC-Software-Effect-2-sidewaves/> пункта, используемого, чтобы вычислить расстояние до каждой координаты x/y. Мы называем этот пункт происхождением, так как волна происходит от этого пункта.
Координата происхождения вычислена <http://www.instructables.com/id/Led-Cube-8x8x8/step67/PC-Software-Effect-2-sidewaves/> как это:
x = грех (итеративный прилавок) y = <http://www.instructables.com/id/Led-Cube-8x8x8/step67/PC-Software-Effect-2-sidewaves/>, потому что (итеративный прилавок)
Результат состоит в том, что эти x и <http://www.instructables.com/id/Led-Cube-8x8x8/step67/PC-Software-Effect-2-sidewaves/> y координаты перемещаются в кругу, приводящем к волне греха, которая входит от стороны.
Мы просто хотели показать Вам <http://www.instructables.com/id/Led-Cube-8x8x8/step67/PC-Software-Effect-2-sidewaves/>, как легкий это должно полностью изменить эффект, щипая некоторые переменные, когда работа с математикой базировала эффекты!
Шаг 68: программное обеспечение PC: Эффект 3, фейерверк
Этот эффект был довольно забавен сделать. Чтобы сделать этот эффект, мы действительно должны были сесть и думать о том, как работает фейерверк, и который вызывает, влияют на частицы фейерверка.
Мы придумали теоретическую модель того, как работает фейерверк:
1) Ракета застрелена до случайного положения, origin_x, origin_y, origin_z.
2) Ракета взрывается и выбрасывает горящие частицы в случайных направлениях наугад скорости.
3) Частицы замедлены сопротивлением воздуха и потянулись к земле силой тяжести.
С этой моделью в памяти мы создали эффект фейерверка с довольно убедительным результатом. Вот то, как это работает:
1) Выбрано случайное положение происхождения. (в пределах определенных пределов, x и y между 2 и 5, чтобы держать фейерверк более или менее в центре куба. z между 5 и 6. Фейерверк, взрывающийся около земли, может быть опасным!:p)
2) Ракета, в этом случае единственный voxel продвинут Ось Z в x и координатах y, пока это не достигает origin_z.
3) Множество n частиц создано. У каждой частицы есть x, y и координата z так же как скорость для каждой оси, дуплекса, dy и дюжины.
4) Мы для () петля через 25 шагов мультипликации частицы:
5) slowrate вычислен, это - сопротивление воздуха. slowrate вычислен, используя загар (), который возвратится по экспоненте растущее число, замедляя частицы быстрее и быстрее.
6) Переменная силы тяжести вычислена. Также используя загар (). Эффект силы тяжести также показателен. Это, вероятно, не математически правильный способ вычислить эффект силы тяжести на объект, но это выглядит хорошим.
7) Для каждой частицы x y и координаты z увеличены их дуплексом, dy и скоростями дюжины, разделенными на slowrate. Это заставит частицы переместиться медленнее и медленнее.
8) Координата z уменьшена переменной силы тяжести.
9) Частица оттянута на кубе.
10) Задержка некоторое время, затем сделайте следующее повторение мультипликации взрыва.
Мы вполне довольны результатом.
Шаг 69: программное обеспечение PC: <http://www.instructables.com/id/Led-Cube-8x8x8/step69/PC-Software-Effect-4-Conways-Game-of-Life-3D/> Эффект 4, Игра Конвея 3D Жизни
Игра Жизни, также известной <http://www.instructables.com/id/Led-Cube-8x8x8/step69/PC-Software-Effect-4-Conways-Game-of-Life-3D/> просто как Жизнь, является клеточным автоматом, разработанным британским математиком Джоном Хортоном Конвеем. Вы можете читать больше об этом на Википедию, если Вы не услышали <http://www.instructables.com/id/Led-Cube-8x8x8/step69/PC-Software-Effect-4-Conways-Game-of-Life-3D/> об этом прежде.
Популярным требованием мы имеем <http://www.instructables.com/id/Led-Cube-8x8x8/step69/PC-Software-Effect-4-Conways-Game-of-Life-3D/> осуществленная Игра Жизни в 3D на ВЕДОМОМ кубе. Чтобы заставить его работать в 3-ьем, правила <http://www.instructables.com/id/Led-Cube-8x8x8/step69/PC-Software-Effect-4-Conways-Game-of-Life-3D/> нужно щипнуть немного:
Мертвая клетка становится <http://www.instructables.com/id/Led-Cube-8x8x8/step69/PC-Software-Effect-4-Conways-Game-of-Life-3D/> живой, если у нее есть точно 4 соседа живая клетка с 4 соседями <http://www.instructables.com/id/Led-Cube-8x8x8/step69/PC-Software-Effect-4-Conways-Game-of-Life-3D/> живой живая клетка с 3 или меньше <http://www.instructables.com/id/Led-Cube-8x8x8/step69/PC-Software-Effect-4-Conways-Game-of-Life-3D/>, соседи умирают живая клетка с 5 или больше <http://www.instructables.com/id/Led-Cube-8x8x8/step69/PC-Software-Effect-4-Conways-Game-of-Life-3D/>, соседи умирают
Запуски программы, помещая <http://www.instructables.com/id/Led-Cube-8x8x8/step69/PC-Software-Effect-4-Conways-Game-of-Life-3D/> 10 случайных voxels в одном углу куба, тогда игра жизненных правил применена, и повторения начались.
Во втором видео мы бежим <http://www.instructables.com/id/Led-Cube-8x8x8/step69/PC-Software-Effect-4-Conways-Game-of-Life-3D/> мультипликация быстрее и семя с 20 voxels.
Шаг 70: Управляйте кубом <http://www.instructables.com/id/Led-Cube-8x8x8/step70/Run-the-cube-on-an-Arduino/> на Arduino
Так как мы издали наше последнее <http://www.instructables.com/id/Led-Cube-8x8x8/step70/Run-the-cube-on-an-Arduino/> ВЕДОМЫЙ Куб instructable, мы получили много вопросов от людей, задающихся вопросом, могли ли бы они использовать Arduino, чтобы управлять кубом.
На сей раз мы - один шаг вперед <http://www.instructables.com/id/Led-Cube-8x8x8/step70/Run-the-cube-on-an-Arduino/> Вас на, "Я могу использовать arduino?" фронт :D
Требования IO для 8x8x8 <http://www.instructables.com/id/Led-Cube-8x8x8/step70/Run-the-cube-on-an-Arduino/> ВЕДОМЫЙ куб:
Избранный слой: 8 <http://www.instructables.com/id/Led-Cube-8x8x8/step70/Run-the-cube-on-an-Arduino/>
Шина данных для замков: <http://www.instructables.com/id/Led-Cube-8x8x8/step70/Run-the-cube-on-an-Arduino/> 8 Адресных шин для замков: <http://www.instructables.com/id/Led-Cube-8x8x8/step70/Run-the-cube-on-an-Arduino/> 3 Продукции позволяет (OE) для <http://www.instructables.com/id/Led-Cube-8x8x8/step70/Run-the-cube-on-an-Arduino/> замки: 1
Общее количество: 21 <http://www.instructables.com/id/Led-Cube-8x8x8/step70/Run-the-cube-on-an-Arduino/>
У Arduino есть 13 булавок GPIO <http://www.instructables.com/id/Led-Cube-8x8x8/step70/Run-the-cube-on-an-Arduino/> и 8 аналоговых входов, которые могут также использоваться в качестве GPIO. Это дает Вам в общей сложности 21 линию IO, точно количество IO должно было управлять ВЕДОМЫМ кубом! <http://www.instructables.com/id/Led-Cube-8x8x8/step70/Run-the-cube-on-an-Arduino/>
Но почему пишут об этом, когда <http://www.instructables.com/id/Led-Cube-8x8x8/step70/Run-the-cube-on-an-Arduino/> мы могли просто показать Вам?
Мы зацепили куб до <http://www.instructables.com/id/Led-Cube-8x8x8/step70/Run-the-cube-on-an-Arduino/> Arduino и перенесли часть программного обеспечения.
Начиная со множества мультиплексора и <http://www.instructables.com/id/Led-Cube-8x8x8/step70/Run-the-cube-on-an-Arduino/> правление AVR отделено кабелем ленты, соединение линий IO к Arduino является простым вопросом соединения некоторых проводов макета. К счастью мы спаяли в <http://www.instructables.com/id/Led-Cube-8x8x8/step70/Run-the-cube-on-an-Arduino/> женский 0.1-дюймовый заголовок булавки для линий транзистора, когда мы отлаживали первый набор транзисторов. Просто удалите ATmega и соедините провода от Arduino до них <http://www.instructables.com/id/Led-Cube-8x8x8/step70/Run-the-cube-on-an-Arduino/> заголовки булавки.
Мы соединили куб как <http://www.instructables.com/id/Led-Cube-8x8x8/step70/Run-the-cube-on-an-Arduino/> это: Шина данных: Цифровые булавки 0-7. Это соответствует PORTD на ATmega328 на совете Arduino, таким образом, мы можем использовать прямой доступ порта вместо Arduinos digitalWrite <http://www.instructables.com/id/Led-Cube-8x8x8/step70/Run-the-cube-on-an-Arduino/> (который является медленным). Адресная шина: Цифровые булавки 8-10. Это соответствует биту PORTB 0-2. На этом мы должны использовать прямой доступ порта. Arduinos digitalWrite не работал бы с <http://www.instructables.com/id/Led-Cube-8x8x8/step70/Run-the-cube-on-an-Arduino/> это, потому что Вы не можете установить многократные булавки одновременно. Если бы булавки адреса не установлены в то же самое время, продукция 74HC138 вызвала бы неправильные замки. <http://www.instructables.com/id/Led-Cube-8x8x8/step70/Run-the-cube-on-an-Arduino/> Продукция Позвольте: Цифровая булавка 11. Транзисторы слоя: Аналог прикрепляет 0-5 и цифровые булавки 12 и 13.
Мы должны были пойти немного вне <http://www.instructables.com/id/Led-Cube-8x8x8/step70/Run-the-cube-on-an-Arduino/> область платформы Arduino. Намерение Arduino состоит в том, чтобы использовать digitalWrite () для доступа порта IO, чтобы сделать кодекс портативным и некоторые другие причины. Мы должны были обойти <http://www.instructables.com/id/Led-Cube-8x8x8/step70/Run-the-cube-on-an-Arduino/> это и получить доступ к портам непосредственно. В дополнение к этому мы должны были использовать один из таймеров для рутины перерыва.
Регистры для перерыва и таймеры отличаются на различных моделях AVR, таким образом, кодекс может не быть портативным между различными версиями совета Arduino.
Кодекс для нашего быстрого Arduino
Шаг 71: отладка Аппаратных средств: Сломанный LEDs
Забастовки бедствия. Сломана ВЕДОМАЯ внутренняя часть куб!
У нас было несколько разрывов LEDs фактически. К счастью самый твердый, чтобы добраться до был только одним слоем в кубе.
Чтобы удалить ВЕДОМЫЙ, просто возьмите маленькую пару плоскогубцев носа иглы и окажите некоторое давление на ноги, затем дайте ему мягкое прикосновение с паяльником. Нога должна высунуть право. Сделайте это для обеих ног, и это отсутствует.
Вставка ВЕДОМОГО нового является хитрой частью. Это должно быть так же симметрично и хорошо как остальная часть LEDs. Мы использовали руку помощи, чтобы держать его в месте, спаивая. Это пошло удивительно хорошо, и мы не можем даже видеть, какие LEDs были заменены.
Шаг 72: Обратная связь
Мы любим получать обратную связь на наших проектах! 4x4x4 ВЕДОМЫЙ куб получил тонну обратной связи, и много пользователей опубликовали картины и видео их ВЕДОМЫХ кубов.
Если Вы следуете за этим Instructable и делаете Ваш собственный ВЕДОМЫЙ куб, пожалуйста, опубликуйте картины и видео!
О, и не забывайте оценивать этот Instructable, если Вам понравился он :)
Как символ благодарности за всю большую обратную связь, вот коллаж части обратной связи на нашем 4x4x4 ВЕДЕТСЯ куб instructable:
