Arduino:Примеры/RobotInputs

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Версия для печати больше не поддерживается и может содержать ошибки обработки. Обновите закладки браузера и используйте вместо этого функцию печати браузера по умолчанию.

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Устройства ввода[1]

Этот пример показывает, как использовать потенциометр и кнопки, имеющиеся на приборной панели Arduino Robot, в качестве примитивной клавиатуры. С его помощью робот станет чем-то вроде мобильного диджейского пульта – попробуйте понажимать на разные кнопки, чтобы увидеть, что получится.

Необходимое оборудование

  • Arduino Robot;

Инструкция

  1. Загрузите скетч, а когда закончите, USB можете оставить подключенным;
  2. Показав загрузочную картинку, робот начнет проигрывать музыку;
  3. Также на экране появится интерфейс, где синяя вертикальная панель будет показывать темп музыки, а оранжевая горизонтальная – высоту звука. Кроме того, на экране появится крестообразная фигура, изображающая кнопки, а слева внизу будет окружность, представляющая головку потенциометра;

Пробуем

Тестируем устройства ввода Arduino Robot

Код

/* Устройства ввода Arduino Robot

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

Кручение головки потенциометра будет рисовать на экране циферблатообразную окружность. Кнопки «Вверх» и «Вниз» отвечают
за изменение высоты звука, а «Влево» и «Вправо» – за изменение темпа.
Средняя кнопка сбрасывает темп и высоту звука к параметрам
по умолчанию.

Цепь:
* Arduino Robot

Создан 1 мая 2013 Х. Янгом (X. Yang),
модифицирован 12 мая 2013 Д. Куартиллье (D. Cuartielles).

Этот код не защищен авторским правом.

*/

#include <ArduinoRobot.h>
#include <Wire.h>
#include <SPI.h>

// Параметры по умолчанию для темпа и высоты звука:
int tempo = 60;
int pitch = 1000;

void setup() {
  // Инициализируем робота, SD-карту, динамик и дисплей:
  Robot.begin();
  Robot.beginTFT();
  Robot.beginSpeaker();
  Robot.beginSD();

  // Рисуем на экране картинки «lg0.bmp» и «lg1.bmp»:
  Robot.displayLogos();

  // Проигрываем звуковой файл:
  Robot.playFile("Melody.sqm");
}

void loop() {
  // Проверяем значения от кнопок:
  keyDown(Robot.keyboardRead());

  // Проверяем значение от потенциометра:
  drawKnob(Robot.knobRead());
}

// Функция для прорисовки интерфейса по умолчанию:
void renderUI() {
  // Рисуем кнопки: 
  Robot.fill(255, 255, 255);
  Robot.rect(53, 58, 13, 13); // «Влево»
  Robot.rect(93, 58, 13, 13); // «Вправо»
  Robot.rect(73, 38, 13, 13); // «Вверх»
  Robot.circle(79, 64, 6); // средний кружок
  Robot.rect(73, 78, 13, 13); // «Вниз»

  // Рисуем потенциометр:
  Robot.noFill();
  Robot.circle(26, 116, 17); // кружок потенциометра

  // рисуем вертикальную панель:
  int fullPart = map(pitch, 200, 2000, 0, 58); // адаптируем диапазон высоты звука под длину вертикальной панели:
  Robot.fill(255, 255, 255);
  Robot.rect(21, 30, 13, 58 - fullPart);
  Robot.fill(0, 0, 255);
  Robot.rect(21, 88 - fullPart, 13, fullPart); //58-fullPart+30

  // Рисуем горизонтальную панель:
  fullPart = map(tempo, 20, 100, 0, 58);  // адаптируем диапазон ритма под длину горизонтальной панели:
  Robot.fill(255, 190, 0);
  Robot.rect(53, 110, fullPart, 13);
  Robot.fill(255, 255, 255);
  Robot.rect(53 + fullPart, 110, 58 - fullPart, 13);
}

void keyDown(int keyCode) {
  // Создаем статическое целочисленное значение, которое будет всегда оставаться неизменным:
  static int oldKey;
  switch (keyCode) {
    case BUTTON_LEFT:
      // Если нажата кнопка «Влево», снижаем темп:
      tempo -= 5;
      if (tempo < 20) {
        tempo = 20;  // Самый низкий уровень темпа – 20
      }
      Robot.fill(255, 190, 0);

      Robot.rect(53, 58, 13, 13);
      break;
    case BUTTON_RIGHT:
      // Если нажата кнопка «Вправо», увеличиваем темп:
      tempo += 5;
      if (tempo > 100) {
        tempo = 100;  // самый высокий уровень темпа – 100
      }
      Robot.fill(255, 190, 0);
      Robot.rect(93, 58, 13, 13);
      break;
    case BUTTON_UP:
      // Если нажата кнопка «Вверх», увеличиваем высоту звука:
      pitch += 120;
      if (pitch > 2000) {
        pitch = 2000;
      }
      Robot.fill(0, 0, 255);

      Robot.rect(73, 38, 13, 13);
      break;
    case BUTTON_DOWN:
      // Если нажата кнопка «Вниз», снижаем высоту звука:
      pitch -= 120;
      if (pitch < 200) {
        pitch = 200;
      }
      Robot.fill(0, 0, 255);

      Robot.rect(73, 78, 13, 13);
      break;
    case BUTTON_MIDDLE:
      // Если нажата средняя кнопка, сбрасываем темп и высоту звука
      // к параметрам по умолчанию:
      tempo = 60;
      pitch = 1000;
      Robot.fill(160, 160, 160);

      Robot.circle(79, 64, 6);
      break;
    case BUTTON_NONE:
      // Перерисовываем интерфейс в состояние по умолчанию
      // только в том случае, если ни одна из кнопок не нажата
      // (т.е. если функция возвращает значение BUTTON_NONE): 
      if (oldKey != BUTTON_NONE) {
        renderUI();
      }
      break;
  }
  if (oldKey != keyCode) {
    // Меняем ритм песни:
    Robot.tempoWrite(tempo);
    // Меняем высоту звука:
    Robot.tuneWrite(float(pitch / 1000.0));
  }
  oldKey = keyCode;
}

// Рисуем круг в соответствии со значением, полученным от потенциометра: 
void drawKnob(int val) {
  static int val_old;
  int r = map(val, 0, 1023, 1, 15);

  // Обновляем только в том случае, если изменилось значение:
  if (val_old != r) {
    Robot.noFill();

    // Стираем старый круг:
    Robot.stroke(255, 255, 255);
    Robot.circle(26, 116, r + 1);

    // Рисуем новый круг:
    Robot.stroke(255, 0, 255);
    Robot.circle(26, 116, r);

    Robot.stroke(0, 0, 0);

    val_old = r;
  }
}

См.также

  1. begin()
  2. keyboardRead()

Внешние ссылки