Создание игры Пинг-понг на 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. Движение шарика и индикация гола
В следующей части урока мы добавим в игру действия игроков (реакцию на нажатие клавиш).
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.