На попередніх уроках ми познайомилися з найпростішими схемами — збиранням та . Сьогодні збираємо модель з потенціометром (змінним резистором) та світлодіодом. Така модель може використовуватися для керування роботом.
Потенціометр- Це змінний резистор із регульованим опором.Потенціометри використовують у робототехніці як регулятори різних параметрів — гучності звуку, потужності, напруги тощо. У нашій моделівід повороту ручки потенціометрабуде залежати яскравість світлодіода. Це також одна із базових схем.
Відео-інструкція складання моделі:
Для складання моделі нам знадобиться:
Що знадобиться для підключення потенціометра та світлодіода на Arduino?
Схема підключення моделі Arduino з потенціометром та світлодіодом:
Схема підключення моделі Arduino з потенціометром та світлодіодом
Для роботи цієї моделі підійде наступна програма (програму ви можете просто скопіювати в Arduino IDE):
// даємо імена пінів зі світлодіодом
// і потенціометром
#define led 9
#define pot A0
void setup()
{
// пін зі світлодіодом - вихід
pinMode(led, OUTPUT);
// пін з потенціометром – вхід
pinMode(pot, INPUT);
}
void loop()
{
// Оголошуємо змінну x
int x;
// зчитуємо напругу з потенціометра:
// буде отримано число від 0 до 1023
// ділимо його на 4, вийде число в діапазоні
// 0-255 (дрібна частина буде відкинута)
x = analogRead(pot)/4;
// Видаємо результат на світлодіод
analogWrite(led, x);
}
Так виглядає зібрана модель Arduino потенціометра зі світлодіодом:
Модель Arduino з потенціометром та світлодіодом у зібраному вигляді
На цьому третій урок Arduino для початківців закінчено. Далі буде!
Пости з уроків:
І спробуємо виконати нове завдання. Думаю, що всі бачили новорічні вітринні гірлянди, де плавно блимають світлодіоди. Допустимо, що ми хочемо зробити щось подібне.
Ми вже розглядали функцію digitalWrite() і знаємо, що значення, яке вона записує, може бути двох варіантів – високий чи низький рівень. В цьому випадку нам допоможе функція analogWrite(). "Формулювання" функцій відрізняються лише початковими приставками, тому їх легко запам'ятати.
Функція analogWrite(), так само як і digitalWrite(), містить у дужках два аргументи і працює за тим самим словесним принципом: "куди, що". Головною відмінністю є можливість запису широкого діапазону значень замість звичного LOW чи HIGH. Це дозволить нам регулювати яскравість світлодіода. Головне зауваження, яке необхідно враховувати, те, що ця функція працює тільки на певних контактах. Ці контакти позначені символом "~". Цей символ означає, що це PWM-контакт. PWM (pulse-width modulation) звучить російською мовою ШІМ (широтно-імпульсна модуляція). Принцип роботи ґрунтується на зміні тривалості імпульсу. Графічно це можна зобразити так:
Спробуймо розібратися як це працює, розглянувши простий приклад. Для цього необхідно підключити світлодіод до PWM-контакту через резистор номіналом 150 Ом і зашити в Arduino простеньку програму. Схема підключення та код скетчу представлені нижче:
void setup()
{
pinMode(led,OUTPUT);
}void loop()
{
for(int i=0; i<=255; i++)
{
analogWrite(led,i);
delay(10);
}
for(int i=255; i>=0; i--)
{
analogWrite(led,i);
delay(10);
}
}
Думаю, що загалом код зрозумілий, але необхідно приділити трохи уваги циклу for(). Існує таке поняття як дозвіл. Оскільки ми працюємо з 8-бітною роздільною здатністю (це буде розглянуто трохи пізніше), то мінімальному значенню буде відповідати 0, а максимальному - 255. Наприкінці кожної ітерації ми встановили тимчасову затримку в 10мс.
Повернімося до схеми з попереднього уроку і спробуємо зробити аналогічну гірлянду з використанням функції analogWrite().
int buttonPin = 2;
int pins = (3,5,6,9,10,11);boolean lastButton = LOW;
boolean currentButton = LOW;
boolean enable = false;void setup()
{
pinMode(buttonPin, INPUT);
for(int mode = 0; mode<= 5; mode++) pinMode(pins, OUTPUT);
}boolean debounce(boolean last)
{
boolean current = digitalRead(buttonPin);
if(last != current)
{
delay(5);
current = digitalRead(buttonPin);
}
return current;
}void loop()
{
currentButton = debounce(lastButton);
if(lastButton == LOW && currentButton == HIGH)
{
enable = ! enable;
}If(enable == true)
{
for (int i=0; i<=5; i++)
{
for (int brightness = 0; brightness<= 255; brightness++)
{
delay(1);
}
delay(40);
}
for (int i=0; i<=5; i++)
{
for (int brightness = 255; brightness >= 0; brightness--)
{
analogWrite(pins[i], brightness);
delay(1);
}
delay(40);
}
}If(enable == false)
{
for(int i = 0; i<= 5; i++) digitalWrite(pins[i], LOW);
}LastButton = currentButton;
}
Сподіваюся, що ця стаття була для Вас корисною. У наступному уроці ми розглянемо переривання в Arduino і досягнемо належного результату.
У функції setup() необхідно призначити висновок 9 виходом.
Функція analogWrite(), яку ви будете використовувати в основному циклі, має два аргументи: перший говорить функції, який висновок використовувати, в другий записують значення для ШІМ.
Для того щоб плавно збільшити яскравість світлодіода, а потім плавно зменшити вам потрібно спочатку збільшувати значення ШІМ від 0 (світлодіод вимкнено) до 255 (максимальна яскравість), а потім навпаки. У нашій програмі змінна, що відповідає за значення ШІМ, називатиметься brightness. У кожному циклі ця змінна зміниться на значення fadeAmount.
Як тільки освіта досягне значення 255 або 0 fadeAmount змінить свій знак. У такий спосіб ми зможемо змінити збільшення яскравості зниження і навпаки.
analogWrite() змінює значення ШІМ дуже швидко, тому потрібна затримка контролю швидкості зміни яскравості. Ви можете самі змінювати значення затримки та дивитися як це позначиться на роботі.
Повний текст програми:
/*
Цей приклад показує, як змінювати яскравість світлодіода на виведенні.
використовуючифункціюanalogWrite().
*/
int led = 9; // висновоксвітлодіода 9
int brightness = 0; // Змінна відповідальна за яскравість
int fadeAmount = 5; // Змінна, яка задає швидкість зміни яскравості за цикл
// налаштування:
void setup() {
// призначимо висновок 9 виходом:
pinMode (led, OUTPUT);
// основний цикл:
void loop () {
// Встановлюємо яскравість світлодіода на виводі 9:
analogWrite (led, brightness);
// Змінимо значення яскравості для наступного проходу циклу:
brightness = brightness + fadeAmount;
// поміняємо напрямок зміни яскравості :
if (brightness == 0 || brightness == 255) {
fadeAmount = -fadeAmount;
// Чекаємо 30 мілісекунд для спостереження ефекту димування:
delay (30);
ще 1 світлодіод
ще 1 резистор номіналом 220 Ом
ще 2 дроти
Ми підключили "землю" світлодіода та змінного резистора (потенціометра) до довгої рейки "-" макетної плати, і вже її з'єднали з входом GND мікроконтролера. Таким чином ми використовували менше входів і від макетки до контролера тягнеться менше дротів.
Підписи «+» та «-» на макетці не зобов'язують вас використовувати їх строго для харчування, просто найчастіше вони використовуються саме так і маркування нам допомагає
Не важливо, яка з крайніх ніжок потенціометра буде підключена до 5, а яка до GND, зміниться тільки напрям, в якому потрібно крутити ручку для збільшення напруги. Запам'ятайте, що сигнал ми зчитуємо із середньої ніжки
Для зчитування аналогового сигналу, що приймає широкий спектр значень, а не просто 0 або 1, як цифровий, підходять тільки порти, позначені на платі як Analog In і пронумеровані з префіксом A . Для Arduino Uno – це A0-A5.
p030_pot_light.ino // даємо розумні імена для пінів зі світлодіодом // і потенціометр (англ potentiometer або просто «pot»)#define LED_PIN 9 #define POT_PIN A0 void setup() ( // пін зі світлодіодом - вихід, як і раніше. pinMode(LED_PIN, OUTPUT); // ...а ось пін з потенціометром має бути входом // (англ. «input»): ми хочемо зчитувати напругу,// Видається їм pinMode(POT_PIN, INPUT); ) void loop() ( // заявляємо, що далі ми будемо використовувати 2 змінні з // іменами rotation і brightness, і що зберігатимемо в них будемо // Цілі числа (англ. "integer", скорочено просто "int") int rotation, brightness; // зчитуємо в rotation напругу з потенціометра: // мікроконтролер видасть число від 0 до 1023 // пропорційне куту повороту ручки rotation = analogRead(POT_PIN); // у brightness записуємо отримане раніше значення rotation // поділено на 4. Оскільки у змінних ми забажали зберігати // Цілі значення, частина від розподілу буде відкинута. // В результаті ми отримаємо ціле число від 0 до 255 brightness = rotation / 4; // Видаємо результат на світлодіод analogWrite(LED_PIN, brightness) ; )
За допомогою директиви #define ми сказали компілятор замінити ідентифікатор POT_PIN на A0 - номер аналогового входу. Ви можете зустріти код, де звернення до аналогового порту буде за номером без індексу A . Такий код буде працювати, але, щоб уникнути плутанини з цифровими портами, використовуйте індекс.
Змінним прийнято давати назви, що починаються з малої літери.
Щоб використовувати змінну, необхідно її оголосити, що ми робимо інструкцією:
Змінні одного типу можна оголосити в одній інструкції, перерахувавши їх через кому, що ми і зробили
Функція analogRead(pinA) повертає ціле значення в діапазоні від 0 до 1023, пропорційне напруги, поданому на аналоговий вхід, номер якого ми передаємо функції як параметр pinA
Зверніть увагу, як ми отримали значення, повернене функцією analogRead() : ми просто помістили його в змінну rotation за допомогою оператора присвоєння = , який записує те, що знаходиться праворуч від нього ту змінну, яка стоїть зліва
Чи можемо ми під час складання схеми підключити світлодіод та потенціометр безпосередньо до різних входів GND мікроконтролера?
В який бік потрібно крутити змінний резистор збільшення яскравості світлодіода?
Що буде, якщо стерти з програми рядок pinMode (LED_PIN, OUTPUT)? Рядок pinMode(POT_PIN, INPUT) ?
Навіщо ми ділимо значення, отримане з аналогового входу перед тим, як встановити яскравість світлодіода? що буде, якщо цього зробити?
На цьому прикладі ви навчитеся змінювати яскравість світлодіода, використовуючи резистори з різним опором.
1 світлодіод діаметром 5 мм
1 резистор на 270 Ом (червоний, фіолетовий, коричневий)
1 резистор на 470 Ом (жовтий, фіолетовий, коричневий)
1 резистор на 2.2 кОм (червоний, червоний, червоний)
1 резистор на 10 ком (коричневий, чорний, помаранчевий)
Світлодіоди чудово служать у пристроях для різного роду індикації. Вони споживають мало електрики і при цьому довговічні.
У цьому прикладі ми використовуємо найпоширеніші світлодіди діаметром 5 мм. Також поширені світлодіоди діаметром 3 міліметри, та й великі світлодіоди діаметром 10 мм.
Підключати світлодіод безпосередньо до батареї або джерела напруги не рекомендується. По-перше, треба спочатку розібратися, де саме у світлодіода негативна та позитивна ноги. Ну а по-друге, необхідно використовувати струмообмежуючі резистори, інакше світлодіод дуже швидко перегорить.
Якщо ви не використовуватимете резистор зі світлодіодом, останній дуже швидко вийде з ладу, тому що через нього проходитиме занадто велика кількість струму. В результаті світлодіод нагріється і контакт, що генерує світло, зруйнується.
Розрізнити позитивну та негативну ноги світлодіода можна двома способами.
Перший – позитивна нога довша.
Другий - при вході в корпус самого діода на конектор негативної ноги є плоска кромка.
Якщо вам потрапив світлодіод, на якому плоска кромка на довшій нозі, довга нога все одно є позитивною.
Resist – опір (англ.)
З назви можна здогадатися, що резистори опираються потоку електрики. Чим більший номінал (Ом) резистора, тим більший опір і тим менше струму пройде ланцюгом, в якому він встановлений. Ми будемо використовувати цю властивість резисторів регулювання струму, який проходить через світлодіод і, таким чином, його яскравість.
Але спочатку погоримо трохи про резистори.
Одиниці, в яких вимірюється опір - Ом, які в багатьох джерелах позначаються грецькою буквою Ω - Омега Так як Ом - маленьке значення опору (практично непомітне в ланцюзі), ми часто будемо оперувати такими одиницями як ком - кілом (1000 Ом) та МОм мегаом (1000000 Ом).
У цьому прикладі ми будемо використовувати резистори з чотирма різними номіналами: 270 Ω, 470 Ω, 2.2 кΩ та 10 кΩ. Розміри цих резисторів однакові. Колір також. Єдине, що їх розрізняє кольорові смужки. Саме з цих смужок візуально визначається номінал резисторів.
Для резисторів, у яких три кольорові смужки та остання золотиста, працюють наступні відповідності:
Коричневий 1
Червоний 2
Помаранчевий 3
Зелений 5
Фіолетовий 7
Перші дві смужки позначають перші 2 числові значення, так що червоний, філетовий означає 2, 7. Наступна смужка – кількість нулів, які необхідно поставити після перших двох цифр. Тобто якщо третя смужка коричнева, як на фото вище, буде один нуль і номінал резистора дорівнює 270 Ω.
Резистор із смужками коричневого, чорного, помаранчевого кольорів: 10 і три нулі, так що 10000 Ω. Тобто 10 кΩ.
На відміну від світлодіодів, у резисторів немає позитивної та негативної ніг. Якою саме ногою підключати їх до живлення/землі – не має значення.
Підключіть відповідно до схеми, наведеної нижче:
На Arduino є пін на 5 для живлення периферійних пристроїв. Ми будемо його використовувати для живлення світлодіода та резистора. Більше вам від плати нічого не потрібно, тільки підключити її через USB до комп'ютера.
З резистором на 270 Ω світлодіод повинен горіти досить яскраво. Якщо ви замість резистора на 270 Ω встановите резистор номіналом 470 Ω, світлодіод горітиме не так яскраво. З резистором на 2.2 кΩ, світлодіод повинен ще трохи згаснути. Зрештою, з резистором 10 кΩ, світлодіод буде ледве видно. Цілком ймовірно, щоб побачити різницю на останньому етапі вам доведеться витягнути червоний перехідник, використавши його як перемикач. Тоді ви зможете побачити різницю у яскравості.
До речі, можна провести цей досвід і за вимкненого світла.
У момент, коли до однієї ноги резистора підключено 5, друга нога резистора підключається до позитивної ноги світлодіода, а друга нога світлодіода підключена до землі. Якщо ми перемістимо резистор так, що він розташовуватиметься за світлодіодом, як показано нижче, світлодіод все одно горітиме.
Ми можемо підключити світлодіод до виходу Arduino. Перемістіть червоний провід від піна живлення 5V до D13, як показано нижче.
Тепер завантажте приклад Blink, який ми розглядали . Зверніть увагу, що обидва світлодіоди – вбудований та встановлений вами зовнішній почали блимати.
Спробуємо використовувати інший пін на Arduino. Скажімо, D7. Перемістіть конектор з піна D13 на пін D7 і змініть наступний рядок коду:
Завантажте змінний скетч на Arduino. Світлодіод продовжуватиме блимати, але цього разу, використовуючи харчування від піна D7.