🧠 Логическое мышление • 💻 Алгоритмы • 🤖 Интеллект • 🏆 Соревнования
5 класс • Технология • 90 минут
👨🏫 Учитель: Ахметов Рустам
🏫 Школа: ГБОУ № 1362
📅 Дата: 2025-06-11
🎯 Миссия: Создать действительно умного робота!
🚀 Наша большая миссия:
🎯 Результат работы:
👥 Работаем в парах:
1. Логические операции:
2. Комбинации датчиков:
3. Применение в программах:
🤖 Техническое задание: Создать робота, который демонстрирует четыре разных типа поведения в зависимости от комбинации сигналов от двух датчиков нажатия.
📋 Требования:
🏆 Критерии успеха:
🚗 Вариант А: “Умный автомобиль”
🏠 Вариант Б: “Робот-уборщик”
🎮 Вариант В: “Игровой робот”
🔍 Вариант Г: “Робот-исследователь”
🧮 Математическая основа:
Для n датчиков существует 2^n различных комбинаций.
Для 2 датчиков: 2^2 = 4 комбинации.
📊 Базовая таблица истинности:
| Комбинация | Левый датчик (L) | Правый датчик (R) | Двоичный код | Десятичное |
|---|---|---|---|---|
| 1 | 0 (НЕ НАЖАТ) | 0 (НЕ НАЖАТ) | 00 | 0 |
| 2 | 0 (НЕ НАЖАТ) | 1 (НАЖАТ) | 01 | 1 |
| 3 | 1 (НАЖАТ) | 0 (НЕ НАЖАТ) | 10 | 2 |
| 4 | 1 (НАЖАТ) | 1 (НАЖАТ) | 11 | 3 |
🎯 Задача: Для каждой комбинации определить действие робота.
📊 Детальная таблица поведения:
| L | R | Ситуация | Действие робота | Логическое условие | Продолжительность |
|---|---|---|---|---|---|
| 0 | 0 | Путь свободен | Движение вперед (скорость 200) | НЕ L И НЕ R | Постоянно |
| 0 | 1 | Препятствие справа | Поворот налево | НЕ L И R | 800 мс |
| 1 | 0 | Препятствие слева | Поворот направо | L И НЕ R | 800 мс |
| 1 | 1 | Тупик впереди | Отъезд назад + разворот | L И R | 2000 мс |
🧠 Логические выражения:
Движение_вперед = НЕ(L) И НЕ(R)
Поворот_налево = НЕ(L) И R
Поворот_направо = L И НЕ(R)
Маневр_тупик = L И R
🎯 Составьте таблицу для вашего варианта:
Вариант: ________________
| L | R | Описание ситуации | Действие робота | Время выполнения |
|---|---|---|---|---|
| 0 | 0 | _________________ | _______________ | _________ |
| 0 | 1 | _________________ | _______________ | _________ |
| 1 | 0 | _________________ | _______________ | _________ |
| 1 | 1 | _________________ | _______________ | _________ |
🔍 Проверочные вопросы:
🔬 Проверка полноты покрытия:
Условие 1: Объединение всех условий должно покрывать все возможные состояния:
(НЕ L И НЕ R) ИЛИ (НЕ L И R) ИЛИ (L И НЕ R) ИЛИ (L И R) = ИСТИНА
Условие 2: Условия не должны пересекаться:
Любые два условия в паре дают ЛОЖЬ при операции И
Условие 3: Каждое условие должно быть достижимо:
Для каждого условия существует реальная ситуация
🎯 Практическая проверка: Убедитесь, что ваша таблица удовлетворяет всем трем условиям!
🧠 Для понимания сложности:
При добавлении третьего датчика (например, заднего):
2^3 = 8📋 Краткая таблица (L-левый, R-правый, B-задний):
| L | R | B | Ситуация | Действие |
|---|---|---|---|---|
| 0 | 0 | 0 | Полная свобода | Быстро вперед |
| 0 | 0 | 1 | Препятствие сзади | Медленно вперед |
| 0 | 1 | 0 | Препятствие справа | Поворот налево |
| … | … | … | … | … |
🎯 Вывод: Чем больше датчиков, тем сложнее, но умнее поведение!
🔄 Структура основного цикла:
⭕ НАЧАЛО
↓
📦 Инициализация датчиков и моторов
↓
🔄 ГЛАВНЫЙ ЦИКЛ (бесконечный)
↓
📥 Чтение состояния левого датчика → L
↓
📥 Чтение состояния правого датчика → R
↓
🔷 Определение комбинации (L, R)
↙ ↓ ↓ ↘
(0,0) (0,1) (1,0) (1,1)
↓ ↓ ↓ ↓
📦 📦 📦 📦
Действие Действие Действие Действие
1 2 3 4
↓ ↓ ↓ ↓
↑←←←←←↑←←←←←↑←←←←←↑
🎯 Основная структура программы:
ПРОГРАММА "Умный робот с двумя датчиками"
КОНСТАНТЫ:
ПИН_ЛЕВЫЙ_ДАТЧИК = 2
ПИН_ПРАВЫЙ_ДАТЧИК = 3
ПИН_МОТОР_ЛЕВЫЙ = 9
ПИН_МОТОР_ПРАВЫЙ = 10
СКОРОСТЬ_НОРМАЛЬНАЯ = 200
СКОРОСТЬ_ПОВОРОТА = 150
НАЧАЛО
Инициализировать_пины()
Показать_приветствие()
ГЛАВНЫЙ_ЦИКЛ:
ПОКА ИСТИНА:
// Чтение датчиков
левый_нажат = Прочитать_датчик(ПИН_ЛЕВЫЙ_ДАТЧИК)
правый_нажат = Прочитать_датчик(ПИН_ПРАВЫЙ_ДАТЧИК)
// Определение действия
ВЫБОР (левый_нажат, правый_нажат):
СЛУЧАЙ (ЛОЖЬ, ЛОЖЬ):
Выполнить_действие_00()
СЛУЧАЙ (ЛОЖЬ, ИСТИНА):
Выполнить_действие_01()
СЛУЧАЙ (ИСТИНА, ЛОЖЬ):
Выполнить_действие_10()
СЛУЧАЙ (ИСТИНА, ИСТИНА):
Выполнить_действие_11()
КОНЕЦ_ВЫБОРА
Ждать(50) // Небольшая задержка
КОНЕЦ_ПОКА
КОНЕЦ
ФУНКЦИЯ Инициализировать_пины():
Настроить_пин(ПИН_ЛЕВЫЙ_ДАТЧИК, ВХОД_С_ПОДТЯЖКОЙ)
Настроить_пин(ПИН_ПРАВЫЙ_ДАТЧИК, ВХОД_С_ПОДТЯЖКОЙ)
Настроить_пин(ПИН_МОТОР_ЛЕВЫЙ, ВЫХОД)
Настроить_пин(ПИН_МОТОР_ПРАВЫЙ, ВЫХОД)
Вывести("Датчики и моторы инициализированы")
КОНЕЦ_ФУНКЦИИ
📝 Реализация каждого поведения:
ФУНКЦИЯ Выполнить_действие_00():
// Комбинация (0,0) - путь свободен
Вывести("Движение вперед - путь свободен")
Установить_скорость_моторов(СКОРОСТЬ_НОРМАЛЬНАЯ, СКОРОСТЬ_НОРМАЛЬНАЯ)
КОНЕЦ_ФУНКЦИИ
ФУНКЦИЯ Выполнить_действие_01():
// Комбинация (0,1) - препятствие справа
Вывести("Препятствие справа - поворот налево")
Остановить_моторы()
Ждать(300)
// Поворот налево: правый мотор быстрее левого
Установить_скорость_моторов(СКОРОСТЬ_ПОВОРОТА / 2, СКОРОСТЬ_ПОВОРОТА)
Ждать(800)
Остановить_моторы()
Ждать(200)
КОНЕЦ_ФУНКЦИИ
ФУНКЦИЯ Выполнить_действие_10():
// Комбинация (1,0) - препятствие слева
Вывести("Препятствие слева - поворот направо")
Остановить_моторы()
Ждать(300)
// Поворот направо: левый мотор быстрее правого
Установить_скорость_моторов(СКОРОСТЬ_ПОВОРОТА, СКОРОСТЬ_ПОВОРОТА / 2)
Ждать(800)
Остановить_моторы()
Ждать(200)
КОНЕЦ_ФУНКЦИИ
ФУНКЦИЯ Выполнить_действие_11():
// Комбинация (1,1) - тупик
Вывести("Тупик - маневр разворота")
Остановить_моторы()
Ждать(500)
// Отъезд назад
Установить_скорость_моторов(-СКОРОСТЬ_НОРМАЛЬНАЯ, -СКОРОСТЬ_НОРМАЛЬНАЯ)
Ждать(1000)
// Разворот на 180 градусов
Установить_скорость_моторов(СКОРОСТЬ_ПОВОРОТА, -СКОРОСТЬ_ПОВОРОТА)
Ждать(1500)
Остановить_моторы()
Ждать(300)
КОНЕЦ_ФУНКЦИИ
⚙️ Основные функции управления:
ФУНКЦИЯ Установить_скорость_моторов(скорость_левого, скорость_правого):
// Ограничение скорости в диапазоне -255...255
скорость_левого = Ограничить(скорость_левого, -255, 255)
скорость_правого = Ограничить(скорость_правого, -255, 255)
// Установка скорости с учетом направления
ЕСЛИ скорость_левого >= 0 ТО
Установить_ШИМ(ПИН_МОТОР_ЛЕВЫЙ, скорость_левого)
ИНАЧЕ
Установить_ШИМ(ПИН_МОТОР_ЛЕВЫЙ, -скорость_левого)
// Дополнительно: инвертировать направление
КОНЕЦ_ЕСЛИ
ЕСЛИ скорость_правого >= 0 ТО
Установить_ШИМ(ПИН_МОТОР_ПРАВЫЙ, скорость_правого)
ИНАЧЕ
Установить_ШИМ(ПИН_МОТОР_ПРАВЫЙ, -скорость_правого)
// Дополнительно: инвертировать направление
КОНЕЦ_ЕСЛИ
КОНЕЦ_ФУНКЦИИ
ФУНКЦИЯ Остановить_моторы():
Установить_скорость_моторов(0, 0)
КОНЕЦ_ФУНКЦИИ
ФУНКЦИЯ Прочитать_датчик(пин):
значение = Прочитать_цифровой_пин(пин)
// Для датчика с подтяжкой: LOW = нажат, HIGH = не нажат
ВОЗВРАТ (значение = LOW)
КОНЕЦ_ФУНКЦИИ
ФУНКЦИЯ Ограничить(значение, минимум, максимум):
ЕСЛИ значение < минимум ТО
ВОЗВРАТ минимум
ИНАЧЕ_ЕСЛИ значение > максимум ТО
ВОЗВРАТ максимум
ИНАЧЕ
ВОЗВРАТ значение
КОНЕЦ_ЕСЛИ
КОНЕЦ_ФУНКЦИИ
📈 Улучшения для более умного поведения:
ПЕРЕМЕННЫЕ:
счетчик_столкновений = 0
время_последней_комбинации = 0
предыдущая_комбинация = (ЛОЖЬ, ЛОЖЬ)
ФУНКЦИЯ Анализ_поведения(текущая_комбинация):
// Подсчет частоты столкновений
ЕСЛИ текущая_комбинация ≠ (ЛОЖЬ, ЛОЖЬ) ТО
счетчик_столкновений = счетчик_столкновений + 1
Вывести("Столкновение номер:", счетчик_столкновений)
КОНЕЦ_ЕСЛИ
// Адаптация скорости в зависимости от частоты столкновений
ЕСЛИ счетчик_столкновений > 10 ТО
СКОРОСТЬ_НОРМАЛЬНАЯ = СКОРОСТЬ_НОРМАЛЬНАЯ * 0.8 // Снизить скорость
Вывести("Снижаю скорость из-за частых столкновений")
счетчик_столкновений = 0 // Сброс счетчика
КОНЕЦ_ЕСЛИ
// Запоминание предыдущего состояния
предыдущая_комбинация = текущая_комбинация
время_последней_комбинации = Получить_время()
КОНЕЦ_ФУНКЦИИ
🎯 Систематическая проверка всех комбинаций:
Тест 1: Проверка чтения датчиков
ПРОЦЕДУРА Тест_датчиков():
Вывести("=== ТЕСТ ДАТЧИКОВ ===")
ДЛЯ i = 1 ДО 20:
левый = Прочитать_датчик(ПИН_ЛЕВЫЙ_ДАТЧИК)
правый = Прочитать_датчик(ПИН_ПРАВЫЙ_ДАТЧИК)
Вывести("L:", левый, " R:", правый, " Комбинация: (", левый, ",", правый, ")")
Ждать(500)
КОНЕЦ_ДЛЯ
КОНЕЦ_ПРОЦЕДУРЫ
Тест 2: Проверка каждой комбинации отдельно
ПРОЦЕДУРА Тест_комбинаций():
комбинации = [(ЛОЖЬ,ЛОЖЬ), (ЛОЖЬ,ИСТИНА), (ИСТИНА,ЛОЖЬ), (ИСТИНА,ИСТИНА)]
ДЛЯ КАЖДОЙ комбинации ИЗ комбинации:
Вывести("Тест комбинации:", комбинация)
Вывести("Нажмите соответствующие датчики и нажмите Enter")
Ждать_нажатия_Enter()
// Проверка в течение 5 секунд
время_начала = Получить_время()
ПОКА (Получить_время() - время_начала) < 5000:
текущие_датчики = (Прочитать_датчик(ПИН_ЛЕВЫЙ_ДАТЧИК), Прочитать_датчик(ПИН_ПРАВЫЙ_ДАТЧИК))
ЕСЛИ текущие_датчики = комбинация ТО
Выполнить_действие_для_комбинации(комбинация)
КОНЕЦ_ЕСЛИ
Ждать(100)
КОНЕЦ_ПОКА
Остановить_моторы()
Вывести("Тест завершен")
КОНЕЦ_ДЛЯ
КОНЕЦ_ПРОЦЕДУРЫ
❌ Ошибка 1: Дребезг контактов
Проблема: Датчик срабатывает несколько раз при одном нажатии
// Плохой код
ЕСЛИ Прочитать_датчик(пин) ТО
счетчик = счетчик + 1 // Может увеличиться несколько раз!
КОНЕЦ_ЕСЛИ
✅ Решение: Фильтрация сигнала
ФУНКЦИЯ Прочитать_датчик_стабильно(пин):
СТАТИЧЕСКАЯ предыдущее_состояние = ЛОЖЬ
СТАТИЧЕСКАЯ время_последнего_изменения = 0
текущее_состояние = Прочитать_цифровой_пин(пин) = LOW
текущее_время = Получить_время()
ЕСЛИ текущее_состояние ≠ предыдущее_состояние ТО
время_последнего_изменения = текущее_время
КОНЕЦ_ЕСЛИ
// Считаем сигнал стабильным, если он не менялся 50мс
ЕСЛИ (текущее_время - время_последнего_изменения) > 50 ТО
стабильное_состояние = текущее_состояние
ИНАЧЕ
стабильное_состояние = предыдущее_состояние
КОНЕЦ_ЕСЛИ
предыдущее_состояние = текущее_состояние
ВОЗВРАТ стабильное_состояние
КОНЕЦ_ФУНКЦИИ
❌ Ошибка 2: Застревание в одном состоянии
Проблема: Робот выполняет действие только один раз и застревает
// Плохой код
ЕСЛИ левый_датчик И правый_датчик ТО
Развернуться_на_180()
// После разворота датчики могут быть все еще нажаты!
КОНЕЦ_ЕСЛИ
✅ Решение: Ожидание освобождения датчиков
ФУНКЦИЯ Выполнить_действие_11_безопасно():
Вывести("Тупик - начинаю маневр")
// Выполняем маневр
Маневр_разворота()
// Ждем освобождения всех датчиков
ПОКА Прочитать_датчик(ПИН_ЛЕВЫЙ_ДАТЧИК) ИЛИ Прочитать_датчик(ПИН_ПРАВЫЙ_ДАТЧИК):
Вывести("Жду освобождения датчиков...")
Ждать(100)
КОНЕЦ_ПОКА
Вывести("Датчики освобождены, продолжаю")
КОНЕЦ_ФУНКЦИИ
❌ Ошибка 3: Неправильная логика условий
Проблема: Условия перекрываются или не покрывают все случаи
// Плохой код - условия могут перекрываться
ЕСЛИ левый_датчик ТО
Повернуть_направо()
КОНЕЦ_ЕСЛИ
ЕСЛИ правый_датчик ТО
Повернуть_налево()
КОНЕЦ_ЕСЛИ
// Что если нажаты оба? Будет два поворота!
✅ Решение: Взаимоисключающие условия
// Хороший код - четкие приоритеты
ЕСЛИ левый_датчик И правый_датчик ТО
Маневр_тупика()
ИНАЧЕ_ЕСЛИ левый_датчик И НЕ правый_датчик ТО
Повернуть_направо()
ИНАЧЕ_ЕСЛИ НЕ левый_датчик И правый_датчик ТО
Повернуть_налево()
ИНАЧЕ
Двигаться_вперед()
КОНЕЦ_ЕСЛИ
📊 Система мониторинга состояний:
ПЕРЕМЕННАЯ режим_отладки = ИСТИНА
ФУНКЦИЯ Отладочный_вывод(левый, правый, действие):
ЕСЛИ режим_отладки ТО
Вывести("--- DEBUG ---")
Вывести("Время:", Получить_время())
Вывести("Левый датчик:", ЕСЛИ левый ТО "НАЖАТ" ИНАЧЕ "НЕ НАЖАТ")
Вывести("Правый датчик:", ЕСЛИ правый ТО "НАЖАТ" ИНАЧЕ "НЕ НАЖАТ")
Вывести("Действие:", действие)
Вывести("--- END ---")
КОНЕЦ_ЕСЛИ
КОНЕЦ_ФУНКЦИИ
// Использование в основном коде
ГЛАВНЫЙ_ЦИКЛ:
левый = Прочитать_датчик_стабильно(ПИН_ЛЕВЫЙ_ДАТЧИК)
правый = Прочитать_датчик_стабильно(ПИН_ПРАВЫЙ_ДАТЧИК)
ЕСЛИ левый И правый ТО
Отладочный_вывод(левый, правый, "Маневр тупика")
Выполнить_действие_11()
// ... остальные условия
КОНЕЦ_ЦИКЛА
📈 Статистика работы:
ПЕРЕМЕННЫЕ:
счетчик_комбинаций[4] = [0, 0, 0, 0] // Для каждой комбинации
общее_время_работы = 0
ФУНКЦИЯ Обновить_статистику(комбинация):
индекс = Комбинация_в_индекс(комбинация)
счетчик_комбинаций[индекс] = счетчик_комбинаций[индекс] + 1
// Каждые 100 циклов выводим статистику
ЕСЛИ Сумма(счетчик_комбинаций) % 100 = 0 ТО
Показать_статистику()
КОНЕЦ_ЕСЛИ
КОНЕЦ_ФУНКЦИИ
ФУНКЦИЯ Показать_статистику():
Вывести("=== СТАТИСТИКА ===")
Вывести("(0,0):", счетчик_комбинаций[0], " раз")
Вывести("(0,1):", счетчик_комбинаций[1], " раз")
Вывести("(1,0):", счетчик_комбинаций[2], " раз")
Вывести("(1,1):", счетчик_комбинаций[3], " раз")
Вывести("================")
КОНЕЦ_ФУНКЦИИ
📐 Конструкция лабиринта:
🎯 Простой лабиринт (для начинающих):
Размер: 2м × 2м
┌─────┬─────┐
│START│ │
├─────┤ ○ │ ○ = препятствие
│ │ │
│ ○ ├─────┤
│ │FINISH│
└─────┴─────┘
🔥 Сложный лабиринт (для продвинутых):
Размер: 3м × 3м
┌───┬───┬───┐
│S │ ○ │ │
├───┼───┼───┤
│ ○ │ │ ○ │
├───┼───┼───┤
│ │ ○ │ F │
└───┴───┴───┘
🧰 Материалы для препятствий:
🎯 Основные дисциплины:
🥇 Дисциплина 1: “Скоростное прохождение”
🥈 Дисциплина 2: “Элегантная навигация”
🥉 Дисциплина 3: “Исследователь”
🧮 Формула итогового балла:
Итоговый_балл = Базовые_баллы + Бонусы - Штрафы
Базовые_баллы = ЕСЛИ робот дошел до финиша ТО 50 ИНАЧЕ 0
Бонусы:
- За скорость: (120 - время_в_секундах) × 0.5
- За элегантность: (20 - количество_столкновений) × 2
- За стабильность: ЕСЛИ без_зависаний ТО 10 ИНАЧЕ 0
Штрафы:
- За зависания: количество_зависаний × 5
- За выход из лабиринта: 20
- За опасное поведение: 30
📋 Таблица результатов:
| Команда | Время, с | Столкновения | Зависания | Базовые | Бонусы | Штрафы | Итого |
|---|---|---|---|---|---|---|---|
| 1 | ___ | ___ | ___ | ___ | ___ | ___ | ___ |
| 2 | ___ | ___ | ___ | ___ | ___ | ___ | ___ |
| 3 | ___ | ___ | ___ | ___ | ___ | ___ | ___ |
| 4 | ___ | ___ | ___ | ___ | ___ | ___ | ___ |
📈 Успешные подходы:
Стратегия А: “Осторожный исследователь”
Характеристики:
- Медленная, но стабильная навигация
- Минимум столкновений
- Хорошее время без зависаний
Типичный результат:
- Время: 80-120 секунд
- Столкновения: 3-7
- Зависания: 0-1
Стратегия Б: “Агрессивный спидран”
Характеристики:
- Высокая скорость движения
- Быстрые резкие повороты
- Риск зависаний в углах
Типичный результат:
- Время: 40-70 секунд
- Столкновения: 8-15
- Зависания: 1-3
Стратегия В: “Адаптивная навигация”
Характеристики:
- Изменение поведения в зависимости от ситуации
- Учет предыдущих ошибок
- Сбалансированный подход
Типичный результат:
- Время: 60-90 секунд
- Столкновения: 5-10
- Зависания: 0-2
🏆 Номинации и призы:
🥇 Главные призы:
🎯 Специальные номинации:
🎪 Демонстрационные заезды:
📸 Документирование:
📈 Усложнения для будущих турниров:
Уровень 2: Динамические препятствия
Уровень 3: Многоэтажный лабиринт
Уровень 4: Командные соревнования
Уровень 5: ИИ-вызов
1. Схема поведения для трех датчиков Разработайте полную схему поведения робота с тремя датчиками нажатия:
📊 Таблица истинности (L-левый, C-центральный, R-правый):
| L | C | R | Ситуация | Действие робота | Логическое обоснование |
|---|---|---|---|---|---|
| 0 | 0 | 0 | _________ | ______________ | ____________________ |
| 0 | 0 | 1 | _________ | ______________ | ____________________ |
| 0 | 1 | 0 | _________ | ______________ | ____________________ |
| 0 | 1 | 1 | _________ | ______________ | ____________________ |
| 1 | 0 | 0 | _________ | ______________ | ____________________ |
| 1 | 0 | 1 | _________ | ______________ | ____________________ |
| 1 | 1 | 0 | _________ | ______________ | ____________________ |
| 1 | 1 | 1 | _________ | ______________ | ____________________ |
2. Анализ соревнования Проанализируйте результаты сегодняшнего соревнования:
📈 Ваши результаты:
🧠 Анализ ошибок:
📝 План улучшений:
🧮 Для математиков: Исследуйте сложность алгоритмов с множественными датчиками:
Постройте график зависимости сложности от количества датчиков.
💻 Для программистов: Изучите продвинутые техники программирования:
Реализуйте один из подходов в виде псевдокода.
🔬 Для исследователей: Проведите эксперимент по влиянию параметров на эффективность:
Сделайте научный отчет с графиками и выводами.
🎨 Для творческих: Спроектируйте робота будущего с супер-интеллектом:
📚 Для изучения:
💻 Симуляторы и инструменты:
🎥 Видеоматериалы:
🧠 Интеллектуальные навыки:
💻 Программистские навыки:
🤖 Робототехнические навыки:
🎯 Революционные выводы:
“Умное поведение = Простые датчики + Сложная логика”
“Каждая дополнительная комбинация экспоненциально увеличивает возможности”
“Правильная отладка важнее сложного алгоритма”
🔮 Взгляд в будущее:
🎯 Оцените свой рост (0-10 баллов):
📈 Понимание логических операций: ___/10
💻 Навыки программирования: ___/10
🤖 Робототехническая экспертиза: ___/10
💬 Поделитесь впечатлениями:
🔮 Следующий урок: “Ультразвуковые датчики расстояния”
🎯 Готовимся к новым возможностям:
🧠 ВЫ СОЗДАЛИ РОБОТА С ИСКУССТВЕННЫМ ИНТЕЛЛЕКТОМ!
Теперь ваши роботы думают прежде чем действовать!