Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/RobotInputs

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


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

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

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

  • Arduino Robot;

Инструкция

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

Пробуем

LottieLemon illustration 780.png

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

Код

  1. /* Устройства ввода Arduino Robot
  2.  
  3. Этот скетч показывает, как использовать потенциометр и кнопки,
  4. имеющиеся на приборной панели робота, в качестве устройств ввода.
  5.  
  6. Кручение головки потенциометра будет рисовать на экране циферблатообразную окружность. Кнопки «Вверх» и «Вниз» отвечают
  7. за изменение высоты звука, а «Влево» и «Вправо» – за изменение темпа.
  8. Средняя кнопка сбрасывает темп и высоту звука к параметрам
  9. по умолчанию.
  10.  
  11. Цепь:
  12. * Arduino Robot
  13.  
  14. Создан 1 мая 2013 Х. Янгом (X. Yang),
  15. модифицирован 12 мая 2013 Д. Куартиллье (D. Cuartielles).
  16.  
  17. Этот код не защищен авторским правом.
  18.  
  19. */
  20.  
  21. #include <ArduinoRobot.h>
  22. #include <Wire.h>
  23. #include <SPI.h>
  24.  
  25. // Параметры по умолчанию для темпа и высоты звука:
  26. int tempo = 60;
  27. int pitch = 1000;
  28.  
  29. void setup() {
  30.   // Инициализируем робота, SD-карту, динамик и дисплей:
  31.   Robot.begin();
  32.   Robot.beginTFT();
  33.   Robot.beginSpeaker();
  34.   Robot.beginSD();
  35.  
  36.   // Рисуем на экране картинки «lg0.bmp» и «lg1.bmp»:
  37.   Robot.displayLogos();
  38.  
  39.   // Проигрываем звуковой файл:
  40.   Robot.playFile("Melody.sqm");
  41. }
  42.  
  43. void loop() {
  44.   // Проверяем значения от кнопок:
  45.   keyDown(Robot.keyboardRead());
  46.  
  47.   // Проверяем значение от потенциометра:
  48.   drawKnob(Robot.knobRead());
  49. }
  50.  
  51. // Функция для прорисовки интерфейса по умолчанию:
  52. void renderUI() {
  53.   // Рисуем кнопки:
  54.   Robot.fill(255, 255, 255);
  55.   Robot.rect(53, 58, 13, 13); // «Влево»
  56.   Robot.rect(93, 58, 13, 13); // «Вправо»
  57.   Robot.rect(73, 38, 13, 13); // «Вверх»
  58.   Robot.circle(79, 64, 6); // средний кружок
  59.   Robot.rect(73, 78, 13, 13); // «Вниз»
  60.  
  61.   // Рисуем потенциометр:
  62.   Robot.noFill();
  63.   Robot.circle(26, 116, 17); // кружок потенциометра
  64.  
  65.   // рисуем вертикальную панель:
  66.   int fullPart = map(pitch, 200, 2000, 0, 58); // адаптируем диапазон высоты звука под длину вертикальной панели:
  67.   Robot.fill(255, 255, 255);
  68.   Robot.rect(21, 30, 13, 58 - fullPart);
  69.   Robot.fill(0, 0, 255);
  70.   Robot.rect(21, 88 - fullPart, 13, fullPart); //58-fullPart+30
  71.  
  72.   // Рисуем горизонтальную панель:
  73.   fullPart = map(tempo, 20, 100, 0, 58);  // адаптируем диапазон ритма под длину горизонтальной панели:
  74.   Robot.fill(255, 190, 0);
  75.   Robot.rect(53, 110, fullPart, 13);
  76.   Robot.fill(255, 255, 255);
  77.   Robot.rect(53 + fullPart, 110, 58 - fullPart, 13);
  78. }
  79.  
  80. void keyDown(int keyCode) {
  81.   // Создаем статическое целочисленное значение, которое будет всегда оставаться неизменным:
  82.   static int oldKey;
  83.   switch (keyCode) {
  84.     case BUTTON_LEFT:
  85.       // Если нажата кнопка «Влево», снижаем темп:
  86.       tempo -= 5;
  87.       if (tempo < 20) {
  88.         tempo = 20;  // Самый низкий уровень темпа – 20
  89.       }
  90.       Robot.fill(255, 190, 0);
  91.  
  92.       Robot.rect(53, 58, 13, 13);
  93.       break;
  94.     case BUTTON_RIGHT:
  95.       // Если нажата кнопка «Вправо», увеличиваем темп:
  96.       tempo += 5;
  97.       if (tempo > 100) {
  98.         tempo = 100;  // самый высокий уровень темпа – 100
  99.       }
  100.       Robot.fill(255, 190, 0);
  101.       Robot.rect(93, 58, 13, 13);
  102.       break;
  103.     case BUTTON_UP:
  104.       // Если нажата кнопка «Вверх», увеличиваем высоту звука:
  105.       pitch += 120;
  106.       if (pitch > 2000) {
  107.         pitch = 2000;
  108.       }
  109.       Robot.fill(0, 0, 255);
  110.  
  111.       Robot.rect(73, 38, 13, 13);
  112.       break;
  113.     case BUTTON_DOWN:
  114.       // Если нажата кнопка «Вниз», снижаем высоту звука:
  115.       pitch -= 120;
  116.       if (pitch < 200) {
  117.         pitch = 200;
  118.       }
  119.       Robot.fill(0, 0, 255);
  120.  
  121.       Robot.rect(73, 78, 13, 13);
  122.       break;
  123.     case BUTTON_MIDDLE:
  124.       // Если нажата средняя кнопка, сбрасываем темп и высоту звука
  125.       // к параметрам по умолчанию:
  126.       tempo = 60;
  127.       pitch = 1000;
  128.       Robot.fill(160, 160, 160);
  129.  
  130.       Robot.circle(79, 64, 6);
  131.       break;
  132.     case BUTTON_NONE:
  133.       // Перерисовываем интерфейс в состояние по умолчанию
  134.       // только в том случае, если ни одна из кнопок не нажата
  135.       // (т.е. если функция возвращает значение BUTTON_NONE):
  136.       if (oldKey != BUTTON_NONE) {
  137.         renderUI();
  138.       }
  139.       break;
  140.   }
  141.   if (oldKey != keyCode) {
  142.     // Меняем ритм песни:
  143.     Robot.tempoWrite(tempo);
  144.     // Меняем высоту звука:
  145.     Robot.tuneWrite(float(pitch / 1000.0));
  146.   }
  147.   oldKey = keyCode;
  148. }
  149.  
  150. // Рисуем круг в соответствии со значением, полученным от потенциометра:
  151. void drawKnob(int val) {
  152.   static int val_old;
  153.   int r = map(val, 0, 1023, 1, 15);
  154.  
  155.   // Обновляем только в том случае, если изменилось значение:
  156.   if (val_old != r) {
  157.     Robot.noFill();
  158.  
  159.     // Стираем старый круг:
  160.     Robot.stroke(255, 255, 255);
  161.     Robot.circle(26, 116, r + 1);
  162.  
  163.     // Рисуем новый круг:
  164.     Robot.stroke(255, 0, 255);
  165.     Robot.circle(26, 116, r);
  166.  
  167.     Robot.stroke(0, 0, 0);
  168.  
  169.     val_old = r;
  170.   }
  171. }

См.также

  1. begin()
  2. keyboardRead()

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

  1. Arduino - Inputs