Ардуино. Урок 3. ( Продолжение). Часть 1. Вывод информации из цифровых входов. Полезный совет 1. Для увеличения эффекта свечения светодиодов, на них можно надеть пластмассовые трубки. Пьезоизлучатель звука. Термин пьезо происходит от греческого слова «давить» или «сжимать». Много лет назад исследователи, неожиданно обнаружили, что при механической деформации некоторых материалов вырабатывается электричество. Это явление назвали пьезоэлектричеством. (Первое исследование пьезоэлектрического эффекта осуществлено П. Кюри (1880) на кристалле кварца. Пьезоэлектрический эффект обнаружен более чем у 1500 веществ.) Потом оказалось, что если приложить к таким материалам напряжение, они меняют свою форму (хотя и очень незначительно). Это явление назвали электрострикцией. Позже оказалось, что это открытие имеет важное значение для науки и техники, поскольку стало возможным использовать пьезоэлектрики в тысячах различных практических применениях: кварцевых часах, электронных будильниках, системах зажигания и зажигалках и т.д. Сейчас мы рассмотрим применение электрострикции в приборах, которые называются пьезоизлучатели. Мы будем использовать пьезодатчик (Piezo Transducer), который позволяет генерировать звуковые волны в диапазоне частот 20 Гц - 20 000 Гц. Нужный нам для опытов пьезоизлучатель можно выломать из старой игрушки (тетрис, тамагочи) или музыкальной открытки. — схема проста, один вывод от пьезоизлучателя подключается к земле, а второй (от центра пластинки/провод красного цвета) к выводу digital pin 3. Код скетча: int p = 3; void setup() { pinMode(p, OUTPUT); } void loop() { tone (p, 500); delay(100); tone(p, 1000); delay(100); } //объявляем переменную с номером пина, на который мы //подключили пьезоэлемент //процедура setup //объявляем пин как выход //процедура loop //включаем на 500 Гц //ждем 100 Мс //включаем на 1000 Гц //ждем 100 Мс Часть 2. Ввод информации в цифровые входы. Без подсоединений цифровые входы «плавают» между 0 и 5 В. Чтобы на цифровом входе/выходе был логический 0, соединим его с минусом ( GND) резистором на 10 к ( он называется стягивающим резистором). Тогда на выходе будет логический 0. Чтобы на входе появилась логическая единица, необходимо с помощью кнопки, соединить его с плюсом V ( 5 В). Чтобы на цифровом входе/выходе была логическая единица ( 5 В), соединим его с плюсом резистором на 10 к ( он называется подтягивающим резистором). Тогда на выходе будет логическая единица. Чтобы на входе появилась логический нуль, необходимо с помощью кнопки, соединить его с минусом GND. Все что мы рассмотрели, связано с очень полезным элементом в Ардуине – кнопкой. Цифровой ввод — кнопка Настало время попробовать поработать с вводом : Для начала, возьмём обычную кнопку и соберём такую простую схему: как видно – это дополненная схема Blink-а :) Что же происходит на 2-м цифровом порту? Если к порту ничего не подключено – его состояние меняется между 0V и 5V (LOW & HIGH). Подключая резистор между портом и землёй — мы тем самым «прижимаем» порт к 0 (LOW), а при нажатии кнопки происходит соединение с напряжением питания и тем самым порт «подтягивается» к 5V (HIGH). Тем самым мы узнаём – нажата кнопка или нет – просто считывая значение на входе 12 цифрового порта и проверяя – HIGH это или LOW. Кроме кнопки с резистором R1 , мы видим на схеме светодиод с резистором R2, подключенным к GND. Это одна из базовых схем, которая неоднократно пригодиться вам в будущем и может использоваться для управления роботом на Arduino. В вашем будущем роботе по нажатию кнопки могут происходить самые разные действия. Скетч к этой схеме написан таким образом, что при нажатой кнопке светодиод будет гореть, при отжатой – не гореть. Вот так будет выглядеть схема после сборки на плате прототипирования. int button = 2; // Кнопку //подключаем к pin 2 // Светодиод подключаем к pin 6 int led = 6; void setup() { pinMode(led, OUTPUT); // pin 6 настраиваем на выход pinMode(button, INPUT); // pin 2 настраиваем на вход } void loop(){ if (digitalRead(button) == HIGH) // Если кнопка нажата { digitalWrite(led, HIGH); // то светодиод горит } else { digitalWrite(led, LOW); // иначе светодиод не горит } } Устранение дребезга контактов. У кнопки есть один большой недостаток – дребезг контактов. Дело в том, что когда нажимаешь на кнопку, ее контакты замыкаются не сразу, когда кнопка только нажимается, то происходит многократное замыкание и размыкание контактов. Микропроцессор Ардуино обладает большим быстродействием, поэтому он не понимает что надо делать – включать или выключать ! Чтобы этого не происходило существуют разные решения – собираются специальные схемы или создают специальные программы. Рассмотрим скетч, который позволяет устранять дребезг контактов кнопки. Скетч. #define BUTTON_PIN 3 #define LED_PIN 13 boolean buttonWasUp = true; // была ли кнопка отпущена? boolean ledEnabled = false; // включен ли свет? void setup() { pinMode(LED_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // определить момент «клика» несколько сложнее, чем факт того, // что кнопка сейчас просто нажата. Для определения клика мы // сначала понимаем, отпущена ли кнопка прямо сейчас... boolean buttonIsUp = digitalRead(BUTTON_PIN); // ...если «кнопка была отпущена и (&&) не отпущена сейчас»... if (buttonWasUp && !buttonIsUp) { // ...может это «клик», а может и ложный сигнал (дребезг), // возникающий в момент замыкания/размыкания пластин кнопки, // поэтому даём кнопке полностью «успокоиться»... delay(10); // ...и считываем сигнал снова buttonIsUp = digitalRead(BUTTON_PIN); } if (!buttonIsUp) // если она всё ещё нажата... // ...это клик! Переворачиваем сигнал светодиода { ledEnabled = !ledEnabled; digitalWrite(LED_PIN, ledEnabled); } } // запоминаем последнее состояние кнопки для новой итерации buttonWasUp = buttonIsUp; } Эта программа довольно сложная. Но если нужно устранить дребезг контактов кнопки, то она будет Вам необходима. Существует очень много различных типов кнопок и переключателей. На рисунке изображены некоторые из них : магнитный, шестналцатичичный, датчик наклона, рычажный переключатель и т.д. Если кнопки, шестнадцатеричный и рычажный переключатели просты по устройству и напоминают кнопку, то магнитный переключатель и датчик наклона рассмотрим поподробнее. Геркон, представляет из себя стеклянную трубку, в которой находятся два разомкнутых контакта – медный и стальной. Внутри геркона находится вакуум. При поднесении к геркону магнита со стороны медного контакта, стальной контакт притягивается и контактная цепь замыкается. Короче говоря, геркон представляет из себя кнопку, управляемую магнитом, лучше неодимовым. Он способен коммутировать напряжение до 200В, Коммутируемая мощность контакта 10Вт. Подключите левый контакт V к + 5 В, правый к верхнему концу резистора R1, а нижний конец резистора к GND. К выходу 4 Ардуино подключите светодид, к ножке 4 + светодиода, а минус светодиода соедините через резистор 250 -1000 Ом с GND. После сборки цепи светодиод гореть не будет, так как контакты геркона разомкнуты. Если будете подносить неодимовый магнит к геркону, то контакты геркона замкнутся и светодиод загорится. Cхему с герконом можно применить вместо кнопки, описанной выше. Скетч будут точно такой же. К контактным датчикам относится и датчик наклона. В простейшее случае он представляет герметичный сосуд ( см. вверху рисунка) с двумя металлическими контактами. В сосуде находится капелька ртути. Когда сосуд наклонен влево, то ртуть не замыкает контакты, а если сосуд наклонить вправо, то контакты замыкаются. Внизу изображен датчик наклона без ртути. Внутри него находятся три контакта, электролит ( любой) и воздушный пузырь. В горизонтальном состоянии все три контакта замкнуты электролитом и через контакты может идти электрический ток. При наклоне датчика вправо – воздушный пузырь ( см. рисунок внизу) Размыкает левый и средний контакты и наоборот. Датчик наклона позволяет автоматически удерживать любой аппарат ( самолет, квадролет, летающую тарелку и т.д.) в горизонтальном положении. Слева изображен промышленный датчик наклона. Часть 3. Управление напряжением на цифровых выходах «Arduino» ШИМ (PWM). Вам уже известно, что на цифровых выходах «Arduino» могут быть два уровня напряжения 0В и 5В. Но разработчики «Arduino» предусмотрели и такой вариант :если на цифровой выход подать прямоугольные импульсы с переменной скважностью, то тогда эффективное напряжение на цифровом выходе будет изменяться. Давайте выясним, что такое скважность. Рассмотрим симметричный прямоугольный импульс ( рис.4). Скважностью называют безразмерную физическую величину, характеризующую любую импульсную систему. Она обозначается буквой S и определяется отношением периода импульсных сигналов T к их длительности. S = T/τ. Если длина импульса равна половине периода, то скважность равна двум, такой сигнал называется меандром. Длительность такого импульса и паузы между импульсами в периоде равны. Скважность может выражаться в процентах и является важной характеристикой импульсной системы. У нас она выражается в вольтах. Так вот, если в «Arduino» программно изменять скважность, то на цифровых выходах (3, 5, 6, 9, 10, 11) можно изменять напряжение от 0 В до 5 В. На научном языке это называется ШИМ ( англ. PWM) Широтно-Импульсная Модуляция. Обратите внимание ! Контакты 3, 5, 6, 9, 10, 11 имеют двойное назначение : вход/выход и ШИМ (PWM). Arduino Mega построена на микроконтроллере ATmega1280 . Платформа содержит 54 цифровых входа/выходов ( 14 из которых могут использоваться как выходы ШИМ ), 16 аналоговых входов, кварцевый генератор 16 МГц, разъем USB, силовой разъем и кнопку перезагрузки. Значение, которое можно передавать в analogWrite должно быть между 0 и 255, что соответствует напряжению от 0V до 5V на выходе порта. Т.е. постепенно увеличивая/уменьшая переданное в analogWrite значение можно добиться плавного роста/падения напряжения на выходе. Теперь, подключив к одному из PWM-портов ардуины (3, 5, 6, 9, 10, 11, ) светодиод будет плавно загораться и затухать (fading). Остаётся собрать простейшую схему и скомпилировать скетч :) int value = 0; //здесь храним значение яркости int ledpin = 9; //светодиод подключим к 9 контакту void setup() { pinMode(ledpin, OUTPUT); //устанавливаем 6 контакт в режим вывода } void loop() { for(value = 0 ; value <= 255; value+=5) //плавно зажигаем светодиод { analogWrite(ledpin, value); //выставляем значение delay(30); //небольшая пауза } for(value = 255; value >=0; value-=5) //плавно гасим { analogWrite(ledpin, value); delay(30); } } Программа очень простая, и по исходному тексту и комментариям все должно быть понятно. В программе используется циклы (оператор for). В первом цикле переменная value изменяется от 0 до 255 с шагом 5, во втором – от 255 до 0 с тем же шагом 5. Настоящего аналогового выхода в данном микроконтроллере нет, но на выводы 3, 5, 6, 9, 10, 11 можно подавать сигнал с широтно-импульсной модуляцией (ШИМ). Здесь мы не будем разбирать точные, математически строгие формулировки, а попробуем проще всего объяснить, о чем идет речь. Мы уже научились устанавливать на выходе микроконтроллера одно из двух значений – 0, либо +5 Вольт, и какие-то другие значения постоянного напряжения микроконтроллер формировать не может. Но что делать, если мы захотим получить +2,5 Вольта? Строгого решения этой задачи у нас не получится, но можно с большой частотой переключать выход из низкого в высокое состояние и обратно. В таком случае, светодиод, подключенный к такому выводу, будет гореть в половину яркости (на самом деле он будет очень часто мигать), а среднее значение сигнала за период будет +2,5 Вольта. Меняя соотношение между временем нахождения выхода в высоком и низком состоянии, можно получать различные средние значения напряжения. Хорошая новость заключается в том, что нам предоставляется функция analogWrite, а все сложности реализации скрыты от наших глаз. Функция принимает 2 параметра – номер вывода (не забываем, что ШИМ сигнал можно выводить только на выводы 3, 5, 6, 9, 10, 11), и величину, пропорциональную среднему значению напряжения. 0 соответствует 0 Вольтам, а 255 - +5 Вольтам. Таким образом, чтобы получить на 3м выводе +2,5 Вольта, а на 5м +1 Вольт, мы сделаем так: analogWrite(3, 128); // 255/2 = 128 analogWrite(5, 51); // 255/5 = 51 Светодиод нужно подключить на выводы 3, 5, 6, 9, 10, 11 ШИМ (PWM) через ограничительный резистор номиналом от 200 до 1500 Ом, и с соблюдением полярности – иначе он просто не загорится.. Так как на выходе ШИМ присутствует прямоугольное пульсирующее напряжение, То параллельно светодиоду нужно подключить конденсатор С, который будет поддерживать напряжение на светодиоде постоянным. // Используя генератор случайных чисел, можно эмулировать мерцающее пламя свечи с //помощью светодиода, int ledPin = 9; // выбор пина для светодиода int val = 0; // переменная для хранения текущей яркости светодиода int delayval = 0; int delayval; // переменная для хранения текущего времени задержки void setup() { randomSeed(0); // запустить генератор случайных чисел pinMode(ledPin, OUTPUT); // объявить ledPin выходом } void loop() { val = random(100,255); // выбрать случайное число между 100 и 255 analogWrite(ledPin, val); // установить яркость светодиода delayval = random(50,150); // выбрать случайное число между 30 и 100 delay(delayval); // подождать это число миллисекунд } Домашнее задание : 1. Повторение. Обзор элементов Ардуино. 2. Свечение светодиодов через RND. 3. Пьезоизлучатели. Устройство и принцип действия. 4. Воспроизведение звука через пьезоизлучатель. 5. Стягивающие и подтягивающие резисторы. 6. Кнопка. Типы кнопок. Датчик наклона. 7. Включение и выключение светодиода кнопкой. 8. ШИМ (PWM). 9. Автоматическое изменение яркости горения светодиода. Fade. 10. Ручное изменение яркости горения светодиода. 11. Собственный проект на базе пьезоизлучателей , различных кнопок и управление яркости горения светодиода .