Енциклопедія пожежної безпеки

Arduino: що можна зробити за його допомогою. Незвичайні проекти на Arduino Uno Конструкції на ардуїно

Як вибрати ArduinoЦе питання виникає у всіх, хто вперше зважився створити проект з використанням Arduino. Визначилися з необхідними деталями: сенсорами, датчиками, модулями і т.д., і зіткнулися з чималим асортиментом плат Arduino, на додаток у кожної плати ще й по два, три аналоги. Деякі думають, що чим дорожче і потужніше - тим краще, набувають серйозних рішень, як наприклад Arduino Due, а потім розуміють, що на ньому працюють не всі скетчі, і самостійно впоратися з усією міццю даного девайсу, для них важко. Інші йдуть протилежним шляхом і стикаються з нестачею ресурсів (пам'ять, висновки, порти, тактова частота, харчування). Як же знайти ту золоту середину? Спробуємо розібратися...

Плата Плюси Мінуси

Arduino Uno

функціонал як у ProMini та Nano
  • Плата є найпоширенішою у сімействі Arduino, саме для неї створено найбільшу кількість уроків
  • Завдяки наявності DIP панелі, можна міняти мікроконтролер
  • При однаковому функціоналі з Arduino ProMini, Nano та Micro плата має в рази більші розміри

Arduino Mega 2560

  • Підходять shield створені під Arduino UNO
  • Максимальна кількість висновків
  • Розширений обсяг всіх видів пам'яті
  • Не можна встановити на Breadboard без використання дротів

Arduino Leonardo

функціонал як у MICRO

  • Підходять shield створені під Arduino UNO
  • Плата є вдосконаленою версією Arduino UNO і працює з більшістю її скетчів
  • Не можна встановити на Breadboard без використання дротів
  • Деякі скетчі створені під Arduino Uno не працюють Leonardo, т.к. використовуються різні мікроконтролери

Arduino Due


  • Кількість висновків як у Arduino Mega
  • Впроваджено два аналогові виходи
  • Використовується потужний 32-розрядний мікроконтролер з тактовою частотою 84МГц
  • Не можна встановити на Breadboard без використання дротів
  • Найбільший розмір плати у всьому сімействі Arduino
  • Не всі скетчі передбачають таку високу тактову частоту
  • Не всі shield передбачають передачу сигналів з граничною напругою 3,3В
  • Напруга живлення 3,3В

Arduino ProMini 3.3V

функціонал як у Nano та UNO


  • Найменша тактова частота мікроконтролера, всього 8МГц
  • Напруга живлення 3,3В

Arduino ProMini 5V

функціонал як у Nano та UNO

  • Можна використовувати для конструювання схем на Breadboard
  • Найменша плата в сімействі Arduino
  • Постачається без впаяних штирьових контактів, що дозволяє використовувати навісний монтаж
  • Не підходять shield, створені під Arduino UNO
  • Немає контролера USB, у зв'язку з чим потрібен зовнішній програматор

Arduino NANO V3.0

функціонал як у ProMini та UNO


  • Можна використовувати для конструювання схем на Breadboard
  • Плата трохи більше ніж Arduino ProMini, але має порт USB і не вимагає використання зовнішнього програматора
  • Не підходять shield, створені під Arduino UNO
  • Впровадження порту USB з контролером, призвело до збільшення обсягу flash-пам'яті, що виділяється під завантажувач (у порівнянні з Arduino ProMini)

Arduino MICRO

функціонал як у Leonardo


  • Можна використовувати для конструювання схем на Breadboard
  • Плата трохи більше ніж Arduino Nano, але має весь функціонал Arduino Leonardo
  • Є можливість імітувати різні USB-пристрою при підключенні до ПК (плата буде визначатися як миша, клавіатура і т.д.)
  • Не підходять shield, створені під Arduino UNO
  • Передача функції контролера USB на мікроконтролер, призвело до збільшення обсягу flash-пам'яті, що виділяється під завантажувач

Перше питання, що впливає на вибір Arduino- який проект Ви хочете реалізувати

Якщо Ви бажаєте створити вже готовий проект, люб'язно наданий іншими розробниками, то логічним придбанням буде та Arduino, де проект був створений спочатку. Тут варто відзначити той факт, що тепер, на території РФ, плати Arduino поширюються під торговою маркою Geduino . Тобто, як Ви правильно зрозуміли, Arduino Micro відрізняється від Geduino Micro назвою та логотипом (це не аналог), про що написано на офіційному сайті. Оскільки остання коштує дешевше, то вибір очевидний.

Якщо Ви не визначились із проектомАле хочете придбати Arduino для власних експериментів, то важливим фактором є кількість різних прикладів у мережі, під ту чи іншу Arduino. Тут безперечним лідером є Arduino UNO Це пояснюється тим, що дана плата є старшою в лінійці Arduino, при цьому не є застарілою, оскільки зазнала чимало змін з моменту створення.

Якщо Ви маєте намір реалізувати власний проект, то до вибору Arduino варто підходити шляхом виключення. Якщо у Вашому проекті є модулі з висновками під Arduino Uno, тоді виключаємо Arduino ProMini 3.3V, Arduino ProMini 5V, - аналог Arduino Nano), але можуть мати інший тип USB роз'єму, трохи відрізнятися за габаритами, мати інший контролер USB, інший тип корпусу мікроконтролера, колір плати і т.д. Тут потрібно розуміти, що ці плати повторюють функціонал їх оригіналу (на який вони схожі назвою), оскільки використовують той самий мікроконтролер ATmega, тієї ж серії. Габарити плати, корпус мікроконтролера та тип USB порту можна визначити за фото. А наявність «CH340G» у назві означає, що як контролер USB використовується не стандартний для Arduino чіп FTDI, а його аналог CH340G, отже, для підключення такої Arduino до комп'ютера, потрібно встановити драйвер для чіпа CH340G. Дані плати підійдуть тим, хто вважає, що одноразова установка драйвера не є незручністю, а знижена ціна є перевагою перед оригінальною назвою.

Цикл статей та навчальних схем з радіоаматорськими експериментами на Arduino для початківців. Це така радіоаматорська іграшка-конструктор, з якої без паяльника, травлення друкованих плат тощо будь-який чайник в електроніці може зібрати повноцінний працюючий пристрій, що підходить як для професійного прототипування так і для аматорських дослідів при вивченні електроніки.


Плата Arduino призначена в першу чергу для навчання початківців радіоаматорів основ програмування мікроконтролерів і створення мікроконтролерних пристроїв своїми руками без серйозної теоретичної підготовки. Середовище розробки Arduino дозволяє скомпілювати та завантажити в пам'ять плати готовий програмний код. Причому завантаження коду гранично просте.

Arduino з чого почати новачкові

В першу чергу для роботи з платою Ардуїно електроннику-початківцю потрібно завантажити програму для розробки Arduino, вона складається з вбудованого текстового редактора, в якому ми працюємо з програмним кодом, області повідомлень, вікна виведення тексту (консолі), панелі інструментів з кнопками команд, що часто використовуються. кількох меню. Для завантаження своїх програм та зв'язку ця програма через типовий шнур USB підключається до плати Arduino.


Код, написаний серед Arduino, називають скетч. Він пишеться в текстовому редакторі, який має спеціальні інструменти вставки/вирізки, заміни/пошуку тексту. Під час збереження та експорту в області повідомлень (див. малюнок у першому уроці для початківців, трохи нижче) з'являються пояснення, також можуть з'являтися помилки. Консоль показує повідомлення Arduino, що містять повні звіти про помилки та іншу корисну інформацію. Кнопки інструментальної панелі дозволяють перевірити та записати скейтч, відкрити, створити та зберегти його, відкрити моніторинг послідовної шини та багато іншого.

Отже, переходимо до першого уроку Arduino схеми електронників-початківців.

Контролер Arduino UNO для зручності початківців вже має опір і LED-світлодіод, приєднаний до 13 виведення роз'єму, тому ніяких зовнішніх радіоелементів у першому досвіді нам не потрібно.


Завантаживши код, Ардуїно дозволяє нашій програмі взяти участь у ініціалізації системи. Для цього ми вказуємо мікроконтролеру команди, які він виконає в момент початкового завантаження і далі геть-чисто забуде про них (тобто ці команди виконуються Ардуїнкою тільки один раз при старті). І саме з цією метою у нашому коді ми виділяємо блок, у якому зберігатимуться ці команди. void setup(), а точніше у тому просторі всередині фігурних дужок цієї функції, дивись програмний скейтч.

Не забувайте про фігурні дужки!Втрата хоча б однієї з них зробить весь скейтч цілком неробочим. Але і зайві дужки теж не ставте, тому що також виникне помилка.

Код скачати:
Скейтч з коментарями та поясненнями у файлі 001-1_mig-led.ino

Функція void loop()це те місце, куди ми поміщаємо команди, які будуть виконуватися весь час, поки включена плата Arduino. Почавши виконання з першої команди, Ардуїнка дійде до кінця і відразу ж перейде в початок, щоб повторити ту ж саму послідовність. І так нескінченна кількість разів, допоки на плату надходить харчування. По суті, void loop - це головна функція, точка входу в Arduino.


Функція delay(1000) затримує обробку програми на 1000 мілісекунд. Все це йде у вічному циклі loop().

Головний висновок після сприйняття нашої першої програми на Ардуїно:За допомогою функцій void loop та void setup ми передаємо мікроконтролеру наші інструкції. Все те, що знаходиться всередині блоку setup, виконається всього один раз. Вміст модуля loop буде повторюватися в циклі до тих пір, поки залишиться включеним Arduino.

У попередній програмі між включенням та вимкненням світлодіода була секундна затримка. У найпростішому коді початківця ардуїнщика був один великий мінус. Для витримки паузи між увімкненням та вимкненням світлодіода в одну секунду ми застосували функцію delay()і тому в цей момент контролер не здатний виконувати інші команди у головній функції loop(). Коригування коду у функції loop(), подана нижче вирішує цю проблему.

Замість встановлення значення в HIGH, а потім у LOW, ми отримаємо значення ledPin та проінвертуємо його. Припустимо, якщо воно було HIGH, то стане LOW і т.п.

Другий варіант коду Ардуїно для керування світлодіодомтут:

Потім можна замінити функцію delay(). Замість неї краще використовувати функцію millis(). Вона повертає кількість мілісекунд, яка пройшла з моменту старту програми. Функція переповниться приблизно через 50 діб програмного коду.

Схожою функцією є micros(), яка повертає кількість мікросекунд, що минуло з моменту запуску програмного коду Функція повернеться в нуль через 70 хвилин роботи програми.

Звичайно, це додасть трохи рядків коду в наш скетч, але це, зробить вас, безсумнівно, більш досвідченим програмістом і збільшить потенціал вашого Arduino. Для цього потрібно лише навчитися застосовувати функцію millis.

Слід чітко розуміти, що найпростіша функція delay припиняє виконання всієї програми Ардуїно, роблячи її нездатною виконувати якісь завдання у цей час. Замість того, щоб зупиняти всю нашу програму, можна підраховувати, скільки часу пройшло до завершення дії. Це чудово реалізується за допомогою функції millis(). Щоб усе було легко розуміти, ми розглянемо наступний варіант миготіння світлодіодом без тимчасової затримки.

Початок цієї програми такий самий, як і в будь-якого іншого стандартного скетчу Arduino.


У цьому прикладі використовується два цифрові введення-виведення Arduino. Світлодіод приєднується до 8 піну, який налаштований як OUTPUT. До 9 через підключено кнопку, яка налаштована як INPUT. Коли натискаємо кнопку пін 9 встановлюється в HIGH, і програма перемикає висновок 8 в HIGH, цим включаючи світлодіод. Відпускання кнопки скидає дев'ятий висновок стан LOW. Потім код перемикає висновок 8 LOW, відключаючи світловий індикатор.

Для управління п'ятьома світлодіодами будемо застосовувати різні маніпуляції з портами Arduino. Для цього безпосередньо запишемо дані в порти Arduino, це дозволить встановити значення для світлодіодів за допомогою однієї лише функції.

Arduino UNO має три порти: B(цифрові входи/виходи з 8 по 13); C(аналогові входи); D(цифрові входи/виходи з 0 по 7)

Кожен порт здійснює керування трьома регістрами. Перший DDR задає чим буде pin входом або виходом. За допомогою другого регістру PORT можна задати pin у стан HIGH або LOW. За допомогою третього можна вважати інформацію про стан ніжок Arduino, якщо вони працюють на вхід.

Для роботи схеми використовуємо порт B. Для цього встановимо всі ніжки порту як цифрові виходи. У порту B всього 6 ніжок. Біти регістру DDRB повинні бути задані в "1" , якщо пін буде використовуватися як вихід (OUTPUT), і в "0" якщо пін плануємо застосовувати як вхід (INPUT). Біти портів нумеруються з 0 по 7, але не мають всі 8 пінів.

Допустимо: DDRB = B00111110;// встановити ніжки порту з 1 по 5 як виходу, а 0 як вхід.

У нашій схемі вогнів, що біжать, ми задіємо п'ять виходів: DDRB = B00011111; // Встановити піни порту з 0 по 4 як виходи.

Для запису даних у порт необхідно задіяти регістр PORTB. Запалити перший світлодіод можна за допомогою команди, що управляє: PORTB = B00000001;, перший і четвертий LED: PORTB = B00001001і т.п

Існує два оператори двійкового зсуву: вліво та вправо. Оператор зсуву вліво змушує всі біти даних переміститися вліво, відповідно оператор зсуву вправо, переміщує їх вправо.

Приклад:

varA = 1; // 00000001
varA = 1 varA = 1 varA = 1

Тепер повернемося до вихідного коду нашої програми. Нам потрібно запровадити дві змінні: upDownбуде включати значення куди рухатися - вгору або вниз, а друга cylonвкаже які Led запалювати.

Конструктивно такий світлодіод має один загальний висновок та три виводи для кожного кольору. Нижче показано схему підключення RGB-світлодіода до плати Arduino із загальним катодом. Усі резистори використовуються у схемі для підключення повинні бути одного номіналу від 220-270 Ом.


Для підключення із загальним катодом схема підключення триколірного LED буде майже аналогічна, за винятком того, що загальний висновок буде підключений не до землі (gnd на пристрої), а до висновку +5 вольт. Висновки Червоний, зелений та синій в обох випадках підключаються до цифрових виходів контролера 9, 10 та 11.

До дев'ятого піну Arduino UNO підключимо зовнішній світлодіод через опір 220 Ом. Для плавного керування яскравістю останнього застосуємо функцію analogWrite(). Вона забезпечує виведення ШІМ-сигналу на ніжку контролера. Причому команду pinMode()викликати не потрібно. Т.к analogWrite(pin,value)включає два параметри: pin – номер ніжки для виведення, value – значення від 0 до 255.

Код:
/*
Навчальний приклад ардуїнщика-початківця, розкриває можливості команди analogWrite() для реалізації Fade-ефекту світлодіода
*/
int brightness = 0; // яскравість LED
int fadeAmount = 5; // крок зміни яскравості
unsigned long currentTime;
unsigned long loopTime;

Void setup() (
pinMode(9, OUTPUT); // встановлюємо 9 пін як вихід
currentTime = millis();
loopTime = currentTime;
}

Void loop() (
currentTime = millis();
if(currentTime >= (loopTime + 20))(
analogWrite(9, brightness); // встановлюємо значення на 9 виводі

Brightness = brightness + fadeAmount; // додаємо крок зміни яскравості, яка встановиться у наступному циклі

// якщо досягли хв. чи макс. значення, то йдемо у зворотний бік (реверс):
if (brightness == 0 || brightness == 255) (
fadeAmount = -fadeAmount;
}
loopTime = currentTime;
}
}

Робота Arduino з енкодером

Енкодер призначений для перетворення кута повороту в електричний сигнал. З нього ми отримуємо два сигнали (А та В), які протилежні по фазі. У цьому навчальному прикладі ми будемо застосовувати енкодер SparkFun COM-09117, що має дванадцять положень на один оберт (кожне положення дорівнює 30 °). На наведеному нижче малюнку добре видно, як залежать вихід А і В один від одного під час руху енкодера за годинниковою або проти годинникової стрілки.

Якщо сигнал А переходить від позитивного рівня до нульового, ми зчитуємо значення виходу В. Якщо вихід У цей момент часу знаходиться в позитивному стані, значить енкодер рухається за годинниковою стрілкою, якщо В видає нульовий рівень, то енкодер рухається в протилежному напрямку. Зчитуючи обидва виходи, ми за допомогою мікроконтролера здатні обчислити напрямок обертання, а за допомогою підрахунку імпульсів з А виходу енкодера - кут повороту.

При необхідності можна за допомогою розрахунку частоти визначити, наскільки швидко відбувається обертання енкодера.

Застосовуючи енкодер в нашому навчальному прикладі ми регулюватимемо яскравістю світлодіода за допомогою ШІМ виходу. Для зчитування даних з енкодера ми будемо використовувати метод, що базується на програмних таймерах, які ми вже розглянули.

Враховуючи той факт, що в найшвидшому випадку, ми можемо повернути ручку енкодера на 180 ° за 1/10 секунд, то це буде 6 імпульсів за 1/10 секунд або 60 імпульсів в одну секунду.

Насправді швидше обертати неможливо. Так як нам необхідно відстежувати всі напівперіоди, то частота має бути близько 120 Герц. Для повної впевненості візьмемо 200 Гц.

Так як, в даному випадку, у нас використовується механічний енкодер, то можливий брязкіт контактів, а низька частота чудово відфільтровує подібний брязкіт.


За сигналами програмного таймера необхідно здійснювати порівняння поточного значення виходу А енкодера з попереднім значенням. Якщо стан змінюється від позитивного до нуля, ми опитуємо стан виходу У. Залежно від результату опитування стану ми збільшуємо чи знижуємо лічильник значення яскравості LED світлодіода. Код програми з тимчасовим інтервалом близько 5 мс (200 Гц) представлений нижче:

Код ардуїнника-початківця:
/*
** Енкодер
** Для управління яскравістю світлодіода застосовується енкодер фірми Sparkfun
*/

