Построение контроллеров на Raspberry Pi #6: интерактивные графические контроллеры

Добавлено 12 декабря 2016 в 01:00

Raspberry Pi является универсальным одноплатным компьютером, который позволяет создавать различные встраиваемые контроллеры. Проекты, рассмотренные в данной практической серии, это небольшие примеры электронных устройств и гаджетов, которые могут быть построены на основе Raspberry Pi.

В шестой части серии «Построение контроллеров на Raspberry Pi» вы узнаете, как реализовать графическое отображение прыгающего мяча с помощью нескольких дополнительных электронных компонентов и физических вычислений.

Рисунок 1 показывает основные блоки компонентов, необходимых для создания интерактивного графического контроллера.

Электронные компоненты и встраиваемые аппаратные средства, необходимые для построения RPi (Raspberry Pi) интерактивного графического контроллера
Рисунок 1 – Электронные компоненты и встраиваемые аппаратные средства, необходимые для построения RPi (Raspberry Pi) интерактивного графического контроллера

Список компонентов, необходимых для сборки проекта, показан ниже.

Список компонентов

Pygame и Raspberry Pi

Одним из ключевых элементов интерактивного графического контроллера является Python библиотека Pygame. Python библиотека Pygame делает простым добавление графики в анимационные приложения на Raspberry Pi. Библиотека Pygame позволяет создавать игры и интерактивные объекты без преодоления трудностей разработки специального кода и алгоритмов.

Интерактивный графический контроллер, который мы создадим, использует библиотеку Pygame для добавления изображения прыгающего мяча в окно, которое называется холст. Рисунок 2 показывает холст, построенный с помощью Pygame для изображения мяча.

Пример холста прыгающего мяча, построенный с помощью библиотеки Pygame
Рисунок 2 – Пример холста прыгающего мяча, построенный с помощью библиотеки Pygame

Размеры холста заданы с помощью Python инструкции под названием size. Инструкция size определяет ширину (width) и высоту (height) холста, как показано ниже.

size = width, height = 500, 500

Таким образом, библиотека Pygame предоставляет следующие улучшения программирования для Python:

  • созданная графика не будет мерцать;
  • графические элементы могут управляться с соответствующей скоростью движения с помощью Raspberry Pi;
  • графические элементы могут управляться с помощью клавиатуры, мыши или внешних датчиков.

В дополнение к добавлению графики, как показано на блок-схеме на рисунке 1, с помощью библиотеки Pygame цифровой датчик будет управлять изображением интерактивного контроллера. Чтобы перемещать мяч на холсте, мы соберем цифровой датчик с использованием кнопки или фотоэлемента.

Теперь давайте обсудим функциональное взаимодействие между прыгающим мячом и цифровым датчиком с помощью физических вычислений.

Физические вычисления и Raspberry Pi

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

Рисунок 3 – Внешняя среда физических вычислений для датчика (фотоэлемента) со вспомогательной разводкой на макетной плате. Движение руки имитирует удары по мячу.

Окружающей средой для датчика является беспаечная макетная плата и вспомогательная схема с подтягивающим резистором. При прохождении руки над датчиком генерируется электрический сигнал. Этот электрический сигнал затем обрабатывается компьютером Raspberry Pi посредством Python кода, находящегося в памяти микроконтроллера. Библиотека Pygame создаст холст с мячиком, позволяющий графическому элементу двигаться в соответствии с параметрами движения в Python коде. Параметром движения для этой интерактивной анимации является диагональное направление движения мяча по холсту.

Мы будем использовать фотоэлемент (в качестве датчика движения руки), а также Python код и библиотеку Pygame для создания интерактивного графического контроллера на основе физических вычислений. Теперь, ознакомившись с физическими вычислениями и библиотекой Pygame, мы готовы собрать наш интерактивный графический контроллер.

Методы разводки электрической схемы

Для сборки электронной схемы фотоэлементного датчика мы будем использовать беспаечную макетную плату и перемычки. Как показано на рисунке 3, выход электронной схемы фотоэлементного датчика будет подключен к GPIO (вход/выход общего назначения) выводу Raspberry Pi. Мы подключим выход схемы непосредственно к GPIO выводу 25 Raspberry Pi.

Перед сборкой контроллера, соберем тестовую схему с кнопкой для проверки интерфейса электрической схемы цифрового коммутатора. Подтягивающий резистор 1 кОм обеспечит цифровые сигналы с напряжениями 0 и 3,3 вольта на GPIO выводе 25 Raspberry Pi, когда кнопка нажата или отпущена. Рисунок 4 показывает схему соединений тестовой электрической схемы с кнопкой.

Схема соединений тестовой электрической схемы с кнопкой
Рисунок 4 – Схема соединений тестовой электрической схемы с кнопкой

К сожалению, на печатной плате не приводится маркировка GPIO выводов 40-пинового разъема Raspberry Pi. Для помощи в подключении тестовой схемы на рисунке 5 приведена распиновка разъема GPIO выводов Raspberry Pi.

