Arduino для початківців. Як створити зоотроп на Arduino: керування мотором через H-мост для анімації (Частина 10)

24 лютого 2025 1 хвилина Автор: Lady Liberty

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

Зоотроп

Створення рухомих зображень у прямому та зворотному напрямку за допомогою Arduino, мотора та H-мосту.

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

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

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

H-мости є різновидом компонентів, які називаються інтегральними схемами (IC). Інтегральна схема — це електронний елемент, який у компактному корпусі містить велику кількість електричних компонентів. Вони значно спрощують складні електронні схеми, оскільки поєднують безліч елементів в одному модулі, який легко замінити.

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

Кожна інтегральна схема має контактні виводи (піни), через які можна підключатися до її внутрішніх ланцюгів. Різні IC можуть мати різну кількість пінів, і не всі вони використовуються в кожній схемі. Щоб спростити роботу з ними, зручніше нумерувати виводи, а не запам’ятовувати їхню функцію.

WiПри розташуванні IC важливо орієнтувати її правильно: верхня частина позначається виїмкою або крапкою. Визначати номери пінів потрібно, рахуючи з верхнього лівого кута в напрямку «U», як показано на схемі.

  1. Підключіть живлення та землю з одного боку макетної плати до Arduino.

  2. Додайте дві кнопки (моментальні перемикачі) на макетну плату, підключивши одну сторону кожної до живлення. До вихідного контакту кожної кнопки під’єднайте резистор на 10 кОм, підключений до землі (pull-down резистор). Кнопка на піні 4 керуватиме напрямком обертання, а кнопка на піні 5 вмикатиме та вимикатиме мотор.

  3. Підключіть потенціометр до макетної плати. Один його край підключіть до 5V, інший — до землі, а центральний вивід з’єднайте з аналоговим входом A0 на Arduino. Це дозволить регулювати швидкість мотора.

  4. Розмістіть H-міст на макетній платі так, щоб він охоплював центральний роз’єм (див. рис. 2 для правильного розташування). Підключіть пін 1 H-мосту до цифрового піну 9 на Arduino. Це enable-пін, який вмикає та вимикає мотор: при отриманні 5V мотор увімкнеться, при 0V — вимкнеться. За допомогою цього піна буде використовуватися PWM для регулювання швидкості мотора.

  5. Підключіть пін 2 H-мосту до цифрового піну 3 на Arduino, а пін 7 H-мосту — до піну 2. Ці піни використовуються для передачі команд H-мосту щодо напрямку обертання.Якщо пін 3 = LOW, а пін 2 = HIGH — мотор обертатиметься в одному напрямку. Якщо пін 2 = LOW, а пін 3 = HIGH — мотор змінить напрямок на протилежний. Якщо обидва піни одночасно HIGH або LOW — мотор зупиниться.

  6. H-міст отримує живлення через пін 16, підключений до 5V. Піни 4 і 5 H-мосту необхідно з’єднати із землею.

  7. Підключіть мотор до пінів 3 і 6 H-мосту. Ці два піни будуть переключатися залежно від сигналів, які надсилаються через пін 2 і пін 7.

  8. Підключіть роз’єм батареї (без встановленої батареї!) до інших живильних шин на макетній платі. З’єднайте землю Arduino із землею батареї. Пін 8 H-мосту підключіть до живлення від батареї. Не з’єднуйте лінії 9V і 5V разом! Вони мають залишатися розділеними, спільною повинна бути лише земля.

Код

  • Оголошення констант. Створіть константи для вхідних і вихідних пінів.

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

  • Оголошення змінних для керування мотором. motorDirection зберігає інформацію про напрямок обертання. motorPower контролює, чи мотор увімкнений чи вимкнений.

  • Оголошення цифрових пінів як входів та виходів.  У функції setup() задайте напрямок для кожного піну — визначте, які будуть вхідними (INPUT), а які вихідними (OUTPUT).

  • Вимкнення мотора при старті. Перед початком роботи встановіть enable-пін у LOW, щоб мотор залишався вимкненим одразу після запуску програми.

  • Зчитування даних із сенсорів. У функції loop() необхідно прочитати стан кнопки вмикання/вимикання і зберегти його в змінну onOffSwitchState.

