Вы находитесь на странице: 1из 22

Разработка интерактивных систем

на OpenFrameworks

Подключение внешних датчиков


с помощью Arduino

http://dkds.ciid.dk/wp-content/uploads/2009/02/2970549282_a49c822cd4.jpg

лекции и объявления: вопросы отправляйте на адрес


www.uralvision.blogspot.com perevalovds@gmail.com УрГУ / ИММ весна 2011
Виды датчиков

Рассмотрим только некоторые


Кнопки, потенциометры, слайдеры

http://www.djtechtools.com/wp-content/uploads/2008/11/nano-sliders.jpg

http://www.itsahit.com/rikard/Restorations/images/JP6/uncleanpcbpotsandall.jpg
ИК датчики движения

Активные
стоит излучатель и приемник.

acroname Sharp IR (в России пока не нашел) - меряет также расстояние.

Autonics BA2M-DDT - по типу реле, выдает бинарный сигнал если объект ближе
некоторого расстояния.

Проблемы - если объект черный, то могут не сработать так как они рассчитаны на то,
что объект отражает свет. Показатель расстояния зависит от цвета объекта.

Пассивные
Использутся в охранных системах.
Основаны на измерении (теплового) ИК-излучения от объектов.
Ультразвуковой датчик расстояния -
сонар
Maxbotix LV-MAXSONAR-EZ1

Компактный, недорогой, используется энтузиастами-любителями, в частности, для


экспериментальной робототехники.
Проблемы для применения в интерактивных системах - недостаточно точный, и не
будет работать за стеклом.

Принцип работы - посылает ультразвуковой сигнал и меряет время, через которое


приходит отраженный сигнал.
Подключение датчиков
с помощью Arduino
Общее описание
Arduino — аппаратная вычислительная платформа, основными
компонентами которой являются простая плата ввода/вывода и среда
разработки на языке Processing/Wiring.
Arduino может работать как автономная микропроцессорная плата.
Также может подключаться через USB к компьютеру и интегрироваться с
программным обеспечением, выполняемым на компьютере.
Например, Flash, Processing, Max/MSP, Pure Data, SuperCollider,
OpenFrameworks.

Аппаратура
Плата Arduino состоит из микроконтроллера Atmel AVR, а также элементов
обвязки для программирования и интеграции с другими схемами.

Программирование
Для Arduino создана интегрированная среда разработки на Java,
включающая в себя редактор кода, компилятор и модуль передачи
прошивки в плату. Запускается сразу, без установки.
Freeduino - клон Arduino

Несмотря на то что документация на аппаратную часть и программный код


опубликованы под лицензией «copyleft», разработчики выразили желание, чтобы
название «Arduino» (и производные от него) было торговой маркой для
официального продукта и не использовалось для производных работ без
разрешения. В официальном документе об использовании названия Arduino
подчеркивается, что проект открыт для всех желающих работать над официальным
продуктом.

Результатом защиты названия стало ответвление от версии платы Arduino Diecimila,


сделанное группой пользователей, что привело к выпуску эквивалентной платы,
названной Freeduino. Название Freeduino не является торговой маркой и может
использоваться в любых целях.

Freeduino 2009 - полный аналог Arduino Duemilanove.


Freeduino 2009

Микроконтроллер: ATmega168 (ATmega328)


Цифровые порты ввода/вывода: 14 портов (из них 6 с ШИМ-сигналом)
Аналоговые порты ввода: 6 портов
ППЗУ (Flash Memory): 16 K (32 К), из них 2 К используются загрузчиком
ОЗУ (SRAM): 1 Кбайт (2 Кбайт)
ПЗУ (EEPROM): 512 байт (1024 байт)
Тактовая частота: 16 МГц
Интерфейс с ПК: USB
Питание от USB, либо от внешнего источника, выбор автоматический

http://www.freeduino.ru
Программа для мигания встроенным
светодиодом
Запустить Arduino.exe, затем в меню выбрать File - Examples - Digital - Blink

int ledPin = 13; // LED connected to digital pin 13 - это также выводит и на встр.ламп.
// The setup() method runs once, when the sketch starts
void setup() {
// initialize the digital pin as an output:
pinMode(ledPin, OUTPUT);
}

// the loop() method runs over and over again,


