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

LXF107:Аппаратный хакинг

Материал из Linuxformat
Перейти к: навигация, поиск
Arduino Аппаратный хакинг для любителей гаражной электроники
Arduino

Arduino: Светодиодный светометр

В завершение нашей серии Грэм Моррисон соберет датчик освещенности.
Что нам надо
  • Arduino
  • Макетная плата
  • Пять резисторов по 1 кОм
  • Датчик освещенности

Это последний учебник по Arduino в нашей серии. Прибавим проекту жизни: вставим датчик освещенности. Из названия ясно, что он должен как-то реагировать на свет, но эти датчики не так умны, как кажутся. По сути, датчик освещенности – это переменный резистор, и его также часто называют «фоторезистором» [light dependent resistor, LDR], что прекрасно описывает принцип действия. Фоторезистор можно использовать в самых разных задачах, от измерения освещенности помещения до построения сети защитных датчиков и лазеров вокруг короны Св. Эдуарда в Лондонском Тауэре [используемой при коронации британских монархов, – прим. ред.]. А главное, датчик освещенности обычно имеется в стартовом наборе Arduino, и для построения чего-то полезного вам больше почти ничего не нужно.

Шаг 1: Сборка

LXF107 70 1.jpg На вид сложновато, но этот проект датчика освещенности очень легко реализуется и пригодится в различных видах приложений.

Если вы, например, прикрутите датчик освещенности к простой цепи со светодиодом, то обнаружите, что яркость последнего меняется в зависимости от количества прямого света, падающего на датчик, Вы также обнаружите, что эта яркость немного колеблется, независимо от освещенности датчика, потому что цепь «плывет», и возникающая небольшая электрическая интерференция влияет на сопротивление. Решением будет добавить резистор в 1 кОм между источником энергии и датчиком освещенности. Это стабилизирует цепь, остановив интерференцию, влияющую на сопротивление датчика.

Вы можете попытаться сделать это сами. Поместите датчик освещенности на вашу макетную плату – так, чтобы два его контакта были по обе стороны центральной канавки. Соедините одну сторону через резистор с 5-В выходом Arduino и соедините проводом ту же линию с Аналоговым входом 0. Другую сторону канавки макетной платы просто подключите к GND (Земля) на Arduino. Наконец, вставьте длинную ножку светодиода прямо в Цифровой порт 13 на Arduino, а короткую ножку – в ближайший разъем GND. Вот код, делающий рабочей эту конструкцию:

int ledPin = 13;
int analogInput = 0;
int aInput;
void setup(){
  pinMode(ledPin, OUTPUT);
  pinMode(analogInput, INPUT);
  beginSerial(9600);
}
void loop(){
  aInput = analogRead(analogInput);
  digitalWrite(ledPin, HIGH);
  delay(aInput);
  digitalWrite(ledPin, LOW);
  delay(aInput);
  printInteger(aInput);
  printByte(10);
}

Вы должны бы уже привыкнуть к синтаксису, и понять, что при этом происходит, несложно. Мы считываем аналоговые данные с датчика освещенности и используем их как задержку мигания светодиода на плате. Чем ярче свет, падающий на датчик, тем меньше задержка между вспышками светодиода. Как мы изучили в прошлом месяце, анало- говые значения варьируются в диапазоне от 0 до 1023, что может дать задержку вспышек от более одной секунды до практически нулевой. Но вы найдете, что большинству датчиков нужен прямой солнечный свет, чтобы задержки стали меньше 150 миллисекунд (единицы измерения, используемые командой ‘delay’), и при искусственном освещении различия заметить труднее. Значит, нам нужен способ увидеть значения, считываемые с датчика освещенности, чтобы мы могли улучшить нашу программу для работы с меньшими значениями. Вот это и делают строки beginSerial(9600), printInteger(aInput) и printByte(10). Они открывают последовательное соединение с компьютером и начинают передавать значения с датчика освещенности. Чтобы увидеть значение, нужно просто открыть Serial Monitor в IDE Arduino на вашем компьютере. Вы будете видеть каждое значение в новой строке (результат работы команды printByte), и сможете отслеживать читаемые с датчика освещенности числа, отражающие количество света. В условиях светлого офиса наш датчик показывал около 800 и сбрасывался до 960, когда мы закрывали его пальцем. Учтите, датчик редко имеет линейную зависимость отклика, и при уменьшении освещенности вдвое вы не должны ожидать такого же уменьшения сопротивления.

Разобравшись с выводом с датчика, мы можем применить сенсор еще где-нибудь. Используем массив светодиодов как столбик графика, где число горящих светодиодов представляет значение освещенности, попадающей на датчик. Можете использовать до 13 отдельных светодиодов – столько, сколько позволяют цифровые входы Arduino, но для демонстрации основных принципов нам хватит четырех. Каждый светодиод требует присоединения его длинной ножки к отдельному цифровому входу, в большинстве случаев через 1-кОм резистор (это зависит от типа используемых светодиодов). Короткая ножка подключается к «земле». Используем различные контакты для каждого светодиода, с общей шиной, присоединенной к GND, и проводом к цифровому входу Arduino.

Шаг 2: Программируем

Скорая помощь

Если вы попытаетесь установить или обновить IDE Arduino и он начнет генерировать длинные и странные сообщения об ошибке компиляции, убедитесь, что у вас также установлен пакет 'avr-libc.

LXF107 71 1.jpgПринципиальная схема.

Вот и все нужные нам дополнительные подключения. Но исходный код программы требует чуть больше работы. Начнем с верхней части кода, добавив следующие определения ‘define’ и изменив переменную ledPin:

 #define MAX_LED 4
 int ledPin[MAX_LED]={12, 11,10,9};

Вместо того, чтобы вручную инициализировать и обрабатывать каждый подключенный к Arduino светодиод, мы создали простой массив, куда записали выходной контакт для каждого соединения (ledPin). Мы не только сэкономили место на данной странице, но и облегчили легкое перемещение по данным. Это решение также более гибкое. Если вы захотите добавить или удалить светодиоды с Arduino, вам будет только нужно изменить значение MAX_LED и удалить назначенные контакты из массива. Но перед тем, как мы сможем их зажечь, сперва необходимо инициализировать каждый используемый контакт, в функции setup заменив строку pinMode(ledPin, OUTPUT) на следующую:

 for (int i=0; i<MAX_LED; i++){
       pinMode(ledPin[i], OUTPUT);
 }

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

 void barGraph(int count) {
   for (int i=0; i<MAX_LED; i++){
       digitalWrite(ledPin[i], LOW);
   }
   for (int i=0; i<count; i++){
        digitalWrite(ledPin[i], HIGH);
     }
 }

Тут сперва выключаются все светодиоды, а потом они по очереди включаются, в зависимости от значения переменной ‘count’. Наконец, в логику программы осталось добавить команду, ответственную за вызов функции barGraph с различными значениями. Мы используем серию условий if для снятия различных пороговых значений освещенности. Следующие значения работали у нас, но вам может потребоваться использовать Serial Console в IDE Arduino для подбора значений, более подходящих к вашей установке. Если значения, читаемые с датчика освещенности, менее чем 840, мы зажигаем все четыре светодиода. Это значение освещенности в нашем офисе. Если вам повезет испытывать установку на природе летним солнечным днем, то более подходящим значением будет 150. Каждый последующий диапазон для 3-х, 2-х, 1-го и 0 светодиодов является произвольным отклонением от стартового значения. Вы можете использовать более чем четыре светодиода, для этого вам нужно будет добавить соответствующие диапазоны в условия ‘if’.

aInput = analogRead(analogInput);
 if (aInput < 840)
   barGraph(4);
 else if (aInput < 900)
   barGraph(3);
 else if (aInput < 940)
   barGraph(2);
 else if (aInput < 980)
   barGraph(1);
 else
   barGraph(0);
delay (10);

Скомпилировав и послав эту программу на ваш Arduino, вы должны увидеть набор светодиодов, откликающихся в зависимости от уровня света, попадающего на сенсор. Темнота все их выключит, а прямое освещение все зажжет. Проект готов. Потом вы сможете много чего добавить, чтобы извлечь из него пользу. Можно применить его в системах домашней автоматизации – например, включения или выключения устройств при наступлении темноты. Лучшей стартовой площадкой будет Arduino Sketchbook – онлайн-репозиторий всех вещей Arduino, а также полезный форум, полных энтузиастов вроде вас. Все это можно найти на главном сайте Arduino: http://www.arduino.cc. Сообщите нам, если изваяете что-нибудь клевое. LXF

Персональные инструменты
купить
подписаться
Яндекс.Метрика