Arduino:Примеры/VirtualColorMixer

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

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


Виртуальный «микшер» цветов [1]

Этот пример показывает, как передавать с Arduino на компьютер сразу несколько значений. Данные от трех потенциометров, подсоединенных к Arduino, будут использоваться для изменения фонового цвета в скетче для Processing или патче для Max/MSP. Каждый потенциометр отвечает за свой цвет – красный, зеленый и синий. Сочетание этих цветов и станет итоговым фоновым цветом для экрана программы.

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

  • Плата Arduino;
  • Три аналоговых датчика (подойдут потенциометры, фотоэлементы, силоизмерительные резисторы и т.д.);
  • Три резистора на 10 кОм;
  • Макетная плата Breadboard;
  • Провода-перемычки;

Необходимое ПО

Цепь

Подключите аналоговые датчики к 0-ому, 1-ому и 2-ому входным аналоговым контактам. Эта цепь использует три подцепи с делителями напряжения – чтобы генерировать аналоговое напряжение от потенциометров. Каждая из этих подцепей имеет по два последовательно подключенных резистора (резистора-датчика и обычного резистора), которые делят напряжение пропорционально своим значениям.

Схема

Код для Arduino

Данные от датчиков передаются с Arduino на компьютер в виде десятичных ASCII-чисел. Это значит, что каждое число будет передаваться с помощью ASCII-символов, отвечающих за цифры от «0» до «9». К примеру, число «234» будет передано при помощи трех байтов: «50» (это число отвечает в кодировке ASCII за «2»), «51» (это «3») и «52» (это «4»).

/*
  Этот пример считывает данные от трех аналоговых датчиков (проще всего воспользоваться потенциометрами), 
а затем передает эту информацию по последовательному порту. 
 Программы Processing и Max/MSP (примеры для них указаны ниже) используют эти данные для того,
чтобы поменять фоновый цвет экрана. 
 
 Цепь:
 * потенциометры, подсоединенные к 0-ому, 1-ому и 2-ому входным аналоговым контактам

 http://www.arduino.cc/en/Tutorial/VirtualColorMixer
 
 Создан 2 декабря 2006 года Дэвидом А. Меллисом (David A. Mellis),
 модифицирован 30 августа 2011 Томом Иго (Tom Igoe)
 и Скоттом Фитцджеральдом (Scott Fitzgerald).
 
 Этот код не защищен авторским правом.
 */

const int redPin = A0;      // датчик для управления красным цветом const int greenPin = A1;    // датчик для управления зеленым цветом
const int bluePin = A2;     // датчик для управления синим цветом 

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  Serial.print(analogRead(redPin));
  Serial.print(",");
  Serial.print(analogRead(greenPin));
  Serial.print(",");
  Serial.println(analogRead(bluePin));
}

Код к Processing

/* Код к Processing для этого примера */
 
//  Этот код не защищен авторским правом.
 
 import processing.serial.*;
 
 float redValue = 0;        // значение для красного
 float greenValue = 0;      // значение для зеленого
 float blueValue = 0;       // значение для синего
 
 Serial myPort;
 
 void setup() {
 size(200, 200);
 
 // выводим список всех доступных последовательных портов:
 println(Serial.list());
 // я знаю, что на моем Mac первый последовательный порт
 // всегда подключен к Arduino,
 // поэтому я сразу открываю Serial.list()[0].
 // вы же укажите тот порт, который подключен к Arduino у вас.
 myPort = new Serial(this, Serial.list()[0], 9600);
 // не запускаем serialEvent(), пока не увидим символ новой строки:
 myPort.bufferUntil('\n');
 }
 
 void draw() {
 // задаем фоновый цвет, основываясь на значениях для исходных цветов (красного, зеленого и синего):
 background(redValue, greenValue, blueValue);
 }
 
 void serialEvent(Serial myPort) { 
 // берем ASCII-строку:
 String inString = myPort.readStringUntil('\n');

 if (inString != null) {
 // избавляемся от пробелов:
 inString = trim(inString);
 // разбиваем данные в строке запятыми и
 // конвертируем итоговые «суб-строки» в массив целых чисел:
 float[] colors = float(split(inString, ","));
 // если в массиве как минимум три элемента,
 // это значит, что мы получили блок данных, позволяющий поменять цвет экрана,
 // то есть данные, с которыми можно работать дальше. 
 // записываем эти числа в «цветные» переменные:
 if (colors.length >=3) {
 // а теперь масштабируем их в диапазоне от 0 до 255:
 redValue = map(colors[0], 0, 1023, 0, 255);
 greenValue = map(colors[1], 0, 1023, 0, 255);
 blueValue = map(colors[2], 0, 1023, 0, 255);
 }
 }
 }

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

Код к Max

/* Патч к Max/MSP для этого примера */

 ----------begin_max5_patcher----------