Распиновка разъема GPIO выводов Raspberry Pi
Рисунок 5 – Распиновка разъема GPIO выводов Raspberry Pi

Другой способ подключения электронной схемы фотоэлементного датчика к Raspberry Pi заключается в использовании Т-образного переходника для разъема GPIO выводов на макетную плату, который показан на рисунке 6.

Переходник для разъема GPIO выводов Raspberry Pi на макетную плату
Рисунок 6 – Переходник для разъема GPIO выводов Raspberry Pi на макетную плату

Переходник для разъема GPIO выводов Raspberry Pi вставляется в стандартную макетную плату и подключается плоским шлейфом к Raspberry Pi. Рисунок 7 показывает подключение тестовой схемы с кнопкой к Raspberry Pi с помощью переходника.

Подключение электрической схемы на макетной плате к Rapberry Pi с помощью переходника для разъема GPIO выводов
Рисунок 7 – Подключение электрической схемы на макетной плате к Rapberry Pi с помощью переходника для разъема GPIO выводов

Теперь, собрав тестовую схему, мы готовы проверить работу интерактивного графического контроллера с помощью python кода, показанного в листинге 1 ButtonBouncingBall.py.

# Подключаем библиотеки Python
import sys, pygame
import time
import RPi.GPIO as io
io.setmode(io.BCM)

# Выполняем назначение выводов
button_pin = 25

# Настроить button_pin на вход
io.setup(button_pin, io.IN)

pygame.init( )

# Установить параметры холста
size = width, height = 500, 500
speed = [100, 100]
white = 255,255,255

# Показать заголовок холста
pygame.display.set_caption("Bouncing Ball")

screen = pygame.display.set_mode(size)
ball = pygame.image.load("beachball2.png")
ballrect = ball.get_rect()

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT: sys.exit()
    if io.input(button_pin): # Если кнопка нажата, то перемещать мяч
       ballrect = ballrect.move(speed)
    if ballrect.left < 0 or ballrect.right > width:  # Перемещать мяч вверх
        speed[0] = -speed[0] 
    if ballrect.top < 0 or ballrect.bottom > height: # Перемещать мяч вниз
        speed[1] = -speed[1]

    screen.fill(white) # Установить фон холста
    screen.blit(ball, ballrect)
    pygame.display.flip()
    time.sleep(0.1)    # Ждать 100мс до следующего нажатия кнопки
    

Тестирование интерактивного графического контроллера

Чтобы можно было протестировать интерактивный графический контроллер, вам необходимо скачать (ссылка выше) и распаковать архив ButtonBouncingBall_materials.zip в какой-либо каталог на Raspberry Pi. В архиве находятся файлы beachball2.png и ButtonBouncingBall.py.

Теперь запустите LXTerminal и перейдите в каталог, в котором расположен скрипт ButtonBouncingBall.py. Основные моменты в скрипте прокомментированы. Перед запуском скрипта просмотрите эти комментарии, чтобы понимать, как работает код.

Наберите в LXTerminal команду sudo python ButtonBouncingBall.py, как показано на рисунке 8, чтобы запустить приложение.

Запуск Python приложения ButtonBouncingBall.py в LXTerminal
Рисунок 8 – Запуск Python приложения ButtonBouncingBall.py в LXTerminal

Как только код будет запущен, на экране HDMI монитора появится холст с мячом, как показано на рисунке 9.

Код ButtonBouncingBall.py, запускающий холст Pygame
Рисунок 9 – Код ButtonBouncingBall.py, запускающий холст Pygame

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

Функция детектирования ведения мяча рукой

Чтобы мяч прыгал при ведении рукой, необходимо заменить кнопку электронной схемой фотоэлементного датчика. Схема фотоэлементного датчика подключается как цифровой коммутатор. Размещение руки над фотоэлементом обеспечит управляющий сигнал логической единицы (3,3В), который будет считан Raspberry Pi. Raspberry Pi обработает этот цифровой управляющий сигнал и заставит мяч двигаться вниз или отскочить вверх.

Убирание руки от фотоэлемента обеспечивает цифровой управляющий сигнал логического нуля (0В). Мяч, управляемый Raspberry Pi, перестанет прыгать. Схема подключения схемы детектирования ведения мяча рукой показана на рисунке 10.

Схема подключения схемы детектирования ведения мяча рукой Raspberry Pi
Рисунок 10 – Схема подключения схемы детектирования ведения мяча рукой

Ниже, на рисунке 11, приведена фотография собранного устройства.

Окончательная версия собранного интерактивного графического контроллера. Обратите внимание, что кнопка заменена на фотоэлемент
Рисунок 11 – Окончательная версия собранного интерактивного графического контроллера. Обратите внимание, что кнопка заменена на фотоэлемент

Ниже приведено видео, демонстрирующее работу проекта.

И снова поздравляю с успешным добавлением функции детектирования ведения мяча рукой в ваш интерактивный графический контроллер! Надеюсь, статья оказалась полезной. Оставляйте комментарии!

Теги

PythonRaspberry PiГрафикаМакетная плата

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.