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

Arduino привело кубНа прошлой неделе я построил светодиодный куб

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

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

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

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

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

Arduino привело куб

Тем не менее, в нашем кубе плоскости X и Z представлены светодиодными выводами, в то время как Y непосредственно отображается на плоскости катода. Чтобы облегчить работу с этими координатами и выяснить движение вокруг куба, я поэтому создал новый тип данных (используя struct) для представления одной точки на кубе, которую я назвал «xyz». Он состоит из двух целых чисел: «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, которые не позволяют функциям возвращение пользовательских типов данных; они должны быть помещены в их собственный файл, а затем импортированы в начале основного файла.

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

Единственное, на что следует обратить внимание в главном цикле, — это некоторые проверки для исправления найденной мною ошибки, связанной с мультиплексированием: если новое местоположение было в той же плоскости катода или на том же выводе анода, выключение предыдущего светодиода привело бы к тому, что оба погасли. Также в этот момент я понял, что выход за пределы 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: декартовы координаты — пользователь Wikimedia Sakurambo

Ссылка на основную публикацию
Adblock
detector