Создание электронной игры "Лабиринт" на основе сборной 3d-модели и электронных элементов с Arduino: пьезоизлучателя, светодиодов и фоторезистора.
Идея проекта.
Игра представляет собой сборную модель: коробка с накладной крышкой и электронная часть.
Коробка - обычный полый параллелепипед с вырезанными отверстиями под крышку и для удобного снятия крышки.
Внизу коробки есть отверстие для выхода шарика, куда попадает шарик в случае неправильного движения по лабиринту. В коробке есть также отдел, куда попадает шарик в случае правильного движения по лабиринту. Этот отдел оснащен электронной частью, отгорожен от остальной части коробки.В этом отделе есть отверстия для контактов фотоэлемента и отверстия для контактов светодиода, поддерживающего искусственное освещение в отделе коробки.Фотоэлемент подключен к Arduino и когда шарик пролетает в указанный отдел, происходит изменение освещенности, меняются показания фотоэлемента и звучит "победная мелодия".
Крышка - плоский лабиринт с выдавленными стенками. Есть неправильные варианты движения, в конце которых отверстие. И один правильный путь, в конце которого отверстие над выделенной частью коробки.
Примеры лабиринтов:
Примеры объемных лабиринтов
Разработка модели лабиринта
Задание1. Создайте в плоскости xz крышку-лабиринт размером не более 100*100*10мм, толщина и высота стен - 5мм. Ширина дорожек - 8 мм. Диаметр отверстия - 8мм.
Пример:
Задание 2. Создайте коробку, в которой выделены отделы для "правильного" попадания шарика и "неправильного" попадания. В стенках "правильного" отдела предусмотрите отверстия для контактов фоторезистора и светодиода. В "неправильном" отделе прадусмотрите отверстие сбоку или в дне коробки, через которое шарик легко можно извлечь и повторить игру. Также должно быть отверстие для быстрого съема крышки.
Разработка программы управления аппаратной частью модели игры-лабиринта
В модели используется плата ArduinoUno, красный и желтый светодиоды, резисторы на 220Ом и 10кОм, фоторезистор, пьзоизлучатель и провода для их подключения к плате.
Схемы подключения элементов:
Управление светодиодом
Подключение:
Катод подключаем к "земле" (-), анод - через резистор 220 Ом к пину ("питание")
В программе:
int is=1;//источник постоянного света. в качестве источника может быть дневной свет
void setup()
{
pinMode(is, OUTPUT);
}
void loop()
{
digitalWrite(is, HIGH);//включить свет
delay(50); //ждем 50 Мс
digitalWrite(is, LOW);//выключить свет
delay(50); //ждем 50 Мс
}
Управление пьезоизлучателем
Пьезоизлучатель звука (англ. buzzer) переводит переменное напряжение в колебание мембраны, которая в свою очередь создаёт звуковую волну.Иначе говоря, пьезодинамик — это конденсатор, который звучит при зарядке и разрядке.
Подключение:
Без соблюдения полярности - один контакт к "земле", другой - кпину (к "питанию")
В программе:
int zvuk=13;//звуковая сигнализация
void setup()
{
pinMode(zvuk, OUTPUT);
}
void loop()
{
tone (zvuk, 500); //включаем звук на 500 Гц
delay(100); //ждем 50 Мс
noTone (zvuk); //выключаем звук
delay(100); //ждем 50 Мс
}
На следующем рисунке представлен "нотный алфавит" - все значения частоты звучания пьезоизлучателя, соответствующие стандартным нотам. Например, С – это «до» на 1 октаве, а с – это «до» на 2 октаве и так далее. Этот нотный «алфавит» был написан Бреттом Хэгменом (Brett Hagman), и функция tone() основана именно на его работе.
Используя частоту звучания, можно создавать мелодии с помощью пьезоизлучателя.
Управление фоторезистором
Подключение:
Выходным результатом работы сенсора является аналоговый сигнал. Выходное напряжение датчика обратно пропорционально интенсивности падающего света.
Датчик подключается к управляющей электронике через 3 провода: один контакт подключается к внешнему питанию (5V), другой контакт - через резистор 10кОм к пину и к аналоговому входу (А0)
Для создания эффекта естественного освещения в коробке используется светодиод.Стартовые показания фотоэлемента при первом запуске программы сохраняются в переменную sig0 в разделе программы void setup() и затем в дальнейшем не меняются. Работа устройства будет зависеть от данного значения и показаний фоторезистора в текущий момент. Чтобы избежать погрешности (в процессе перепада освещенности или перепада электросигнала), будем учитывать эту погрешность в условии:
if (sig < sig0-10)//если шарик упал и текущий свет меньше начального
В программе:
int sig;//сигнал с фоторезистора текущий
int sig0;//сигнал с фоторезистора начальный
int fr=0;//показания фоторезистора
void setup()
{
sig0=analogRead(fr);
}
void loop()
{
sig = analogRead(fr);
if (sig < sig0-10)//если шарик упал и текущий свет меньше начального
{
//Действия, когда шарик упал
}
else
{
//Действия, когда шарик не упал
}
}
Пример программы со световой сигнализацией:
Задание1: Добавьте в программу реализацию звуковой сигнализации
Задание 2: В качестве звуковой сигнализации запрограммируйте какую-либо мелодию