Предлагаем собрать схему и написать программу для игры «Кто быстрее». Это игра на реакцию для двух игроков.
В игре используется две кнопки и три светодиода. Управляет игрой микроконтроллер ATMega328 установленный на плате ARDUINO.
Рис. 1. Принципиальная электрическая схема игры.
Питание на схему изображённую на рис. 1 может быть подано через USB разъём платы Arduino. Так же, запитать схему можно от батареи на 4,5 Вольт, подав питание на ножку VIN или +5V на плате Arduino. Если у Вас плата Arduino UNO, то можно подать напряжение питания от 7 до 12 Вольт от блока питания через разъём питания платы.
Рис. 2. Макет схемы.
Далее, по шагам, пройдём все этапы разработки программы для нашей игры. Пишем и компилируем программу в среде разработки Arduino IDE.
int knLeft = 2; int knRight = 3; // Правая и левая кнопки
int ledLeft = 4; int ledStart = 5; int ledRight = 6; // Правый и левый светодиоды, светодиод Start
void setup() {
}
void loop() {
}
Программа 1.
В программе 1 мы объявили пять переменных целого типа и присвоили им значения. В переменных knLeft и knRight мы храним номера портов на плате Arduino, к которым подключили левую и правую кнопки. В переменные ledLeft, ledStart и ledRight мы записали номера портов, к которым подключили левый и правый светодиоды и светодиод Start, который будет давать сигнал к старту соревнования.
Программа 1 не производит ни каких действий с внешними устройствами и загрузка этой программы в микроконтроллер на плате Arduino не имеет смысла. Но, мы рекомендуем начинающим программистам выполнить компиляцию этой программы в среде программирования Arduino. В процессе компиляции в Вашей программе, возможно, будут выявлены ошибки, которые необходимо исправить.
int knLeft = 2; int knRight = 3; // Правая и левая кнопки
int ledLeft = 4; int ledStart = 5; int ledRight = 6; // Правый и левый светодиоды, светодиод Start
void setup() {
pinMode(ledLeft, OUTPUT);
pinMode(ledStart, OUTPUT);
pinMode(ledRight, OUTPUT);
pinMode(knLeft, INPUT_PULLUP);
pinMode(knRight, INPUT_PULLUP);
}
void loop() {
}
Программа 2.
int knLeft = 2; int knRight = 3; // Правая и левая кнопки
int ledLeft = 4; int ledStart = 5; int ledRight = 6; // Правый и левый светодиоды, светодиод Start
void setup() {
pinMode(ledLeft, OUTPUT);
pinMode(ledStart, OUTPUT);
pinMode(ledRight, OUTPUT);
pinMode(knLeft, INPUT_PULLUP);
pinMode(knRight, INPUT_PULLUP);
}
void loop() {
// Команда "На старт"
digitalWrite(ledLeft, HIGH);
digitalWrite(ledStart, LOW);
digitalWrite(ledRight, HIGH);
delay(4000);
}
Программа 3.
int knLeft = 2; int knRight = 3; // Правая и левая кнопки
int ledLeft = 4; int ledStart = 5; int ledRight = 6; // Правый и левый светодиоды, светодиод Start
void setup() {
pinMode(ledLeft, OUTPUT);
pinMode(ledStart, OUTPUT);
pinMode(ledRight, OUTPUT);
pinMode(knLeft, INPUT_PULLUP);
pinMode(knRight, INPUT_PULLUP);
}
void loop() {
// Команда "На старт"
digitalWrite(ledLeft, HIGH);
digitalWrite(ledStart, LOW);
digitalWrite(ledRight, HIGH);
delay(4000);
// Команда "Внимание!"
digitalWrite(ledLeft, LOW);
digitalWrite(ledStart, LOW);
digitalWrite(ledRight, LOW);
delay(4000);
}
Программа 4.
int knLeft = 2; int knRight = 3; // Правая и левая кнопки
int ledLeft = 4; int ledStart = 5; int ledRight = 6; // Правый и левый светодиоды, светодиод Start
void setup() {
pinMode(ledLeft, OUTPUT);
pinMode(ledStart, OUTPUT);
pinMode(ledRight, OUTPUT);
pinMode(knLeft, INPUT_PULLUP);
pinMode(knRight, INPUT_PULLUP);
}
void loop() {
// Команда "На старт"
digitalWrite(ledLeft, HIGH);
digitalWrite(ledStart, LOW);
digitalWrite(ledRight, HIGH);
delay(4000);
// Команда "Внимание!"
digitalWrite(ledLeft, LOW);
digitalWrite(ledStart, LOW);
digitalWrite(ledRight, LOW);
delay(random(2000, 3000));
// Команда "Старт!"
digitalWrite(ledStart, HIGH);
delay(4000);
}
Программа 5.
int knLeft = 2; int knRight = 3; // Правая и левая кнопки
int ledLeft = 4; int ledStart = 5; int ledRight = 6; // Правый и левый светодиоды, светодиод Start
void setup() {
pinMode(ledLeft, OUTPUT);
pinMode(ledStart, OUTPUT);
pinMode(ledRight, OUTPUT);
pinMode(knLeft, INPUT_PULLUP);
pinMode(knRight, INPUT_PULLUP);
}
void loop() {
// Команда "На старт"
digitalWrite(ledLeft, HIGH);
digitalWrite(ledStart, LOW);
digitalWrite(ledRight, HIGH);
delay(4000);
// Команда "Внимание!"
digitalWrite(ledLeft, LOW);
digitalWrite(ledStart, LOW);
digitalWrite(ledRight, LOW);
delay(random(2000, 3000));
// Команда "Старт!"
digitalWrite(ledStart, HIGH);
int flagLeft = false; int flagRight = false;
// Здесь в программе необходимо выявить победителя
delay(4000);
// Команда "Вольно!"
digitalWrite(ledLeft, LOW);
digitalWrite(ledStart, LOW);
digitalWrite(ledRight, LOW);
delay(4000);
}
Программа 6.
Рис. 3. Блок-схема алгоритма определения победителя. Проработано для левого игрока.
Описание блок-схемы алгоритма определения победителя в игре «Кто быстрее» представленной на рис. 3:
Перед стартом, каждый игрок считается не допущенным к соревнованию по причине фальстарта. Считаем что игроки могли нажать кнопку до подачи светового сигнала старт. В программе 6 мы фиксируем этот факт присваиванием переменной flagLeft значения false. В алгоритме, см. рис. 3 до начала цикла определения победителя мы создали переменные fL и fR со значениями равными 0.
int knLeft = 2; int knRight = 3; // Правая и левая кнопки
int ledLeft = 4; int ledStart = 5; int ledRight = 6; // Правый и левый светодиоды, светодиод Start
void setup() {
pinMode(ledLeft, OUTPUT);
pinMode(ledStart, OUTPUT);
pinMode(ledRight, OUTPUT);
pinMode(knLeft, INPUT_PULLUP);
pinMode(knRight, INPUT_PULLUP);
}
void loop() {
// Команда "На старт"
digitalWrite(ledLeft, HIGH);
digitalWrite(ledStart, LOW);
digitalWrite(ledRight, HIGH);
delay(4000);
// Команда "Внимание!"
digitalWrite(ledLeft, LOW);
digitalWrite(ledStart, LOW);
digitalWrite(ledRight, LOW);
delay(random(2000, 3000));
// Команда "Старт!"
digitalWrite(ledStart, HIGH);
int flagLeft = false; int flagRight = false;
// Здесь в программе необходимо выявить победителя
while (true) {
if (digitalRead(knLeft)) { // Левая кнопка отпущена
flagLeft = true; // Левый готов к соревнованию
}
if (not(digitalRead(knLeft)) and flagLeft) {
digitalWrite(ledLeft, HIGH); // Победил левый
break;
}
}
delay(4000);
// Команда "Вольно!"
digitalWrite(ledLeft, LOW);
digitalWrite(ledStart, LOW);
digitalWrite(ledRight, LOW);
delay(4000);
}
Программа 7.
int knLeft = 2; int knRight = 3; // Правая и левая кнопки
int ledLeft = 4; int ledStart = 5; int ledRight = 6; // Правый и левый светодиоды, светодиод Start
void setup() {
pinMode(ledLeft, OUTPUT);
pinMode(ledStart, OUTPUT);
pinMode(ledRight, OUTPUT);
pinMode(knLeft, INPUT_PULLUP);
pinMode(knRight, INPUT_PULLUP);
}
void loop() {
// Команда "На старт"
digitalWrite(ledLeft, HIGH);
digitalWrite(ledStart, LOW);
digitalWrite(ledRight, HIGH);
delay(4000);
// Команда "Внимание!"
digitalWrite(ledLeft, LOW);
digitalWrite(ledStart, LOW);
digitalWrite(ledRight, LOW);
delay(random(2000, 3000));
// Команда "Старт!"
digitalWrite(ledStart, HIGH);
int flagLeft = false; int flagRight = false;
// Здесь в программе необходимо выявить победителя
while (true) {
if (digitalRead(knLeft)) { // Левая кнопка отпущена
flagLeft = true; // Левый готов к соревнованию
}
if (digitalRead(knRight)) { // Правая кнопка отпущена
flagRight = true; // Правый готов к соревнованию
}
if (not(digitalRead(knLeft)) and flagLeft) {
digitalWrite(ledLeft, HIGH); // Победил левый
break;
}
if (not(digitalRead(knRight)) and flagRight) {
digitalWrite(ledRight, HIGH); // Победил правый
break;
}
}
delay(4000);
// Команда "Вольно!"
digitalWrite(ledLeft, LOW);
digitalWrite(ledStart, LOW);
digitalWrite(ledRight, LOW);
delay(4000);
}
Программа 8.