Оглавление:

Arduino и сенсорная панель Tic Tac Toe: 8 шагов (с изображениями)
Arduino и сенсорная панель Tic Tac Toe: 8 шагов (с изображениями)

Видео: Arduino и сенсорная панель Tic Tac Toe: 8 шагов (с изображениями)

Видео: Arduino и сенсорная панель Tic Tac Toe: 8 шагов (с изображениями)
Видео: Игра крестики нолики на микроконтроллере stm32: звук, эффекты, голос, дисплей с тачскрином, аудиоЦАП 2024, Сентябрь
Anonim
Arduino и сенсорная панель Tic Tac Toe
Arduino и сенсорная панель Tic Tac Toe

Или упражнение по мультиплексированию ввода и вывода и работе с битами. И заявка на конкурс Arduino.

Это реализация игры в крестики-нолики с использованием массива двухцветных светодиодов 3x3 для дисплея, простого резистивного тачпада и Arduino, чтобы связать все вместе. Чтобы увидеть, как это работает, посмотрите видео: Что требуется для этого проекта: Детали и расходные материалы Одна перфорированная плата (или монтажная плата) Девять двухцветных светодиодов, общий катод Девять идентичных резисторов в диапазоне 100-220 Ом Шесть идентичных резисторов в Диапазон от 10 кОм до 500 кОм Один однополюсный переключатель с двойным ходом Пучка штырей заголовка Связка электрического провода Один небольшой квадратный лист прозрачного акрила, толщиной ~ 1 мм, 8 см сбоку Прозрачная липкая лента Термоусадочные термоусадки (по желанию) Все вышеперечисленное являются довольно распространенными предметами, их общая стоимость не должна превышать 20 долларов США. Инструменты Одна установка Arduino (Arduino Duemilanove, Arduino IDE, компьютер, USB-кабель) Обычные электрические инструменты (мультиметр, паяльный пистолет, ножницы для проводов, кусачки) Все, что связано с Arduino, может быть можно найти на https://www.arduino.cc. Продолжаем сборку!

Шаг 1. Подключение светодиодной матрицы

Подключение светодиодной матрицы
Подключение светодиодной матрицы
Подключение светодиодной матрицы
Подключение светодиодной матрицы

Чтобы светодиод загорелся, оба его вывода должны быть подключены. Если бы мы назначили пару контактов каждому из 18 светодиодов (9 красных, 9 зеленых), у нас бы быстро закончились контакты на Arduino. Однако с мультиплексированием мы сможем адресовать все светодиоды с помощью всего 9 контактов! Для этого светодиоды соединены поперечным швом, как показано на первом рисунке. Светодиоды сгруппированы в столбцы по три, а их катоды сгруппированы в ряды по шесть штук. Установив высокий уровень для конкретной анодной линии и низкий уровень для конкретной катодной линии, и имея высокий импеданс на всех других анодных и катодных линиях, мы можем выберите, какой светодиод мы хотим, чтобы он загорелся, так как есть только один возможный путь, по которому может пройти ток. Например, на втором рисунке, если для зеленой линии анода 1 установлено высокое значение, а для линии катода 1 - низкий уровень, загорится нижний левый зеленый светодиод.. Текущий путь в этом случае показан синим цветом, но что, если вы хотите, чтобы зажечь более одного светодиода на разных линиях? Мы будем использовать настойчивое видение, чтобы добиться этого. Очень-очень быстрый выбор пар светодиодных линий создает иллюзию, что все выбранные светодиоды горят одновременно.

Шаг 2: компоновка светодиодной матрицы

Схема расположения светодиодной матрицы
Схема расположения светодиодной матрицы
Схема расположения светодиодной матрицы
Схема расположения светодиодной матрицы

На схеме ниже показано, как светодиоды подключены физически (G1-G9: зеленые светодиоды, R1-R9: красные светодиоды). Эта диаграмма предназначена для одиночных красных и зеленых светодиодов, если вы используете двухцветные общие катодные красные / зеленые светодиоды, вам необходимо подключить только одну катодную ножку на красную / зеленую пару. Красная и зеленая анодные линии входят в контакты ШИМ. Arduino (контакты 3, 5, 6, 9, 10, 11 на Duemilanove), чтобы в дальнейшем мы могли иметь такие эффекты, как затухание. Катодные линии входят в контакты 4, 7 и 8. Каждая из катодной и анодной линий имеет резисторы 100 Ом для защиты.

Шаг 3: обращение к светодиодной матрице

