Разберём, как работать с аналоговыми входами Arduino — и в Arduino IDE (на упрощённом C++/Wiring), и на «чистом» C.
Работа в Arduino IDE
Основные сведения
Аналоговые входы Arduino (обычно пины A0–A5 на Arduino Uno/Nano) подключены к 10‑битному аналого‑цифровому преобразователю (АЦП). Это значит, что:
- диапазон входного напряжения: 0–5 В (для большинства плат);
- разрешающая способность: 1024 уровня (от 0 до 1023);
- точность измерения: ~0,005 В ().
Ключевые функции
analogRead(pin)— считывает аналоговое значение с указанного пина. Возвращает целое число от 0 до 1023.map(value, fromLow, fromHigh, toLow, toHigh)— преобразует значение из одного диапазона в другой.Serial.println(value)— выводит значение в монитор последовательного порта для отладки.
Пошаговый алгоритм работы
- Настройка пина (в функции
setup()):- аналоговые пины по умолчанию настроены как входы, поэтому
pinModeможно не указывать; - при необходимости явно указать:
pinMode(A0, INPUT).
- аналоговые пины по умолчанию настроены как входы, поэтому
- Инициализация последовательного порта (для вывода данных):
Serial.begin(9600). - Считывание значения (в цикле
loop()):int sensorValue = analogRead(A0). - Обработка и использование данных — например, преобразование в вольты или другой диапазон.
- Вывод результата (при необходимости):
Serial.println(sensorValue).
Пример кода: считывание с потенциометра и вывод в монитор порта
void setup() {
Serial.begin(9600); // Инициализация последовательного порта
pinMode(A0, INPUT); // Явное указание, что A0 — вход (необязательно)
}
void loop() {
int sensorValue = analogRead(A0); // Считываем значение (0–1023)
float voltage = sensorValue * (5.0 / 1024.0); // Преобразуем в вольты
Serial.print("Значение: ");
Serial.print(sensorValue);
Serial.print(" | Напряжение: ");
Serial.println(voltage);
delay(1000); // Задержка 1 с
}
Преобразование значений
- В вольты:
voltage = value * (5.0 / 1024.0). - В другой диапазон (например, 0–255 для ШИМ):
outputValue = map(sensorValue, 0, 1023, 0, 255).
Работа на «чистом» C через регистры ATmega
Этот способ даёт больше контроля и скорости, но требует знания архитектуры микроконтроллера (например, ATmega328P).
Основные регистры для работы с АЦП
- ADMUX — выбор канала АЦП (аналогового пина).
- ADCSRA — управление АЦП (включение, запуск, частота).
- ADCL/ADCH — чтение результата преобразования (младший и старший байты).
Пошаговая настройка и чтение
- Включить АЦП (установка бита ADEN в ADCSRA).
- Выбрать канал (записать номер пина в ADMUX).
- Запустить преобразование (установить бит ADSC в ADCSRA).
- Дождаться завершения (проверка флага ADIF или ожидание бита ADSC).
- Прочитать результат из регистров ADCL/ADCH.
Пример кода на C: чтение с аналогового пина A0
#include <avr/io.h>
#include <util/delay.h>
void initADC() {
ADMUX = (1 << REFS0); // Опорное напряжение — 5 В от VCC
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS0); // Включить АЦП, предделитель 32 (16 МГц / 32 = 500 кГц)
}
uint16_t readADC(uint8_t channel) {
ADMUX = (ADMUX & 0xF0) | (channel & 0x0F); // Выбрать канал
_delay_us(10); // Пауза для стабилизации
ADCSRA |= (1 << ADSC); // Запустить преобразование
while (ADCSRA & (1 << ADSC)); // Ждать завершения
return (ADCL | (ADCH << 8)); // Прочитать результат (10 бит)
}
int main(void) {
initADC();
DDRB |= (1 << PB5); // Пин 13 как выход (для светодиода)
while (1) {
uint16_t adcValue = readADC(0); // Читать с A0
if (adcValue > 512) { // Если значение > половины шкалы
PORTB |= (1 << PB5); // Включить светодиод
} else {
PORTB &= ~(1 << PB5); // Выключить светодиод
}
_delay_ms(100);
}
return 0;
}
Сравнение подходов
| Критерий | Arduino IDE | «Чистый» C |
|---|---|---|
| Простота | Высокая, интуитивные функции | Требует знания регистров и таймингов |
| Скорость | Медленнее (функции с накладными расходами) | Быстрее (прямая работа с регистрами) |
| Потребление памяти | Больше (библиотеки и абстракции) | Меньше (компактный код) |
| Гибкость | Ограничена стандартными функциями | Полная (можно настраивать АЦП вручную) |
| Совместимость | Работает на всех платах Arduino | Зависит от модели МК (ATmega328, ATmega2560 и т. д.) |
Практические советы
- Опорное напряжение. По умолчанию — 5 В, но его можно изменить:
analogReference(INTERNAL)— 1,1 В (внутренний источник);- внешний опорный источник на пин AREF.
- Фильтрация. Для сглаживания показаний используйте:
- усреднение нескольких измерений;
- программные фильтры (скользящее среднее).
- Подключение датчиков. Аналоговые входы подходят для:
- потенциометров (регулировка параметров);
- фоторезисторов (измерение освещённости);
- терморезисторов (измерение температуры);
- тензодатчиков (измерение веса/давления).
- Ограничения. Не подключайте к аналоговым входам напряжение выше 5 В — это может повредить АЦП.
