Программирование вашего светодиодного куба Arduino 4x4x4 для создания еще чего-нибудь интересного

  • William Charles
  • 0
  • 2321
  • 528
Реклама

На прошлой неделе я построил светодиодный куб Как создать пульсирующий светодиодный куб Arduino, который выглядит так, как будто он из будущего Как создать пульсирующий светодиодный куб Arduino, который выглядит так, как будто он пришел из будущего , но ищете что-то немного постоянное и на совершенно ином уровне удивительного, тогда скромный светодиодный куб 4 x 4 x 4… - 64 светодиода что вы можете программировать для создания фантастических футуристических световых шоу - и я надеюсь, что вы это сделали, потому что это отличный проект, чтобы мотивировать вас и расширить свой набор навыков Arduino. Я оставил вам несколько базовых приложений, чтобы вы могли подумать, но сегодня я представлю еще несколько кусочков программного обеспечения, которое я сделал для куба, вместе с пояснениями кода. Цель этого состоит не только в том, чтобы дать вам несколько более приятных световых шоу для запуска, но также в том, чтобы узнать о некоторых ограничениях программирования куба и изучить некоторые новые концепции программирования в процессе..

Это довольно продвинутая кодировка; вам действительно нужно прочитать все мои предыдущие учебники по Arduino и руководство по Arduino для начинающих, прежде чем настраивать предоставленный код.

Приложение 1: Mini Snake

Вместо того, чтобы запускать последовательность паттернов в виде змеи, я хотел запрограммировать змею - искусственную, которая делала бы свои собственные случайные выборы и была бы совершенно непредсказуемой. Он ограничен только двумя сегментами, которые я объясню позже, и вы можете увидеть демо ниже. Загрузите полный код здесь.

При работе с трехмерным пространством вам нужно 3 координаты для одной точки: Икс, Y, а также Z.

Однако в нашем кубе плоскости X и Z представлены светодиодными штырьками, а Y непосредственно отображается на плоскости катода. Чтобы облегчить работу с этими координатами и выяснить движение вокруг куба, я поэтому создал новый тип данных (используя структуру) представлять одну точку на кубе - который я назвал “хуг”. Он состоит всего из двух целых чисел: “XZ”, а также “Y”. С помощью этой структуры я мог бы также представить направление, указанное ниже в нашей специальной (xz, y) системе координат:

Движение Y (вверх вниз): (xz, y + 1), (xz, y-1)
Z движение (вперед, назад): (xz-1, y), (xz + 1, y)
Движение X (лево право): (xz + 4, y), (xz-4, y)

Например, чтобы переместить светодиод в положение (0,0) один налево, мы применяем (хз + 4, у) и в конечном итоге (0,4).

Существуют определенные ограничения на движение, а именно то, что координаты Y могут быть только возможными От 0 до 3 (0 - нижний слой, 3 - верхний), а координаты XZ могут быть только От 0 до 15. Дальнейшее ограничение накладывается на движение Z, чтобы предотвратить “прыжки” от задней части к передней части куба, и наоборот. В этом случае мы используем функцию модуля для проверки на кратность 4 и отклоняем эту попытку перемещения. Это логика представлена ​​в действительный () функция, которая возвращает истину, если предложенное направление является приемлемым, и ложь в противном случае. Я добавил еще одну функцию для проверки обратное направление - то есть, если змея движется в одном направлении, мы не хотим, чтобы она двигалась назад сама по себе, даже если в противном случае она является допустимым местом для перемещения - и переехать() функция, которая принимает координату, направление и возвращает новую координату.

XYZ тип данных, действительный (), переехать() а также обратное () все функции можно найти в xyz.h файл в загрузках. Если вам интересно, почему это было помещено в отдельный файл вместо основного файла программы, это связано с некоторыми сложными правилами компилятора Arduino, которые не позволяют функциям возвращение пользовательских типов данных; они должны быть помещены в их собственный файл, а затем импортированы в начале основного файла.

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

