вторник, 12 февраля 2013 г.

ARDUINO омметр


ARDUIO первый полезный проект

Для реализации данного способа подключения потребуется:

·        1 * резистор 10 кОм (100 руб за набор из 95 штук)
·        Разъем на 5 pin «мама» (25 руб за линейку из 40 штук)

Цены взяты с сайта МОЛОТОК.РУ

Иногда, после творения очередного проекта остается куча резисторов, которые нужно разобрать обратно по местам, согласно маркировки. Проблема в том, что современные резисторы имеют маркировку в виде цветных полос. В отличии от советских резисторов, на которых был написан номинал.
Можно сверять цветную маркировку с таблицами в интернете или использовать программу установленную на ANDROID телефоне. Мне показалось это не удобно.

Я решил сделать небольшой проект «ARDUINO омметр». Наверно всем известен делитель напряжения. Вкратце: падение напряжения на резисторе зависит от его сопротивления. Смотрим схему.


ARDUINO имеет аналоговый вход. При чтении с него возвращается значение от 0 до 1023. Собираем схемку.

На одном плече резистор 10 кОм, ко второму плечу подключаем резистор, сопротивление которого нужно измерить.  Среднюю точку подключаем к аналоговому входу A0.
Загружаем скетч. 

// ОММЕТР (С)2013 ALEN Studio by Little_Red_Rat

// Омметр на осное ARDUINO
//
// Подключение делителя напряжения к ARDUINO
// Arduino 5V -> R1 10kOm -> Arduino Analog 0 -> R2 -> Arduino GND

int analogPin = 0; // Анлоговый вход для считывания напряжения с делителя напряжения
float Vout = 0; // Переменная для хранения значения напряжения в средней точки делителя (0-5.0)

float R2 = 0; // Переменная для хранения значения резистора R2

void setup() 

Serial.begin(9600); // Подготовка Serial Monitor для вывода информации


void loop() 

Vout = (5.0 / 1023.0) * analogRead(analogPin); // Вычисляем напряжение в средней точки делителя (0-5.0)
R2 = 10000 / ((5.0 / Vout) - 1); // Вычисляем сопротивление R2 (10000 это значение R1 10 кОм) 
Serial.print("Voltage: "); // 
Serial.println(Vout); // Напряжения в средней точки делителя (0-5.0) для справки
Serial.print("R2: "); // 
Serial.println(R2); // Значение сопротивления R2

delay(1000); // Пауза 1 сек
}


Включаем Serial Monitor. Раз в 1 секунду мы видим напряжение в средней точке делителя и рассчитанное сопротивление.

Для примера измерено сопротивление резистора, который имеет маркировку 10 кОм. Результат работы удовлетворителен. Но если R2 будет намного больше или меньше, чем R1, погрешность возрастет. Составим таблицу. Показания на аналоговом входе могут изменятся от 0 до 1023. Посмотрим чему будет равно расчетное значение сопротивления R2 для некоторых значений U2.

U2 U1 R1 R2 шаг  в %
1 1023 10000 10
2 1022 10000 20 100
3 1021 10000 29 50
4 1020 10000 39 33
5 1019 10000 49 25
6 1018 10000 59 20
7 1017 10000 69 17
502 522 10000 9617
503 521 10000 9655 0.39
504 520 10000 9692 0.39
505 519 10000 9730 0.39
506 518 10000 9768 0.39
507 517 10000 9807 0.39
1017 7 10000 1452857
1018 6 10000 1696667 17
1019 5 10000 2038000 20
1020 4 10000 2550000 25
1021 3 10000 3403333 33
1022 2 10000 5110000 50
1023 1 10000 10230000 100

Как видно из сокращенной таблицы шаг измерения наименьший в середине диапазона. Это значит, что чем ближе значения R1 и R2, тем результат измерения наиболее точен.
Значит не напрасно в цифровых мультиметрах существует несколько диапазонов для измерения сопротивления. Что можно сделать в нашем случае. Переключатель ставить не хочется. Попробуем использовать несколько аналоговых входов. 

Далее идет чистая теория, не опробованная на практике.

Попробуем собрать схему с несколькими делителями напряжения. Подключим измеряемое сопротивление к GND и к одному из аналоговых входов. Чем ближе значение его сопротивления будет к значению сопротивлению подключенного от этого же входа к 5V, тем точнее будет результат измерения.

В программе нужно реализовать следующие функции.

1.   Определение, к какому входу подключено сопротивление. На этом входе значение будет отличным от 1023 (5V), т.к. при отсутствии R2 в делителе в средней точке будет 5V.
2.   Определение, в какой части диапазона находится значение напряжения. Если в начале или в конце диапазона (например 0-256 или 768-1023) ,предложить подключить сопротивление на соседний вход
3.   Рассчитать сопротивление, исходя из значения R1 подключенного к входу, определенному в пункте 1.

Это уже вы как-нибудь самостоятельно, без меня

Для красоты можно добавить дисплей и ввести таблицу стандартных значений резисторов и подводить измеренное сопротивление под стандарт
Класс точности 10%, ряд Е12 по ГОСТу (Ом, кОм, МОм):
1.0, 1.2, 1.8, 2.2, 2.7, 3.3, 3.9, 4.7, 5.6, 6.8, 8.2, 10, 12, 15, 18, 22, 27, 33, 39, 47, 56, 68, 82, 100, 120, 150, 180, 220, 270, 330, 390, 470, 560, 680, 820


Большая просьба к любителям перепостов, указывать автора Little_Red_Rat



5 комментариев:

  1. Схема интересная, в качестве решения со множеством ходов можно использовать мультиплексор, к примеру, вполне доступный 4051BD

    ОтветитьУдалить
  2. Злобные буржуи на инструктаблах тоже в 2013 году выложили эту поделку.

    ОтветитьУдалить
  3. Измерение сопротивления образца через один аналоговый вход(используя несколько значений делителя) с использованием цифровых выходов как питания делителя. На выходе сопротивление и через точку с запятой достоверность. В sens задаете цифровой порт к которому подключен резистор и его номинал sens(порт; сопр Ом)
    void setup() {

    Serial.begin(9600);

    }

    void loop() {

    sens(97.7, 10);

    sens(9860, 6);

    sens(97800, 8);

    sens(9460000, 12);

    sens(974, 4);

    sens(972000, 2);

    }

    void sens(float resist, int port){
    pinMode(port, OUTPUT);
    digitalWrite(port, HIGH);

    delay(10);

    float sum = 0;
    int tim = 5;

    for (byte i = 0; i < tim; i++)
    {
    delay(10);
    sum += analogRead(A0);
    }


    float sensorValue = sum / float(tim);
    float R = resist / ((5.0 / ((5.0 / 1023.0) * sensorValue)) - 1);

    Serial.print(R);

    if (sensorValue>512){
    sensorValue = sensorValue -(2*(sensorValue-512));
    }
    Serial.print(";");
    Serial.println(sensorValue);

    digitalWrite(port, LOW);
    pinMode(port, INPUT);
    delay(10);
    }

    ОтветитьУдалить
  4. Есть такая замечательная весчь как цифровой потенциометр. Предлагаю не загромождать аналоговые входы и не напаивать резисторы а подключить этот потенциометр и по SPI автоматом подстраивать под номинал. Идея на мой взгляд супер.

    ОтветитьУдалить
    Ответы
    1. цифр потенциометр имеет предел около 100кОм,
      тут мультиплексор в самый раз

      Удалить