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