Порты Arduino

Разберём, как работать с портами Arduino — и в Arduino IDE (на упрощённом C++/Wiring), и на «чистом» C (через регистры микроконтроллера ATmega).

Работа в Arduino IDE (язык Wiring, основанный на C++)

Основные режимы портов

Порты (пины) настраиваются в функции void setup() с помощью команды pinMode(номер_порта, назначение).

Три режима работы:

  • INPUT — вход. Считывание данных с датчиков, кнопок и т. д. Порт в высокоимпедансном состоянии (высокое сопротивление).
  • OUTPUT — выход. Порт выдаёт напряжение (5 В / логическая «1» или 0 В / логический «0») и может управлять нагрузкой (до 20 мА постоянно, до 40 мА в пике).
  • INPUT_PULLUP — вход с подтягивающим резистором 20 кОм. Удобно для кнопок: не нужны внешние резисторы, сигнал инвертирован («1» на входе воспринимается как «0»).

Команды для работы с портами

  • digitalWrite(пин, значение) — устанавливает состояние выходного пина:
    • HIGH (5 В, логическая «1»);
    • LOW (0 В, логический «0»).
  • digitalRead(пин) — считывает значение со входа (HIGH или LOW).
  • analogRead(пин) — считывает аналоговый сигнал (0–1023, соответствует 0–5 В для 10‑битного АЦП). Работает только на аналоговых пинах (A0–A5 на Arduino Uno/Nano).

Пример кода (мигание светодиодом)

void setup() {
  pinMode(13, OUTPUT); // Пин 13 как выход для светодиода
}

void loop() {
  digitalWrite(13, HIGH); // Включить светодиод
  delay(1000);           // Ждать 1 с
  digitalWrite(13, LOW);  // Выключить светодиод
  delay(1000);           // Ждать 1 с
}

Работа на «чистом» C через регистры ATmega

Этот способ быстрее и экономнее по памяти, но требует знания архитектуры микроконтроллера (например, ATmega328P).

Основные регистры для управления портами:

  • DDRx (Data Direction Register) — определяет направление порта (вход/выход):
    • «1» — выход;
    • «0» — вход.
  • PORTx — управляет состоянием выходов или подключением подтягивающих резисторов:
    • для выхода: «1» = 5 В, «0» = 0 В;
    • для входа: «1» подключает подтягивающий резистор (INPUT_PULLUP), «0» — высокоимпедансное состояние (INPUT).
  • PINx — считывает текущее состояние пинов порта (логические уровни).

Где x — буква порта (B, C, D и т. д.). Например:

  • DDRB, PORTB, PINB — для порта B (пины PB0–PB7);
  • DDRD, PORTD, PIND — для порта D (пины PD0–PD7).

Соответствие пинов Arduino и регистров ATmega

На Arduino Uno/Nano:

  • цифровые пины 0–7 → порт D (PD0–PD7);
  • цифровые пины 8–13 → порт B (PB0–PB5);
  • аналоговые пины A0–A5 → порт C (PC0–PC5).

Примеры операций с регистрами

  1. Настройка пина как выход (например, PD2 = пин 2 Arduino):
DDRD |= (1 << 2); // Установить бит 2 в DDRD в «1»
  1. Установка высокого уровня на выходе (PD2 = 5 В):
PORTD |= (1 << 2); // Установить бит 2 в PORTD в «1»
  1. Установка низкого уровня на выходе (PD2 = 0 В):
PORTD &= ~(1 << 2); // Обнулить бит 2 в PORTD
  1. Считывание состояния пина (PD3):
uint8_t state = PIND & (1 << 3); // Считать бит 3 из PIND
  1. Настройка входа с подтягивающим резистором (PB5 = пин 13 Arduino):
DDRB &= ~(1 << 5); // PB5 как вход (бит 5 в DDRB = 0)
PORTB |= (1 << 5);  // Подключить подтягивающий резистор (бит 5 в PORTB = 1)

Полный пример на C (мигание светодиодом через регистры)

#include <avr/io.h>
#include <util/delay.h>

int main(void) {
  DDRB |= (1 << 5); // PB5 (пин 13) как выход

  while (1) {
    PORTB |= (1 << 5);   // PB5 = 5 В (светодиод включён)
    _delay_ms(100);      // Ждать 100 мс
    PORTB &= ~(1 << 5);  // PB5 = 0 В (светодиод выключен)
    _delay_ms(100);      // Ждать 100 мс
  }
  return 0;
}

Сравнение подходов

Критерий Arduino IDE (Wiring) «Чистый» C (регистры)
Скорость Медленнее (функции с накладными расходами) Быстрее (прямая работа с регистрами)
Потребление памяти Больше (код функций занимает место) Меньше (компактный машинный код)
Простота Просто для новичков (интуитивные команды) Требует понимания архитектуры МК
Гибкость Ограничена стандартными функциями Полная (можно управлять каждым битом)
Совместимость Работает на всех платах Arduino Зависит от модели МК (ATmega328, ATmega2560 и т. д.)

Рекомендации

  • Для обучения и простых проектов — используйте Arduino IDE и функции pinMode, digitalWrite, digitalRead. Это проще и надёжнее.
  • Для критичных по скорости или памяти задач — переходите на работу с регистрами. Это даст выигрыш в производительности, но потребует изучения документации на микроконтроллер.
  • Всегда проверяйте соответствие пинов Arduino и битов регистров для вашей платы (Uno, Nano, Mega и т. д.).

Добавить комментарий

Войти с помощью: