Журнал LinuxFormat - перейти на главную

LXF151:Arduino: Начнем знакомство

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


Создать полезное устройство с Arduino проще, чем вы думали. Ник Вейч начинает серию статей об Arduino с добавления датчиков к устройствам.

Признайтесь честно: вы купили макетную плату Arduino, загрузили примеры прошивок и полюбовались мигающими светодиодами, но с тех пор плата вместе с набором компонентов, которые вы приобрели в решимости создать нечто грандиозное, собирает пыль в шкафу.

Здесь нечего стыдиться, но если вы хотите узнать, как с небольшими усилиями сделать удивительные вещи, надеемся, эта серия руководств поможет вам. Да, нас ждет немного арифметики, и кое-что потребуется изучить. Сайтов с планами проектов для Arduino немало, но если вы не понимаете основ работы платы, то никогда не претворите свои великие планы в жизнь.

Мы не только покажем, что можно сделать на базе Arduino, но и ознакомим вас с теоретическими сведениями, лежащими в основе работы платы, и стоящими за ними расчетами – во всяком случае, в той мере, в какой это будет полезно.

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

Содержание

Простые датчики

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

Сопротивление для всех типов датчиков обычно измеряется косвенно в резисторной сборке (называемой делителем напряжения). В цепочке резисторов отношение падения напряжения на каждом отдельном резисторе к общему напряжению, приложенному к цепочке, равно отношению сопротивления этого резистора к общему сопротивлению цепочки. И если собрать цепочку резисторов, в которую входит датчик, его сопротивление можно определить, измерив напряжение на датчике и сравнив его с общим приложенным напряжением. Во многих случаях точная величина сопротивления даже не нужна: достаточно получать определенный входной сигнал, который изменяется в диапазоне, позволяющем заметить, что изменилось исследуемое свойство.

(thumbnail)
Стоит усвоить основы — и возможно все!
 

Эй, здесь темно

Создание схемы, которая включает и выключает свет в зависимости от освещенности – пожалуй, эквивалент «Hello World» в Arduino. Это довольно простая схема, и для нее нужны всего два дополнительных компонента, которые легко доступны – а если у вас их нет, ну, достаньте их.

Фоторезистор (LDR, Light Dependent Resistor) как раз и представляет собой резистор, сопротивление которого меняется в зависимости от падающего на него света. Существуют фоторезисторы различных типов, но самые распространенные имеют ромбовидную форму, около 4 мм в длину, а их сопротивление изменяется от нескольких сот ом (на ярком свету) до примерно 250 кОм (в глухой тьме).

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

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

В нашей простой цепи мы объединим фоторезистор в цепочку с резистором сопротивлением 10 кОм. Тогда мы не потратим на нашу цепь чересчур много энергии, более чем достаточно защитим фоторезистор и получим приемлемое сравнительное значение в диапазоне сопротивлений фоторезистора.

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

При ярком свете измеренное сопротивление нашего фоторезистора составило 220 Ом. В темноте оно поднялось до 250 кОм. Следовательно [ULDR – напряжение на фоторезисторе; Uin – входное напряжение; RLDR – сопротивление фоторезистора, – прим. пер.]:

ULDR = Uin * (RLDR/ RLDR +10000)

ULDR = 5 * (220/10220) = 0,1 В при ярком свете

ULDR = 5 * (250000/260000) = 4,8 В в темноте

В аналоговых входах Arduino используются внутренние аналого-цифровые преобразователи (АЦП) Atmega. Они обладают 10-битной разрядностью сигнала и сравнивают поступающее напряжение с напряжением питания Arduino. Так, значение 1023 соответствует 5 В. На практике это напряжение меньше, особенно при питании через USB.

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

Схема, как она есть, приведена на рис. 1 в конце статьи; есть и фотография, чтобы вы смогли посмотреть, как это выглядит на макете. Осталось написать код, включающий свет.

/* Простой датчик освещенности

*/

int LDR = 1; // выбор входного контакта для LDR

int LED = 13; // выбор контакта для LED

int val = 0; // переменная, хранящая показание датчика

void setup() {

pinMode(LDR, INPUT); // объявим LDR как вход - INPUT

Serial.begin(9600);

}

void loop() {

val = analogRead(LDR); // считываем показание датчика

delay(1000); // небольшая пауза

Serial.print(“Освещенность: “);

Serial.println(val);

}

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

