⚡ Практикум • 💻 Программирование • 📊 Исследования
5 класс • Технология • 90 минут
👨🏫 Учитель: Ахметов Рустам
🏫 Школа: ГБОУ № 1362
📅 Дата: 2025-06-11
🎯 Миссия: Научиться управлять движением роботов!
🔬 Сегодня научимся:
🧰 Оборудование на пару:
⚠️ Техника безопасности:
1. Типы электродвигателей:
2. Принцип работы:
3. Управление скоростью:
🔌 Базовое подключение двигателя к Arduino:
Arduino Uno → Двигатель
+5V → Красный провод (+)
GND → Черный провод (-)
Pin 9 → Управляющий сигнал
⚠️ Важно:
🔧 Порядок подключения:
📝 Базовый алгоритм:
void setup() {
// Настройка пинов
pinMode(9, OUTPUT); // Пин управления мотором
}
void loop() {
// Управляющие команды
analogWrite(9, 128); // 50% мощности
delay(2000); // 2 секунды
analogWrite(9, 0); // Остановка
delay(1000); // 1 секунда
}
🧮 Диапазон значений ШИМ:
Шаг 1: Подготовка
Шаг 2: Подключение питания
Шаг 3: Подключение управления
Шаг 4: Проверка
🔬 Тестирование мультиметром (если есть):
Проверка сопротивления:
Проверка цепи:
Контроль напряжения:
📋 Результаты измерений:
| Параметр | Измеренное значение | Норма |
|---|---|---|
| Сопротивление мотора | ___ Ом | 10-50 Ом |
| Напряжение питания | ___ В | ~5 В |
| Целостность проводов | ✓/❌ | ✓ |
💻 Простейшая программа проверки:
void setup() {
pinMode(9, OUTPUT);
Serial.begin(9600);
Serial.println("Тест мотора начат");
}
void loop() {
Serial.println("Мотор включен");
analogWrite(9, 100); // Слабое вращение
delay(3000);
Serial.println("Мотор выключен");
analogWrite(9, 0);
delay(2000);
}
📝 Наблюдения:
📝 Расширенная программа:
void setup() {
pinMode(9, OUTPUT);
Serial.begin(9600);
Serial.println("Программа управления скоростью");
}
void loop() {
// Последовательность скоростей
testSpeed(64); // 25%
testSpeed(128); // 50%
testSpeed(192); // 75%
testSpeed(255); // 100%
// Остановка
analogWrite(9, 0);
delay(2000);
}
void testSpeed(int speed) {
Serial.print("Скорость: ");
Serial.print(speed * 100 / 255);
Serial.println("%");
analogWrite(9, speed);
delay(3000);
}
⚙️ Для реверсивного управления нужен драйвер L298N:
// Пины управления направлением
#define MOTOR_PIN1 7
#define MOTOR_PIN2 8
#define MOTOR_SPEED 9
void setup() {
pinMode(MOTOR_PIN1, OUTPUT);
pinMode(MOTOR_PIN2, OUTPUT);
pinMode(MOTOR_SPEED, OUTPUT);
}
void motorForward(int speed) {
digitalWrite(MOTOR_PIN1, HIGH);
digitalWrite(MOTOR_PIN2, LOW);
analogWrite(MOTOR_SPEED, speed);
}
void motorBackward(int speed) {
digitalWrite(MOTOR_PIN1, LOW);
digitalWrite(MOTOR_PIN2, HIGH);
analogWrite(MOTOR_SPEED, speed);
}
void motorStop() {
digitalWrite(MOTOR_PIN1, LOW);
digitalWrite(MOTOR_PIN2, LOW);
analogWrite(MOTOR_SPEED, 0);
}
📱 Управление через последовательный порт:
void setup() {
pinMode(9, OUTPUT);
Serial.begin(9600);
Serial.println("Введите команду:");
Serial.println("0-9: скорость (0=стоп, 9=максимум)");
}
void loop() {
if (Serial.available()) {
char command = Serial.read();
if (command >= '0' && command <= '9') {
int speed = (command - '0') * 28; // 0-252
analogWrite(9, speed);
Serial.print("Установлена скорость: ");
Serial.print(speed * 100 / 255);
Serial.println("%");
}
}
}
🎮 Команды управления:
0 → остановка1 → 11% мощности5 → 55% мощности9 → 100% мощности🔄 Подсчет оборотов с помощью меток:
// Переменные для измерения
unsigned long startTime;
int revolutionCount = 0;
bool measurementActive = false;
void setup() {
pinMode(9, OUTPUT);
Serial.begin(9600);
Serial.println("Измерение скорости начато");
}
void measureSpeed(int motorPower) {
Serial.print("Тест при мощности ");
Serial.print(motorPower);
Serial.println("/255");
analogWrite(9, motorPower);
delay(1000); // Время на разгон
Serial.println("Считайте обороты в течение 30 секунд");
startTime = millis();
while (millis() - startTime < 30000) {
// Ждем 30 секунд для подсчета
delay(100);
}
analogWrite(9, 0); // Остановка
Serial.println("Введите количество оборотов:");
// Ждем ввода от пользователя
}
🎯 Цель: Установить зависимость между мощностью ШИМ-сигнала и скоростью вращения мотора.
📋 План эксперимента:
⏱️ Инструкция по измерению:
| № | Мощность ШИМ | Мощность, % | Обороты за 30с | Скорость, об/мин | Примечания |
|---|---|---|---|---|---|
| 1 | 51 | 20% | ___ | ___ | |
| 2 | 102 | 40% | ___ | ___ | |
| 3 | 153 | 60% | ___ | ___ | |
| 4 | 204 | 80% | ___ | ___ | |
| 5 | 255 | 100% | ___ | ___ |
🧮 Расчет скорости в об/мин:
\[n = \frac{\text{обороты за 30с} \times 60}{30} = \text{обороты за 30с} \times 2\]📝 Пример расчета: Если за 30 секунд мотор сделал 45 оборотов:
\[n = 45 \times 2 = 90 \text{ об/мин}\]📊 График n = f(P)
Координатные оси:
🎯 Порядок построения:
📐 Пример масштаба:
📈 Определение типа зависимости:
Если зависимость линейная:
\(n = k \cdot P + b\)где:
🔢 Расчет коэффициента наклона:
\[k = \frac{n_2 - n_1}{P_2 - P_1}\]📝 Пример: При P₁ = 20%, n₁ = 30 об/мин При P₂ = 100%, n₂ = 150 об/мин
\[k = \frac{150 - 30}{100 - 20} = \frac{120}{80} = 1.5 \text{ об/мин на %}\]🎯 Физический смысл: При увеличении мощности на 1% скорость увеличивается на 1.5 об/мин
⚡ Измерение тока потребления (если есть амперметр):
| Мощность, % | Ток, мА | Расчетная мощность, мВт |
|---|---|---|
| 20% | ___ | ___ |
| 40% | ___ | ___ |
| 60% | ___ | ___ |
| 80% | ___ | ___ |
| 100% | ___ | ___ |
🧮 Расчет мощности:
\[P = U \times I = 5\text{В} \times I\text{(А)}\]🎯 Цель: Понять, как растет энергопотребление с увеличением нагрузки
📊 Характер зависимости:
Из графика видно, что зависимость скорости от мощности:
🧮 Уравнение зависимости:
\[n = \_\_\_ \cdot P + \_\_\_\]📐 Коэффициент корреляции: Насколько точно точки ложатся на прямую линию?
🔋 Пороговые эффекты:
Минимальная мощность запуска:
📈 Линейность в рабочем диапазоне:
🔥 Максимальная нагрузка:
🤖 Применение в робототехнике:
1. Точное управление скоростью:
2. Энергосбережение:
3. Программирование движения:
// Медленное движение
analogWrite(motorPin, 80); // ~30% мощности
// Нормальное движение
analogWrite(motorPin, 150); // ~60% мощности
// Быстрое движение
analogWrite(motorPin, 255); // 100% мощности
👥 Сравнение результатов разных команд:
| Команда | Коэффициент k | Мин. мощность запуска | Макс. скорость |
|---|---|---|---|
| 1 | ___ | ___% | ___ об/мин |
| 2 | ___ | ___% | ___ об/мин |
| 3 | ___ | ___% | ___ об/мин |
| 4 | ___ | ___% | ___ об/мин |
| Среднее | ___ | ___% | ___ об/мин |
❓ Причины различий:
🎯 Какие результаты считать правильными? Средние значения наиболее достоверны при условии правильных измерений
📏 Погрешности измерений:
1. Случайные погрешности:
2. Систематические погрешности:
🧮 Расчет погрешности:
\[\delta = \frac{\text{разброс значений}}{\text{среднее значение}} \times 100\%\]📝 Пример: Если измерения: 28, 30, 32 оборота за 30с Среднее: 30, разброс: ±2 Погрешность: δ = 2/30 × 100% = 6.7%
📋 Цель: Добавить возможность вращения в обе стороны
🔌 Схема подключения с драйвером L298N:
Arduino → L298N → Мотор
Pin 7 → IN1
Pin 8 → IN2
Pin 9 → ENA (скорость)
5V → VCC
GND → GND
💻 Программа управления:
void setup() {
pinMode(7, OUTPUT); // Направление 1
pinMode(8, OUTPUT); // Направление 2
pinMode(9, OUTPUT); // Скорость
Serial.begin(9600);
}
void loop() {
// Вперед
motorForward(150);
delay(3000);
// Стоп
motorStop();
delay(1000);
// Назад
motorBackward(150);
delay(3000);
// Стоп
motorStop();
delay(1000);
}
void motorForward(int speed) {
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
analogWrite(9, speed);
}
void motorBackward(int speed) {
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
analogWrite(9, speed);
}
void motorStop() {
digitalWrite(7, LOW);
digitalWrite(8, LOW);
analogWrite(9, 0);
}
🎯 Цель: Измерить время остановки мотора после отключения питания
⏱️ Методика:
📋 Таблица результатов:
| Начальная мощность, % | Время остановки, с | Количество оборотов по инерции |
|---|---|---|
| 40% | ___ | ___ |
| 60% | ___ | ___ |
| 80% | ___ | ___ |
| 100% | ___ | ___ |
🧮 Анализ:
🚗 Цель: Имитировать движение автомобиля с разными режимами
💻 Алгоритм программы:
void setup() {
pinMode(9, OUTPUT);
Serial.begin(9600);
Serial.println("Режимы движения автомобиля:");
Serial.println("1 - Парковка");
Serial.println("2 - Город");
Serial.println("3 - Трасса");
}
void loop() {
if (Serial.available()) {
char mode = Serial.read();
switch(mode) {
case '1':
parkingMode();
break;
case '2':
cityMode();
break;
case '3':
highwayMode();
break;
}
}
}
void parkingMode() {
Serial.println("Режим парковки - медленное движение");
analogWrite(9, 80); // ~30% мощности
}
void cityMode() {
Serial.println("Городской режим - средняя скорость");
analogWrite(9, 150); // ~60% мощности
}
void highwayMode() {
Serial.println("Трасса - высокая скорость");
analogWrite(9, 220); // ~85% мощности
}
📡 Цель: Управление мотором с помощью Bluetooth
📱 Приложение на смартфоне отправляет команды:
F - впередB - назадL - левоR - правоS - стоп0-9 - скорость💻 Программа обработки команд:
void loop() {
if (bluetooth.available()) {
char command = bluetooth.read();
switch(command) {
case 'F':
motorForward(currentSpeed);
break;
case 'B':
motorBackward(currentSpeed);
break;
case 'S':
motorStop();
break;
case '0'...'9':
currentSpeed = (command - '0') * 25;
break;
}
}
}
1. Схема подключения двух моторов Нарисуйте схему подключения двух моторов к одному контроллеру Arduino для управления двухколесным роботом:
Мотор А (левое колесо):
- Пины управления: ___
- Пин скорости: ___
Мотор Б (правое колесо):
- Пины управления: ___
- Пин скорости: ___
2. Программа дифференциального управления Напишите псевдокод программы, которая заставит робота:
3. Анализ эксперимента Ответьте на вопрос: “Как можно использовать информацию о зависимости скорости от мощности при конструировании робота?” (минимум 5 применений)
🔬 Для исследователей: Проведите дома эксперимент с игрушечной машинкой на радиоуправлении:
💻 Для программистов: Изучите документацию по библиотеке Servo.h и напишите программу управления сервоприводом с плавным изменением угла поворота.
🧮 Для математиков: Постройте математическую модель зависимости времени разгона мотора от приложенного напряжения. Учтите инерцию ротора и сопротивление.
📚 Обучающие материалы:
🛠️ Симуляторы:
📱 Мобильные приложения:
🔌 Технические навыки:
🔬 Исследовательские навыки:
🧮 Математические навыки:
📈 Главная закономерность: Скорость вращения электродвигателя пропорциональна мощности управляющего ШИМ-сигнала в рабочем диапазоне.
🧮 Математическая модель: \[n = k \cdot P + n_0\]
где n₀ - минимальная мощность запуска
🤖 Практическое применение:
🔮 Что будем изучать дальше:
🎯 Как сегодняшние знания пригодятся:
👨🏫 Учитель: Ахметов Рустам
📧 Email: r.akhmetov@gse1362.ru
💬 Classroom: gse1362.classroom.ru
⏰ Консультации: ПН, СР 15:00-16:00, каб. 205
🔧 Помощь с проектами:
🎯 Следующий урок: “Датчики - органы чувств робота”
⚡ ПРОДОЛЖАЕМ СОЗДАВАТЬ УМНЫХ РОБОТОВ!
Увидимся на следующем практикуме!