// as long as the Arduino has power
void loop()
{
digitalWrite(ledPin, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(ledPin, LOW); // set the LED off
delay(1000); // wait for a second
}
Программа для мигания внешним
светодиодом
Подключим светодиод к цифровому выходу 12, и AREF (он подключен к питанию)
(С точки зрения радиоэлектроники не очень корректно - надо еще резистор, но для
примера нормально)

В предыдущей программе изменить строку:


int ledPin = 12;
Программа для мигания внешним
светодиодом
Тут Arduino работает как независимое устройство. Можно
выключить USB-шнур и подключить внешний источник
питания.

Но нас больше интересует, как ввести данные для


использования в OpenFrameworks. Займемся этим.
Как передать данные от Arduino в PC
- Serial Port.
Arduino обменивается с PC данными через
последовательный COM-порт. Мы подключили через USB -
в этом случае COM-порт эмулируется.

Подключим к Arduino сонар и будем просто печатать в порт


приходящие значения.

В среде программирования для Arduino есть возможность


смотреть данные с порта, а также посылать туда значения.
Подключение сонара к аналоговому
входу Arduino
3 контакта - питание, земля, и аналоговый вход 0.
Подключение сонара к аналоговому
входу Arduino
const int analogInPin = 0; // Analog input pin that the potentiometer is attached to
int sensorValue = 0; // value read from the port

void setup() {
// initialize serial communications at 9600 bps:
Serial.begin(9600);
}

void loop() {
// read the analog in value:
sensorValue = analogRead(analogInPin);

// print the results to the serial monitor:


Serial.print("sensor = " );
Serial.println(sensorValue);
// wait 10 milliseconds before the next loop
// for the analog-to-digital converter to settle
// after the last reading:
delay(10);
}
Подключение сонара к аналоговому
входу Arduino
Скомпилировав и закачав эту программу в устройство,
нужно в Arduino IDE нажать кнопку "Serial Monitor",
и появится список считанных значений.
...
sensor = 50
sensor = 50
sensor = 143
sensor = 143
sensor = 140
sensor = 140
sensor = 50
sensor = 48
...

ПРИМЕЧАНИЕ Повышение точности измерений сонара


Если в Setup() добавить analogReference(INTERNAL); то будет измерение точнее
- так как сравнивать не с 5 В, а 1.1В
(другие значения - DEFAULT = 5В, EXTERNAL - внешний, сравнение с AREF)
Протокол Firmata
Мы рассмотрели пример, как с помощью класса ofSerial
можно работать с последовательным портом.
Это позволяет обмениваться данными с Arduino.
Обычно это делается синхронно - посылаем в Arduino
управляющий сигнал (например, произвольный 1 байт), а в
ответ ждем пачку данных.

Неудобство: для каждой новой конфигурации датчиков


нужно перепрограммировать и отлаживать Arduino и
процедуру обмена данными в OpenFrameworks.

Решение: использовать протокол Firmata, специально


созданный для упрощения операций ввода/вывода данных.
А на стороне Arduino программа она не меняется: все
настройки делаются через OpenFrameworks.
Протокол Firmata
Firmata is a generic protocol for communicating with microcontrollers from
software on a host computer. It is intended to work with any host computer
software package. Right now there is a matching object in a number of
languages. It is easy to add objects for other software to use this protocol.
Basically, this firmware establishes a protocol for talking to the Arduino from the
host software. The aim is to allow people to completely control the Arduino from
software on the host computer.
http://firmata.org

Класс ofArduino в OpenFrameworks использует Firmata, и имеет простые


команды для подключения к Arduino и ввода-вывода данных с портов
Arduino, например:

int getAnalog(int pin) - считать данные с аналогового входа номер pin


int getDigital(int pin) - считать данные с цифрового входа номер pin

Чтобы этим пользоваться, надо поставить в Arduino программу работы с


Firmata, см. далее.
Пример обмена данными
OpenFrameworks - Firmata - Arduino
1. На стороне Arduino: закачать программу
Firmata - StandartFirmata
2. На стороне OpenFrameworks:
запустить пример FirmataExample, предварительно указав в нем в строке
используемый порт
(это могут быть COM4, COM6, COM7 и т.д.):
ard.connect("COM6", 57600);

(3. Если работа идет с тем же сонаром - стоит в Arduino - Setup() добавить
analogReference(INTERNAL); для повышения точности измерений, см.
примечание выше).

Как узнать порт - программа пишет при старте в отладочном окне список
имеющихся портов.
Если же список портов на экран не вывелся, то при включенном устройстве можно
посмотреть его в Диспетчере Устройств.
Пример обмена данными
OpenFrameworks - Firmata - Arduino
Проект с увеличивающимся
квадратом
Цель: исследование точности и устойчивости измерений сонара.

На основе примера firmataExample сделать проект, в котором рисуется


квадрат, размеры которого зависят от измеренного расстояния.
Проект: управление генератором
звука с помощью сонара
Идея: использовать значения сонара для изменения высоты
генерируемого звука.

1. Генерацию звука рекомендуется делать на основе примера


audioOutputExample.

2. Данные, приходящие с сонара, стоит сглаживать.


Простейший фильтр:
filtered = f * value + (1-f) * filtered.

где filtered - сглаженное значение, value - новое значение, f - коэффициент


фильтра, от 0 до 1, например, 0.2 или 0.01.

Оценить