Если вам нужно измерять с помощью ардуины напряжения превышающие напряжение питания или измерять сопротивление резистивного датчика — вам необходим резисторный делитель напряжения.
На деле это очень просто — два резистора и всё:
К выводу верхнего резистора (R1) подключаем измеряемое напряжение (Uвх) — со средней точки снимаем поделённое (Uвых).
Значение выходного напряжения зависит от соотношения сопротивлений (и входного напряжения естественно):
Обратите внимание — важно только соотношение сопротивлений, например, если сопротивления равны, то входное напряжение поделится на 2.
А что бы через делитель не шёл слишком большой ток (разряжая батарею и грея резисторы) стоит выбирать номиналы в еденицы-десятки килоом.
Что со всем этим можно сделать:
Измерение напряжения питания
Например, имеется тяговый 12В аккумулятор на роботе и надо знать его текущее состояние, что бы вовремя подъехать на зарядку. Подключим «плюс» батареи к верхнему резистору делителя, и объединим земли — «минус» батареи робота и GND ардуины.
Измерения будем просто выводить в сом-порт:
// аналоговый пин подключенный к средней точке делителя const int batterySensorPin = A0; int batterySensorValue = 0; float batteryVoltage = 0; // 5V/1024 значений = 0,004883 В/значение const float voltPerUnit = 0.004883; //"рассчёт делителя" const float R1 = 2; const float R2 = 1; //коэффициент для расчёта напряжения на входе делителя const float dividerRatio = (R1+R2)/R2; //коэффициент перевода имерений в напряжение const float voltRatio = voltPerUnit * dividerRatio; void setup() { Serial.begin(9600); } void loop() { batterySensorValue = analogRead(batterySensorPin); // рассчитаем в человеко-понятных вольтах batteryVoltage = batterySensorValue * voltRatio; //и выведем результаты в ком-порт: Serial.print("batterySensorValue = " ); Serial.print(batterySensorValue); Serial.print(" " ); Serial.print("batteryVoltage = " ); Serial.println(batteryVoltage); delay(1000); }
Получилось так:
для наглядности взял совершенно дохлую, не заряженную батарею и подключил нагрузку.
Датчик положения(угла поворота)
Потенциометр(или подстроечник) — это готовый регулируемый делитель. Крутитим ручку — бегунок ездит по резистивной дорожке и меняет соотношение сопротивлений плечей:
Тоесть можно воткнуть крайние ноги в землю и в питание(5В), а со средней снимать напряжение зависящее от угла поворота ручки.
В качестве примера можно взять стандартный скетч knob:
#include <Servo.h> Servo myservo; // создаём обьект servo int potpin = 0; // на A0 подключим среднюю ногу потенциометра int val; // сюда будем считывать void setup() { myservo.attach(9); // на 9 ноге у нас будет серва } void loop() { val = analogRead(potpin); // читаем значение с А0 ( получается от 0 до 1023) val = map(val, 0, 1023, 0, 179); // преобразуем это в диапазон 0-180 для управления сервой myservo.write(val); // и поворачиваемсерву на получившийся угол delay(15); // задержка }
схема для примера проста как угол дома:
поэтому работает:
Много резисторов и серв, и зачем такая связка может понадобиться можно увидеть здесь.
Резистивные датчики (фоторезистор, терморезистор)
Некоторые датчики меняют своё сопротивление в зависимости от изменений измеряемой величины — например фоторезистор или терморезистор. Чувствовать изменение сопротивления контроллер не может — зато воткнув наш датчик в одно из плечей делителя сможем измерить изменение напряжения:
«Х» на полке у нижнего резистора символизирует некую физическую величину к которой данный Х-резистор не равнодушен.
Тут, как и в примере с потенциометром, мы запитали делитель от стабильного известного напряжения — напряжения питания МК (5В), сопротивление верхнего резистора постоянно, так что напряжение со средней точки будет зависеть только от сопротивления датчика(нижнего резистора).
Узнаем освещённость во внешнем мире:
Скетч — подрезанный AnalogInOutSerial:
const int analogInPin = A0; //на A0 подключим среднюю ногу делителя int sensorValue = 0; // тут будем хранить значения с фоторезистора void setup() { Serial.begin(9600); } void loop() { sensorValue = analogRead(analogInPin); //считываем значение Serial.print("sensor = " ); // и самым тупым образом выводим его в сиреал Serial.println(sensorValue); delay(500); // с задержкой }
Он видит свет!
Ещё по теме:
Всё о резисторах
Потенциометр
фоторезистор
Терморезистор (там скорее термостабилитрон, но суть совершенно та же)