Проект 15: Как писать код с помощью AI
Введение
Что мы будем делать?
В этом уроке вы научитесь работать с AI помощниками (ChatGPT, Claude, Gemini и другими) для создания кода для робота Фобо. Вы получите готовый промпт — специальный текст с полным описанием вашего набора, который можно скопировать и вставить в любой AI чат.
Почему это важно?
⚡ Ускорение разработки — AI помогает писать код в 10 раз быстрее
🎓 Обучение — AI объясняет код и предлагает улучшения
🐛 Отладка — AI помогает находить и исправлять ошибки
💡 Идеи — AI предлагает новые проекты и функции
Что такое промпт?
Промпт — это подробное описание вашей задачи для AI. Чем точнее и подробнее промпт, тем лучше результат. В этом уроке мы дадим вам универсальный промпт для робота Фобо.
Какие AI помощники можно использовать?
Бесплатные варианты
ChatGPT (OpenAI)
Ссылка: https://chat.openai.com
Бесплатная версия: GPT-3.5
Платная версия: GPT-4 ($20/месяц)
Язык: русский, английский
Лучше всего: объяснения кода, обучение
Claude (Anthropic)
Ссылка: https://claude.ai
Бесплатная версия: Claude 3.5 Sonnet
Язык: русский, английский
Лучше всего: работа с большими проектами, отладка
Gemini (Google)
Ссылка: https://gemini.google.com
Бесплатная версия: есть
Язык: русский, английский
Лучше всего: интеграция с Google сервисами
Grok (X/Twitter)
Ссылка: https://grok.x.ai
Требует подписку X Premium
Язык: английский, русский
Рекомендации
Для новичков:
Начните с ChatGPT — самый популярный, много примеров
Переходите на Claude для сложных проектов
Для опытных:
Claude — лучше понимает контекст, меньше ошибок
ChatGPT-4 — если готовы платить
Универсальный промпт для робота Фобо
Скопируйте и вставьте этот промпт в начало разговора с AI
# ОПИСАНИЕ НАБОРА: РОБОТ ФОБО (PHOBO)
Я работаю с образовательным набором для робототехники "Робот Фобо" от Alash Electronics.
Мне нужна помощь в написании кода для Arduino.
## АППАРАТНАЯ ЧАСТЬ
### Микроконтроллер
- **Arduino Uno** (ATmega328P)
- **Sensor Shield V5** — все компоненты подключаются через shield
- Питание: 2x 18650 батареи (7.4-8.4V) через L298N
### Конструкция
- **Название робота:** Фобо (от "фобия" — страх)
- **Шасси:** Деревянное, двухъярусное
- **Моторы:** 4 желтых DC мотора с колесами
- **Привод:** Дифференциальный (повороты за счёт разной скорости колёс)
### Компоненты набора
#### 1. Моторы и драйвер
- **L298N** — драйвер моторов
- Управляет 4 моторами (2 канала: Motor A = правая сторона, Motor B = левая)
- Встроенный регулятор 5V (для питания Arduino)
- Jumper 5V EN должен быть установлен!
#### 2. Датчики
- **RCWL-9610A** — ультразвуковой датчик расстояния
- Работает в GPIO режиме (как HC-SR04)
- Дальность: 2-450 см
- M1 и M2 контакты НЕ припаяны (GPIO режим)
- Установлен на сервоприводе SG92R (может поворачиваться)
- **3x IR датчики линии** (аналоговые)
- Каждый датчик имеет 4 пина: VCC, GND, A0 (аналоговый), D0 (цифровой)
- **ИСПОЛЬЗУЕМ ТОЛЬКО A0** (аналоговый выход)
- D0 не используется (требует калибровки потенциометром)
- Установлены снизу (левый, центральный, правый)
- **ВАЖНО:** Могут быть инвертированными (высокие значения = чёрное)
- **VS1838B** — ИК-приёмник (для пульта)
- Протокол NEC (38 kHz)
- Дальность: 5-8 метров
- Код повтора: 0xFFFFFFFF (при удержании кнопки)
#### 3. Исполнительные устройства
- **SG92R сервопривод** (нейлон + карбон)
- Угол поворота: 0-180°
- На нём установлен ультразвуковой датчик (для сканирования)
- **HM-10 Bluetooth BLE** модуль (CC2541)
- Bluetooth 4.0 Low Energy
- Работает с iOS и Android
- Baud rate: 9600
- Имя по умолчанию: "BT05" или "HM-10"
- PIN: 123456 (обычно не запрашивается)
## ПОДКЛЮЧЕНИЕ КОМПОНЕНТОВ
### Таблица пинов (ФИКСИРОВАННАЯ КОНФИГУРАЦИЯ)
**КРИТИЧЕСКИ ВАЖНО:** Эта конфигурация пинов НЕЛЬЗЯ менять!
Она специально подобрана для избежания конфликтов таймеров Arduino.
| Компонент | Тип | Пин Arduino | Примечание |
|---------------------|------------|-------------|-------------------------------------|
| **МОТОРЫ (L298N)** | | | |
| Motor A IN1 | Digital | D4 | Направление правого мотора |
| Motor A IN2 | Digital | D2 | Направление правого мотора |
| Motor A ENA | PWM | D5 | Скорость правого (Timer0) |
| Motor B IN3 | Digital | D8 | Направление левого мотора |
| Motor B IN4 | Digital | D12 | Направление левого мотора |
| Motor B ENB | PWM | D6 | Скорость левого (Timer0) |
| | | | |
| **ДАТЧИКИ** | | | |
| RCWL-9610A Trig | Digital | D3 | Триггер ультразвукового датчика |
| RCWL-9610A Echo | Digital | D7 | Эхо ультразвукового датчика |
| Servo Signal | PWM | D9 | Сервопривод (Timer1, нет конфликта) |
| Line Sensor Left | Analog | A0 | Левый датчик линии (ТОЛЬКО A0 пин!) |
| Line Sensor Center | Analog | A1 | Центральный датчик линии |
| Line Sensor Right | Analog | A2 | Правый датчик линии |
| IR Receiver | Digital | A3 | ИК-приёмник (аналог. пин как цифр.) |
| | | | |
| **СВЯЗЬ** | | | |
| HM-10 RX | Digital | D10 | Arduino TX → HM-10 RX (SoftSerial) |
| HM-10 TX | Digital | D11 | Arduino RX ← HM-10 TX (SoftSerial) |
| Serial Monitor | - | D0/D1 | НЕ ИСПОЛЬЗОВАТЬ (зарезервировано) |
### Почему именно эти пины?
**Проблема конфликта таймеров:**
- Arduino Uno имеет 3 таймера: Timer0, Timer1, Timer2
- Servo.h библиотека использует Timer1 (пины D9, D10)
- analogWrite() (PWM) использует разные таймеры для разных пинов:
- D3, D11 → Timer2
- D5, D6 → Timer0
- D9, D10 → Timer1
**Решение:**
- Servo на D9 (Timer1)
- Моторы PWM на D5, D6 (Timer0)
- Никаких конфликтов! Серво и моторы работают одновременно.
### Схема питания
```
2x 18650 батареи (7.4-8.4V)
↓
[Держатель со встроенным модулем зарядки]
[Type-C/MicroUSB, выключатель, LED индикатор]
↓
L298N (12V вход)
↓ (встроенный регулятор 5V)
Arduino Uno + Sensor Shield
↓
Все датчики и модули (питание 5V от Shield)
```
**ВАЖНО:**
- Выключатель на держателе батарей управляет всем роботом
- L298N имеет джампер "5V EN" — ДОЛЖЕН быть установлен
- При загрузке кода выключите робота, загружать только через USB
- **Зарядка:** Холдер имеет встроенный модуль зарядки — заряжайте робота через Type-C или MicroUSB (5V), не вынимая батарей! Синий LED1 = включен, зелёный LED2 = заряжается (гаснет когда готово)
## БИБЛИОТЕКИ
Установите эти библиотеки через Arduino IDE → Sketch → Include Library → Manage Libraries:
### 1. AlashMotorControlLite
- **Репозиторий:** https://github.com/Alash-electronics/AlashMotorControlLite
- **Версия:** последняя
- **Назначение:** Управление моторами L298N
**API:**
```cpp
#include <AlashMotorControlLite.h>
// Инициализация (режим DIR_DIR_PWM для L298N)
AlashMotorControlLite motorLeft(DIR_DIR_PWM, IN1, IN2, ENA);
AlashMotorControlLite motorRight(DIR_DIR_PWM, IN3, IN4, ENB);
// Использование
motorLeft.setSpeed(100); // Вперёд максимум
motorLeft.setSpeed(-100); // Назад максимум
motorLeft.setSpeed(0); // Стоп
motorLeft.stop(); // Плавная остановка (coast)
motorLeft.brake(); // Резкая остановка (brake)
int speed = motorLeft.getSpeed(); // Получить текущую скорость
```
**КРИТИЧЕСКИ ВАЖНО: Минимальные скорости моторов**
Жёлтые DC моторы робота Фобо имеют минимальные пороги скорости из-за трения и момента инерции:
- **Минимум для движения вперёд/назад:** 45 (ниже — моторы застревают)
- **Минимум для поворотов/реверса:** 65 (ниже — недостаточный момент)
```cpp
// ❌ НЕПРАВИЛЬНО — робот не поедет!
motorLeft.setSpeed(30); // Слишком медленно
motorLeft.setSpeed(SPEED / 2); // Деление создаёт значения < 45!
// ✅ ПРАВИЛЬНО — используйте константы выше минимумов
const int SPEED_FORWARD = 70; // Выше 45
const int SPEED_TURN = 80; // Выше 65
const int SPEED_REVERSE = 65; // Минимум для реверса
motorLeft.setSpeed(SPEED_FORWARD);
```
**Правило:** Никогда не делите скорости во время выполнения — используйте именованные константы!
### 2. AlashUltrasonic
- **Репозиторий:** https://github.com/Alash-electronics/AlashUltrasonic
- **Версия:** последняя
- **Назначение:** Работа с RCWL-9610A (как с HC-SR04)
**API:**
```cpp
#include <AlashUltrasonic.h>
// Инициализация (ОБЯЗАТЕЛЬНО uint8_t!)
const uint8_t TRIG_PIN = 3;
const uint8_t ECHO_PIN = 7;
AlashUltrasonic sensor(TRIG_PIN, ECHO_PIN);
void setup() {
sensor.begin(); // ОБЯЗАТЕЛЬНЫЙ вызов!
}
void loop() {
float distance = sensor.getDistance(); // Возвращает см (float)
}
```
**КРИТИЧЕСКИЕ ОШИБКИ (НЕ ДОПУСКАТЬ):**
- ❌ `const int TRIG_PIN` — НЕПРАВИЛЬНО! Вызовет ошибку компиляции
- ✅ `const uint8_t TRIG_PIN` — ПРАВИЛЬНО
- ❌ `sensor.read()` — НЕ СУЩЕСТВУЕТ
- ✅ `sensor.getDistance()` — ПРАВИЛЬНО
- ❌ Забыть `sensor.begin()` — датчик не будет работать
### 3. AlashIRControlRX
- **Репозиторий:** https://github.com/Alash-electronics/AlashIRControl
- **Версия:** последняя
- **Назначение:** Приём сигналов с ИК-пульта
**API:**
```cpp
#include <AlashIRControlRX.h>
const int IR_PIN = A3;
AlashIRControlRX irReceiver(IR_PIN);
void setup() {
irReceiver.begin();
}
void loop() {
if (irReceiver.check()) { // true если новый сигнал
unsigned long code = irReceiver.data;
if (code != 0xFFFFFFFF) { // Игнорируем код повтора
// Обработка кода кнопки
}
}
}
```
**Стандартные коды кнопок (Alash пульт):**
```cpp
const unsigned long BTN_UP = 0xFF18E7;
const unsigned long BTN_DOWN = 0xFF4AB5;
const unsigned long BTN_LEFT = 0xFF10EF;
const unsigned long BTN_RIGHT = 0xFF5AA5;
const unsigned long BTN_OK = 0xFF38C7;
const unsigned long BTN_1 = 0xFFA25D;
const unsigned long BTN_2 = 0xFF629D;
const unsigned long BTN_3 = 0xFFE21D;
const unsigned long BTN_REPEAT = 0xFFFFFFFF;
```
### 4. Servo (встроенная)
- **Встроена в Arduino IDE** — устанавливать не нужно
**API:**
```cpp
#include <Servo.h>
Servo myServo;
void setup() {
myServo.attach(9); // Подключить к пину D9
myServo.write(90); // Повернуть на 90° (центр)
}
void loop() {
myServo.write(0); // 0°
delay(1000);
myServo.write(180); // 180°
delay(1000);
myServo.detach(); // Отключить (важно для Bluetooth!)
}
```
**ВАЖНО:** После использования серво вызывайте `.detach()` — это освобождает Timer1 и убирает помехи для Bluetooth!
### 5. SoftwareSerial (встроенная)
- **Встроена в Arduino IDE**
- **Назначение:** Виртуальный COM-порт для HM-10 Bluetooth
**API:**
```cpp
#include <SoftwareSerial.h>
const uint8_t BT_RX = 10; // Arduino RX ← HM-10 TX
const uint8_t BT_TX = 11; // Arduino TX → HM-10 RX
SoftwareSerial bluetooth(BT_RX, BT_TX);
void setup() {
Serial.begin(9600); // Serial Monitor (отладка)
bluetooth.begin(9600); // HM-10
}
void loop() {
// Приём от HM-10
if (bluetooth.available()) {
String cmd = bluetooth.readStringUntil('\n');
cmd.trim();
}
// Отправка на HM-10
bluetooth.println("Hello from Phobo!");
}
```
## КАЛИБРОВКА ДАТЧИКОВ ЛИНИИ
### Процедура калибровки
Датчики линии могут быть **инвертированными** или **обычными**:
**Обычные датчики:**
- Белая поверхность: 800-1000
- Чёрная линия: 50-200
- Логика: `value < threshold` = чёрное
**Инвертированные датчики (как у нас):**
- Белая поверхность: 20-40
- Чёрная линия: 30-60
- Логика: `value > threshold` = чёрное
### Пример калибровки (для инвертированных)
```cpp
// Калибровочные значения (ИЗМЕРЬТЕ СВОИ!)
const int LEFT_WHITE = 28, LEFT_BLACK = 38;
const int CENTER_WHITE = 29, CENTER_BLACK = 41;
const int RIGHT_WHITE = 26, RIGHT_BLACK = 36;
// Автоматический расчёт порогов
const int LEFT_THRESHOLD = (LEFT_WHITE + LEFT_BLACK) / 2; // 33
const int CENTER_THRESHOLD = (CENTER_WHITE + CENTER_BLACK) / 2; // 35
const int RIGHT_THRESHOLD = (RIGHT_WHITE + RIGHT_BLACK) / 2; // 31
// Автоопределение инверсии
const bool INVERTED = (LEFT_BLACK > LEFT_WHITE); // true
// Функция проверки
bool isOnLine(int value, int threshold) {
if (INVERTED) {
return value > threshold; // Инвертированные
} else {
return value < threshold; // Обычные
}
}
```
## ТИПИЧНЫЕ ЗАДАЧИ
### Задача 1: Движение вперёд
```cpp
const int SPEED = 80; // 0-100
motorLeft.setSpeed(SPEED);
motorRight.setSpeed(SPEED);
```
### Задача 2: Поворот на месте направо
```cpp
motorLeft.setSpeed(65); // Левое вперёд
motorRight.setSpeed(-65); // Правое назад
delay(550); // ~90° поворот
motorLeft.stop();
motorRight.stop();
```
### Задача 3: Измерить расстояние
```cpp
float dist = ultrasonic.getDistance();
if (dist < 20 && dist > 0) {
Serial.println("Препятствие близко!");
}
```
### Задача 4: Следование по линии (упрощённо)
```cpp
int L = analogRead(A0);
int C = analogRead(A1);
int R = analogRead(A2);
bool onLeft = isOnLine(L, LEFT_THRESHOLD);
bool onCenter = isOnLine(C, CENTER_THRESHOLD);
bool onRight = isOnLine(R, RIGHT_THRESHOLD);
if (!onLeft && onCenter && !onRight) {
// Прямо
motorLeft.setSpeed(70);
motorRight.setSpeed(70);
} else if (onLeft) {
// Поворот налево
motorLeft.setSpeed(0);
motorRight.setSpeed(80);
} else if (onRight) {
// Поворот направо
motorLeft.setSpeed(80);
motorRight.setSpeed(0);
}
```
### Задача 5: Сканирование с серво
```cpp
// ВАЖНО: Перед использованием серво отключаем моторы!
motorLeft.stop();
motorRight.stop();
pinMode(5, INPUT); // ENA
pinMode(6, INPUT); // ENB
delay(50);
// Сканируем
scanServo.attach(9);
delay(20);
scanServo.write(30); // Направо
delay(300);
float distRight = ultrasonic.getDistance();
scanServo.write(150); // Налево
delay(300);
float distLeft = ultrasonic.getDistance();
scanServo.write(90); // Центр
delay(300);
scanServo.detach(); // ОБЯЗАТЕЛЬНО!
delay(20);
// Восстанавливаем моторы
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
```
## ОГРАНИЧЕНИЯ ARDUINO UNO
### Память
- **Flash:** 32 KB (код программы)
- **SRAM:** 2048 байт (переменные) — **КРИТИЧНО!**
- **EEPROM:** 1 KB (постоянное хранение)
### Экономия памяти
**Используйте макрос F() для строк:**
```cpp
// ❌ НЕПРАВИЛЬНО (строка в SRAM)
Serial.println("Hello World");
bluetooth.println("Robot ready");
// ✅ ПРАВИЛЬНО (строка во Flash)
Serial.println(F("Hello World"));
bluetooth.println(F("Robot ready"));
```
**Избегайте String, используйте char[]:**
```cpp
// ❌ Плохо (String использует много SRAM)
String message = "Hello";
// ✅ Хорошо (char[] использует меньше SRAM)
char message[] = "Hello";
```
## ПРИМЕРЫ ЗАПРОСОВ К AI
### Пример 1: Создание нового режима
```
Напиши код для робота Фобо, который следует за рукой на расстоянии 20 см.
Если рука ближе 15 см — робот отъезжает назад.
Если рука дальше 30 см — робот едет вперёд.
Используй ультразвуковой датчик RCWL-9610A.
```
### Пример 2: Отладка
```
У меня проблема: робот Фобо не поворачивает направо.
Вот мой код: [вставить код]
Проверь:
- Правильно ли подключены моторы (пины D2, D4, D5, D8, D12, D6)
- Правильно ли используется AlashMotorControlLite
- Знаки скоростей (положительные/отрицательные)
```
### Пример 3: Улучшение кода
```
Улучши этот код для следования по линии.
Добавь:
- ПИД-регулятор для плавных поворотов
- Обработку потери линии (все датчики 0-0-0)
- Экономию памяти (макрос F() для строк)
[вставить код]
```
### Пример 4: Новая функция
```
Добавь в код робота Фобо режим "патрулирование":
- Робот едет вперёд
- При препятствии (<20 см) поворачивает на 90° направо
- Продолжает движение
- Если справа тоже препятствие — поворачивает налево
- Используй RCWL-9610A и сервопривод для сканирования
```
## ВАЖНЫЕ ПРАВИЛА ПРИ РАБОТЕ С AI
### ✅ Делайте
1. **Указывайте конкретные пины**
- Не "подключи мотор", а "подключи мотор к пинам IN1=D4, IN2=D2, ENA=D5"
2. **Называйте библиотеки**
- Не "используй датчик расстояния", а "используй AlashUltrasonic для RCWL-9610A"
3. **Описывайте поведение**
- Не "сделай объезд препятствий", а "при расстоянии <20 см остановись, поверни серво налево и направо, выбери направление с большим расстоянием"
4. **Просите комментарии**
- "Добавь подробные комментарии на русском языке"
5. **Просите проверку памяти**
- "Используй макрос F() для всех строк, чтобы экономить SRAM"
### ❌ Не делайте
1. **Не давайте расплывчатые задачи**
- ❌ "Сделай робота умнее"
- ✅ "Добавь обработку случая, когда робот потерял линию"
2. **Не просите изменить пины**
- ❌ "Перенеси сервопривод на пин D3"
- ✅ "Используй серво на пине D9 (фиксированная конфигурация)"
3. **Не забывайте про контекст**
- Каждый раз начинайте новый чат с промпта (или держите один длинный чат)
## ЧЕКЛИСТ ПЕРЕД ЗАГРУЗКОЙ КОДА
Проверьте код от AI перед загрузкой:
### Обязательные проверки
- [ ] Пины моторов: IN1=D4, IN2=D2, ENA=D5, IN3=D8, IN4=D12, ENB=D6
- [ ] Пины датчиков: Trig=D3, Echo=D7, Servo=D9
- [ ] Пины линии: A0, A1, A2 (НЕ D0!)
- [ ] Bluetooth: RX=D10, TX=D11 (SoftwareSerial)
- [ ] Используется `const uint8_t` для пинов AlashUltrasonic
- [ ] Вызван `sensor.begin()` в setup()
- [ ] Все строки используют макрос `F()`
- [ ] После серво вызывается `detach()`
- [ ] Перед серво моторы останавливаются и пины переключаются в INPUT
### Рекомендуемые проверки
- [ ] Есть комментарии на русском языке
- [ ] Скорости моторов в диапазоне -100...100
- [ ] Калибровка датчиков линии указана
- [ ] Обработка ошибок (расстояние = 0, линия потеряна)
## ПРИМЕРЫ ГОТОВЫХ ПРОЕКТОВ
После промпта попросите AI:
**Простые проекты:**
- "Напиши код для движения по квадрату 1x1 метр"
- "Напиши код для остановки перед препятствием"
- "Напиши код для управления роботом с ИК-пульта (4 стрелки)"
**Средние проекты:**
- "Напиши код для следования за рукой с 3 зонами расстояния"
- "Напиши код для объезда препятствий с 3-точечным сканированием"
- "Напиши код для Bluetooth управления (U/D/L/R команды)"
**Сложные проекты:**
- "Напиши код для следования по линии с ПИД-регулятором"
- "Напиши код для мастер-режима: ручное управление + 3 автономных режима"
- "Напиши код для лабиринта (правило правой руки)"
## ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ
**Q: AI выдал код с другими пинами. Что делать?**
A: Скажите AI: "Используй точно эти пины: IN1=D4, IN2=D2, ENA=D5, IN3=D8, IN4=D12, ENB=D6, Servo=D9. Это фиксированная конфигурация, менять нельзя."
**Q: AI использовал библиотеку NewPing вместо AlashUltrasonic**
A: "Используй только библиотеку AlashUltrasonic, не NewPing. API: sensor.begin() в setup, sensor.getDistance() возвращает float."
**Q: Код не компилируется: "call of overloaded AlashUltrasonic is ambiguous"**
A: "Измени тип пинов с `const int` на `const uint8_t`."
**Q: AI забыл sensor.begin()**
A: "Добавь обязательный вызов sensor.begin() в функцию setup()."
**Q: Робот работает, но серво дёргается**
A: "Добавь scanServo.detach() после использования серво. Также перед attach серво останавливай моторы и переключай пины ENA/ENB в INPUT."
**Q: AI использует много Serial.print, память заканчивается**
A: "Используй макрос F() для всех строк: Serial.println(F(\"текст\")). Убери ненужные отладочные сообщения."
**Q: Как попросить AI объяснить код?**
A: "Объясни этот код построчно простыми словами, как для начинающего."
**Q: Можно ли попросить AI улучшить чужой код?**
A: Да! "Улучши этот код: добавь комментарии, оптимизируй память, исправь баги. [вставить код]"
## ПРОДВИНУТЫЕ ТЕХНИКИ
### Техника 1: Пошаговая разработка
Вместо "напиши полный код для объезда препятствий", делайте так:
1. "Напиши код для чтения расстояния с RCWL-9610A"
2. "Добавь остановку робота при расстоянии <20 см"
3. "Добавь поворот сервопривода на 30° и 150° для сканирования"
4. "Добавь выбор направления с максимальным расстоянием"
5. "Добавь поворот робота в выбранном направлении"
**Почему лучше:** Вы понимаете каждый шаг, легче найти ошибки.
### Техника 2: Code Review от AI
После написания кода попросите:
```
Проверь этот код на:
1. Ошибки компиляции
2. Логические баги
3. Утечки памяти
4. Неправильное использование библиотек
5. Возможные улучшения
[вставить код]
```
### Техника 3: Документация
```
Создай документацию для этого кода в формате:
- Описание проекта
- Список компонентов
- Схема подключения
- Описание функций
- Инструкция по загрузке
- Возможные проблемы и решения
[вставить код]
```
### Техника 4: Тестирование
```
Создай тестовую программу для проверки:
- Работы моторов (вперёд, назад, повороты)
- Ультразвукового датчика (вывод расстояния в Serial Monitor)
- Датчиков линии (вывод значений LEFT/CENTER/RIGHT)
- Сервопривода (поворот 0-90-180-90-0)
- Bluetooth (эхо команд обратно на телефон)
```
## ЭТИКА ИСПОЛЬЗОВАНИЯ AI
### Учитесь, не копируйте слепо
- ✅ Прочитайте код от AI, поймите каждую строку
- ✅ Спросите AI: "Объясни, почему ты сделал именно так"
- ✅ Экспериментируйте: меняйте параметры, наблюдайте результат
- ❌ Не копируйте код без понимания
### Указывайте источники
Если используете код от AI в проектах/конкурсах:
```cpp
/*
* Проект: Робот Фобо - Объезд препятствий
* Автор: Ваше Имя
* Создано с помощью: ChatGPT / Claude
* Дата: 2025-01-15
*/
```
### AI — помощник, не замена учёбе
- AI помогает ускорить разработку
- AI объясняет сложные концепции
- Но **понимание** приходит только через практику!
## ЗАКЛЮЧЕНИЕ
Поздравляем! Теперь у вас есть **полный промпт** для работы с AI помощниками при программировании робота Фобо.
**Сохраните этот промпт** — он пригодится для каждого нового проекта!
**Следующие шаги:**
1. Скопируйте универсальный промпт (раздел выше)
2. Откройте ChatGPT / Claude / Gemini
3. Вставьте промпт в начало разговора
4. Попросите AI создать простой проект (например, "движение по квадрату")
5. Загрузите код на робота и протестируйте
6. Экспериментируйте с более сложными задачами!
**Помните:**
- 🎯 Чем точнее промпт — тем лучше результат
- 🧪 Всегда проверяйте код от AI перед загрузкой
- 📚 Учитесь на коде от AI, не просто копируйте
- 🚀 Используйте AI для ускорения, но развивайте навыки сами
Удачи в создании проектов с помощью AI! 🤖✨