const int controlPin1 = 2;
const int controlPin2 = 3;
const int enablePin = 9;
const int directionSwitchPin = 4;
const int onOffSwitchStateSwitchPin = 5;
const int potPin = A0;
int onOffSwitchState = 0;
int previousOnOffSwitchState = 0;
int directionSwitchState = 0;
int previousDirectionSwitchState = 0;
int motorEnabled = 0;
int motorSpeed = 0;
int motorDirection = 1;
void setup(){
 pinMode(directionSwitchPin, INPUT);
 pinMode(onOffSwitchStateSwitchPin, INPUT);
 pinMode(controlPin1, OUTPUT);
 pinMode(controlPin2, OUTPUT);
 pinMode(enablePin, OUTPUT);
 digitalWrite(enablePin, LOW);
}
void loop(){
 onOffSwitchState =
 digitalRead(onOffSwitchStateSwitchPin);
 delay(1);
 directionSwitchState =
 digitalRead(directionSwitchPin);
 motorSpeed = analogRead(potPin)/4;
  • Перевірте, чи змінився стан датчика вмикання/вимикання. Якщо поточний стан перемикача відрізняється від попереднього і перемикач зараз знаходиться у стані HIGH, встановіть змінну motorPower у значення 1. Якщо стан LOW, встановіть змінну у 0. Зчитайте значення перемикача напрямку та потенціометра. Збережіть отримані значення у відповідних змінних.

  • Перевірте, чи змінився напрямок. Переконайтеся, що перемикач напрямку зараз знаходиться в іншому положенні, ніж був раніше. Якщо це так, змініть значення змінної напрямку мотора. Існує лише два способи обертання мотора, тому змінну потрібно чергувати між двома станами. Один із способів зробити це — використати оператор інверсії: motorDirection = !motorDirection;

  • Змініть піни для правильного напрямку обертання мотора. Змінна motorDirection визначає, в якому напрямку обертається мотор. Щоб встановити напрямок, необхідно налаштувати керуючі піни: один у HIGH, інший у LOW. Коли motorDirection змінюється, потрібно інвертувати стани керуючих пінів. Якщо натиснуто перемикач напрямку, мотор має змінити напрямок, інвертуючи значення controlPins.

  • Використовуйте PWM, якщо мотор увімкнений. Якщо змінна motorEnabled дорівнює 1, встановіть швидкість мотора за допомогою analogWrite(), використовуючи PWM для enablePin. Якщо motorEnabled дорівнює 0, вимкніть мотор, встановивши analogWrite() у значення 0.

  • Збережіть поточні стани для наступного циклу. Перед виходом із loop(), збережіть поточні стани перемикачів як попередні, щоб у наступному циклі програма могла правильно реагувати на зміни.

if(onOffSwitchState != previousOnOffSwitchState){
 if(onOffSwitchState == HIGH){
 motorEnabled = !motorEnabled;
 }
 }
 if (directionSwitchState !=
 previousDirectionSwitchState) {
 if (directionSwitchState == HIGH) {
 motorDirection = !motorDirection;
 }
 }
 if (motorDirection == 1) {
 digitalWrite(controlPin1, HIGH);
 digitalWrite(controlPin2, LOW);
 }
 else {
 digitalWrite(controlPin1, LOW);
 digitalWrite(controlPin2, HIGH);
 }
 if (motorEnabled == 1) {
 analogWrite(enablePin, motorSpeed);
 }
 else {
 analogWrite(enablePin, 0);
 }
 previousDirectionSwitchState =
 directionSwitchState;
 previousOnOffSwitchState = onOffSwitchState;
}

Використання

Підключіть Arduino до комп’ютера. Приєднайте батарею до роз’єму.

Натиснувши кнопку вмикання/вимикання, мотор повинен почати обертатися. Якщо повернути потенціометр, швидкість мотора буде змінюватися – він прискориться або сповільниться. Повторне натискання кнопки вимкне мотор.

Спробуйте натиснути кнопку зміни напрямку та перевірте, що мотор може обертатися в обидва боки. Також, якщо ви повернете ручку потенціометра, мотор буде змінювати швидкість відповідно до отриманого значення.

Після перевірки роботи схеми від’єднайте батарею та USB-кабель.

1. Закріпіть компакт-диск на дерев’яній основі. Додайте краплю клею, щоб переконатися, що він не розкрутиться, коли двигун запуститься. 2. Використовуйте виступи, щоб закрити виріз, утворюючи коло.

Щоб побудувати свій зоотроп, ви повинні взяти вертушка, яку ви використовували в Project 9, і виріз із вертикальними прорізами, який входить у ваш комплект. Після того, як компакт-диск буде надійно прикріплений до валу двигуна, під’єднайте все назад. Тримайте проект угорі, щоб ви могли дивитися крізь щілини (але переконайтеся, що компакт-диск закріплено на двигуні, і не наближайтеся до нього). Ви повинні побачити, як послідовність нерухомих зображень «рухається»! Якщо анімація йде надто швидко або повільно, поверніть ручку потенціометра, щоб відрегулювати швидкість анімації.

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

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

Зліва. Вставте чотири виступи в основу зоотропа. Справа. Вставте смужку паперу із зображеннями всередину зоотропа.

Зоотропи діють завдяки феномену, який називається «персистенцією зору», іноді скорочено до POV. POV описує ілюзію руху, яка створюється, коли наші очі спостерігають нерухомі зображення з незначними варіаціями у швидкій послідовності. Якщо ви шукаєте в Інтернеті «POV дисплей», ви знайдете багато проектів, створених людьми, які використовують цей ефект, часто зі світлодіодами та Arduino.

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

Трохи попрацювавши, ви зможете змусити свій zoetrope працювати навіть за умов слабкого освітлення. Підключіть світлодіод і резистор до одного з безкоштовних цифрових вихідних контактів. Також додайте другий потенціометр і підключіть його до аналогового входу. Розташуйте світло так, щоб воно світило на зображеннях. Використовуючи аналоговий вхід для вимірювання часу спалаху світлодіода, спробуйте визначити час, щоб світло спалахував, коли щілина знаходиться перед вашими очима. Для цього може знадобитися трохи повозитися з ручками, але результат справді вражаючий!

Інші статті по темі
Майстерня мікроконтролерівОсвіта
Читати далі
Arduino для початківців. Створюємо прості схеми з LED, кнопками та резисторами (Частина 2)
Ви дізнаєтеся, що таке електричний струм, напруга та опір, а також на практиці вивчите основи роботи з паралельним і послідовним з’єднанням компонентів.
287
Майстерня мікроконтролерівОсвіта
Читати далі
Arduino для початківців. Як зробити механічний індикатор настрою на Arduino за допомогою сервоприводу (Частина 5)
Ви дізнаєтесь, як працює сервопривід, як його підключити до Arduino за допомогою бібліотеки Servo, а також як використовувати потенціометр для керування положенням стрілки.
199
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.