Текстовая версия:

На этом уроке мы закончим знакомиться с возможностями получения и передачи сигналов с помощью Arduino. Рассмотрим аналоговые входы и выходы. Для этого урока нам понадобится: Arduino, макетная плата, фоторезистор, резистор на 200 Ом, резистор на 10 кОм, светодиод и соединительные провода

Комплект для третьего урока

Если раньше все было просто – есть сигнал или нет, то теперь все будет гораздо хитрее. Аналоговым сигналом является, например, звук. Если встать у дороги, где постоянно едут машины, уровень шума постоянно меняется. Однако современные компьютеры цифровые и работать могут только с цифровыми сигналами. Как же тут быть? Для решения этой проблемы используется Аналого-Цифровые Преобразователи (АЦП).

Эти устройства преобразуют, как не трудно догадаться из названия, аналоговый сигнал в цифровой. Что было понятнее, разберем на примере. Arduino имеет 10 битный АЦП, т.е. подаваемый на вход сигнал может быть преобразован в цифровые значения от 0 до 1023. Если подключить микрофон к аналоговому входу Arduino и попасть в место с идеальной тишиной, то будет значение 0, на улице днем -200-300, а если встать рядом с взлетающим самолетом – 1023. Цифры абстрактные, но теперь должно быть понятно, как это работает. Мы можем любой плавный сигнал (звук, свет, напряжение) преобразовать в число от 0 до 1023.

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

Для этого мы используем фоторезистор. Его свойство в том, что он меняет свое сопротивление в зависимости от яркости освещения. Что бы использовать фоторезистор, мы соберем простой делитель напряжения. Эта штука используется постоянно, так что изучить ее действительно очень важно.

 Делитель напряжения

По сути это последовательное соединение двух резисторов. Только один из них не простой, а фоторезистор. 

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

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

Вот так это выглядит в собранном виде на Arduino:

Делитель напряжение с фоторезистором на Arduino

  

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

 

В данном случаи мы используем первый.

Рассмотрим код:

int a=0;

void setup()
{  
  Serial.begin(9600);
}
void loop()
{ 
  a=analogRead(1);
  Serial.println(a);  
  delay(100);
}

Тут мы видим кое-что новое. Во-первых, аналоговые входы не нужно инициировать в блоке Setup(). Во-вторых, мы видим новую команду - Serial.begin(9600); С помощью нее мы сообщаем плате, что будем обмениваться данными с компьютером – нам же нужно как-то увидеть, что у нас приходит на аналоговый вход? В основном цикле программы мы считываем сигнал с входа в переменную и отправляем ее на последовательный порт. Теперь получим эти данные на компьютере. Отправим программу на Ардуино. После того, как она успешно запишется и начнет работать, необходимо вызвать монитор последовательного порта. Это маленький значек в правом верхнем углу:

 Монитор последовательного порта

Откроется новое окно, в котором мы увидим бегущие числа:

 Данные с фоторезистора на последовательном порту

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

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

Для этого просто добавим светодиод (как обычно через резистор на 200 Ом). 

 Светодиод на плате с делителем напряжения

Подключим его к 3 выходу. На ардуино нет отдельных аналоговых выходов, просто некоторые цифровые могут работать как аналоговые. На плате они помечены знаком «тильда». Третий выход как раз такой. 

Для начала давайте определим, какие минимальные и максимальные значения мы получаем. У меня получилось от 300 до 800. Помним, что АЦП Ардуино может выдавать от 0 до 1024. Обрежем крайние значения:

int a=0;
void setup()
{  
  Serial.begin(9600);
  pinMode(3, OUTPUT);
}
void loop()
{ 
  a=analogRead(1);
  if(a<300)
    a=0;
  if (a>850)
    a=1024;  
  Serial.println(a);  
  analogWrite(3, 256- (a / 4));
  delay(100);
}

Теперь, если значения на входе падают ниже 300, светодиод гаснет, а если выше 800, горит на полную. Обратите внимание, что значения аналогового выхода лежат в диапазоне 0-256, поэтому мы делим приходящие с входа значения на 4. 

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