Для кода крестики-нолики нам необходимо иметь возможность хранить следующую информацию о светодиодах: - горит ли светодиод или нет - горит ли он, красный или зеленый Один из способов сделать это - сохранить состояние в массиве из 9 ячеек с использованием трех цифр для представления состояния (0 = выключено, 1 = красный включен, 2 = зеленый включен). Каждый раз, когда нам нужно проверить состояние светодиода, например, чтобы проверить, есть ли условие выигрыша, нам нужно будет циклически перебрать массив. Это работоспособный, но довольно неуклюжий метод. Более рациональным методом было бы использование двух групп по девять бит. Первая группа из девяти битов хранит состояние включения-выключения светодиодов, а вторая группа из девяти битов хранит цвет. Тогда управление состояниями светодиодов просто превращается в разряд битовой арифметики и сдвига. Вот наработанный пример. Скажем, мы рисуем нашу сетку крестики-нолики графически и сначала используем единицы и нули для представления состояния включения-выключения (1 включен, 0 выключен): 000 000 = матрица с горящим нижним левым светодиодом 100 100 010 = матрица с диагональю Светодиоды горят 001 Если мы пронумеруем ячейки снизу слева, мы можем записать вышеприведенные представления в виде серии битов. В первом случае это будет 100000000, а во втором - 001010100. Если мы будем думать об этом как о двоичных представлениях, то каждую серию битов можно сжать в одно число (256 в первом случае, 84 во втором случае). Поэтому вместо использования массива для хранения состояния матрицы мы можем просто использовать одно число! Точно так же мы можем представить цвет светодиода таким же образом (1 - красный, 0 - зеленый). Давайте сначала предположим, что все светодиоды горят (поэтому состояние включения-выключения представлено цифрой 511). Матрица ниже будет представлять состояние цвета светодиодов: 010 зеленый, красный, зеленый 101 красный, зеленый, красный 010 зеленый, красный, зеленый Теперь при отображении светодиодной матрицы нам просто нужно циклически перебрать каждый бит, сначала в выключенном состоянии, а затем в цветном состоянии. Например, предположим, что наше состояние включения-выключения - 100100100, а состояние цвета - 010101010. Вот наш алгоритм включения светодиодной матрицы: Шаг 1. Выполните побитовое сложение состояния включения-выключения с двоичной 1 (т.е. бит маскировка). Шаг 2. Если это правда, светодиод горит. Теперь произведите побитовое сложение состояния цвета с двоичным 1. Шаг 3. Если это правда, зажгите красный светодиод. Если неверно, загорится зеленый светодиод. Шаг 4. Сдвиньте как состояние включения-выключения, так и состояние цвета на один бит вправо (т.е. битовый сдвиг). Шаг 5. Повторяйте шаги 1–4, пока не будут прочитаны все девять бит. Обратите внимание, что мы заполняем матрицу в обратном направлении - мы начинаем с ячейки 9, затем переходим обратно к ячейке 1. Кроме того, состояния включения-выключения и цвета сохраняются как беззнаковый целочисленный тип (слово) вместо целочисленного типа со знаком. Это потому, что при битовом сдвиге, если мы не будем осторожны, мы можем случайно изменить знак переменной. Прилагается код для включения светодиодной матрицы.

Шаг 4: сборка сенсорной панели

Сборка сенсорной панели
Сборка сенсорной панели
Сборка сенсорной панели
Сборка сенсорной панели
Сборка сенсорной панели
Сборка сенсорной панели
Сборка сенсорной панели
Сборка сенсорной панели

Тачпад изготовлен из листа тонкого акрила, достаточно большого, чтобы перекрывать светодиодную матрицу. Затем приклейте проволоку рядов и столбцов к акриловому листу прозрачной лентой. Прозрачная лента также используется в качестве изоляционной прокладки между проводами в местах пересечения. Обязательно используйте чистые инструменты, чтобы жир с пальцев не попал на липкую сторону ленты. Пятна от отпечатков пальцев не только выглядят некрасиво, но и делают ленту менее липкой. Обрежьте один конец каждой линии и припаяйте другой конец к более длинному проводу. Перед пайкой разъемов припаяйте резистор на одной линии с проводами. Используемые здесь резисторы - 674 кОм, но подойдет любое значение от 10 кОм до 1 м. Подключения к Arduino выполняются с помощью 6 аналоговых выводов, при этом выводы 14-16 подключены к рядам проволочной сетки, а контакты 17-19 подключены к столбцы.

Шаг 5. Сенсорная панель - как она работает

Сенсорная панель - как она работает
Сенсорная панель - как она работает
Сенсорная панель - как она работает
Сенсорная панель - как она работает