1512.3oc4Z00aaaCE8YmeED9ktB35xOjrj1aAsXX4g8xZQeYoXfVh1gqRjdT
TsIsn+2K+PJUovVVJ1VMdCAvxThV7bO7b48dIyWtXxzkxaYkSA+J3u.Sl7kK
lLwcK6MlT2dxzB5so4zRW2lJXeRt7elNy+HM6Vs61uDDzbOYkNmo02sg4euS
4BSede8S2P0o2vEq+aEKU66PPP7b3LPHDauPvyCmAvv4v6+M7L2XXF2WfCaF
lURgVPKbCxzKUbZdySDUEbgABN.ia08R9mccGYGn66qGutNir27qWbg8iY+7
HDRx.Hjf+OPHCQgPdpQHoxhBlwB+QF4cbkthlCRk4REnfeKScs3ZwaugWBbj
.PS+.qDPAkZkgPlY5oPS4By2A5aTLFv9pounjsgpnZVF3x27pqtBrRpJnZaa
C3WxTkfUJYA.BzR.BhIy.ehquw7dSoJCsrlATLckR.nhLPNWvVwL+Vp1LHL.
SjMG.tRaG7OxT5R2c8Hx9B8.wLCxVaGI6qnpj45Ug84kL+6YIM8CqUxJyycF
7bqsBRULGvwfWyRMyovElat7NvqoejaLm4f+fkmyKuVTHy3q3ldhB.WtQY6Z
x0BSOeSpTqA+FW+Yy3SyybH3sFy8p0RVCmaMpTyX6HdDZ2JsPbfSogbBMueH
JLd6RMBdfRMzPjZvimuWIK2XgFA.ZmtfKoh0Sm88qc6OF4bDQ3P6kEtF6xej
.OkjD4H5OllyS+.3FlhY0so4xRlWqyrXErQpt+2rsnXgQNZHZgmMVzEofW7T
S4zORQtgIdDbRHrObRzSMNofUVZVcbKbhQZrSOo934TqRHIN2ncr7BF8TKR1
tHDqL.PejLRRPKMR.pKFAkbtDa+UOvsYsIFH0DYsTCjqZ66T1CmGeDILLpSm
myk0SdkOKh5LUr4GbWwRYdW7fm.BvDmzHnSdH3biGpSbxxDNJoGDAD1ChH7L
I0DaloOTBLvkO7zPs5HJnKNoGAXbol5eytUhfyiSfnjE1uAq+Fp0a+wygGwR
q3ZI8.psJpkpJnyPzwmXBj7Sh.+bNvVZxlcKAm0OYHIxcIjzEKdRChgO5UMf
LkMPNN0MfiS7Ev6TYQct.F5IWcCZ4504rGsiVswGWWSYyma01QcZgmL+f+sf
oU18Hn6o6dXkMkFF14TL9rIAWE+6wvGV.p.TPqz3HK5L+VxYxl4UmBKEjr.B
6zinuKI3C+D2Y7azIM6N7QL6t+jQyZxymK1ToAKqVsxjlGyjz2c1kTK3180h
kJEYkacWpv6lyp2VJTjWK47wHA6fyBOWxH9pUf6jUtZkLpNKW.9EeUBH3ymY
XSQlaqGrkQMGzp20adYSmIOGjIABo1xZyAWJtCX9tg6+HMuhMCPyx76ao+Us
UxmzUE79H8d2ZB1m1ztbnOa1mGeAq0awyK8a9UqBUc6pZolpzurTK232e5gp
aInVw8QIIcpaiNSJfY4Z+92Cs+Mc+mgg2cEsvGlLY6V+1kMuioxnB5VM+fsY
9vSu4WI1PMBGXye6KXvNuzmZTh7U9h5j6vvASdngPdgOFxycNL6ia1axUMmT
JIzebXcQCn3SKMf+4QCMmOZung+6xBCPLfwO8ngcEI52YJ1y7mx3CN9xKUYU
bg7Y1yXjlKW6SrZnguQdsSfOSSDItqv2jwJFjavc1vO7OigyBr2+gDYorRk1
HXZpVFfu2FxXkZtfp4RQqNkX5y2sya3YYL2iavWAOaizH+pw.Ibg8f1I9h3Z
2B79sNeOHvBOtfEalWsvyu0KMf015.AaROvZ7vv5AhnndfHLbTgjcCK1KlHv
gOk5B26OqrXjcJ005.QqCHn8fVTxnxfj93SfQiJlv8YV0VT9fVUwOOhSV3uD
eeqCUClbBPa.j3vWDoMZssNTzRNEnE6gYPXazZaMF921syaLWyAeBXvCESA8
ASi6Zyw8.RQi65J8ZsNx3ho93OhGWENtWpowepae4YhCFeLErOLENtXJrOSc
iadi39rf4hwc8xdhHz3gn3dBI7iDRlFe8huAfIZhq
-----------end_max5_patcher-----------

Патч к Max указан выше. Скопируйте его и вставьте в новое окно.

См.также

  1. serial.begin()
  2. serial.print()
  3. analogRead()
  4. Dimmer
  5. Graph
  6. Physical Pixel
  7. Serial Call Response
  8. Serial Call and Response ASCII
  9. Serial Input (Switch (case) Statement)

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