Код установки инициализирует контакты должными функциями (это очень важно, так как у контактов есть несколько режимов работы и функций) и инициализирует последовательный ввод/вывод, чтобы впоследствии мы смогли записывать данные.

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

Измеренное показание также отправляется на последовательный порт (чтобы мы могли следить за его изменениями), и затем нужна небольшая пауза на передышку. Пауза указывается в миллисекундах, так что у нас здесь показание считывается примерно раз в секунду. Если вы планируете разместить различные датчики на различных контактах, позаботьтесь о том, чтобы считывать их значения одновременно.

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

Идем дальше

(thumbnail)
Включите монитор последовательного порта в IDE Arduino и следите за показаниями.

Если вы просто хотите знать, светло или темно, использование аналогового входа – напрасная трата ресурсов. Поэтому датчики часто применяются только для установки событий – жарко/темно/влажно и т. п., и все, что нам нужно – установить их выход в логическую «единицу» или «ноль».

Можно просто подключить делитель напряжения к цифровому входу, но результаты окажутся не лучшими. Причина – в напряжении переключения: когда напряжение на выводе станет достаточно высоким для отправки логической единицы, вы войдете в состояние почти случайных включений и отключений. Такой способ ненадежен и для управления логическими схемами.


(thumbnail)
Простая схема, объединяющая аналоговый сигнал освещенности и цифровой сигнал под управлением триггера Шмитта, на макете.

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

Добавление дополнительного транзистора, впрочем, означает, что можно настроить петлю обратной связи, которая придаст устойчивость выходному сигналу. Напряжение, при котором система переходит в состояние «включено», можно сделать заметно выше, чем напряжение, необходимое для переключения обратно в состояние «выключено», создав таким образом буфер и исключив колебания состояний «включено»/«выключено».

Такая схема называется триггером Шмитта, и это краеугольный камень множества управляющих электронных схем. Для решения нашей задачи можно купить интегральные схемы с большим количеством триггеров Шмитта или добавить схему операционного усилителя, но с парой простых NPN-транзисторов стоимостью около 30 пенсов и несколькими резисторами сделать то же самое гораздо проще.

Расположение компонентов приведено на рис. 2. Мы воспользовались NPN-транзисторами BC547, но на самом деле подойдут любые NPN-транзисторы. Сопротивления резисторов в цепи определяют точки, в которых будет изменяться значение логического выхода. С нашими резисторами оно должно установиться в «единицу» при напряжении около 2,5 В и в «ноль» при напряжении около 1,3 В (при напряжении питания 5 В).

Чтобы получить точки переключения, которые вам нужны, можно изменять значения резисторов или добавить переменный резистор между базой второго транзистора и «заземлением» и с его помощью смещать точку переключения вверх и вниз.


Триггер счастлив

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

На сайте pcbheaven есть прекрасная статья о том, как реализовать триггер Шмитта (http://pcbheaven.com/wikipages/The_Schmitt_Trigger/), а также удобную утилиту для определения сопротивления используемых резисторов (http://pcbheaven.com/drcalculus/index.php?calc=st_tr).

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

/* Датчик освещенности - аналоговый и цифровой

*/

int LDR = 1 // аналоговый контакт для LDR

int ledPin = 13; // выбор контакта для LED

int sensePin =12; // цифровой контакт

int val = 0;

int sense =0;

void setup() {

pinMode(LDR, INPUT); // объявим LDR как вход INPUT

pinMode(ledPin, OUTPUT); // объявим ledPin как выход OUTPUT

pinMode(sensePin, INPUT);

Serial.begin(9600);

}

void loop() {

val = analogRead(LDR); // считываем показания датчика

sense = digitalRead(sensePin);

if (sense == 1)

digitalWrite(ledPin, LOW); // включаем ledPin

else

digitalWrite(ledPin, HIGH); // выключаем ledPin

delay(1000);

Serial.print(“reading: “);

Serial.println(val);

Serial.print(“sense: “);

Serial.println(sense);

}

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


(thumbnail)
Рис. 1. В этой простой схеме мы объединили фоторезистор и резистор сопротивлением 10 кОм.
(thumbnail)
Рис. 2. Сопротивления резисторов во второй схеме определяют точки переключения логического выхода.
Персональные инструменты
купить
подписаться
Яндекс.Метрика