Int brightness = 120; // Яскравість світлодіода, починаємо з половини
int fadeAmount = 10; // крок зміни яскравості
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 12; // pin 12
const int pin_B = 11; // pin 11
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
void setup() (
// declare pin 9 to be an output:
pinMode(9, OUTPUT); // встановлюємо 9 висновок як вихід
pinMode(pin_A, INPUT);
pinMode(pin_B, INPUT);
currentTime = millis();
loopTime = currentTime;
}
void loop() (
currentTime = millis();
if(currentTime >= (loopTime + 5))( // перевіряємо стани кожні 5мс (частота 200 Гц)
encoder_A = digitalRead(pin_A); // зчитуємо стан виходу А енкодера
encoder_B = digitalRead(pin_B); // Виходу В енкодера
if((!encoder_A) && (encoder_A_prev))( // якщо стан змінюється з позитивного до нульового
if(encoder_B) (
// вихід У позитивному стан, отже обертання здійснюється за годинниковою стрілкою
// збільшуємо яскравість світіння, лише до 255
if(brightness + fadeAmount)
else (
// вихід У нульовому стан, отже обертання йде проти годинникової стрілки
// знижуємо яскравість, але не нижче за нуль
if(brightness - fadeAmount >= 0) brightness -= fadeAmount;
}

}
encoder_A_prev = encoder_A; // Зберігаємо значення А для наступного циклу

AnalogWrite(9, brightness); // встановлюємо яскравість на дев'ятий пін

LoopTime = currentTime;
}
}

У цьому прикладі для початківців ми розглянемо роботу з п'єзовипромінювачем для створення звуків. Для цього візьмемо п'єзодатчик, що дозволяє генерувати звукові хвилі в діапазоні частот 20 Гц - 20 кГц.

Це така радіоаматорська конструкція, де по всьому об'єму розташовані світлодіоди. За допомогою цієї схеми можна генерувати різні світлові та анімаційні ефекти. Складні схеми можуть навіть відображати різні об'ємні слова. Тобто це елементарний об'ємний монітор

Сервопривід є основним елементом при конструюванні різних радіокерованих моделей, а керування ним за допомогою контролера просто і зручно.


Програма для управління проста та наочна. Починається вона з підключення файлу, що містить усі необхідні команди для керування сервоприводом. Далі ми створюємо об'єкт servo, наприклад servoMain. Наступна функція setup(), в якій ми прописуємо, що сервопривід приєднано до дев'ятого висновку контролера.

Код:
/*
Arduino Servo
*/
#include
Servo servoMain; // Об'єкт Servo

Void setup()
{
servoMain.attach(9); // Servo підключений до дев'ятого висновку
}

Void loop()
{
servoMain.write(45); // Повернути сервопривід ліворуч на 45°
delay (2000); // Очікування 2000 мілісекунд (2 секунди)
servoMain.write(0); // Повернути серво вліво на 0°
delay(1000); // Пауза 1 с.

delay (1500); // Очікування 1.5 с.
servoMain.write(135); // Повернути серво вправо на 135°
delay(3000); / / Пауза 3 с.
servoMain.write(180); // Повернути серво вправо на 180°
delay(1000); // Очікування 1 с.
servoMain.write(90); // Повернути серво на 90°. Центральна позиція
delay(5000); / / Пауза 5 с.
}

У головній функції loop(), ми задаємо команди для серводвигуна, витримуючи паузи між ними.

Схема Arduino лічильника на 7-сегментному індикаторі

Цей простий проект на Arduino для початківців полягає у створенні схеми лічильника на звичайному 7-сегментному індикаторі із загальним катодом. Програмний код, наведений нижче, дозволяє при натисканні на кнопку запускати рахунок від 0 до 9.

Семисегментний індикатор – є комбінацією 8 світлодіодів (останній відповідає за точку) із загальним катодом, які можна включати в потрібній послідовності так, щоб вони створювали цифри. Слід звернути увагу, що в даній схемі дивись малюнок нижче, висновки 3 і 8 відведені під катод.


Справа показано таблицю відповідності висновків Arduino та висновків світлодіодного індикатора.

Код цього проекту:

byte numbers = (
B11111100, B01100000, B11011010, B11110010, B01100110,
B10110110, B10111110, B11100000, B11111110, B11100110
};
void setup() (
for(int i = 2; i pinMode(i, OUTPUT);
}
pinMode(9, INPUT);
}
int counter = 0;
bool go_by_switch = true;
int last_input_value = LOW;
void loop() (
if(go_by_switch) (
int switch_input_value = digitalRead(9);
if(last_input_value == LOW && switch_input_value == HIGH) (

}
last_input_value = switch_input_value;
) else (
delay(500);
counter = (counter + 1) % 10;
}
writeNumber(counter);
}

Void writeNumber(int number) (
if(number 9) (
return;
}
byte mask = numbers;
byte currentPinMask = B10000000;
for(int i = 2; i if(mask & currentPinMask) digitalWrite(i,HIGH);
else digitalWrite(i,LOW);
currentPinMask = currentPinMask >> 1;
}
}

Істотно розширити потенціал плат Ардуїно можна і за допомогою додаткових модулів, які можна підключити до виводів PIN практично будь-якого пристрою. Розглянь найбільш популярні та цікаві модулі розширення або як їх ще називають – шилди.

Затримки в Ардуїно грають дуже велику роль. Без них не зможе працювати навіть найпростіший приклад Blink, який блимає світлодіодом через заданий проміжок часу. Але більшість програмістів-початківців мало знають про тимчасові затримки і використовують тільки Arduino delay, не знаючи побічних ефектів цієї команди. У цій статті я докладно розповім про тимчасові функції та особливості їх використання в середовищі розробки Arduino IDE.

В Arduino існує кілька різних команд, які відповідають за роботу з часом та паузи:

  • delay()
  • delayMicroseconds()
  • millis()
  • micros()

Вони відрізняються точності і мають свої особливості, які варто враховувати при написанні коду.

Використання функції arduino delay

Синтаксис

Ардуїно delay є найпростішою командою і її найчастіше використовують новачки. По суті, вона є затримкою, яка припиняє роботу програми, на вказане в дужках число мілісекунд. (В одній секунді 1000 мілісекунд.) Максимальне значення може бути 4294967295 мс, що приблизно дорівнює 50 діб. Давайте розглянемо простий приклад, що наочно показує роботу цієї команди.

Void setup() ( pinMode(13, OUTPUT); ) void loop() ( digitalWrite(13, HIGH); // подаємо високий сигнал на 13 пін delay(10000); // пауза 10000мс або 10 секунд digitalWrite13, LOW); // подаємо низький сигнал на 13 пін delay (10000); // пауза 10000мс або 10 секунд)

У методі setupпрописуємо, що пін 13 буде використовуватися як вихід. В основній частині програми спочатку на пін подається високий сигнал, потім затримку в 10 секунд. На цей час програма ніби зупиняється. Далі подається низький сигнал і знову затримка, і все починається спочатку. У результаті ми отримуємо, що на пін по черзі подається, то 5, то 0.

Потрібно чітко розуміти, що на час паузи за допомогою delay робота програми припиняється, програма не отримуватиме жодних даних із датчиків. Це найбільший недолік використання функції delay в Arduino. Обійти це обмеження можна за допомогою переривань, але про це ми поговоримо у статті.

Приклад delay з блиманням світлодіодом

Приклад схеми для ілюстрації роботи функції delay.
Можна побудувати схему зі світлодіодом та резистором. Тоді в нас вийде стандартний приклад – блимання світлодіодом. Для цього на пін, який ми позначили як вихідний, необхідно підключити світлодіод до плюсового контакту. Вільну ногу світлодіода через резистор приблизно на 220 Ом (можна трохи більше), підключаємо на землю. Визначити полярність можна, якщо подивитися на його нутрощі. Велика філіжанка всередині з'єднана з мінусом, а маленька ніжка з плюсом. Якщо світлодіод новий, то визначити полярність можна по довжині висновків: довга ніжка - плюс, коротка - мінус.

Функція delayMicroseconds

Ця функція є повним аналогом delay за винятком того, що одиниці виміру у неї не мілісекунди, а мікросекунди (в 1 секунді – 1000000 мікросекунд). Максимальне значення буде 16383, що дорівнює 16 мілісекунд. Роздільна здатність дорівнює 4, тобто число буде завжди кратно чотирьом. Шматок прикладу виглядатиме так:

DigitalWrite(2, HIGH); // подаємо високий сигнал на 2 пін delayMicroseconds(16383); // пауза 16383мкс digitalWrite(2, LOW); // подаємо низький сигнал на 2 пін delayMicroseconds(16383); // Пауза 16383мкс

Проблема з delayMicroseconds така сама, як у delay – ці функції повністю «вішають» програму і вона на деякий час буквально завмирає. У цей час неможлива робота з портами, зчитування інформації з датчиків та виконання математичних операцій. Для мигалок цей варіант підходить, але досвідчені користувачі не використовують її для великих проектів, тому що там не потрібні такі збої. Тому набагато краще використовувати функції, описані нижче.

Функція millis замість delay

Функція millis() дозволить виконати затримку без delay на ардуїно, тим самим оминути недоліки попередніх способів. Максимальне значення параметра millis таке саме, як і у функції delay (4294967295мс або 50 діб).

За допомогою millis ми не зупиняємо виконання всього скетчу, а просто вказуємо, скільки часу ардуїно має просто "минати" саме той блок коду, який ми хочемо призупинити. На відміну від delay millis, сама по собі нічого не зупиняє. Ця команда просто повертає нам від вбудованого таймера мікроконтролера кількість мілісекунд, що пройшли з моменту запуску. При кожному виклику loop Ми самі вимірюємо час, що минув з останнього виклику нашого коду і якщо різниця часу менша за бажану паузу, то ігноруємо код. Як тільки різниця стане більшою за потрібну паузу, ми виконуємо код, отримуємо поточний час за допомогою тієї ж millis і запам'ятовуємо його – цей час буде новою точкою відліку. У наступному циклі відлік вже буде від нової точки і ми знову ігноруватимемо код, поки нова різниця millis і нашого збереженого раніше значення не досягне знову бажаної паузи.

Затримка без delay за допомогою millis вимагає більшого коду, але з її допомогою можна моргати світлодіодом і ставити на паузу скетч, не зупиняючи систему.

Ось приклад, який наочно ілюструє роботу команди:

Unsigned long timing; // Змінна для зберігання точки відліку void setup() ( Serial.begin(9600); ) void loop() ( /* У цьому місці починається виконання аналога delay() Обчислюємо різницю між поточним моментом і раніше збереженою точкою відліку. Якщо різниця більша потрібного значення, то виконуємо код Якщо ні - нічого не робимо */ if (millis() - timing > 10000)( // Замість 10000 підставте потрібне вам значення паузи timing = millis(); Serial.println ("10 seconds") ; ) )

Спочатку ми вводимо змінну timing, в ній зберігатиметься кількість мілісекунд. За замовчуванням значення змінної дорівнює 0. В основній частині програми перевіряємо умову: якщо кількість мілісекунд із запуску мікроконтролера мінус число, записане в змінну timing більше, ніж 10000, виконується дія з виведення повідомлення в монітор порту і в змінну записується поточне значення часу. В результаті роботи програми кожні 10 секунд монітор порту буде виводитися напис 10 seconds. Цей спосіб дозволяє моргати світлодіодом без delay.

Функція micros замість delay

Ця функція може виконати затримку, не використовуючи команду delay. Вона працює так само, як і millis, але вважає не мілісекунди, а мікросекунди з роздільною здатністю в 4мкс. Її максимальне значення 4294967295 мікросекунд або 70 хвилин. При переповненні значення просто скидається в 0, не забувайте про це.

Резюме

Платформа Arduino надає кілька способів виконання затримки у своєму проекті. За допомогою delay можна швидко поставити на паузу виконання скетчу, але при цьому заблокуєте роботу мікроконтролера. Використання команди millis дозволяє обійтися в ардуїно без delay, але для цього потрібно трохи більше програмувати. Вибирайте найкращий спосіб, залежно від складності вашого проекту. Як правило, у простих скетчах і при затримці менше 10 секунд використовують delay. Якщо логіка роботи складніша і потрібна велика затримка, то замість delay краще використовувати millis.

Цей симулятор найкраще працює у браузері Chrome
Давайте розглянемо Arduino уважніше.

Arduino це не великий комп'ютер, до якого можуть підключатися зовнішні ланцюги. В Arduino Uno використовується Atmega 328P
Це найбільший чіп на платі. Цей чіп виконує програми, які зберігаються у його пам'яті. Ви можете завантажити програму через USB за допомогою Arduino IDE. Usb порт також забезпечує харчування arduino.

Є окремий роз'єм живлення. На платі є два висновки позначені 5v та 3.3v, які потрібні для того, щоб запитувати різні пристрої. Також ви знайдете контакти, помічені як GND, це висновки землі (земля це 0В). Платформа Arduino, також, має 14 цифрових висновків (пінів), помічених цифрами від 0 до 13, які підключаються до зовнішніх вузлів і мають високі або низькі стани (включено або вимкнено). Ці контакти можуть працювати як виходи чи як входи, тобто. вони можуть або передавати якісь дані та керувати зовнішніми пристроями, або отримувати дані з пристроїв. Наступні висновки на платі позначені А0-А5. Це аналогові входи, які можуть приймати дані різних датчиків. Це особливо зручно, коли вам треба виміряти певний діапазон, наприклад, температуру. У аналогових входів є додаткові функції, які можна використовувати окремо.

Як використати макетну плату.

Макетна плата потрібна для того, щоб тимчасово з'єднати деталі, перевірити, як працює пристрій, перш ніж ви спаяєте все разом.
Всі наведені нижче приклади зібрані на макетній платі, щоб можна було швидко вносити зміни в схему і повторно використовувати деталі не заморочиваясь з паянням.

У макетній платі є ряди отворів, в які ви можете вставляти деталі та дроти. Деякі з цих отворів електрично з'єднані один з одним.

Два верхніх і нижніх ряди з'єднані по - рядно вздовж усієї плати. Ці ряди використовують, щоб подавати харчування на схему. Це може бути 5в або 3.3в, але в будь-якому випадку, перше, що вам потрібно зробити, - це підключити 5в і GND на макетну плату, як показано на малюнку. Іноді ці з'єднання рядів можуть перериватися посередині плати, тоді, якщо вам знадобиться, ви можете з'єднати їх, як показано на малюнку.








Інші отвори, розташовані в середині плати, групуються по п'ять отворів. Вони використовують для з'єднання деталей схеми.


Перше, що ми підключимо до нашого мікроконтролера, це світлодіод. Схема електричних з'єднань показана на зображенні.

Навіщо потрібен резистор у схемі? У разі він обмежує струм, який проходить через світлодіод. Кожен світлодіод розрахований на певний струм, і якщо цей струм буде більшим, то світлодіод вийде з ладу. Дізнатися, якого номіналу має бути резистор можна за допомогою закону ома. Для тих хто не знає чи забув, закон каже, що існує лінійна залежність струму від напруги. Тобто чим більше ми докладемо напруги до резистора, тим більше через нього струме струм.
V=I*R
Де V-напруга на резистор
I- Струм через резистор
R- Опір, який треба знайти.
По-перше, ми повинні пізнати напругу на резистор. Більшість світлодіодів 3мм або 5мм, які ви використовуватимете, мають робочу напругу 3в. Значить, на резистори нам треба погасити 5-3 = 2в.

Потім ми обчислимо струм через резистор.
Більшість 3 та 5мм світлодіодів світяться повною яскравістю при струмі 20мА. Струм більше цього може вивести їх з ладу, а струм меншої сили знизить їхню яскравість, не завдавши жодної шкоди.

Отже, хочемо включити світлодіод у ланцюг 5в,щоб у ньому був струм 20мА. Так як всі деталі включені в один ланцюг на резистор теж буде 20мА струм.
Ми отримуємо
2В = 20 мА * R
2В = 0.02A * R
R = 100 Ом

100 Ом це мінімальний опір, краще використовувати трохи більше, тому що світлодіоди мають деякий розкид характеристик.
У цьому прикладі використовується резистор 220 Ом. Тільки тому, що у автора їх дуже багато: wink: .

Вставте світлодіод у отвори посередині плати таким чином, щоб його довгий висновок був з'єднаний з одним із висновків резистора. Другий кінець резистора з'єднайте з 5V, а другий вихід світлодіода з'єднайте з GND. Світлодіод повинен спалахнути.

Зверніть увагу, що є різниця, як з'єднувати світлодіод. Струм тече від довшого виведення до більш короткого. На схемі це можна припустити, що струм тече в той бік, куди спрямований трикутник. Спробуйте перевернути світлодіод і ви побачите, що він не світитиметься.

А ось як ви з'єднуватимете резистор, різниці зовсім немає. Можете його перевернути або спробувати приєднати до іншого виведення світлодіода, це не вплине на роботу схеми. Він так само обмежуватиме струм через світлодіод.

Анатомія Arduino Sketch.

Програми Arduino називають sketch. Вони складаються із двох основних функцій. Функція setupта функція loop
всередині цієї функції ви задаватимете всі основні налаштування. Які висновки працюватимуть на вхід чи вихід, які бібліотеки підключатимуть, ініціалізуватимуть змінні. Функція Setup()запускається лише один раз протягом скетчу, коли стартує виконання програми.
це основна функція, яка виконується після setup(). Фактично, це сама програма. Ця функція буде виконуватися нескінченно, доки ви не вимкнете живлення.

Arduino блимає світлодіодом



У цьому прикладі ми з'єднаємо схему зі світлодіодом до одного з цифрових висновків Arduino і включатимемо і вимикатимемо його за допомогою програми, а також ви дізнаєтеся кілька корисних функцій.

Ця функція використовується в setup()частини програми і служить для ініціалізації висновків, які ви будете використовувати як вхід (INPUT)або вихід (OUTPUT). Ви не зможете рахувати або записати дані з піна, доки не встановите його відповідно до pinMode. Ця функція має два аргументи: pinNumber- це номер піна, який ви використовуватимете.

Mode-Задає, як пін працюватиме. На вхід (INPUT)або вихід (OUTPUT). Щоб запалити світлодіод, ми повинні подати сигнал. З Arduino. Для цього ми налаштовуємо пін на вихід.
- ця функція служить у тому, щоб задати стан (state)піна (pinNumber). Є два основні стани (взагалі їх 3), один це HIGH, на піні буде 5в, інше це Lowта на піні буде 0в. Значить, щоби запалити світлодіод нам треба на піні, сполученому зі світлодіодом виставити високий рівень HIGH.

Затримка. Служить для затримки програми на заданий в мсек період.
Нижче наведено код, який змушує блимати світлодіод.
//LED Blink int ledPin = 7;//пін Arduino до якого підключений світлодіод void setup() ( pinMode(ledPin, OUTPUT);// установка піна як ВИХІД ) запалити світлодіод delay (1000); // затримка 1000 мсек (1 сек) digitalWrite (ledPin, LOW); // Вимкнути світлодіод delay (1000);

Невеликі пояснення щодо коду.
Рядки, які починаються з "//", це коментарі Arduino їх ігнорує.
Усі команди закінчуються крапкою з комою, якщо ви забудете їх, то отримаєте повідомлення про помилку.

ledPin- Це змінна. Змінні використовуються у програмах зберігання значень. У цьому прикладі змінної ledPinнадається значення 7, це номер піна Arduino. Коли Arduino у програмі зустріне рядок зі змінною ledPin, він буде використовувати те значення, яке ми вказали раніше.
Так запис pinMode(ledPin, OUTPUT)аналогічна запису pinMode(7, OUTPUT).
Але в першому випадку вам достатньо змінити змінну і вона зміниться в кожному рядку, де використовується, а в другому вам, щоб змінити змінну, доведеться ручками в кожній команді вносити зміни.

У першому рядку вказує тип змінної. При програмуванні Arduino важливо завжди оголошувати тип змінних. Поки вам достатньо знати, що INTоголошує негативні та позитивні числа.
Нижче наведено моделювання скетчу. Натисніть старт, щоб переглянути роботу схеми.

Як і очікувалося, світлодіод гасне і спалахує за одну секунду. Спробуйте змінити затримку, щоб побачити, як вона працює.

Управління кількома світлодіодами.

У цьому прикладі ви дізнаєтесь, як керувати кількома світлодіодами. Для цього встановіть ще 3 світлодіоди на плату та з'єднайте їх з резисторами та висновками Arduino, як показано нижче.

Для того, щоб вмикати та вимикати світлодіоди по черзі треба написати програму подібну до цієї:
//Multi LED Blink int led1Pin = 4; int led2Pin = 5; int led3Pin = 6; int led4Pin = 7; void setup() ( //установка пінів як ВИХІД pinMode(led1Pin, OUTPUT); pinMode(led2Pin, OUTPUT); pinMode(led3Pin, OUTPUT); pinMode(led4Pin, OUTPUT); ) void loop() ( digitalWrite(led1Pin) );//запалити світлодіод delay(1000);//затримка 1 сек digitalWrite(led1Pin, LOW);//загасити світлодіод delay(1000);//затримка 1 сек //do the same for the other 3 LEDs digitalWrite(led2Pin ; HIGH); delay(1000);// затримка 1 сек digitalWrite(led3Pin, LOW);//згасити світлодіод delay(1000);//затримка 1 сек digitalWrite(led4Pin, HIGH); 1 сек digitalWrite(led4Pin, LOW);//згасити світлодіод delay(1000);//затримка 1 сек )

Ця програма буде добре працювати, але це не раціональне рішення. Код треба змінити. Для того, щоб програма працювала щоразу ми застосуємо конструкцію, яка називається .
Цикли зручні, коли треба повторити одну і ту ж дію кілька разів. У коді, проведеному вище, ми повторюємо рядки

DigitalWrite (led4Pin, HIGH); delay (1000); digitalWrite (led4Pin, LOW); delay (1000);
повний код скетчу у вкладенні (завантажень: 1260)

Регулювання яскравості світлодіодів

Іноді вам потрібно буде змінювати яскравість світлодіодів у програмі. Це можна зробити за допомогою команди analogWrite() . Ця команда так швидко вмикає та вимикає світлодіод, що очей не бачить це мерехтіння. Якщо світлодіод половину часу буде увімкнений, а половину вимкнений, то візуально здаватиметься, що він світиться в половину своєї яскравості. Це називається широтно-імпульсна модуляція (ШІМ або PWM англійською). Шим застосовується досить часто, тому що за її допомогою можна керувати "аналоговим" компонентом за допомогою цифрового коду. Не всі висновки Arduino підходять для цього. Тільки ті висновки, біля яких намальовано таке позначення. ~ Ви побачите його поряд з висновками 3,5,6,9,10,11.
Поєднайте один із ваших світлодіодів з одним із висновків ШІМ(у автора це висновок 9). Тепер запуститискетч миготіння світлодіода, але перш за змініть команду digitalWrite()на analogWrite(). analogWrite()має два аргументи: перший це номер виведення, а другий- значення ШІМ (0-255), стосовно світлодіодів це буде їх яскравість свічення, а для електродвигунів швидкість обертання. Нижче наведено код прикладу для різної яскравості світлодіода.
//Змінюємо яскравість світлодіода int ledPin = 9;//до цього висновку приєднаний світлодіод void setup() ( pinMode(ledPin, OUTPUT); повна яскравість (255/255 = 1) delay(1000);// пауза 1 сек digitalWrite(ledPin, LOW);//вимкнути світлодіод delay(1000); на 3/4 (191/255 ~= 0.75) delay(1000);//пауза 1 сек digitalWrite(ledPin, LOW);//вимкнути світлодіод delay(1000);//пауза 1 сек analogWrite(ledPin, 127); //половина яскравості (127/255 ~= 0.5) delay(1000);// пауза 1 сек digitalWrite(ledPin, LOW);//вимкнути світлодіод delay(1000);//пауза 1 сек analogWrite(ledPin, 63) //чверть яскравості (63/255 ~= 0.25) delay(1000);// пауза 1 сек digitalWrite(ledPin, LOW);//вимкнути світлодіод delay(1000);//пауза 1 сек )

Спробуйте змінити значення ШІМ у команді analogWrite()щоб побачити, як це впливає на яскравість.
Далі ви дізнаєтеся, як регулювати яскравість плавно від повної до нульової. Можна, звичайно, скопіювати шматок коду 255 разів
analogWrite(ledPin, brightness); delay(5);//short delay brightness = brightness + 1;
Але самі розумієте - це буде не практично. Для цього краще використовувати цикл FOR, який використовували раніше.
У наступному прикладі використовуються два цикли, один для зменшення яскравості від 255 до 0
for (int brightness=0;brightness=0;brightness--)( analogWrite(ledPin,brightness); delay(5); )
delay(5)використовується, щоб уповільнити швидкість наростання та зменшення яскравості 5*256=1280 мсек= 1.28 сек.)
У першому рядку використовується " brightness-" ,щоб значення яскравості зменшувалася на 1, щоразу, коли цикл повторюється. Зверніть увагу, що цикл працюватиме до того часу, поки brightness >=0. Замінивши знак > на знак >= ми включили 0 у діапазон яскравості. Нижче змодельовано цей скетч. //плавно змінюємо яскравість int ledPin = 9;//до цього піну підключений світлодіод void setup() ( pinMode(ledPin, OUTPUT);// ініціалізація піна на вихід ) void loop() ( //плавно збільшуємо яскравість (0 to 255 ) for (int brightness=0;brightness=0;brightness--)( analogWrite(ledPin,brightness); delay(5); ) delay(1000);//ждем 1 сек //плавно зменшуємо яскравість (255 to 0) for (int brightness=255;brightness>=0;brightness--)( analogWrite(ledPin,brightness); delay(5); ) delay(1000);//чекаємо 1 сек ) )
Це не дуже добре, але ідея зрозуміла.

RGB-світлодіод та Arduino

RGB-світлодіод насправді це три світлодіоди різного кольору в одному корпусі.

Включно з різними світлодіодами з різною яскравістю можна комбінувати і отримувати різні кольори. Для Arduino, де кількість градацій яскравості дорівнює 256, ви отримаєте 256^3=16581375 можливих кольорів. Реально їх, звісно, ​​буде менше.
Світлодіод, який ми будемо використовувати загальним катодом. Тобто. всі три світлодіоди конструктивно з'єднані катодами одного висновку. Цей висновок ми приєднаємо до висновку GND. Інші висновки, через обмежувальні резистори, треба приєднати до висновків ШІМ. Автор використовував висновки 9-11. Таким чином можна буде керувати кожним світлодіодом окремо. У першому скетчі показано, як увімкнути кожен світлодіод окремо.



//RGB LED - test //pin connections int red = 9; int green = 10; int blue = 11; void setup()( pinMode(red, OUTPUT); pinMode(blue, OUTPUT); pinMode(green, OUTPUT); ) void loop()( //включення/вимкнення червоного світлодіод digitalWrite(red, HIGH); delay(500) digitalWrite(red, LOW);delay(500);// увімкнення/вимкнення зеленого світлодіоду digitalWrite(green, HIGH);delay(500); світлодіода digitalWrite(blue, HIGH);delay(500);digitalWrite(blue, LOW);delay(500);

У наступному прикладі використовуються команди analogWrite()і , щоб отримати різні випадкові значення яскравості для світлодіодів. Ви побачите різні кольори, що змінюються випадковим чином.
//RGB LED - random colors //pin connections int red = 9; int green = 10; int blue = 11; void setup()( pinMode(red, OUTPUT); pinMode(blue, OUTPUT); pinMode(green, OUTPUT); ) void loop()( //pick random color analogWrite(red, random(256)); analogWrite( blue, random(256));analogWrite(green, random(256));delay(1000);//wait one second )

Random(256)-Повертає випадкове число в діапазоні від 0 до 255.
У прикріпленому файлі скетч, який продемонструє плавні переходи кольорів від червоного до зеленого, потім до синього, червоного, зеленого тощо. (завантажень: 348)
Приклад скетчу працює, але є багато коду, що повторюється. Можна спростити код, написавши власну допоміжну функцію, яка плавно змінюватиме один колір на інший.
Ось як вона виглядатиме: (скачувань: 385)
Давайте розглянемо визначення функції частинами. Функція називається faderі має два аргументи. Кожен аргумент відокремлюється комою і має тип оголошений у першому рядку визначення функції: void fader (int color1, int color2). Ви бачите, що обидва аргументи оголошені як int, і їм присвоєно імена color1і color2як умовні змінні для визначення функції. Voidозначає, що функція не повертає жодних значень, вона просто виконує команди. Якщо треба було б написати функцію, яка повертала результат множення, це виглядало б так:
int multiplier(int number1, int number2)( int product = number1*number2; return product; )
Зверніть увагу, як ми оголосили Тип intяк тип значення, що повертається замість
void.
Усередині функції йдуть команди, які ви вже використовували у попередньому скетчі, лише номери висновків замінили на color1і color2. Викликається функція fader, її аргументи обчислюються як color1 = redі color2 = green. В архіві повний скетч із використанням функцій (скачувань: 288)

Кнопка

У наступному скетчі використовуватиметься кнопка з нормально розімкненими контактами, без фіксації.


Це означає, що поки кнопка не натиснута, струм через неї не йде, а після відпускання кнопка повертається у вихідне положення.
У схемі, крім кнопки, використовується резистор. У разі він обмежує струм, а " підтягує " кнопку до 0в (GND). Тобто. доки кнопка не натиснута на виводі Arduino, до якого вона підключена, буде низький рівень. Резистор, що використовується у схемі 10 кОм.


// Визначаємо натискання кнопки int buttonPin = 7; void setup()( pinMode(buttonPin, INPUT); // ініціалізуємо пін на вхід Serial.begin (9600); // ініціалізуємо послідовний порт) кнопка натиснута Serial.println("pressed"); // виводимо напис "pressed" ) else ( Serial.println("unpressed");// інакше "unpressed" ) )
У цьому скетчі кілька нових команд.
-Ця команда приймає значення High (високий рівень) і low (низький рівень) того висновку, який ми перевіряємо. Попередньо setup() цей висновок треба налаштувати на вхід.
; //де buttonPin це номер виводу, куди приєднується кнопка.
Послідовний порт дозволяє відправляти Arduino повідомлення на комп'ютер, тоді як сам контролер виконує програму. Це корисно для налагодження програми, надсилання повідомлень на інші пристрої або програми. Щоб увімкнути передачу даних через послідовний порт (інша назва UART або USART), треба ініціалізувати його до setup()

Serial.begin()має всього один аргумент-це швидкість передачі між Arduino і комп'ютером.
скетче використовується команда для виведення повідомлення на екран Arduino IDE (Tools >> Serial Monitor).
- конструкція дозволяють контролювати хід виконання програми, поєднавши кілька перевірок в одному місці.
If(якщо) digitalRead повертає значення HIGH, то на моніторі виводиться слово "натиснена". Else (інакше) на моніторі виводиться слово "віджата". Тепер можна спробувати вмикати та вимикати світлодіод за натисканням кнопки.
//button press detection with LED output int buttonPin = 7; int ledPin = 8; void setup()( pinMode(buttonPin, INPUT); =HIGH)( digitalWrite(ledPin,HIGH); Serial.println("pressed"); ) else ( digitalWrite(ledPin,LOW); Serial.println("unpressed"); ) )

Аналоговий вхід

analogReadдозволяє вважати дані з одного з аналогових висновків Arduino та виводить значення в діапазоні від 0 (0В) до 1023 (5В). Якщо напруга на аналоговому вході дорівнюватиме 2.5В, то буде надруковано 2.5/5*1023=512
analogReadмає тільки один аргумент - це номер аналогового входу (А0-А5). У наступному скетчі наводиться код зчитування напруги з потенціометра. Для цього підключіть змінний резистор крайніми висновками на піни 5V і GND, а середній висновок на вхід А0.

Запустіть наступний код і подивіться в serial monitor, як змінюються значення, залежно від повороту ручки резистора.
//analog input int potPin = A0;//до цього піну приєднується центральний висновок потенціометра void setup()( //аналоговий пін за замовчуванням включений на вхід, тому ініціалізація не потрібна Serial.begin(9600); ) void loop()( int potVal = analogRead(potPin);//potVal is a number between 0 and 1023 Serial.println(potVal);
Наступний скетч поєднує скетч натискання кнопки та скетч керування яскравістю світлодіода. Світлодіод буде включатись від кнопки, і керувати яскравістю свічення буде потенціометр.
//button press detection with LED output and variable intensity int buttonPin = 7; int ledPin = 9; int potPin = A0; void setup()( pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); Serial.begin(9600); ) void loop()( if (digitalRead(buttonPin)==HIGH)( // = analogRead(potPin);int scaledVal = map(analogVal, 0, 1023, 0, 255);analogWrite(ledPin, scaledVal); (digitalWrite(ledPin, LOW);

Доставка нових саморобок на пошту

Отримуйте на пошту добірку нових саморобок. Жодного спаму, тільки корисні ідеї!

Це, безперечно, відмінне стартове рішення, але наскільки далеко Ви можете зайти у використанні Arduino? Ну, досить далеко, але до певної межі, тому що (як і взагалі у житті) завжди доводиться обирати між простотою та продуктивністю. Напевно, саме тому спостерігається поява високопродуктивних клонів Arduino, таких як мікроконтролерів компанії сімейства або Netduino на мікроконтролерах ARM. Ця альтернатива може врятувати розробника в багатьох випадках приростом продуктивності, але, зрештою, все ж таки залишаються приховані функції та бібліотеки, які використовують ресурси мікроконтролера, і користувачі будуть змушені вивчати апаратну частину мікроконтролера.

Автор особисто вирішив повністю відмовитись від Arduino після кількох місяців вивчення. Фактично, як стверджує автор, сама платформа Arduino підштовхнула його на цей крок. Нижче наведено причини, але спочатку розглянемо переваги Arduino.

Плюси Arduino (Що чудово):

  • Інтегроване середовище розробки Arduino IDE ґрунтується на компіляторі мови Сі AVRGCC. Вивчення Arduino, зрештою, допоможе у вивченні С++. Якщо Вам не подобаються специфічні високорівневі команди або бібліотеки Arduino, ви зможете замінити їх на С++ еквіваленти (як з'ясовується, не завжди);
  • Живлення, програмування та комунікація з Arduino платформою здійснюється за допомогою одного USB-кабелю (або кабелю з адаптером на спеціалізованій мікросхемі для деяких клонів);
  • З вбудованими бібліотеками ви можете реалізувати якийсь простий (і повільний) проект за лічені хвилини, не замислюючись, як ці бібліотеки реалізовані та як працюють. Повільно відбувається читання кнопок, відображення даних на РК дисплеї або їхнє відправлення по послідовному інтерфейсу, робота з електродвигунами;
  • Комунікація за послідовним інтерфейсом та SPI чудова і стандартна.

Мінуси Arduino (Що жахливо):

  • Arduino IDE - це найгірший і найнепридатніший редактор коду після «Блокнота». В один день ви переключитеся на гідний зовнішній редактор, проте вам все одно доведеться залишити відкритою Arduino IDE для програмування пристрою;
  • Завантажувач Arduino. Для того, щоб завершити будь-який Arduino-пристрій, вам доведеться вручну запрограмувати завантажувач у кожен чистий мікроконтролер ATmega. Це зменшує доступний обсяг Flash-пам'яті програм на 2 Кбайти;
  • Всього кілька варіантів: якщо ви будете використовувати офіційні плати Arduino, вибрати ви зможете тільки з варіантів з 30 Кбайт або 254 КБайт вбудованої пам'яті програм. Що буде, якщо ваш код займає, скажімо 42 Кбайт? Єдиний вибір – використання клону Sanguino, який не повністю сумісний з Arduino;
  • Немає простого способу змінити тактову частоту, чи не так? Модель мікроконтролера з живленням 3.3 і тактовою частотою 8 МГц може безпечно працювати на частоті 12 МГц;
  • Функція digitalWrite() виконується за 56 циклів (хоча автором було отримано результат 400 циклів). Принаймні, це легко з'ясувати і перейти до використання прямого доступу до портів (другий елемент зміни після Arduino IDE). Як правило, Arduino не дуже зручна для написання ефективного коду;
  • Ви не зможете (принаймні просто) відключити бібліотеку послідовної комунікації, яка використовується за замовчуванням, щоб використовувати TX та RX переривання, незалежно від того, була вона запущена, чи ні;
  • Підпрограма обслуговування переривання з переповнення таймера запускається через кожні 16000 циклів у фоновому режимі. Це зроблено для роботи функцій millis() та micros(), навіть коли вони не використовуються;
  • Порожній Arduino проект для платформи Arduino UNO займає 466 байт і 666 байт для Arduino Mega2560. Додаткове витрачання ресурсів не влаштовує багатьох, зокрема й автора статті. Також неприємно бачити помилки компіляції проекту, пов'язані із вищеописаними змінами;
  • Останнє, але не менш важливе – середовище розробки Arduino, без сумніву, «приховує» важливі аспекти архітектури мікроконтролера: регістри, переривання та таймери. Їхнє знання просто необхідне.

Проблеми при використанні AVRGCC:

  • Необхідність переписувати деякі елементи С++, найбільш важливим з яких є обмін по послідовному інтерфейсу (можливо, найкраща частина в Arduino). На щастя, є багато практичних порад та посібників з цього завдання. Написання інших протоколів набагато простіше, наприклад, SPI;
  • Необхідно вивчити, до яких бібліотек включені команди без компіляції, і включити ці бібліотеки до файлу вихідного коду. Найбільш поширеними є: avr/io.h, avr/interrupt.h, util/delay.h, stdio.h and string.h;
  • Типи байтових і логічних змінних повинні бути uint8_t і bool, байтові числа, наприклад, B00010001, повинні бути у вигляді 0b00010001, і так далі. Ви знайдете решту змін, їх дуже мало;
  • Потрібно більше знань і, головне, не здаватися.

Користь від використання AVRGCC:

  • Чи потрібний інший процесор для збільшення пам'яті програм або продуктивності? Ви можете використовувати його (наприклад, з тієї ж серії megaAVR), і доведеться тільки перекомпілювати проект. Потрібно змінити деякі регістри та імена переривань, make-файл та Fuse-біти;
  • Потрібна інша тактова частота? Використовуйте інший кварцовий резонатор, або можна використовувати вбудований осцилятор мікроконтролера, лише змінивши Fuse-біти і make-файл;
  • Можна використовувати гідне (Notepad++) або потужне (Atmel Studio 6) інтегроване середовище розробки коду;
  • Ви отримуєте повний контроль за своїм кодом. Те, що ви написали, те й виконується. Нічого не ховається, нічого не відбувається без вашої згоди. Ви пишете більш ефективний та швидкий код. Ви дізнаєтесь більше.

Як і для Arduino, для AVRGCC є велика кількість допоміжних засобів, готових проектів, бібліотек та навчальних матеріалів. Вибір залишається за користувачами.

Подібні публікації