Arduresling
Введение
Данный проект является интерпретацией армреслинга в виде электронной игры с некоторыми особенностями в правилах.
Перечень элементов:
- Arduino Nano;
- USB – кабель;
- breadboard;
- модуль на 8 RGB сетодиодов
- 2 модуля кнопки
- соединительные провода
План
1. Принцип роботы Ардуреслинга.
2. Модуль на 8 RGB сетодиодов
3. Кнопка
Теоретическая часть
1. Принцип роботы Ардуреслинга
Принцип роботы Ардуреслинга схож с армреслингом. Механизм игры основан на применении кнопок по аналогии с силой руки – чем чаще мы нажимаем кнопку тем быстрее пиксель движется в нужную нам сторону. Против игрока выступает компьютер который пытается «выбить» пиксель за края светодиодной линейки. Сложность заключается в том, что он постоянно, случайным образом меняет направление своего движения и количество шагов которое он делает в этом направлении, поэтому необходимо быстро реагировать и двигаться в противоположном направлении. А так как скорость компьютера со временем возрастает, то продержатся хотя бы минуту не каждый игрок сможет. С отдалением пикселя от центра линейки его цвет сначала меняется на оранжевый а потом на красный. Как только пиксель выходит за приделы ленты игра считается проигранной и вся светодиодная линейка мигает красным цветом. Потом игра начинается заново.
2. Светодиодная линейка на 8 RGB светодиодов.
Для реализации этого проекта мы используем светодиодную линейку на 8 RGB светодиодов. К выводу VCC подключаем питание. Модуль имеет инверсную логику, поэтому для того что бы зажечь нужный нам светодиод необходимо на соответствующий вывод (d0 – d7) подать низкий уровень. На выводы R, G, B мы подаем аналоговые (ШИМ) сигналы, от интенсивности которых обратно зависит яркость соответствующих цветов светодиодов.

Рисунок 2 - Светодиодная линейка на 8 RGB светодиодов
3. Кнопка
Очень часто необходимо управлять роботом или устройством посредством подачи импульсов. Рассмотрим обыкновенную компьютерную клавиатуру. У нее каждая клавиша выполнена в виде тактовой кнопки. Это чаще всего разомкнутый контакт, который практически мгновенно замыкается при нажатии. Этот вид кнопки имеет два состояния "замкнуто" и соответственно "разомкнуто". Кнопка практически мгновенно возвращается в исходное положение, размыкая контакт за счет пружинки при снятии с нее прижимающего усилия (пальца). Кнопка имеет четыре вывода, они соединены попарно между собой. Один подключается к земле, другой к любому цифровому выводу на Arduino. В модуле кнопки вывод, подписанный символом «-», подключаем к питанию, вывод, подписанный символом «S» подключаем к порту Arduino, оставшийся вывод подключаем к земле. Внешний вид показан на рисунке 3.

Рисунок 3 - Модуль кнопки
Практическая часть
Шаг первый. Собираем схему

Рисунок 4 - Схема Arduresling
Шаг второй. Пишем программу на С++
В проекте использовалась светодиодная линейка с инвертированной логикой. Для того что бы зажечь нужный нам светодиод необходимо подать низкий уровень а для того что бы выключить – высокий. Так как для подключения светодиодной линейки мы использовали все доступные цифровые выходы, то кнопки мы подключили в аналоговые входы A0 и A1, которые при программировании на С++ можно использовать как обычные цифровые (доступны под номерами 14 и 15).
Код программы:
#define RED 4
#define GREEN 3
#define BLUE 2
#define LED_1 12
#define LED_2 11
#define LED_3 10
#define LED_4 9
#define LED_5 8
#define LED_6 7
#define LED_7 6
#define LED_8 5
#define BUTTON_1 14
#define BUTTON_2 15
int pause;//Пауза між кроками Ардуїно
int sleep;//Таймер
int steps = 0;//Кроків в відповідному няпрямку
int dir = 1;//Напрямок руху
int pos;//Позиція піксела
int a[] = {12, 11, 10, 9, 8, 7, 6, 5};
//Починає гру спочатку
void initGame() {
digitalWrite(GREEN, LOW);
digitalWrite(RED, HIGH);
digitalWrite(BLUE, HIGH);
pos = 3;
pause = 500;
for (int i = 0; i <= 7; i++) digitalWrite(a[i], HIGH);
}
//Перевірка умови програшу
void checkGame() {
if (pos == -1 || pos == 8) {
digitalWrite(GREEN, HIGH);
digitalWrite(RED, LOW);
for (int i = 0; i <= 7; i++) digitalWrite(a[i], LOW);
delay (500);
for (int i = 0; i <= 7; i++) digitalWrite(a[i], HIGH);
delay (500);
for (int i = 0; i <= 7; i++) digitalWrite(a[i], LOW);
delay (500);
initGame();//Спробуємо ще)))
}
}
//Процедура встановлення позиції пікселя
void setPos(int p) {
digitalWrite(a[pos], HIGH);
if (p >= -1 && p <= 8) {//перевірка чи не вийшли за межі
pos = p;
//Встановлюємо відповідний колір піксела
if (pos == 0 || pos == 7) {
digitalWrite(GREEN, HIGH);
digitalWrite(RED, LOW);
} else if (p == 1 || p == 6) {
digitalWrite(GREEN, LOW);
digitalWrite(RED, LOW);
} else {
digitalWrite(GREEN, LOW);
digitalWrite(RED, HIGH);
}
digitalWrite(a[pos], LOW);
}
}
//Початкові налаштування
void setup() {
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(BLUE, OUTPUT);
pinMode(LED_1, OUTPUT);
pinMode(LED_2, OUTPUT);
pinMode(LED_3, OUTPUT);
pinMode(LED_4, OUTPUT);
pinMode(LED_5, OUTPUT);
pinMode(LED_6, OUTPUT);
pinMode(LED_7, OUTPUT);
pinMode(LED_8, OUTPUT);
pinMode(BUTTON_1, INPUT);
pinMode(BUTTON_2, INPUT);
initGame();
}
void loop() {//Цикл гри
checkGame();//Перевірка умови програшу
//Через певні проміжки часу вибираємо напрямок
//і кількість кроків в чьому напрямку
if (steps == 0) {
steps = random(1, 8);
dir = random(0, 2);
if (dir == 0) dir = -1;
}
setPos(pos);//ця функція втановлює позицію
if (digitalRead(BUTTON_1) == 1) {//Обробка кнопки вліво
setPos(pos + 1);
while (digitalRead(BUTTON_1) == 1) delay(1);
}
if (digitalRead(BUTTON_2) == 1) {//Обробка кнопки вправо
setPos(pos - 1);
while (digitalRead(BUTTON_2) == 1) delay(1);
}
//Ардуїно робить свій крок
if (sleep == 0) {
setPos(pos + dir);
steps--;
sleep = pause;
if (pause > 100) pause -= 10;
}
delay(1);
sleep--;
}
Заключение:
Таким образом, при помощи простого набора модулей и Arduino Nano получаем электронную игру, в которую весело играть. При разработке была глубже изучена робота с модулем на 8 RGB светодиодов, кнопок, получен опыт программирования на языке С++.
Основные порталы (построено редакторами)
