Окреме стабілізоване живлення 5 В для серво1 комплект
У Wokwi додай ці компоненти до проєкту. USB-кабель потрібен лише для справжньої плати. На столі серво живиться окремо; GND джерела та Uno з’єднані. Перший запуск — без навантаження.
5 кроків · у власному темпі
Урок 10.2 · Крок 1 / 5
Від положення до руху
Як це працює
Великий стрибок і малі кроки
Порівняй дві послідовності: 60 → 120 та 60 → 61 → 62 → … → 120. Кінцеві положення однакові. У другому випадку Arduino багато разів змінює ціль, тому ми можемо розтягнути рух у часі.
Як це пов’язано зі Sweep
У статті приклад Sweep проходить діапазон двома циклами for. У нашій програмі один loop повторює малий крок, а змінна direction зберігає напрямок. Починаємо з обмеженого діапазону 60–120. Це послідовність команд; реальний двигун може трохи відставати.
У Wokwi: відкрий новий Arduino Uno, перенеси diagram.json, sketch/sketch.ino та libraries.txt з ZIP потрібного кроку у відповідні вкладки, натисни ▶. На справжній платі спочатку перевір підключення за схемою. Кожен код замінює весь попередній скетч.
Схема підключення — відкрити
Підключення справжнього комплекту
На макетній платі верхня + — тільки джерело серво, нижня + — тільки Uno. Об’єднуємо мінусові шини. Перевір розриви шин; за потреби з’єднай половини тієї самої шини. У Wokwi верхня + живиться від Uno лише як спрощення. На справжній платі цей дріт заміни на +5 V окремого джерела; його мінус додай на верхню −.
Код цього кроку — відкрити й скопіювати
Повний код кроку 1
#include <Arduino.h>
#include <Servo.h>
constbyte SERVO_PIN = 9;
constint ANGLE = 90; // Початковий кут без стріли
Servo arm;
constint FIRST_ANGLE = 60; // Перше положенняconstint SECOND_ANGLE = 120; // Друге положенняconstunsignedlong HOLD_MS = 2000; // Час у кожному положенніvoid setup() {
arm.write(ANGLE); // Задаємо початкове положення
arm.attach(SERVO_PIN); // Сигнал керування через D9
}
void loop() {
arm.write(FIRST_ANGLE);
delay(HOLD_MS);
arm.write(SECOND_ANGLE);
delay(HOLD_MS);
}
Крок 1: код · 1
#include <Arduino.h>
#include <Servo.h>
constbyte SERVO_PIN = 9;
constint ANGLE = 90; // Початковий кут без стріли
Servo arm;
constint FIRST_ANGLE = 60; // Перше положенняconstint SECOND_ANGLE = 120; // Друге положенняconstunsignedlong HOLD_MS = 2000; // Час у кожному положенніvoid setup() {
arm.write(ANGLE); // Задаємо початкове положення
arm.attach(SERVO_PIN); // Сигнал керування через D9
}
void loop() {
arm.write(FIRST_ANGLE);
delay(HOLD_MS);
arm.write(SECOND_ANGLE);
delay(HOLD_MS);
}
angle — остання задана ціль. Спочатку це 60. Програма надсилає її, чекає 30 мс і додає direction × STEP_DEG. За direction = 1 і STEP_DEG = 1 наступна ціль — 61, потім 62.
Звідки береться зворотний рух
Коли angle досягає MAX_ANGLE, програма встановлює direction = −1. Тепер додавання дає 119, 118 і далі. Біля MIN_ANGLE напрямок знову стає 1. Два if перевіряють межі після кожного кроку.
Зроби
Заміни код програмою цього кроку.
Простеж один повний рух туди й назад.
Знайди рядок, який змінює angle.
Очікуваний результат
Вал проходить проміжні положення від 60 до 120 і назад.
Що можна змінити
STEP_DEG = 1; STEP_MS = 30. Спочатку залиш ці значення.
Схема підключення — відкрити
Підключення справжнього комплекту
На макетній платі верхня + — тільки джерело серво, нижня + — тільки Uno. Об’єднуємо мінусові шини. Перевір розриви шин; за потреби з’єднай половини тієї самої шини. У Wokwi верхня + живиться від Uno лише як спрощення. На справжній платі цей дріт заміни на +5 V окремого джерела; його мінус додай на верхню −.
Код цього кроку — відкрити й скопіювати
Повний код кроку 2
#include <Arduino.h>
#include <Servo.h>
constbyte SERVO_PIN = 9;
constint MIN_ANGLE = 60;
constint MAX_ANGLE = 120;
constint STEP_DEG = 1;
constunsignedlong STEP_MS = 30;
Servo arm;
int angle = MIN_ANGLE;
int direction = 1;
void setup() {
arm.write(angle);
arm.attach(SERVO_PIN);
}
void loop() {
arm.write(angle);
delay(STEP_MS);
angle += direction * STEP_DEG;
if (angle >= MAX_ANGLE) {
angle = MAX_ANGLE;
direction = -1;
}
if (angle <= MIN_ANGLE) {
angle = MIN_ANGLE;
direction = 1;
}
}
Крок 2: код · 1
#include <Arduino.h>
#include <Servo.h>
constbyte SERVO_PIN = 9;
constint MIN_ANGLE = 60;
constint MAX_ANGLE = 120;
constint STEP_DEG = 1;
constunsignedlong STEP_MS = 30;
Servo arm;
int angle = MIN_ANGLE;
int direction = 1;
void setup() {
arm.write(angle);
arm.attach(SERVO_PIN);
}
void loop() {
arm.write(angle);
delay(STEP_MS);
angle += direction * STEP_DEG;
if (angle >= MAX_ANGLE) {
angle = MAX_ANGLE;
direction = -1;
}
if (angle <= MIN_ANGLE) {
angle = MIN_ANGLE;
direction = 1;
}
}
Для переходу від 60 до 120 із кроком 1 потрібні 60 змін кута. За 30 мс між ними це приблизно 60 × 30 = 1800 мс, тобто 1,8 с. За 60 мс — приблизно 3,6 с.
Що саме вимірюємо
Це час зміни команд між крайніми цілями, а не гарантований час руху механіки. Під час порівняння залиш STEP_DEG незмінним. Інакше буде незрозуміло, який параметр спричинив різницю.
Зроби
Порівняй STEP_MS = 20 і 60.
Запиши у зошиті, у якому досліді рух повільніший.
Поверни STEP_MS = 30.
Очікуваний результат
Можеш пояснити вплив паузи, не змінюючи межі руху.
Що можна змінити
STEP_MS: 20–60 мс.
Схема підключення — відкрити
Підключення справжнього комплекту
На макетній платі верхня + — тільки джерело серво, нижня + — тільки Uno. Об’єднуємо мінусові шини. Перевір розриви шин; за потреби з’єднай половини тієї самої шини. У Wokwi верхня + живиться від Uno лише як спрощення. На справжній платі цей дріт заміни на +5 V окремого джерела; його мінус додай на верхню −.
Код цього кроку — відкрити й скопіювати
Повний код кроку 3
#include <Arduino.h>
#include <Servo.h>
constbyte SERVO_PIN = 9;
constint MIN_ANGLE = 60;
constint MAX_ANGLE = 120;
constint STEP_DEG = 1;
constunsignedlong STEP_MS = 30;
Servo arm;
int angle = MIN_ANGLE;
int direction = 1;
void setup() {
arm.write(angle);
arm.attach(SERVO_PIN);
}
void loop() {
arm.write(angle);
delay(STEP_MS);
angle += direction * STEP_DEG;
if (angle >= MAX_ANGLE) {
angle = MAX_ANGLE;
direction = -1;
}
if (angle <= MIN_ANGLE) {
angle = MIN_ANGLE;
direction = 1;
}
}
Крок 3: код · 1
#include <Arduino.h>
#include <Servo.h>
constbyte SERVO_PIN = 9;
constint MIN_ANGLE = 60;
constint MAX_ANGLE = 120;
constint STEP_DEG = 1;
constunsignedlong STEP_MS = 30;
Servo arm;
int angle = MIN_ANGLE;
int direction = 1;
void setup() {
arm.write(angle);
arm.attach(SERVO_PIN);
}
void loop() {
arm.write(angle);
delay(STEP_MS);
angle += direction * STEP_DEG;
if (angle >= MAX_ANGLE) {
angle = MAX_ANGLE;
direction = -1;
}
if (angle <= MIN_ANGLE) {
angle = MIN_ANGLE;
direction = 1;
}
}
За STEP_DEG = 5 команди йдуть 60, 65, 70 і далі. До 120 буде 12 переходів замість 60. При тій самій паузі весь прохід команд скорочується, але проміжних положень стає менше.
Для чого перевіряти межі
Крок не завжди ділить діапазон без залишку. Перевірка >= MAX_ANGLE повертає команду точно на верхню межу, а <= MIN_ANGLE — на нижню. Так програма не продовжує збільшувати чи зменшувати кут без кінця.
Зроби
Порівняй STEP_DEG = 1 і 5 при однаковій паузі.
Опиши різницю плавності.
Збережи найплавніший варіант як Servo_sweep.
Очікуваний результат
У твоїй програмі є рух туди й назад і перевірені межі.
Що можна змінити
STEP_DEG: 1–5; MIN_ANGLE = 60, MAX_ANGLE = 120.
Схема підключення — відкрити
Підключення справжнього комплекту
На макетній платі верхня + — тільки джерело серво, нижня + — тільки Uno. Об’єднуємо мінусові шини. Перевір розриви шин; за потреби з’єднай половини тієї самої шини. У Wokwi верхня + живиться від Uno лише як спрощення. На справжній платі цей дріт заміни на +5 V окремого джерела; його мінус додай на верхню −.
Код цього кроку — відкрити й скопіювати
Повний код кроку 4
#include <Arduino.h>
#include <Servo.h>
constbyte SERVO_PIN = 9;
constint MIN_ANGLE = 60;
constint MAX_ANGLE = 120;
constint STEP_DEG = 1;
constunsignedlong STEP_MS = 30;
Servo arm;
int angle = MIN_ANGLE;
int direction = 1;
void setup() {
arm.write(angle);
arm.attach(SERVO_PIN);
}
void loop() {
arm.write(angle);
delay(STEP_MS);
angle += direction * STEP_DEG;
if (angle >= MAX_ANGLE) {
angle = MAX_ANGLE;
direction = -1;
}
if (angle <= MIN_ANGLE) {
angle = MIN_ANGLE;
direction = 1;
}
}
Крок 4: код · 1
#include <Arduino.h>
#include <Servo.h>
constbyte SERVO_PIN = 9;
constint MIN_ANGLE = 60;
constint MAX_ANGLE = 120;
constint STEP_DEG = 1;
constunsignedlong STEP_MS = 30;
Servo arm;
int angle = MIN_ANGLE;
int direction = 1;
void setup() {
arm.write(angle);
arm.attach(SERVO_PIN);
}
void loop() {
arm.write(angle);
delay(STEP_MS);
angle += direction * STEP_DEG;
if (angle >= MAX_ANGLE) {
angle = MAX_ANGLE;
direction = -1;
}
if (angle <= MIN_ANGLE) {
angle = MIN_ANGLE;
direction = 1;
}
}
MIN_ANGLE і MAX_ANGLE визначають, між якими цілями рухаємося. STEP_DEG визначає величину одного переходу. STEP_MS визначає час до наступного переходу. direction визначає, додаємо ми кут чи віднімаємо.
Перевір себе
Потрібно зберегти крайні положення, але зробити прохід удвічі довшим. Який один параметр можна змінити? Спочатку сформулюй передбачення, потім перевір його на вільному серво.
Зроби
Запиши, як зробити рух повільнішим без зміни діапазону.
Поясни, навіщо direction змінює знак.
Збережи скетч і поясни, як змінилася швидкість руху.
Очікуваний результат
Ти можеш передбачити наслідок зміни кроку і паузи.
Що можна змінити
Для останнього показу поверни STEP_DEG = 1 та STEP_MS = 30.
Схема підключення — відкрити
Підключення справжнього комплекту
На макетній платі верхня + — тільки джерело серво, нижня + — тільки Uno. Об’єднуємо мінусові шини. Перевір розриви шин; за потреби з’єднай половини тієї самої шини. У Wokwi верхня + живиться від Uno лише як спрощення. На справжній платі цей дріт заміни на +5 V окремого джерела; його мінус додай на верхню −.
Код цього кроку — відкрити й скопіювати
Повний код кроку 5
#include <Arduino.h>
#include <Servo.h>
constbyte SERVO_PIN = 9;
constint MIN_ANGLE = 60;
constint MAX_ANGLE = 120;
constint STEP_DEG = 1;
constunsignedlong STEP_MS = 30;
Servo arm;
int angle = MIN_ANGLE;
int direction = 1;
void setup() {
arm.write(angle);
arm.attach(SERVO_PIN);
}
void loop() {
arm.write(angle);
delay(STEP_MS);
angle += direction * STEP_DEG;
if (angle >= MAX_ANGLE) {
angle = MAX_ANGLE;
direction = -1;
}
if (angle <= MIN_ANGLE) {
angle = MIN_ANGLE;
direction = 1;
}
}
Крок 5: код · 1
#include <Arduino.h>
#include <Servo.h>
constbyte SERVO_PIN = 9;
constint MIN_ANGLE = 60;
constint MAX_ANGLE = 120;
constint STEP_DEG = 1;
constunsignedlong STEP_MS = 30;
Servo arm;
int angle = MIN_ANGLE;
int direction = 1;
void setup() {
arm.write(angle);
arm.attach(SERVO_PIN);
}
void loop() {
arm.write(angle);
delay(STEP_MS);
angle += direction * STEP_DEG;
if (angle >= MAX_ANGLE) {
angle = MAX_ANGLE;
direction = -1;
}
if (angle <= MIN_ANGLE) {
angle = MIN_ANGLE;
direction = 1;
}
}