Руководство для начинающих по макетированию Raspberry Pi с помощью Game Simon
Макетная плата позволяет создавать схемы без необходимости чего-либо паять. Это отличный инструмент для экспериментов с электроникой, но он может пугать. Наличие проекта для создания может помочь вам сохранить мотивацию во время обучения.
Есть несколько простых игр, из которых можно сделать отличные проекты для начинающих Raspberry Pi. Легко начать с игры Simon. Simon – это игра на память, в которой в случайном порядке вспыхивает серия огней, и игрок должен запомнить последовательность. По мере продвижения игрока длина последовательности увеличивается.
Необходимые компоненты
Для начала вам понадобятся следующие вещи:
- Raspberry Pi
- Карта microSD прошита с Raspbian OS
- 4 светодиода разных цветов
- 4 резистора (от 220 Ом до 1 кОм)
- 4 кнопки
- 1 макет
- Кабельные перемычки для подключения всего
Вы можете использовать любой Raspberry Pi для этого проекта, но модели Pi Zero не так легко подключаются к макетным платам без какой-либо пайки. Какую бы модель вы ни использовали, вам также понадобятся источник питания, монитор, клавиатура и мышь.
Если вы никогда раньше не настраивали Raspberry Pi, вы можете узнать, как подготовить все для этого руководства, в руководстве для начинающих по Raspberry Pi .
В этом руководстве вы будете писать код Python, и вы можете использовать любой текстовый редактор для его написания, но вам может быть проще редактор кода. Некоторые из них уже установлены в ОС Raspberry Pi, и Thonny разработан, чтобы быть простым для новичков. Какой бы из них вы ни использовали, вам нужно будет сохранить и запустить свой код, чтобы следовать этому руководству.
Начало работы с макетной платой
Если вы никогда раньше не использовали макетную плату, вы можете начать с чтения учебного пособия по макету . Понимание того, как работает макетная плата, поможет вам понять, как создавать схемы.
Raspberry Pi имеет два ряда контактов ввода / вывода общего назначения (GPIO). Эти контакты позволяют подключать компоненты к Raspberry Pi. Некоторые контакты отправляют информацию, другие обеспечивают питание, а некоторые заземляют вашу электронику.
Мы начнем с добавления светодиодной лампы на нашу макетную плату. Если вы никогда раньше не работали со светодиодными лампами на макетной плате, возможно, вы захотите прочитать учебное пособие, которое более подробно объяснит, как это работает .
Начните с подключения вывода GPIO к вашей плате. Неважно, какой вывод, если это вывод GPIO, а не вывод питания или заземления. Выше представлена таблица контактов GPIO, которая поможет вам определить, какой контакт использовать. В этом руководстве используется контакт № 18, который также обозначен как GPIO 24.
Штырь будет подавать питание на макетную плату и позволяет Raspberry Pi обмениваться данными с компонентами на плате. Затем подключите контакт номер 6 на Pi к шине заземления макета. Это заземлит плату и позволит нам создавать схемы.
Мощность, исходящая от Raspberry, слишком высока для прямого подключения светодиода. Использование резистора снижает уровень мощности и предотвращает перегорание светодиода. Подключите одну сторону резистора к той же линии, к которой подключен вывод GPIO, а конец – к другой стороне макета. Затем поместите положительный полюс светодиода после резистора. Отрицательный конец светодиода можно подключить непосредственно к отрицательной шине. Конечный результат должен выглядеть как на диаграмме выше. Тщательно проверьте проводку и включите Pi. Светодиод должен загореться.
Итак, вы создали схему с помощью Raspberry Pi, которой можно управлять с помощью кода.
Использование кода Python для управления светодиодами
В этом руководстве вы поэтапно рассмотрите код, но если вы хотите в любое время обратиться к готовому коду, он доступен на Pastebin .
Прямо сейчас питание идет на светодиод, но мы хотим контролировать, когда он включается и выключается. Следующий код Python позволит нам общаться с доской.
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
red = 18
GPIO.setup(red, GPIO.OUT)
GPIO.output(red, GPIO.LOW)
Первые несколько строк все настраивают. Библиотека Raspberry Pi GPIO импортирована. Параметр as GPIO просто позволяет нам называть RPi.GPIO GPIO, чтобы сэкономить немного времени на вводе текста. Режим вывода GPIO установлен на BOARD . Вам не обязательно использовать этот параметр, но может быть проще ссылаться на контакты по их порядку в строках GPIO.
Наконец, мы установили для предупреждений значение false. Это остановит ненужные предупреждения.
Следующие три строки управляют светодиодом. Красный светодиод подключен к контакту 18 GPIO. Вместо того, чтобы запоминать это, переменная red будет сохранять местоположение. Далее GPIO.setup говорит нашу программу , что она отправляет информацию к красной булавке. Наконец, мы устанавливаем GPIO. вывод на красный вывод на низкий . Когда вы запустите эту программу, свет погаснет. Чтобы снова включить его, переключите GPIO.LOW на GPIO.HIGH и снова запустите программу.
Сохраните код и нажмите «Выполнить», чтобы увидеть его в действии. Если в редакторе кода нет кнопки запуска, сохраните ее и запустите python myfilename.py в окне терминала. Сначала вам нужно перейти в тот же каталог, что и ваш новый файл Python. Просмотрите шпаргалку по Raspberry Pi, если не знаете, как это сделать.
Добавление более одного светодиода
Для создания игры Саймона нам понадобятся четыре огонька разного цвета. Те же шаги, которые вы использовали для настройки красного светодиода, можно использовать для настройки остальных трех. Ваша проводка должна выглядеть, как на схеме ниже:
Ваш код должен выглядеть так:
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
red = 18
yellow = 22
green = 24
blue = 26
GPIO.setup(red, GPIO.OUT)
GPIO.setup(yellow, GPIO.OUT)
GPIO.setup(green, GPIO.OUT)
GPIO.setup(blue, GPIO.OUT)
GPIO.output(red, GPIO.HIGH)
GPIO.output(yellow, GPIO.HIGH)
GPIO.output(green, GPIO.HIGH)
GPIO.output(blue, GPIO.HIGH)
После того, как вы проверили светодиоды, установите GPIO.output на GPIO.LOW, чтобы снова выключить каждый из них.
Хотя цвет проводов, которые вы используете, не имеет значения, попробуйте использовать цвета, которые имеют для вас значение, чтобы облегчить чтение доски. Например, для заземления часто используются черные провода. В этой схеме вы можете сопоставить цвет провода с цветом светодиода.
Управление светодиодами с помощью кнопок
Начните с добавления кнопки на свою доску. Кнопка должна быть подключена как к земле, так и к выводу GPIO. Схема должна выглядеть примерно так:
Чтобы заставить кнопку управлять светодиодом, нам нужно добавить в наш код. Настройка кнопки аналогична настройке светодиода, за исключением того, что вывод GPIO настроен как вход, а не выход. Этот код также устанавливает внутренний подтягивающий резистор на Pi, который необходим для правильной работы кнопки.
GPIO.setup (32, GPIO.IN, pull_up_down = GPIO.PUD_UP)
Теперь нам нужен код, который проверяет, была ли нажата кнопка.
game = True
while game:
redButtonState = GPIO.input(32)
if redButtonState == 0:
GPIO.output(red, GPIO.HIGH)
time.sleep(1)
GPIO.output(red, GPIO.LOW)
Мы хотим, чтобы наша программа продолжала проверять, нажата ли кнопка, поэтому мы используем цикл while . Поскольку цикл никогда не будет ложным, он продолжает работать и проверять кнопку, пока мы не завершим программу вручную, нажав кнопку остановки или используя сочетание клавиш Ctrl + c .
Затем, чтобы упростить ссылку на ввод, который отправляет нам вывод GPIO кнопки, мы сохраняем эту информацию в переменной redButtonState . Если значение нашей кнопки изменится на 0, мы знаем, что кнопка была нажата.
Если кнопка нажата, загорится красный светодиод. Затем, через секунду светодиод погаснет. Чтобы рассчитать это время, мы используем функцию time.sleep (1) . Чтобы это работало, вам нужно будет импортировать библиотеку времени в верхней части скрипта.
Как только одна кнопка заработает, вы можете добавить еще три, по одной для каждого светодиода. Ваш код должен выглядеть так:
import random
import time
import RPi.GPIO as GPIO
GPIO.setmode (GPIO.BOARD)
GPIO.setwarnings(False)
red = 18
yellow = 22
green = 24
blue = 26
GPIO.setup(red, GPIO.OUT)
GPIO.setup(yellow, GPIO.OUT)
GPIO.setup(green, GPIO.OUT)
GPIO.setup(blue, GPIO.OUT)
GPIO.setup(32, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(36, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(38, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(40, GPIO.IN, pull_up_down=GPIO.PUD_UP)
game = True
while game:
redButtonState = GPIO.input(32)
if redButtonState == 0:
GPIO.output(red, GPIO.HIGH)
time.sleep(1)
GPIO.output(red, GPIO.LOW)
yellowButtonState = GPIO.input(36)
if yellowButtonState == 0:
GPIO.output(yellow, GPIO.HIGH)
time.sleep(1)
GPIO.output(yellow, GPIO.LOW)
greenButtonState = GPIO.input(38)
if greenButtonState == 0:
GPIO.output(green, GPIO.HIGH)
time.sleep(1)
GPIO.output(green, GPIO.LOW)
blueButtonState = GPIO.input(40)
if blueButtonState == 0:
GPIO.output(blue, GPIO.HIGH)
time.sleep(1)
GPIO.output(blue, GPIO.LOW)
Ваша доска должна выглядеть примерно так:
Теперь вся электроника на месте. Если у вас возникли проблемы, проверьте свой код на наличие ошибок. Помните, что вы можете загрузить полный код с Pastebin, если застряли!
Создание игры
В этом проекте уже рассмотрены все основы, которые вам нужно знать, чтобы начать использовать макетную плату. Но превращение этих навыков в игру действительно продемонстрирует, на что вы способны!
В «Саймоне» игрок видит серию вспышек огней и должен запомнить узор. Это легко начинается с одного света. Каждый уровень добавляет случайный свет к узору, чтобы усложнить игру.
Создание паттерна
Это довольно простой шаг. Один массив будет содержать наш световой узор . Второй массив будет хранить контакты GPIO для наших источников света . В каждом игровом цикле в конец массива паттернов будет добавляться новый случайный источник света. Мы используем случайный. Функция randint () для выбора числа от 0 до 3, представляющего 4 светодиода.
pattern = []
lights = [red, yellow, green, blue]
while game:
pattern.append(random.randint(0,3))
Затем нам нужно зажечь свет, чтобы показать узор.
while game:
pattern.append(random.randint(0,3))
for x in pattern:
GPIO.output(lights[x], GPIO.HIGH)
time.sleep(1)
GPIO.output(lights[x], GPIO.LOW)
time.sleep(0.5)
Важно сделать паузу между двумя огнями. Это позволяет легче увидеть, используется ли один и тот же свет последовательно в узоре.
Получение информации от игрока
Затем игра должна дождаться, пока игрок угадывает порядок огней. Программа должна проверять каждый свет в шаблоне и ждать, пока игрок нажмет кнопку. Для этого требуются вложенные циклы:
for x in pattern:
waitingForInput = True
while waitingForInput:
redButtonState = GPIO.input(32)
yellowButtonState = GPIO.input(36)
greenButtonState = GPIO.input(38)
blueButtonState = GPIO.input(40)
if redButtonState == 0:
GPIO.output(red, GPIO.HIGH)
waitingForInput = False
time.sleep(1)
GPIO.output(red, GPIO.LOW)
if yellowButtonState == 0:
GPIO.output(yellow, GPIO.HIGH)
waitingForInput = False
time.sleep(1)
GPIO.output(yellow, GPIO.LOW)
if greenButtonState == 0:
GPIO.output(green, GPIO.HIGH)
waitingForInput = False
time.sleep(1)
GPIO.output(green, GPIO.LOW)
if blueButtonState == 0:
GPIO.output(blue, GPIO.HIGH)
waitingForInput = False
time.sleep(1)
GPIO.output(blue, GPIO.LOW)
Большая часть приведенного выше кода повторно использует код, который мы написали для проверки кнопок.
Проверьте ввод игрока
Отсюда довольно легко проверить, правильно ли введен игрок. Каждый раз, когда они нажимают кнопку, игра может проверить, правильная ли это кнопка. Для этого добавьте еще один оператор if для каждого ввода кнопки:
if redButtonState == 0:
GPIO.output(red, GPIO.HIGH)
waitingForInput = False
if x != 0:
game = False
time.sleep(1)
GPIO.output(red, GPIO.LOW)
Переменная x из нашего цикла for имеет номер следующего источника света. Красный светодиодный индикатор находится в первой позиции или под номером 0. Если игрок нажал красную светодиодную кнопку, когда у нас в нашем шаблоне 0, он прав! Если нет, они проигрывают. Установка переменной game в значение false остановит наш игровой цикл и завершит программу.
Поздравляю! Вы создали игру с нуля!
Создание игры добавило в этот проект гораздо больше кода, чем просто добавление светодиодов и кнопок. Работа над окончательным проектом, который вы можете показать своим друзьям и семье, поможет вам сохранить мотивацию.
Эта игра довольно проста. Испытайте себя, чтобы улучшить базовый дизайн. Возможно, лампочки могут вспыхнуть, если игрок проиграет. Может быть, вы хотите бросить вызов самому себе, чтобы добавить звуки в игру. Ваше воображение – единственный предел!
Хорошо, это и оборудование, которое у вас есть.