Резисторный делитель


Если вам нужно измерять с помощью ардуины напряжения превышающие напряжение питания или измерять сопротивление резистивного датчика — вам необходим резисторный делитель напряжения.
На деле это очень просто — два резистора и всё:

К выводу верхнего резистора (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);  // с задержкой
}

Он видит свет!

Ещё по теме:
Всё о резисторах
Потенциометр
фоторезистор
Терморезистор (там скорее термостабилитрон, но суть совершенно та же)


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

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Arduino Bluetooth CraftDuino DIY Google IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение