Проект 15: Как писать код с помощью AI

Работа с AI помощником для программирования робота Фобо

Введение

Что мы будем делать?

В этом уроке вы научитесь работать с AI помощниками (ChatGPT, Claude, Gemini и другими) для создания кода для робота Фобо. Вы получите готовый промпт — специальный текст с полным описанием вашего набора, который можно скопировать и вставить в любой AI чат.

Почему это важно?

  • Ускорение разработки — AI помогает писать код в 10 раз быстрее

  • 🎓 Обучение — AI объясняет код и предлагает улучшения

  • 🐛 Отладка — AI помогает находить и исправлять ошибки

  • 💡 Идеи — AI предлагает новые проекты и функции

Что такое промпт?

Промпт — это подробное описание вашей задачи для AI. Чем точнее и подробнее промпт, тем лучше результат. В этом уроке мы дадим вам универсальный промпт для робота Фобо.

Какие AI помощники можно использовать?

Бесплатные варианты

  1. ChatGPT (OpenAI)

    • Ссылка: https://chat.openai.com

    • Бесплатная версия: GPT-3.5

    • Платная версия: GPT-4 ($20/месяц)

    • Язык: русский, английский

    • Лучше всего: объяснения кода, обучение

  2. Claude (Anthropic)

    • Ссылка: https://claude.ai

    • Бесплатная версия: Claude 3.5 Sonnet

    • Язык: русский, английский

    • Лучше всего: работа с большими проектами, отладка

  3. Gemini (Google)

    • Ссылка: https://gemini.google.com

    • Бесплатная версия: есть

    • Язык: русский, английский

    • Лучше всего: интеграция с Google сервисами

  4. 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! 🤖✨