# Задание 1

Порядок диагностики:
1. Проверить мультиметром напряжение на +5V Arduino в момент старта двигателей/сервопривода. Если ниже 4.2V - проблема перезагрузок и шумных данных с HC-SR04 в нестабильном питании и просадках напряжения
2. Проверить данные HC-SR04 без подключения моторов, данные должны быть стабильные. Иначе - проблема в коде или модуль неисправен

Ошибки построения схемы:
1. Всё питание разведено на выход +5V Arduino, а значит:
* Просадка в напряжении питания ниже ~7V приведет к просадкам +5V
* Перегрузка по цепи питания +5V, от которой питается и Arduino с датчиком расстояния, и сервопривод
2. Отсутствие шунтирующих конденсаторов по питанию, даже кратковременные просадки напряжения влияют на работу схемы
3. Низкое напряжение аккумуляторной сборки. Часто ставятся 2S сборки (6.4 - 8.4 вольт), с учетом падения напряжения на линейном стабилизаторе этого мало для стабильного питания с мощной нагрузкой

Корректная схема питания:
0. Увеличить кол-во аккумуляторов до 3, итоговое напряжение ~11.1V, стандарт для двигателей
1. Добавить внешний импульсный преобразователь напряжения на 5В для питания сервопривода
2. Запитать Arduino и датчик можно как напрямую через +5V, так и от бортового питания 11.1V (ТОЛЬКО при низкой нагрузке, максимум Arduino + пара датчиков)
3. Добавить шунтирующие конденсаторы по линиям питания
* Электролит. 100uF на аккумулятор
* Электролит. 100uF на +5V для сервопривода
* Электролит. 47uF на +5V Arduio и HC-SR04
* Керам. 0.1uF на питание +5V HC-SR04 как можно ближе к датчику

ВАЖНО: соединять GND всех линий по принципу звезды чтобы не было наводок

# Задание 2

Проблемы:
1. Таймер на delay, 0.1с робот "глух" к командам
2. Непонятно, какая 2-я проблема имелась ввиду, ведь предложенный код лишь заготовка для отладки.

Простая версия программы:
```C
#include <IRremote.h>

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

#define IN1 7
#define IN2 8
#define ENA 5

#define IN3 9
#define IN4 10
#define ENB 6


void forward() {
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    analogWrite(ENA, 200);
    analogWrite(ENB, 200);
}

void backward() {
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    analogWrite(ENA, 200);
    analogWrite(ENB, 200);
}

void left() {
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    analogWrite(ENA, 200);
    analogWrite(ENB, 200);
}

void right() {
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    analogWrite(ENA, 200);
    analogWrite(ENB, 200);
}

void stopRobot() {
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
}

void setup() {
    Serial.begin(9600);

    pinMode(IN1, OUTPUT);
    pinMode(IN2, OUTPUT);
    pinMode(ENA, OUTPUT);

    pinMode(IN3, OUTPUT);
    pinMode(IN4, OUTPUT);
    pinMode(ENB, OUTPUT);

    irrecv.enableIRIn();
}

    void loop() {
        if (irrecv.decode(&results)) {
        unsigned long code = results.value;

        switch (code) {
            case 0xFF18E7: forward(); break;
            case 0xFF4AB5: backward(); break;
            case 0xFF10EF: left(); break;
            case 0xFF5AA5: right(); break;
            case 0xFF38C7: stopRobot(); break;
        }

        irrecv.resume();
        }
    }
```
По необходимости оптимизации повторения выносятся в функции / макросы / inline функции.

## Если убрать irrecv.resume()
- decode() прочитает буфер и не запустится новый прием команды. resume() читает буфер и запускает новый прием.

# Задание 3
## Часть 1
* Проверить жесткость крепления сервоприводов и отсутствие люфта
* Убедиться, что:
- ноги симметрично собраны и занимают одинаковое положение при старте
- нет перекосов в креплениях
* Вручную (МЕДЛЕННО) подвигать ноги:
- нет ли “закусывания”
- одинаковое ли сопротивление
## Часть 2
* Отключить все, кроме одного сервопривода, запустить простое движение, к примеру 0° -> 90° -> 0°
Проверить:
- есть ли дрожание без нагрузки
- одинаковая ли плавность
Если дрожит один сервопривод — проблема в нём или его питании
# Часть 3 - нагрузочный тест
Запустить простое движение для обоих сервоприводов, например те же 0° -> 90° -> 0°, наблюдать:
- есть ли перезагрузка
- есть ли падение напряжения питания ниже 4.5V
- появляется ли дрожь сервоприводов
Если проблема появляется только при синхронном движении - дело в перегрузке цепи питания.

# Задание 4
## Изменения в модели
1. Усиление отверстий под крепёж - добавить ребра вокруг отверстий, утопить винты в корпус (фаски / отверстия по диаметру шляпки)
2. Перемоделировать крепежные отверстия под датчик чтобы избавиться от перекоса
3. ???
* Возможно, в качестве пункта 3 можно рассмотреть моделирование под закладные гайки
## Изменения в печати
1. Печатать горизонтально, чтобы увеличить предельное усилие на разрыв для отверстий
2. Увеличить кол-во периметров до толщины стенки 0.8 и более мм
3. Уменьшить скорость печати отверстий для улучшения спекаемости слоев и увеличения прочности в этих местах
## Зазор под M3
Оптимальный - 0.15мм по радиусу, создаст эффект нарезания резьбы винтом, но без разшатывания крепежных отверстий при пересборке.

# Задание 5
1. Диод потребляет фиксированное напряжение, при превышении которого может перегореть.
2. Номинал резистора рассчитывается по формуле:
- R = (Vin - Vd)/P = (5 - 3)/0.015 = 200 Ом.
- Vin - Vd = падение напряжения на резисторе, P = мощность диода
3. Светодиод ярко вспыхнет, может даже какое-то время посветит, но потом перегорит.
4. Большое сопротивление ограничит ток настолько что диод либо не загорится, либо будет тусклым.

# Задание 6
1. Дребезг контактов, физическое замыкание/размыкание цепи и высокочастотные помехи от контакта.
2. Подтяжка входа "сбрасывает" маломощные помехи в шину питания, повышая стабильность работы кнопки
3. INPUT не имеет подтяжки, INPUT_PULLUP имеет внутреннюю подтяжку к +5V.
4. Без нажатия кнопки на входе будет +5В, нажатие кнопки соединенной с GND сбросит состояние в 0V.