8 (800) 350-30-16

Джойстик для Arduino

Дата: / Категория: Интерфейсы / Автор: DOC_tr

Не так давно в нашем магазине появилась достаточно забавная вещица - Funduino Joystick shield. И она сразу привлекла мое внимание.

Повертев его в руках я сразу же задумал написать какую-нибдуь простенькую игру типа змейки или сапера и приступил к выполнению своего плана.

Модулей Nokia5110 у меня под рукой не оказалось, и пришлось прибегнуть к помощи конкурентов.

Тут я столкнулся с первой проблемой

На фотографии вы видите приобретенный мной модуль

А на этой фотографии вы видите его рядом с портами на джойстике, предназначенными для дисплея

Как видите, ничего не совпадает - я провел множество разных тестов, и выяснил, что по непонятной мне причине, маркировка ног на дисплее (повторюсь приобретал у конкурентов) не совпадает с реальным расположением ног. Тщательный поиск показал, что они бывают 2х видов - красные (как представлено в данной статье) и синие (именно они продаются в нашем магазине). И если синие всегда подключаются одинаково (подробнее о подключении синего дисплея расписано в данной статье), то у красных может быть разная распиновка, и подключаться они соответственно будут по разному.

Я нашел 2 вида распиновки красных дисплеев - один представлен на фотографиях (точно такой же как и у синих), а еще один вы можете увидеть на следующей фотографии

Именно на такой дисплей и рассчитаны funduino joystik, и именно такая распиновка оказалась у модуля, купленного мной, не смотря на то, что маркировка утверждала обратное. 

В общем, пока я экспериментировал и узнавал что и куда, я сжег подсветку дисплея (ну правильно - если написано GND и VCC, то туда и должны подключаться + и -, а не наоборот), и информация на дисплее была видна только под определенным углом. Я конечно очень расстроился, что не получится собрать что-то более менее интересное, но тут вспомнил о конструкторе из прошлой статьи.

 Схема подключения, думаю, тут не нужна - все и так более чем понятно, так что перейдем к программированию.

Элементы управления джойстика подключены следующим образом

Вверх Digital 2
Вниз Digital 3
Влево Digital 4
Вправо Digital 5
Старт Digital 6
Селект Digital 7
Кнопка джойстика Digital 8
Джойстик X A0
Джойстик Y A1

Наш дисплей подключен в порты 11-13, и теперь, зная все это, попробуем написать подобие змейки.

На данном дисплее было бы затруднительно отличать яблоки от змейки, поэтому я сделал просто бегающую змейку. Управление через джойстик, кнопки вверх/вниз - изменение скорости, а вправо/влево изменение размера змейки.

#include "LedControl.h"
LedControl lc=LedControl(13,11,12,1);

int up_button = 2;
int down_button = 4;
int left_button = 5;
int right_button = 3;
int start_button = 6;
int select_button = 7;
int joystick_button = 8;
int joystick_axis_x = A0;
int joystick_axis_y = A1;
int buttons[] = {up_button, down_button, left_button, right_button, start_button, select_button, joystick_button};

// массив с координатами змейки
int snake[][2] = {
{0,0},
{0,1},
{0,2},
{0,3},
{-1,-1},
{-1,-1},
{-1,-1}
};

// массив с матрицей дисплея
bool LedMatrixArray[8][8] = {
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0}
};

// очищаем дисплей
void clearMatrix(){
for(int i = 0 ; i < 8 ; i++){
for(int k = 0; k < 8 ; k++){
LedMatrixArray[i][k] = 0;
}
}
}

// отрисовываем дисплей по матрице
void drawMatrix(){
for(int i = 0 ; i < 8 ; i++){
for(int k = 0; k < 8 ; k++){
lc.setLed(0,i,k,LedMatrixArray[i][k]);
}
}
}

int coord[2] = {0, 0};

void setup() {
Serial.begin(9600);
for (int i; i < 7; i++){
pinMode(buttons[i], INPUT);
digitalWrite(buttons[i], HIGH);
}
lc.shutdown(0,false);
lc.setIntensity(0,8);
lc.clearDisplay(0);
}

// размер змейки
int sn = 4;
// куда она движется
int right = 1;
int top = 0;
// скорость
int speed = 500;

void loop() {
// смещаем координаты массива змейки
for(int i = 0; i < sn - 1 ; i ++){
if(snake[i + 1][0] >= 0 && snake[i + 1][1] >= 0){
snake[i][0] = snake[i + 1][0];
snake[i][1] = snake[i + 1][1];
}
}
// добавляем новую координату в зависимости от направления
snake[sn - 1][0] += right;
snake[sn - 1][1] += top;
if(snake[sn - 1][0] > 7)snake[sn - 1][0] = 0;
if(snake[sn - 1][0] < 0)snake[sn - 1][0] = 7;
if(snake[sn - 1][1] > 7)snake[sn - 1][1] = 0;
if(snake[sn - 1][1] < 0)snake[sn - 1][1] = 7;

// изменяем скорость
if(digitalRead(up_button) == 0){
if(speed < 1000){
speed += 100;
}
}
// при увеличении добавляем в начало еще одну координату
if(digitalRead(right_button) == 0){
if(sn < 7){
sn ++;
snake[sn - 1][0] = snake[sn - 2][0] + right;
snake[sn - 1][1] = snake[sn - 2][1] + top;
if(snake[sn - 1][0] > 7)snake[sn - 1][0] = 0;
if(snake[sn - 1][0] < 0)snake[sn - 1][0] = 7;
if(snake[sn - 1][1] > 7)snake[sn - 1][1] = 0;
if(snake[sn - 1][1] < 0)snake[sn - 1][1] = 7;
}
}
// при уменьшении убираем из начала координату
if(digitalRead(left_button) == 0){
if(sn > 2){
sn --;
snake[sn][0] = -1;
snake[sn][1] = -1;
}
}
// уменьшаем скорость
if(digitalRead(down_button) == 0){
if(speed > 100){
speed -= 100;
}
}

// считываем данные джойстика и устанавливаем направление
if(analogRead(joystick_axis_x) > 600 && right != -1){
right = 1;
top = 0;
}
if(analogRead(joystick_axis_x) < 400 && right != 1){
right = -1;
top = 0;
}
if(analogRead(joystick_axis_y) > 600 && top != -1){
right = 0;
top = 1;
}
if(analogRead(joystick_axis_y) < 400 && top != 1){
right = 0;
top = -1;
}
clearMatrix();
for(int i = 0; i < sn ; i ++){
LedMatrixArray[snake[i][0]][snake[i][1]] = 1;
}
drawMatrix();
delay(speed);
}

Пример вы можете увидеть в данном видео

Теги: #joystick, #Funduino

Ваша оценка:

Рейтинг: 9.8 (Оценок: 4)

Комментарий:

Copyright © RobOM.ru 2016 г. Все права защищены