Аналоговий регулятор
Вступ
На попередніх уроках ми вже розглядали тактильний спосіб взаємодії з Дроном – через кнопки. Обмеженням цього способу є те, що кнопка має лише 2 стани – натиснута чи не натиснута. Відповідно, є два способи як можна відреагувати на натиснення кнопки, наприклад увімкнути чи вимкнути світлодіод, увімкнути чи вимкнути пищалку, пропелер і так далі. А що як треба буде увімкнути 10, 20, 30 світлодіодів? Додавати 30 кнопок у свій пристрій, щоб керувати кожним світлодіодом окремо? Це занадто, користувач не оцінить такого. Тут на допомогу приходять аналогові регулятори, які можна додати в будь-який пристрій і до нашого Дрона теж. Аналоговий регулятор може видавати в програму значення в набагато ширшому діапазоні ніж просто 0 і 1. Їх існує багато різних типів, але розглянемо кілька, які можна підключити до Дрона:
- Механічні. Треба їх покрутити руками вправо або вліво
- Оптичні. Треба на них направити світло або навпаки затінити рукою
Аналогові регулятори
Аналогові регулятори це насправді ті самі резистори, можливо уже знайомі Вам з уроків фізики. Змінні резистори (потенціометри) можуть плавно обмежувати струм в електричному колі. Завдяки цій плавній зміні наш Дрон зможе отримувати різні числові показники. Для порівняння, зчитуючи показання кнопки ми можемо отримати числові значення лише від 0 до 1, а з аналогового регулятора ми можемо отримати діапазон від 0 до 1023. Це набагато більше і значно розширює можливості керування побутовими пристроями, а в нашому випадку - Дроном
Раніше ми використовували функцію digitalRead
, щоб зчитувати 0 чи 1 з кнопки. Нажаль вона нам не підходить для зчитування показників з аналогових регуляторів. Для цього є інша функція – analogRead
. Вона дозволяє отримати значення вже від 0 до 1023 з аналогового регулятора в нашій програмі. Давайте напишемо програму, яка буде зчитувати число з механічного регулятора і відправляти на комп’ютер по серійному інтерфейсу, знайомому нам з попереднього уроку
1void setup() {
2 pinMode(PA11, INPUT);
3 Serial.begin(115200);
4 delay(2000);
5}
6
7void loop() {
8 int regulator = analogRead(PA11);
9 Serial.println(regulator);
10 delay(100);
11}
1void setup() {
2 pinMode(PA11, INPUT); //переводимо пін в режим на ВХІД, щоб зчитувати показники регулятора
3 Serial.begin(115200); //відкриваємо серійне з'єднання з комп'ютером
4 delay(2000); //відкриття з'єднання потребує трохи часу, тому чекаємо 2 секунди
5}
6
7void loop() {
8 int regulator = analogRead(PA11); //зчитуємо показники і записуємо в змінну 'regulator'
9 Serial.println(regulator); //відправляємо зчитане число на комп'ютер
10 delay(100); //це все повторюємо кожні 100 мілісекунд (10 разів в секунду)
11}
Підключіть механічний аналоговий регулятор (далі просто “крутилка”) до піна PA11, переведіть Дрон в режим програмування та завантажте програму на Дрон. В Ардуїно відкрийте панель Монітор порту і плавно повертайте крутилку на Дроні. Які повідомлення приходять від Дрона?
Просто відправляти показники на комп’ютер це не дуже корисна функція. Давайте зробимо нашу програму корисною і на основі чисел отриманих з регулятора будемо наприклад запалювати світлодіоди. Ми вже пересвідчились, що крутилка видає нам числа від 0 до 1023. Давайте будемо запалювати перший світлодіод (PA5) на Дроні, якщо крутилка видала число більше 0, ще і другий світлодіод якщо видала більше 200, і ще 3-ій – якщо більше 400, і 4-ий – якщо більше 600, і 5-ий – якщо більше 800. Тобто ми розбили 1023 на 5 приблизно рівних частини і в кожній частині буде загорятися додатково ще один світлодіод
1void setup() {
2 pinMode(PA11, INPUT);
3
4 pinMode(PA5, OUTPUT);
5 pinMode(PA7, OUTPUT);
6 pinMode(PB0, OUTPUT);
7 pinMode(PA12, OUTPUT);
8 pinMode(PB3, OUTPUT);
9 Serial.begin(115200);
10 delay(2000);
11}
12
13void loop() {
14 int regulator = analogRead(PA11);
15 Serial.println(regulator);
16
17 digitalWrite(PA5, 0);
18 digitalWrite(PA7, 0);
19 digitalWrite(PB0, 0);
20 digitalWrite(PA12, 0);
21 digitalWrite(PB3, 0);
22
23 if (regulator > 0) {
24 digitalWrite(PA5, 1);
25 }
26 if (regulator > 200) {
27 digitalWrite(PA7, 1);
28 }
29 if (regulator > 400) {
30 digitalWrite(PB0, 1);
31 }
32 if (regulator > 600) {
33 digitalWrite(PA12, 1);
34 }
35 if (regulator > 800) {
36 digitalWrite(PB3, 1);
37 }
38 delay(100);
39}
1void setup() {
2 pinMode(PA11, INPUT); //якщо хочемо зчитувати з крутилки, то ставимо режим на ВХІД
3
4 pinMode(PA5, OUTPUT); //всі світлодіоди переводимо в режим на ВИХІД, щоб керувати ними
5 pinMode(PA7, OUTPUT);
6 pinMode(PB0, OUTPUT);
7 pinMode(PA12, OUTPUT);
8 pinMode(PB3, OUTPUT);
9 Serial.begin(115200); //відкриваємо серійне з'єднання з комп'ютером
10 delay(2000); //відкриття з'єднання потребує трохи часу, тому чекаємо 2 секунди
11}
12
13void loop() {
14 int regulator = analogRead(PA11); //зчитуємо показники і записуємо в змінну 'regulator'
15 Serial.println(regulator); //відправляємо зчитане значення на комп'ютер
16
17 digitalWrite(PA5, 0); //кожного циклу, вимикаємо всі світлодіоди
18 digitalWrite(PA7, 0); //щоб далі в тій же ітерації циклу увімкнути лише потрібні
19 digitalWrite(PB0, 0);
20 digitalWrite(PA12, 0);
21 digitalWrite(PB3, 0);
22
23 if (regulator > 0) {
24 digitalWrite(PA5, 1); //вмикаємо світлодіоди згідно значення з крутилки
25 }
26 if (regulator > 200) {
27 digitalWrite(PA7, 1);
28 }
29 if (regulator > 400) {
30 digitalWrite(PB0, 1);
31 }
32 if (regulator > 600) {
33 digitalWrite(PA12, 1);
34 }
35 if (regulator > 800) {
36 digitalWrite(PB3, 1);
37 }
38 delay(100); //затримкa 100мс означає, що буде 10 спрацюваннь 'loop' за 1с
39}
Переведіть Дрон в режим програмування, завантажте нову програму. Покрутіть крутилку, підключену до піна PA11 в різні сторони. Чи реагує Дрон?
Фоторезистор
Як раніше уже згадувалось, окрім механічних резисторів є ще оптичні – фоторезистори. Фоторезистор змінює свій опір в залежності від кількості світла, яке на нього падає. Якщо темно – значення ближче до 1023, якщо світло – значення ближче до 0. Чудова річ в тому, що всі резистори по своєму принципу працюють однаково – обмежують протікання струму – більше або менше. І неважливо механічний це резистор чи фоторезистор. Щоб в цьому пересвідчитись, підключіть до піна PA11 замість механічного резистора – фоторезистор. І при цьому не потрібно навіть змінювати програму Дрона. Тепер, поглядаючи на панель Монітор порту, посвітіть ліхтариком телефону на фоторезистор або просто долонею прикрийте його. Чи вмикаються/вимикаються світлодіоди тепер?
Самостійна робота №1
Підключіть до піна PA6 пищалку. Модифікуйте програму вище, щоб коли значення механічного регулятора більше 900, то пищалка запищала на 1 секунду
Модифікуйте програму вище, щоб загорявся лише один той світлодіод, якому відповідає значення на механічному регуляторі, а не всі перед ним.
Підказка: потрібно використати else if і порівнювати значення спочатку з найбільшим і потім по спадаючій
Модифікуйте програму вище, щоб світлодіоди загорялися не зліва на право (тобто від PA5 до PB3), а навпаки – від PB3 до PA5