Arduino:Примеры/RobotInputs

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

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Устройства ввода[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()

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