Единственное, на что следует обратить внимание в основном цикле, - это некоторые проверки для исправления найденной мною ошибки, связанной с мультиплексированием: если новое местоположение было в той же плоскости катода или на том же выводе анода, выключение предыдущего светодиода приведет к тому, что оба погаснут. Также в этот момент я осознал, что выход за пределы 2-сегментной змеи будет невозможен с моей текущей реализацией: попробуйте зажечь 3 светодиода в угловом расположении. Вы не можете этого сделать, потому что при активном 2-х слоях и 2-х контактах светодиодов включится 4 светодиода, а не 3. Это неотъемлемая проблема с нашей конструкцией ограниченного мультиплексированного куба, но не беспокойтесь: нам просто нужно использовать силу постоянство видения переписать метод рисования.

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

Новый метод Draw, использующий постоянство видения

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

Приложение 2: Игра Жизни

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

Это, например, то, как муравьи, кажется, двигаются с интеллектом и разумом улья, несмотря на биологический факт, что они просто следуют самым основным гормональным правилам. Вот полный код для скачивания: нажмите сброс кнопка для перезагрузки. Если вы обнаруживаете, что получаете один и тот же шаблон снова и снова, попробуйте удерживать кнопку отдыха дольше.

Вот правила игры жизни:

  • Любая живая клетка с менее чем двумя живыми соседями умирает, как если бы она была вызвана недостаточным населением.
  • Любая живая клетка с двумя или тремя живыми соседями живет в следующем поколении.
  • Любая живая клетка с более чем тремя живыми соседями умирает, как если бы она была переполнена.
  • Любая мертвая клетка с ровно тремя живыми соседями становится живой клеткой, как будто путем размножения.

Запустите код. Вы заметите в течение 5-10 “поколения”, автоматы, вероятно, остановились, стабилизировавшись на определенной позиции; иногда эта стабильная модель меняет местоположение и перемещается по доске. В редких случаях они могут даже полностью вымереть. Это ограничение наличия только 4х4х4 светодиодов для работы, но в любом случае это хорошее упражнение для обучения.

Чтобы объяснить код:

  • Вы можете быть незнакомы с тетср () функция. Я использовал это, чтобы сохранить предыдущее игровое состояние, так как массивы нельзя просто назначать друг другу, как обычные переменные - вы должны фактически скопировать всю область памяти (в данном случае, 64 бита).
  • howManyNeighbours () Функция должна быть самоочевидной, но в противном случае этот метод принимает одну координату и проходит через каждого возможного соседа (тот же массив направлений, который мы ранее использовали в приложении snake), чтобы проверить, действительны ли они. Затем он проверяет, были ли эти соседние светодиоды включены в предыдущем состоянии игры, и подсчитывает, сколько их.
  • Основная функция этого приложения Game of Life - progressGame (), который применяет правила автоматов к текущему состоянию игры.

улучшения: Я потратил слишком много времени на это, но вы можете попробовать добавить проверку, которая автоматически сбрасывает плату после 5 или более поколений одного и того же шаблона. тогда, пожалуйста, дайте мне знать! Я также предложил бы попытаться добавить методологию POV в игру со змеями, чтобы, надеюсь, сделать возможной более длинную змею.

Это все от меня сегодня. Позже я могу вернуться к другим приложениям со светодиодным кубом Arduino, но, надеюсь, вы сможете изменить мой код и создать свои собственные правила игры: сообщите нам, что вы придумали в комментариях, чтобы мы все могли загрузить твои творения! Как всегда, я буду здесь, чтобы ответить на ваши вопросы и защитить свои ужасные способности кодирования.

Image Credit: декартовы координаты - пользователь Викимедиа Сакурамбо




О современных технологиях, просто и доступно.
Ваш гид в мире современных технологий. Узнайте как использовать технологии и гаджеты, которые нас окружают каждый день и научитесь открывать интересные вещи в Интернете.