Создание игры Пинг-понг на Arduino
Это пятый урок курса по основам Ардуино. На этом уроке мы напишем первую игру на Arduino. Назовем ее Пинг-понг. Новых компонентов не добавляется. А значит владельцы любого из наборов серии «Дерзай» («Базовый«, «Изучаем Arduino» и «Умный дом«) смогут его повторить. Написание даже маленькой игры совсем непростая задача, и мы разобъем урок на 2 части.
Для данного проекта Вам понадобятся следующие детали, которые имеются в каждом из наборов Arduino :
- Arduino Uno;
- Кабель USB;
- Плата прототипирования;
- Провода «папа-папа» — 20 шт;
- Резисторы 220 Ом – 8 шт;
- Светодиоды – 8 шт;
- Кнопка – 2 шт;
- Резисторы 10 кОм – 2 шт;
- Потенциометр.
Теперь о самой игре. В игре участвует 2 игрока. На поле (8 светодиодов) движется «шарик» (горящий светодиод) от одного края к другому. По достижению «стены» (крайнего положения поля (1 и 8 светодиод )) шарик отражается от «стены» и движется в противоположном направлении. «Шарик» меняет направление движения также при попаданию в «ракетку» игрока («ракетка» появляется на поле (2 и 7 светодиод) при нажатии игроком своей кнопки (при нажатии загорается светодиод) и исчезает при отжатии кнопки).
Кнопка может быть нажата не более определенного времени, по прошествии которого «ракетка» исчезает с поля, для установки «ракетки» на поле снова требуется нажатие игроком кнопки. Если шарик не отбит «ракеткой» игрока, он попадает в одно из крайних положений и фиксируется гол. Цель игры – забить больше голов.
Игра продолжается до достижения определенного счета. Скорость движения «шарика» будем устанавливать в соответствии с показаниями потенциометра.
Собираем схему, показанную на рисунке 1 (эта схема полностью повторяет схему из урока 4).

Приступим к написанию скетча.
В программе будет 4 режима:
0 — ожидание начала игры.
1 — движение мячика;
2 — индикация ГОЛ — мигание 2 сек;
3 — индикация победителя;
Рисунок 1. Схема соединений
В первой части урока мы напишем скетч движения шарика и индикации гола. Действия игроков мы рассматривать не будем. Переменная posball – позиция «шарика». Переменная dirball – направление движения «шарика». В режиме 1 (движение) мы через промежутки времени speedball (скорость движения шарика) изменяем положение шарика:
posball=posball+dirball;
При достижении крайних положений (0 и 7) мы меняем значение направления движения и переходим в режим 2 (индикация гола). Индикация гола – мигание крайнего светодиода в течении времени TIME_RES2 с частотой TIME_BLINK_RES2 :
#define TIME_RES2 2000 #define TIME_BLINK_RES2 200
По истечении времени TIME_RES2 переходим в режим 1. Скорость движения «шарика» вычисляем в каждом цикле по показаниям потенциометра:
speedball=map(analogRead(POT),0,1023,MAX_SPEEDBALL,MIN_SPEEDBALL);
Создадим в Arduino IDE новый скетч, занесем в него код из листинга 1 и загрузим скетч на на плату Arduino. Напоминаем, что в настройках Arduino IDE необходимо выбрать тип платы (Arduino UNO) и порт подключения платы.
Листинг 1
// количество кнопок
#define COUNT_BUTTONS 2
// количество светодиодов
#define COUNT_LEDS 8
// Аналоговый вход A0 для подключения потенциометра
const int POT=0;
// переменная для хранения значения потенциометра
int valpot = 0;
// условная единица мсек/1 шкалы
int valscale=1000;
// Выводы Arduino для подключения
// список светодиодов
int pinleds[8]={4,5,6,7,8,9,10,11};
// переменная для хранения времени нажатия мсек
unsigned long alltimepressing=0;
// переменная для хранения позиции мячика
int posball=0;
// направление движения мячика
int dirball=1;
// список кнопок
int pinbuttons[2]={2,3};
// список сохранения предыдущих состояний кнопок
int lastbuttons[2]={0,0};
// список сохранения текущих состояний кнопок
int currentbuttons[2]={0,0};
// состояние кнопки
boolean pressing[2]={false,false};
// режим программы
// 0 - ожидание начала игры
// 1 - движение мячика
// 2 - индикация ГОЛ - мигание 3 сек
// индикация ПОБЕДА - мигание
int res=1;
// скорость движения мячика
unsigned long speedball=0;
unsigned long millisgoball=0;
#define MIN_SPEEDBALL 1000
#define MAX_SPEEDBALL 250
// служебная для мигания гола
unsigned long millisres2=0;
#define TIME_RES2 2000
unsigned long millisblinkres2=0;
boolean blinkres2=true;
#define TIME_BLINK_RES2 200
void setup()
{
Serial.begin(9600);
// настроить выводы Arduino для светодиодов как выходы
for(int i=0;i<COUNT_LEDS;i++) { pinMode(pinleds[i], OUTPUT); digitalWrite(pinleds[i],LOW); } Serial.println("start"); setleds(posball); } void loop() { // движение мячика if(res==1) { if((millis()-millisgoball)>=speedball)
{
posball=posball+dirball;
if(posball==7)
{
res=2;
posball=7;dirball=-1;
millisres2=millis();millisblinkres2=millis();
blinkres2=true;
}
else if(posball==-1)
{
res=2;
posball=0;dirball=1;
millisres2=millis();millisblinkres2=millis();
blinkres2=true;
}
setleds(posball);
millisgoball=millis();
// определение скорости движения мячика
speedball=map(analogRead(POT),0,1023,MAX_SPEEDBALL,MIN_SPEEDBALL);
}
}
// ГОЛ !!! - blink
if(res==2)
{
if(millis()-millisblinkres2>=TIME_BLINK_RES2)
{
blinkres2=!blinkres2;
digitalWrite(pinleds[posball],blinkres2);
millisblinkres2=millis();
}
if(millis()-millisres2>=TIME_RES2)
{
digitalWrite(pinleds[posball],HIGH);
res=1;
}
}
}
// (включение-выключение светодиодов)
void setleds(int pos)
{
// выключение светодиодов всех
for(int i=0;i<8;i++)
digitalWrite(pinleds[i],LOW);
// включение светодиода позиции мячика
digitalWrite(pinleds[pos],HIGH);
}
После загрузки скетча наблюдаем движение «шарика» с отражением от стен (крайних позиций), по достижении крайних позиций – индикация гола (мигание крайнего светодиода) (см. рисунок 2,3).

Рисунок 2,3. Движение шарика и индикация гола
В следующей части урока мы добавим в игру действия игроков (реакцию на нажатие клавиш).

Книга Джереми Блума Изучаем Arduino: инструменты и методы технического волшебства.
25 крутых проектов с Arduino
Мобильные роботы на базе Arduino книга М. Момота
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.