Загрузка данных


Отборочное тестирование — проектная группа Arduino
Лебедкин Дмитрий Денисович


1. Что такое Arduino и для каких задач её используют?

Arduino — это такая плата с микроконтроллером, на которую можно загружать свой код через специальную программу (Arduino IDE) и управлять разными устройствами: светодиодами, моторами, датчиками и т.д. По сути это простой и доступный способ собрать своё электронное устройство, даже если ты не особо разбираешься в электронике.

Примеры проектов:
- автополив цветов по датчику влажности почвы
- робот, который объезжает препятствия
- умный дом (например, автоматическое включение света)


2. Чем отличаются цифровые и аналоговые пины?

Цифровые пины умеют работать только с двумя состояниями — включено (HIGH) или выключено (LOW), то есть 5В или 0В. Например, к цифровому пину можно подключить обычный светодиод, который просто горит или не горит.

Аналоговые пины (A0-A5) могут считывать не просто 0 и 1, а целый диапазон значений напряжения. Например, через аналоговый пин можно подключить потенциометр и считывать, насколько сильно он повёрнут.


3. Что делают setup() и loop(), почему loop() выполняется снова и снова?

setup() запускается один раз, когда плата включается или перезагружается — там прописывают начальные настройки, типа pinMode или Serial.begin.

loop() запускается сразу после setup() и потом крутится по кругу бесконечно, пока плата включена. Она выполняется снова и снова, потому что Arduino должна постоянно что-то проверять или делать в реальном времени — например, постоянно проверять, не нажата ли кнопка, а не проверить один раз и забыть.


4. Скетч мигания встроенным светодиодом (пин 13), 1 сек горит / 1 сек нет

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
}

Тут используются: pinMode() — чтобы настроить пин как выход, digitalWrite() — чтобы включать/выключать светодиод, delay() — чтобы сделать паузу, LED_BUILTIN — встроенная константа, которая обычно равна 13.


5. Как подключить внешний светодиод через резистор

Анод (это длинная ножка) подключается через резистор к цифровому пину, а катод (короткая ножка) идёт на GND.

Резистор нужен, чтобы ограничить ток, который течёт через светодиод, иначе он получит слишком много тока. Обычно ставят резистор где-то на 220-330 Ом.

Если подключить светодиод вообще без резистора, он получит слишком большой ток и, скорее всего, просто сгорит почти сразу (ну или сильно сократится срок службы).


6. Что такое Serial Monitor и скетч с отправкой "Hello, Arduino!"

Serial Monitor — это окошко в Arduino IDE, куда плата может отправлять текст через USB-кабель, чтобы можно было посмотреть, что происходит в программе — например, значения с датчиков или просто для отладки кода.

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

void loop() {
  Serial.println("Hello, Arduino!");
  delay(1000);
}


7. Кнопка с подтягивающим резистором (pull-up), код для зажигания LED пока кнопка нажата

Если использовать встроенный pull-up резистор (INPUT_PULLUP), то пин по умолчанию "притянут" к HIGH, а когда кнопку нажимают, она замыкает пин на GND, и на пине появляется LOW.

int buttonPin = 2;
int ledPin = 8;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  if (digitalRead(buttonPin) == LOW) {
    digitalWrite(ledPin, HIGH); // кнопка нажата — светодиод горит
  } else {
    digitalWrite(ledPin, LOW);
  }
}


8. analogRead() и analogWrite(), пример с потенциометром и ШИМ

analogRead() — читает значение с аналогового пина (от 0 до 1023), например с потенциометра.
analogWrite() — выводит ШИМ-сигнал на пин (от 0 до 255), например чтобы регулировать яркость светодиода.

Разница в том, что первая функция про чтение аналогового сигнала, а вторая — про имитацию аналогового выхода через быстрое переключение (ШИМ).

int potPin = A0;
int ledPin = 9;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  int value = analogRead(potPin);       // читаем 0-1023
  int brightness = value / 4;           // переводим в 0-255
  analogWrite(ledPin, brightness);      // регулируем яркость
}


9. Пины с тильдой (~) на Arduino Uno

Пины с тильдой — это пины, которые поддерживают ШИМ (PWM), то есть на них можно использовать analogWrite(). На Uno это, например, пины 3, 5, 6, 9, 10, 11.

analogWrite() нельзя использовать на любом цифровом пине, потому что не все выводы микроконтроллера аппаратно подключены к таймерам, которые генерируют ШИМ-сигнал — а без этого физически невозможно сделать плавное переключение.


10. HC-SR04 (ультразвуковой датчик расстояния)

У датчика 4 пина: VCC (питание), GND (земля), Trig (выход, на него подаём короткий импульс) и Echo (вход, с него считываем длительность импульса).

Работает так: подаём на Trig импульс на 10 микросекунд, датчик испускает ультразвук, звук отражается от препятствия и возвращается обратно. На пине Echo появляется импульс, длительность которого равна времени полёта звука туда-обратно. Зная скорость звука, можно посчитать расстояние: расстояние = (время * скорость звука) / 2.


11. I2C, пины SDA и SCL

I2C — это протокол связи, который позволяет подключать несколько устройств всего по двум проводам: SDA (линия данных) и SCL (линия тактового сигнала). Это удобно, когда нужно подключить много модулей, а свободных пинов мало.

Пример: LCD-дисплей 1602 с модулем I2C — вместо кучи проводов для управления дисплеем напрямую, подключаем всего 4 провода (VCC, GND, SDA, SCL), и дисплей уже сам разбирается, что выводить.


12. Сервопривод дёргается и греется — возможные причины

1. Проблема с питанием — сервоприводу не хватает тока (особенно если питать его напрямую от Arduino), нужно подключить отдельный источник питания.
2. Ошибка в коде — например, если постоянно отправлять сервоприводу противоречивые команды или писать значения вне допустимого диапазона углов.
3. Плохой контакт в проводах или дребезг сигнала — нужно проверить подключение и, возможно, добавить конденсатор для сглаживания питания.


13. millis() и чем она лучше delay()

delay() полностью останавливает выполнение программы на заданное время — то есть пока идёт задержка, Arduino вообще ничего больше не может делать, даже проверить кнопку.

millis() же просто возвращает, сколько миллисекунд прошло с момента запуска платы, и не останавливает программу. Идея "неблокирующей задержки" в том, чтобы запомнить время последнего действия (например, последнего переключения светодиода) и в loop() постоянно сравнивать текущее millis() с этим сохранённым временем — если прошло нужное количество миллисекунд, выполняем действие и обновляем сохранённое время. Так можно одновременно мигать светодиодом и проверять кнопку, не блокируя программу.


14. Проект "Умный ночник"

Схема: фоторезистор подключается по схеме делителя напряжения к аналоговому пину (например, A0), светодиод (или несколько) подключается к цифровому пину через резистор.

Логика: в loop() постоянно читаем значение с фоторезистора через analogRead(). Если значение показывает, что темно (значение ниже определённого порога) — включаем светодиод, если светло — выключаем.

Код (примерно):

int lightPin = A0;
int ledPin = 9;
int threshold = 300;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  int light = analogRead(lightPin);
  if (light < threshold) {
    digitalWrite(ledPin, HIGH); // темно — включаем
  } else {
    digitalWrite(ledPin, LOW);  // светло — выключаем
  }
}


15. Arduino не реагирует после загрузки скетча — план диагностики

1. Проверить, что в Arduino IDE выбрана правильная плата и правильный COM-порт.
2. Убедиться, что скетч действительно загрузился без ошибок (посмотреть на сообщения в консоли IDE).
3. Проверить USB-кабель — иногда кабель только заряжает, но не передаёт данные.
4. Проверить, не завис ли код где-то в бесконечном цикле или ошибочном условии.
5. Проверить физическое подключение компонентов — не перепутаны ли пины, нет ли отошедших проводов на макетке.
6. Проверить, правильно ли задана скорость Serial.begin() в коде и совпадает ли она со скоростью в Serial Monitor.
7. Попробовать загрузить простой тестовый скетч (например, обычное мигание встроенным LED) — если и он не работает, значит проблема в самой плате или подключении, а не в основном коде.