Аналоговий регулятор

Вступ

На попередніх уроках ми вже розглядали тактильний спосіб взаємодії з Дроном – через кнопки. Обмеженням цього способу є те, що кнопка має лише 2 стани – натиснута чи не натиснута. Відповідно, є два способи як можна відреагувати на натиснення кнопки, наприклад увімкнути чи вимкнути світлодіод, увімкнути чи вимкнути пищалку, пропелер і так далі. А що як треба буде увімкнути 10, 20, 30 світлодіодів? Додавати 30 кнопок у свій пристрій, щоб керувати кожним світлодіодом окремо? Це занадто, користувач не оцінить такого. Тут на допомогу приходять аналогові регулятори, які можна додати в будь-який пристрій і до нашого Дрона теж. Аналоговий регулятор може видавати в програму значення в набагато ширшому діапазоні ніж просто 0 і 1. Їх існує багато різних типів, але розглянемо кілька, які можна підключити до Дрона:

  1. Механічні. Треба їх покрутити руками вправо або вліво
  2. Оптичні. Треба на них направити світло або навпаки затінити рукою

Аналогові регулятори

Аналогові регулятори це насправді ті самі резистори, можливо уже знайомі Вам з уроків фізики. Змінні резистори (потенціометри) можуть плавно обмежувати струм в електричному колі. Завдяки цій плавній зміні наш Дрон зможе отримувати різні числові показники. Для порівняння, зчитуючи показання кнопки ми можемо отримати числові значення лише від 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