Так же, как мы использовали перекрестный мультиплексор для настройки светодиодной матрицы с минимальным количеством контактов, мы можем использовать аналогичный перекрестный мультиплексор для настройки сенсорной матрицы, которую мы затем можем использовать для активации светодиодов. Концепция этой сенсорной панели проста. По сути, это проволочная сетка с тремя оголенными проводами, идущими рядами, и тремя неизолированными проводами, идущими столбцами над рядами. В каждой точке пересечения есть небольшой квадрат изоляции, который предотвращает соприкосновение двух проводов. Палец, касающийся пересечения, коснется обоих проводов, что приведет к огромному, но конечному сопротивлению между двумя проводами. Таким образом, небольшой, но обнаруживаемый ток может протекать от одного провода к другому через палец. Чтобы определить, какое пересечение было нажато, был использован следующий метод: Шаг 1: Установите для всех строк столбцов значение ВЫХОДНОЙ НИЗКИЙ. Шаг 2: Установите для строк строк значение INPUT с активированными внутренними подтягиваниями. Шаг 3: Выполните аналоговое считывание для каждой строки строки, пока значение не упадет ниже заданного порогового значения. Это сообщит вам, в какой строке находится нажатое пересечение. Шаг 4. Повторите шаги 1-3, но теперь с столбцами в качестве входов и строками в качестве выходов. Это сообщает вам, в каком столбце находится нажатое пересечение. Чтобы минимизировать влияние шума, снимается ряд показаний, которые затем усредняются. Затем усредненный результат сравнивается с пороговым значением. Поскольку этот метод просто сравнивает с пороговым значением, он не подходит для обнаружения одновременных нажатий. Однако, поскольку крестики-нолики выполняются по очереди, достаточно одного нажатия. Прилагается эскиз, иллюстрирующий, как работает тачпад. Как и в случае со светодиодной матрицей, биты используются для обозначения того, какой перекресток был нажат.

Шаг 6: Собираем все вместе

Собираем все вместе
Собираем все вместе

Теперь, когда все отдельные компоненты готовы, пора собрать их все вместе. Наложите проволочную сетку на светодиодную матрицу. Возможно, вам придется изменить порядок нумерации контактов в коде светодиодной матрицы, чтобы он синхронизировался с датчиком проволочной сетки. Закрепите проволочную сетку на месте с помощью креплений или клея по вашему выбору и приклейте на красивую игровую доску. Добавьте переключатель между контактом 12 и заземлением Arduino. Этот переключатель предназначен для переключения между режимом 2 игроков и режимом 1 игрока (по сравнению с микроконтроллером).

Шаг 7: Программирование крестиков-ноликов

Прилагается код игры. Давайте сначала разбиваем игру в крестики-нолики на различные этапы в режиме двух игроков: Шаг 1: Игрок А выбирает незаполненную ячейку, касаясь перекрестка. Шаг 2: Светодиод этой ячейки загорается цветом A. Шаг 3: Проверьте, выиграл ли игрок A. Шаг 4: Игрок B выбирает незаполненную ячейку Шаг 5: Светодиод этой ячейки загорается цветом B.. Шаг 6: проверьте, выиграл ли игрок Б. Шаг 7: повторяйте 1-6 до тех пор, пока не появится условие выигрыша или если все ячейки не будут заполнены.. Пока датчик сетки не регистрирует ненулевое значение, этот цикл будет продолжаться. При нажатии на пересечение переменная Pressed сохраняет положение нажатой ячейки. Проверка, незаполнена ли ячейка: когда получено значение положения (переменная Pressed), оно сравнивается с текущим статусом ячейки (сохраненным в переменной GridOnOff) с помощью побитового сложения. Если нажатая ячейка незаполнена, включите светодиод, в противном случае вернитесь к чтению ячеек. Переключение цветов: логическая переменная Turn используется для записи, чья это очередь. Цвет светодиода, выбираемый при выборе ячейки, определяется этой переменной, которая меняется каждый раз, когда ячейка выбирается. Проверка условия выигрыша: существует только 8 возможных условий выигрыша, и они хранятся как переменные слова в массиве (winArray). Два побитовых сложения используются для сравнения позиций заполненных игроком ячеек с условиями выигрыша. Если есть совпадение, программа отображает процедуру выигрыша, после чего запускает новую игру. Проверка условия ничьей: когда записано девять ходов, а условия выигрыша все еще нет, игра считается ничьей. Затем светодиоды гаснут, и начинается новая игра. Переключение в режим одного игрока: если переключатель находится в положении «включено», программа переходит в режим одного игрока, при этом игрок-человек запускается первым. В конце хода игрока-человека программа просто выбирает случайную ячейку. Очевидно, это не самая умная стратегия!

Шаг 8: Замечания и дальнейшие улучшения

Вот видео, показывающее режим одного игрока, в котором программа выполняет абсолютно случайные ходы: Показанная здесь программа является лишь минимальной, голой версией. С его помощью можно сделать многое другое: 1) Загорание трех светодиодов одновременно. Текущий код отображает только один светодиод одновременно. Однако с помощью показанной здесь проводки можно одновременно зажечь все светодиоды, подключенные к одной катодной линии. Таким образом, вместо циклического переключения всех девяти позиций, все, что вам нужно сделать, это циклически переключаться между тремя катодными линиями. мерцание. Используя прерывания, можно точно контролировать синхронизацию светодиодов, что приведет к более плавному отображению. 3) Более умный компьютерный проигрыватель Текущий код занимает всего несколько килобайт, оставляя немного больше для реализации более умного компьютерного тактика. toe player. Надеюсь, вам понравилось читать это руководство так же, как мне было весело над ним работать!

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