г. Москва, ул.Новороссийская, дом 21, к.64. м.Люблино,ПН-ПТ с 10.00 до 19.30 и СБ с 12.00 до 16.00
+7(985) 997-37-74
Joystick shield v2.0

    Joystick shield v2.0

    Joystick Shield заслуживает всяческих похвал.Но кто мог подумать что дисплейчик,радио модуль и стик с кнопками можно поместить на одну плату,да и еще красиво?.
    Цена800 руб.

    Старая цена 990 руб.
    Платы и модули:
    Кнопки
    Цена 800 руб.

    Старая цена 990 руб.
    Артикул:
    M0088

    На плате присутствует порты для подключения дисплея от nokia 5110 и радио модуля nRF24L01.И подключение нарисовано на плате.Также все пинов arduino,которые шилд задействует в процессе работы

     Kлавиатура

     Pin # KEY

    D0(RX) 0 NULL

    D1(TX) 1 NULL

    D2 2 KEY A

    D3 3 KEY B

    D4 4 KEY C

    D5 5 KEY D

    D6 6 KEY E

    D7 7 KEY F

    D8 8 KEY Down

    A0 A0 X положение

    A1 A1 Y положение

    Nokia 5110 LCD

    Pin # KEY

    D9 9 SCLK

    D10 10 CSN

    D11 11 D/C

    D12 12 RST

    D13 13 SCE

     

    nRF24L01

    Pin # KEY

    D9 9 SCE

    D10 10 CSN

    D11 11 SCK

    D12 12 MOSI

    D13 13 MISO

     

    Джойстик щилд предоставляет собой простые аналоговые переменные резисторы в стике вместе с четырьмя отдельными кнопками без фиксации и одной с фиксацией к, расположенной под стиком. Джойстик может быть использован для управления мелодиями или изображениями на экране. Кнопки могут быть использованы для навигации или управления.

     

    Как мне найти текущую позицию джойстика?

    Положение джойстика вычисляется с помощью двух потенциометров. Стик может двигаться в двух измерениях, которые обычно представляли бы координаты х и у. Для чтения потенциометров мы используем функцию analogRead (), которая возвращает число от 0 до 1023.Задаем пины подлючения.Шилд для джойстика стандартно задействует аналоговый пин 0 и 1.

    Serial.println(analogRead(0)); // X позиция
    Serial.println(analogRead(1)); // Y позиция
    

     Законстатируем пины.Это сделано только для удобства и красоты кода.

    const byte PIN_ANALOG_X = 0;
    const byte PIN_ANALOG_Y = 1;
     void setup() {
      Serial.begin(9600);
      }
      void loop() {
      Serial.print("x:");
      Serial.print(analogRead(PIN_ANALOG_X));
      Serial.print(" ");
      Serial.print("y:");
      Serial.print(analogRead(PIN_ANALOG_Y));
      Serial.print(" ");
      Serial.println();
      }
    

     Определим текущее положение джойстика.

     Это может быть полезно для определения значений X и Y позиции, чтобы определить джойстик по центру или переехали в одном из 8 направлений (т.е. вверх, вправо-вверх, вправо, вправо-вниз, вниз, влево-вниз, влево, стоп).

     Так как мы знаем значение в каждом измерении будет между 0 до 1023 можно было бы ожидать в центре значение, чтобы быть вокруг 511 или 513, но потому, что стик физическое устройство фактическое значение вряд ли будет что точнее. Если мы выбираем неправильное значение, мы найдем, что наш стик будет двигаться в определенном направлении, даже если он по центру.

     Для решения этой проблемы мы указываем два «порога» значения и считаем, что любое значение в пределах этого диапазона следует рассматривать как "центр":

     | ---- | - | ---- |

    0 505 515 1023

     Пороговые значения, которые вы выбираете, может отличаться в зависимости от вашего джойстика. Зададим значения констант как в коде:

    const int X_THRESHOLD_LOW = 505 ;
    const int X_THRESHOLD_HIGH = 515 ;
    const int Y_THRESHOLD_LOW = 500 ;
    const int Y_THRESHOLD_HIGH = 510 ;
    

     Далее, мы хотим, чтобы все значения направления были в диапазоне от -1 до 1.

     Начнем с установки направления, в каждом измерении 0 ("центром").

    x_direction = 0;
    y_direction = 0;
    x_position = analogRead(PIN_ANALOG_X);
    y_position = analogRead(PIN_ANALOG_Y);
     if (x_position > X_THRESHOLD_HIGH) {
      x_direction = 1;
      } else if (x_position < X_THRESHOLD_LOW) {
      x_direction = -1;
      }
     if (y_position > Y_THRESHOLD_HIGH) {
      y_direction = 1;
      } else if (y_position < Y_THRESHOLD_LOW) {
      y_direction = -1;
      }
    

     Здесь мы прописали текстовые сообщения для удобства.

    const byte PIN_ANALOG_X = 0;
    const byte PIN_ANALOG_Y = 1;
    const int X_THRESHOLD_LOW = 505;
    const int X_THRESHOLD_HIGH = 515;
    const int Y_THRESHOLD_LOW = 500;
    const int Y_THRESHOLD_HIGH = 510;
    int x_position;
    int y_position;
    int x_direction;
    int y_direction;
    void setup() {
      Serial.begin(9600);
    }
    void loop () {
    x_direction = 0;
    y_direction = 0;
    x_position = analogRead(PIN_ANALOG_X);
    y_position = analogRead(PIN_ANALOG_Y);
     if (x_position > X_THRESHOLD_HIGH) {
      x_direction = 1;
      } else if (x_position < X_THRESHOLD_LOW) {
      x_direction = -1;
    }
    if (y_position > Y_THRESHOLD_HIGH) {
    y_direction = 1;
    } else if (y_position < Y_THRESHOLD_LOW) {
    y_direction = -1;
    }
    if (x_direction == -1) {
    if (y_direction == -1) {
    Serial.println("left-down");
    } else if (y_direction == 0) {
    Serial.println("left");
    } else {
    // y_direction == 1
    Serial.println("left-up");
    }
    } else if (x_direction == 0) {
    if (y_direction == -1) {
    Serial.println("down");
    } else if (y_direction == 0) {
    Serial.println("centered");
    } else {
    // y_direction == 1
    Serial.println("up");
    }
    } else {
    // x_direction == 1
    if (y_direction == -1) {
    Serial.println("right-down");
    } else if (y_direction == 0) {
    Serial.println("right");
    } else {
    // y_direction == 1
    Serial.println("right-up");
    }
    }
    

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

    const byte PIN_BUTTON_SELECT = 2;
    const byte PIN_BUTTON_RIGHT = 3;
    const byte PIN_BUTTON_UP = 4;
    const byte PIN_BUTTON_DOWN = 5;
    const byte PIN_BUTTON_LEFT = 6;
    

     

    Оказывается ваш Arduino на самом деле имеет внутренние резисторы, подключенные к контактам внутри микроконтроллера. Для того, чтобы использовать внутренние резисторы нужно "enable the internal pull-up resistors".То есть включить их.

     Когда "подтягивающие" резистор подключены к заданным пинам кнопок это означает, что уровень напряжения, когда кнопка не нажата будет высоким, поскольку резисторы "подтягивает уровень напряжения", чтобы всегда был высокий уровень, когда кнопка не нажата.Данная процедура позволит избежать случайного срабатывания кнопки. На типичной Arduino напряжением сигнала является 5 вольт. При нажатии кнопка будет читаться, как низкий сигнал, так как там меньше сопротивление между пином и землей.

     

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

    pinMode(PIN_BUTTON_RIGHT, INPUT);
    digitalWrite(PIN_BUTTON_RIGHT, HIGH);
    

     

    Код настройки всех кнопок.

    void setup() {
    pinMode(PIN_BUTTON_RIGHT, INPUT);
    digitalWrite(PIN_BUTTON_RIGHT, HIGH);
    pinMode(PIN_BUTTON_LEFT, INPUT);
    digitalWrite(PIN_BUTTON_LEFT, HIGH);
    pinMode(PIN_BUTTON_UP, INPUT);
    digitalWrite(PIN_BUTTON_UP, HIGH);
    pinMode(PIN_BUTTON_DOWN, INPUT);
    digitalWrite(PIN_BUTTON_DOWN, HIGH);
    pinMode(PIN_BUTTON_SELECT, INPUT);
    digitalWrite(PIN_BUTTON_SELECT, HIGH);
    }
    

     

    Смотрите следующий код,о том как узнать, нажата ли кнопка или нет.

     Значение кнопок читается с помощью функции digitalRead (). Если значение читается как LOW, то кнопка нажата, и когда значение HIGH кнопка не нажата.

    if (digitalRead(PIN_BUTTON_LEFT) == LOW) {
    // Button is pressed
    } else {
    // Button is not pressed
    }
    

     Ниже полный пример выводит состояние каждой кнопки и стика в мониторе порта Arduino:

    const byte PIN_BUTTON_SELECT = 2;
    const byte PIN_BUTTON_RIGHT = 3;
    const byte PIN_BUTTON_UP = 4;
    const byte PIN_BUTTON_DOWN = 5;
    const byte PIN_BUTTON_LEFT = 6;
    const byte PIN_ANALOG_X = 0;
    const byte PIN_ANALOG_Y = 1;
    void setup() {
    Serial.begin(9600);
    pinMode(PIN_BUTTON_RIGHT, INPUT);
    digitalWrite(PIN_BUTTON_RIGHT, HIGH);
    pinMode(PIN_BUTTON_LEFT, INPUT);
    digitalWrite(PIN_BUTTON_LEFT, HIGH);
    pinMode(PIN_BUTTON_UP, INPUT);
    digitalWrite(PIN_BUTTON_UP, HIGH);
    pinMode(PIN_BUTTON_DOWN, INPUT);
    digitalWrite(PIN_BUTTON_DOWN, HIGH);
    pinMode(PIN_BUTTON_SELECT, INPUT);
    digitalWrite(PIN_BUTTON_SELECT, HIGH);
    }
    void loop() {
    Serial.print("l:");
    Serial.print(digitalRead(PIN_BUTTON_LEFT));
    Serial.print(" ");
    Serial.print("r:");
    Serial.print(digitalRead(PIN_BUTTON_RIGHT));
    Serial.print(" ");
    Serial.print("u:");
    Serial.print(digitalRead(PIN_BUTTON_UP));
    Serial.print(" ");
    Serial.print("d:");
    Serial.print(digitalRead(PIN_BUTTON_DOWN));
    Serial.print(" ");
    Serial.print("x:");
    Serial.print(analogRead(PIN_ANALOG_X));
    Serial.print(" ");
    Serial.print("y:");
    Serial.print(analogRead(PIN_ANALOG_Y));
    Serial.print(" ");
    Serial.print("s:");
    Serial.print(digitalRead(PIN_BUTTON_SELECT));
    Serial.print(" ");
    Serial.println();
    }