• акселерометры для обнаружения наклона (применяются в смартфонах и планшетах);

• магнитометры для фиксации магнитных полей (необходимы при создании цифровых компасов);

• инфракрасные датчики для определения расстояния до объекта;

• датчики для измерения температуры.

Многие из этих датчиков подключают аналогично потенциометру: два контакта питания (VCC и GND) и один к аналоговому входу платы Arduino. Для следующего эксперимента вы можете выбрать любой датчик из списка:

• Инфракрасный датчик расстояния Sharp. (Описание датчика приведено на странице http://www.exploringarduino.com/parts/lR-Distance-Sensor, разъем для подключения - http://www.exploringarduino.com/parts/JST-Wire.)

Инфракрасные датчики Sharp измеряют расстояние от датчика до объекта. По мере удаления объекта напряжение на выходе датчика уменьшается. Рисунок на странице 5 технического описания датчиков Sharp ( скачать можно по адресу

http://exploringarduino.com/wp-content/uploads/2013/06/GP2YOA-datasheet.pdt)

показывает связь между выходным напряжением и расстоянием до объекта.

• Датчик температуры ТМР36. (Описание приведено на странице http://www.exploringarduino.com/parts/TMP36.)

Датчик температуры ТМР36 позволяет легко преобразовать выходной уровень напряжения в показания температуры в градусах Цельсия. Каждые 10 мВ выходного напряжения соответствуют 1°С. Формула для преобразования выходного напряжения (в мВ) в температуру (в °С) выглядит так: Т= (Uвых - 500)/10.

Смещение 500 мВ необходимо для работы с температурами ниже 0°С. Эта зависимость приведена на рис. 3. 7.

- 72 -

Рис. 3.7. Зависимость выходного напряжения от температуры для различных датчиков

• Трехосевой аналоговый акселерометр. (Описание приведено на странице

http://www.exploringarduino.com/parts/TriAxis-Analog-Accelerometer.)

Трехосевые акселерометры предназначены для определения ориентации объекта. Аналоговые акселерометры выдают значения, соответствующие смещению объекта по каждой оси: Х, У и Z (для каждой оси разном контакте). С помощью тригонометрических преобразований и закона всемирного тяготения можно определить позицию объекта в трехмерном пространстве. Напряжение питания многих акселерометров равно 3,3 В, поэтому для получения правильных значений в программе нужно предусмотреть установку опорного напряжения analogReference(), а вывод питания акселерометра подсоединить к контакту 3,3 В платы Arduino.

• Двухосевой аналоговый гироскоп. (Описание датчика приведено на странице

http://www.exploringarduino.com/parts/DualAxis-Analog-Gyroscope.)

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

Посмотрите пример взаимодействия гироскопа с платой Arduino в моем проекте SudoGlove (http://www.jeremyblum.com/portfolio/sudoglove-hardware-controller/).

Перчатка-манипулятор, которую я разработал, распознает движения руки и способна управлять музыкальным синтезатором или радиоуправляемым автомобилем. Напряжение питания многих гироскопов составляет 3,3 В.

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

- 73 -

3.7. Работа с аналоговым датчиком температуры

Рассмотрим простой пример работы с датчиком температуры ТМР36, упомянутым в предыдущем разделе. Вы можете выбрать любой аналоговый датчик из приведенного ранее списка или взять какой-нибудь другой. Последовательность действий, описанная далее, практически одинакова для любого аналогового датчика.

Для начала подсоедините к плате Arduino Uno RGB-светодиод, как в главе 2, и датчик температуры к выходу A0 (рис. 3.8).

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

Рис. 3.8. Схема подключения датчика температуры

- 74 -

Прежде всего, определите приемлемый для вас температурный диапазон. Используя программу из листинга 3.1, определите аналоговые значения для верхнего и нижнего порогов температуры. Для меня нижний порог комфортной температуры составляет 20°С, что соответствует аналоговому значению 143. У вас эта цифра может быть другой. Следите за показаниями в мониторе последовательного порта при наступлении нижнего и верхнего предела температуры. Эти значения можно получить из графика на рис. 3.7 или из формулы, связывающей температуру (в °С) с входным напряжением (в мВ):

Температура (°С)х10 = Напряжение (мВ)- 500.

Напряжение 700 мВ соответствует температуре 20°С. Расчет по формуле (или просто анализ показаний монитора последовательного порта) дает для 22°С цифровое значение 147, для 18°С- 139. Эти величины выберем для нижнего и верхнего значений комфортной температуры, чтобы изменять цвет светодиода. Функция analogRead() будет считывать показания датчика температуры, digitalWrite() устанавливать цвет светодиода.

Совет Рекомендую вам не копировать листинг 3.2, а попробовать написать текст программы самостоятельно, чтобы убедиться в своих силах. Сравните свой результат с приведенным далее.

Листинг 3.2. Программа температурного оповещателя - tempalert.ino

// Температурный оповещатель

// Контакт

const int BLED=9; // Контакт 9 для вывода BLUE RGB-светодиода

const int GLED=10; // Контакт 9 для вывода GREEN RGB-светодиода

const int RLED=11; // Контакт 9 для вывода RED RGB-светодиода

const int TEMP=0; // A0 для подключения датчика температуры

const int LOWER_BOUND=139; // Нижний порог

const int UPPER_BOUND=147; // Верхний порог

int val = 0; // Переменная для чтения аналогового значения


void setup()

{

pinMode(BLED, OUTPUT); // Сконфигурировать BLUE контакт светодиода как выход

pinMode(GLED, OUTPUT); // - - GREEN - -

pinMode(RLED, OUTPUT); // - - RED - -

}

void loop()

{

val = analogRead(TEMP);

- 75 -

if (val < LOWER_BOUND)

{

digitalWrite(RLED, LOW);

digitalWrite(GLED, LOW);

digitalWrite(BLED, HIGH);

}

else if (val > UPPER_BOUND)

{

digitalWrite(RLED, HIGH);

digitalWrite(GLED, LOW);

digitalWrite(BLED, LOW);

}

else

{

digitalWrite(RLED, LOW);

digitalWrite(GLED, HIGH);

digitalWrite(BLED, LOW);

}

}

В коде листинга 3.2 нет ничего принципиально нового, он сочетает в себе все изложенное ранее о системах, взаимодействующих с окружающей средой и платой Arduino.

3.8. Использование переменных резисторов для создания собственных аналоговых датчиков

Благодаря достижениям в области физики, мы имеем множество материалов, способных изменять сопротивление в результате физического воздействия. Например, проводящие краски изменяют свое сопротивление при изгибе и скручивании, полупроводники меняют сопротивление под действием света ( фоторезисторы), сопротивление некоторых материалов зависит от нагрева и охлаждения (термисторы).

Это всего лишь несколько примеров, которые позволят создать свои собственные аналоговые датчики.

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

3.9. Резистивный делитель напряжения

Резистивный делитель напряжения состоит из двух резисторов, от соотношения сопротивлений которых зависит выходное напряжение. Так, если один из резисторов переменный, то на выходе можно получить изменение напряжения. Другой резистор определяет чувствительность схемы, если это подстроечный резистор, то чувствительность можно корректировать.

- 76 -

Рассмотрим нерегулируемый резистивный делитель (рис. 3.9) и напряжение на его выходе. Обозначение A0 на рис. 3.9- это аналоговый вход A0 на плате Arduino.

Зависимость выходного напряжения делителя от входного:

Uвых = Uвх (R2/(R1 + R2)).

В нашем случае на вход делителя подано напряжение 5 В, а выход подключен к аналоговому контакту A0 платы Arduino. Если R1 и R2 одинаковы (как, например, 10 кОм), то 5 В делится пополам, и на аналоговом входе будет 2,5 В. Проверьте это, подставив значения в формулу: