123




Содержание

  • 5.1 Пробуем другие датчики включения-выключения
    • 5.1.1 Выключатели
    • 5.1.2 Термостаты
    • 5.1.3 Магнитные переключатели, также известные как "герконы"
    • 5.1.4 Ковровые переключатели
    • 5.1.5 Датчики наклона
  • 5.2 Управление светом при помощи ШИМ
  • 5.3 Использование фотодатчика вместо кнопки
  • 5.4 Аналоговый ввод
  • 5.5 Попробуйте другие аналоговые датчики
  • 5.6 Последовательная связь
  • 5.7 Управление большими нагрузками (электродвигатели, лампы и тому подобное)
  • 5.8 Сложные сенсоры

Глава 5. Продвинутый ввод-вывод


Всё, что мы изучили в четвёртой главе - в большинстве простейшие операции, которые мы можем делать с Arduino: управлять цифровым выводом и читать цифровод ввод. Если-бы Arduino был разговорным языком, это было-бы всего-лишь двумя буквами алфавита. Учитывая то, что в этом алфавите всего пять букв, вы можете увидеть сколько еще работы надо сделать чтобы писать поэмы на Arduino.

5.1 Пробуем другие датчики включения-выключения

5.1.1 Выключатели

То-же самое что и кнопка, но не изменяет автоматически своё состоянии при отпускании.

5.1.2 Термостаты

Выключатель, который срабатывает при достижении установленной температуры.

5.1.3 Магнитные переключатели, также известные как "герконы"

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

5.1.4 Ковровые переключатели

Маленькие пластинки, которые можно положить под ковёр чтобы определить присутствие человека (или тяжёлого кота).

5.1.5 Датчики наклона

Простой электронный компонент, сделанный из двух контактов и маленького металлического шарика (или капельки ртути, но я не рекомендую использовать такие). Рис. 5-1 показывает внутренности типичной модели. Когда датчик расположен вертикально, шарик замыкает оба контакта, и устройство работает как если-бы вы нажати кнопку. Когда вы наклоняете датчик, шарик движется и контакты размыкаются, как если-бы вы отпустили кнопку. Используя такой простой компонент, вы можете создавать, например, интерфейсы управления жестами, которые реагируют на движения или встряхивание обьекта.

Рис. 5-1. Конструкция датчика наклона

Другой датчик, который вы можете захотеть испытать, это инфракрасный датчик от охранной сигнализации (также известный как пассивный инфракрасный датчик, или ИК-датчик, см. рис. 5-2). Эти маленькие устройства срабатывают когда человек (или животное) движется в пределах его видимости. Это простой способ определить движение.

Рис. 5-2. Типичный инфракрасный датчик

Теперь вы можете поэкспериментировать, найдя всевозможные устройства, имеющие два замыкающихся контакта, такие как термостат, управляющий температурой в комнате (используйте старый, который не подключён к системе), или просто расположив рядом два контакта и капнув на них водой.

Например, используя пример из главы 4 и ИК-датчик, вы можете создать лампу, которая реагирует на присутствие человека, или вы можете применить датчик наклона чтобы она включалась при наклоне в определённую сторону.

5.2 Управление светом при помощи ШИМ

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

Как я подсказывал в первом примере главы 4, если вы измените цифры в функции задержки чтобы светодиод перестал мигать, вы заметите что светодиод, похоже, светится в половину своей нормальной яркости. Теперь измените цифры так, чтобы светодиод был включен на четверть того времени, пока он выключен. Запустите скетч и вы увидите, что яркость понизилась до 25%. Такая техника называется широтно-импульсная модуляция (ШИМ) - фантастический способ, определяемый так: если мигать светодиодом достаточно быстро, вы не увидите самих миганий, но вы можете изменять яркость светодиода меняя отношение между временем его включенного и выключеного состояния.

Рис. 5-3 показывает как это работает.

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

Экспериментируя, вы увидите, что мигать светодиодом, расставляя задержка в коде, немного неудобно, так как когда вам понадобится считать датчик или отправить данные по последовательному порту, светодиод будет мерцать из-за задержек чтения датчика. К с частью, процессор на плате Arduino, имеет аппаратную часть, которая может очень эффективно мигать тремя сетодиодами в то время, когда ваш скетч делает что-то другое. Эта часть реализована на выводах 9, 10 и 11, которые могут управляться командой analogWrite().

Рис. 5-3. ШИМ в действии

Например, запись analogWrite(9,128) установить яркость светодиода, подключённого к выводу 9 в 50%. Почему 128? analogWrite() требует число от 0 до 255 в качестве аргумента, где 255 означает полную яркость, а 0 - выключено.

Примечание: Наличие трёх каналов - просто отлично, так как вы можете купить красный, зелёный и синий светодиоды и смешивать их цвета для получения любого другого цвета по своему желанию!

Давайте попробуем. Соберите схему по рис. 5-4. Заметьте, что у светодиода есть полярность: длинная ножка (анод) должна быть справа, а короткая (катод) - слева. Также большинство светодиодов имеют плоскую фаску на стороне катода, как показано на рисунке.

Рис. 5-4. Светодиод, подключённый к выводу ШИМ

Далее, создайте новый скетч в Arduino и используйте пример 5-1 (его вы также можете загрузить с www.makezine.com/getstartedarduino):

Пример 5-1. Плавное включение и выключение светодиода, подобное режиму сна в компьютере Apple.

#define LED 9 // the pin for the LED

int i = 0; // We'll use this to count up and down

void setup() {
 pinMode(LED, OUTPUT); // tell Arduino LED is an output
}


void loop(){

 for (i = 0; i < 255; i++) { // loop from 0 to 254 (fade in)
 analogWrite(LED, i); // set the LED brightness
 delay(10); // Wait 10ms because analogWrite

 // is instantaneous and we would
 // not see any change
 }

 for (i = 255; i > 0; i--) { // loop from 255 to 1 (fade out)

 analogWrite(LED, i); // set the LED brightness

 delay(10); // Wait 10ms
 }
}

Теперь вы повторили чудесную возможность ноутбука (может быть, это не очень экономно использовать Arduino для такой простой задачи). Давайте используем эти знания чтобы улучшить нашу лампу.

Добавьте в схему кнопку (см. гл 4) к данной плате. Попробуйте сделать это не читая текст дальше, так как я хочу чтобы вы начали думать о том факте, что любая простая схема, которую я показывал здесь, является "маленьким кирпичиком" для создания всё больших и больших проектов. Если вам потребовалось заглянуть вперёд, не расстраивайтесь, самое важное - это то что вы потратили некоторое время на обдумывание того как может выглядеть такая схема.

Чтобы создать эту данную, вам надо соединить схему, которую вы только-что построили (рис. 5-4) со схемой с кнопкой, показанной на рис. 4-6. Если хотите, можете просто собрать отдельно обе эти схемы на плате; у вас на ней достаточно места. Однако, одно из преимуществ подобной платы- это то, что в ней есть пара шин, которые проходят горизонтально поверху и понизу. Одна из них отмечана красным (плюс), а вторая - синим (минус).

Эти шины используются для подвода питания и общей земли куда потребуется. В случае схемы, которую надо собрать для данного примера, у вас есть два компонента (оба - резисторы), которые надо подключить в выводу GND (земля) платы Arduino. Так как у Arduino есть два вывода GND, вы можете просто соединить эти две схемы в точности как показано на обоих рисунках, а затем взять провода, подключённые на иллюстарциях к GND, и соединить их вместе.

Если вы не готовы сделать это, не расстраивайтесь: просто подключите схемы к Arduino как показано на рисунках 4-6 и 5-4. Вы увидите пример, использующий отрицательную и положительную шины в главе 6.

Возвращаясь к нашему следующему примеру, если у нас есть только одна кнопка, как мы будем управлять лампой? Мы изучим ещё одно действие в технике создания: определение того, как долго была нажата кнопка. Чтобы сделать такое, нам надо изменить пример 4-5 из главы 4 чтобы добавить плавную регулировку. Идея состоит в том чтобы создать "интерфейс", в котором нажатие и отпускание кнопки приводит к включению и выключению света, а нажатие и удерживание той-же кнопки изменяет яркость.

Давайте рассмотрим скетч:

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

#define LED 9 // the pin for the LED
#define BUTTON 7 // input pin of the pushbutton

int val = 0; // stores the state of the input pin

int old_val = 0; // stores the previous value of "val"
int state = 0; // 0 = LED off while 1 = LED on

int brightness = 128; // Stores the brightness value
unsigned long startTime = 0; // when did we begin pressing?

void setup() {

 pinMode(LED, OUTPUT); // tell Arduino LED is an output
 pinMode(BUTTON, INPUT); // and BUTTON is an input
}

void loop() {


 val = digitalRead(BUTTON); // read input value and store it
 // yum, fresh

 // check if there was a transition
 if ((val == HIGH) && (old_val == LOW)) {


 state = 1 - state; // change the state from off to on
 // or vice-versa

 startTime = millis(); // millis() is the Arduino clock
 // it returns how many milliseconds

 // have passed since the board has
 // been reset.

 // (this line remembers when the button
 // was last pressed)
 delay(10);
}
// check whether the button is being held down

 if ((val == HIGH) && (old_val == HIGH)) {

 // If the button is held for more than 500ms.
 if (state == 1 && (millis() - startTime) > 500) {


 brightness++; // increment brightness by 1
 delay(10); // delay to avoid brightness going
 // up too fast

 if (brightness > 255) { // 255 is the max brightness

 brightness = 0; // if we go over 255
 // let's go back to 0
 }
 }
 }

 old_val = val; // val is now old, let's store it

 if (state == 1) {
 analogWrite(LED, brightness); // turn LED ON at the
 // current brightness level
 } else {
 analogWrite(LED, 0); // turn LED OFF

 }
}

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

А теперь давайте разберёмся как использовать более интересные сенсоры.

5.3 Использование фотодатчика вместо кнопки

Сейчас мы произведём интересный эксперимент. Возьмём фотодатчик, как на рис. 5-5.

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

Соберите схему для примера 4-2 (см. "Использование кнопки для управления светодиодом" в главе 4), затем загрузите код из примера 4-2 в вашу Arduino.

Теперь подключите фотодатчик в плату вместо кнопки. Вы увидите, что если закрыть датчик рукой, светодиод выключится. Откройте датчик, и светодиод зажжётся. Вы только-что собрали свой первый светодиод, управляемый датчиком. Это важно, так как первый раз в книге мы используем электронный компонет, не являющийся просто механическим устройством: это полнофункциональный датчик.

5.4 Аналоговый ввод

Как вы узнали из предыдущего раздела, Arduino может определять, было-ли приложено напряжение к одному из её выводов и сообщать это функции digitalRead(). Тип ответа "да/нет" хорош для многих приложений, но датчик света, который мы недавно использовали, может сообщить нам не только что свет есть, но также и сколько его. В этом и состоит разница между датчиками вк/выкл (который сообщает что что-то мы что-то имеем) и аналоговым датчиком, данные которого постоянно изменяются. Для чтения таких датчиком нам требуется другой тип выводов.

В правой нижней части платы Arduino вы видите шесть выводов, обозначенных "Analog In"; это специальные выводы, которые могут сообщить нам не только что к ним приложено напряжение, но и его величину. Используя функцию analogRead(), мы можем считывать это напряжение. Данная функция возвращает числа от 0 до 1023, которые соответствует напряжениям в пределах от 0 до 5 вольт. Например, для напряжения величиной 2,5 В, приложенного к выводу 0, функция analogRead(0) вернёт 512.

Теперь, если вы соберёте схему по рис. 5-6, используя резистор 10 кОм и запустите код из примера 5-3, вы увидите что светодиод на плате (также вы можете вставить светодиод в выводы 13 и GND как показано в разделе "Мигающий светодиод" из главы 4) мигает с частотой, зависящей от освещённости фотодатчика.

Рис. 5-6. Схема с аналоговым датчиком

Пример 5-6. Мигание светодиодом со скоростью, зависящей от величины на аналоговом входе

#define LED 13 // the pin for the LED

int val = 0; // variable used to store the value

 // coming from the sensor
void setup() {
 pinMode(LED, OUTPUT); // LED is as an OUTPUT

 // Note: Analogue pins are
 // automatically set as inputs

}

void loop() {

 val = analogRead(0); // read the value from
 // the sensor

 digitalWrite(13, HIGH); // turn the LED on

 delay(val); // stop the program for
 // some time

 digitalWrite(13, LOW); // turn the LED off

 delay(val); // stop the program for

 // some time
}

Теперь попробуйте пример 5-4, но перед этим вам придётся изменить свою схему. Посмотрите на рис. 5-4 ещё раз и соедините светодиод с выводом 9. Так как у вас уже есть собранная схема, вам надо найти точку платы где светодиод, провод и резистор не будет соединён с фотодатчиком.

Пример 5-4. Установка яркости светодиода, определяемая данными на аналоговом входе.

#define LED 9 // the pin for the LED

int val = 0; // variable used to store the value
 // coming from the sensor

void setup() {

 pinMode(LED, OUTPUT); // LED is as an OUTPUT

 // Note: Analogue pins are
 // automatically set as inputs
}

void loop() {

 val = analogRead(0); // read the value from
 // the sensor

 analogWrite(LED, val/4); // turn the LED on at
 // the brightness set
 // by the sensor

 delay(10); // stop the program for
 // some time
}

Примечание: мы указываем яркость, деля val на 4 из-за того, что analogRead() возвращает число до 1023, а analogWrite() принимает 255 максимум.

5.5 Попробуйте другие аналоговые датчики

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

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

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

5.6 Последовательная связь

Как вы прочли в начале книги, у Arduino есть USB-подключение, используемое средой разработки для загрузки кода в процессор. Хорошая новость в том, что это подключение также может использоваться скетчами для отправки назад на компьютер данных или получения команд от него. Для этой цели мы изучим обьект serial (обьект - это набор свойств, которые обьединены вместе для удобства пишущих скетчи людей).

Этот обьект содержит весь код, необходимый для отправки и получения данных. Сейчас мы используем предыдущую схему с фоторезистором и будем отправлять значения, которые прочли, на компьютер. Вставьте следующий код в новый скетч (его также можно скачать с www.makezine.com/getstartedarduino):

Пример 5-5. Отправка на компьютер данных, прочитанных с аналогового входа 0. После выгрузки скетча на плату нажмите кнопку "Serial Monitor" в IDE.

#define SENSOR 0 // select the input pin for the
 // sensor resistor

int val = 0; // variable to store the value coming

 // from the sensor

void setup() {

 Serial.begin(9600); // open the serial port to send
 // data back to the computer at
 // 9600 bits per second

}

void loop() {

 val = analogRead(SENSOR); // read the value from
 // the sensor

 Serial.println(val); // print the value to

 // the serial port

 delay(100); // wait 100ms between
 // each send
}

После того, как вы выгрузите скетч в Arduino, нажмите кнопку "Serial Monitor" в Arduino IDE (самая правая в панели кнопок); в открывшемся вы увидите постоянно увеличивающийся список цифр. Теперь любая программа, способная работать с последовательным портом, может вести диалог с Arduino. Существует много языков программирования, которые позволяют писать программы, общающиеся с последовательным портом. Processing (www.processing.org) является отличным дополнением к Arduino из-за того что и язык, и IDE очень похожи.

5.7 Управление большими нагрузками (электродвигатели, лампы и тому подобное)

Каждый из выводов Arduino может быть использован для запитки устройств с током до 20 миллиампер - это очень маленькая величина тока, достаточная только для питания светодиода. Если вы попробуете управлять чем-нибудь другим, например, моторчиком, вывод немедленно перестанет работать, и, вероятно, сожжёт весь процессор. Для управления большими нагрузками, такими как электродвигатели или лампы накаливания нам требуется внешний компонент, который может включать и выключать другие компоненты и который управляется выводом Arduino. Одним из таких приборов является MOSFET-транзистор (МОП-транзистор) - не обращайте внимания на смешное название - это электронный выключатель, который может управляться приложением напряжения на один из его трёх выводов, каждый из которых называется затвором. Он подобен выключателю света в доме, когда движение руки для включения или выключения света заменено выводом Arduino, подабщим напряжение на затвор такого транзистора.

Примечание: MOSFET означает "metal–oxide–semiconductor field-effect transistor" (металл-оксид-полупроводник (МОП) полевой транзистор). Это специальный вид транзистора, который может работать на принципе полевого эффекта. Это означает, что электричество будет протекать через частицу полупроводника (между выводами стока и истока) при прикладывании напряжения к выводу затвора. Так как затвор изолирован от остальных выводов плёнкой оксида металла, из Arduino в MOSFET ток не протекает, что позволяет создать простой интерфейс. Они идеальны для включения и выключения больших нагрузок с высокой частостой.

На рис. 5-7 видно как мы применили MOSFET IRF520 для включения и выключения маленького моторчика, присоединённого к вентилятору. Вы также должны заметить, что моторчик получает питание от разъёма 9 В на плате Arduino. Это ещё одно преимущество MOSFET: он позволяет управляет приборами, у которых питание осуществляется от других источников. Так как MOSFET подключён к выводу 9, мы может использовать команду analogWrite() для управления скоростью моторчика при помощи ШИМ.

5.8 Сложные сенсоры

Мы определим сложные сенсоры как такие, которые могут выдавать информацию, что требует больше чем просто функции digitalRead() или analogRead(). Обычно они представляют собой маленькую схему с небольшим микроконтроллером внутри, который предварительно обрабатывает информацию.

Некоторые из таких сложных сенсоров являются ульразвуковыми или инфракрасными датчиками расстояния, акселерометрами. Вы можете увидеть примеры на нашем сайте в разделе "Tutorials" (www.arduino.cc/en/Tutorial/HomePage).

Книга "Making Things Talk" (автор - Tom Igoe, издательство O'Reilly) подробно разъясняет принципы этих сенсоры, а также множество других.

Рис. 5-7. Схема двигателя вентилятора с Arduino



Презентация проекта SERVODROID Закрыть
Если презентация не появилась 5 секунд - просто нажмите на пустой центр панели