Измеритель сопротивления на Arduino

Добавлено 20 января 2019 в 06:41

Данная статья является первой в серии статей про измерение с помощью Arduino параметров различных компонентов и физических величин, используемых в радиоэлектронике. Начнем с самого простого – с измерения сопротивления.

Определение сопротивления резистора по цветовому коду может вызывать некоторые трудности. Чтобы преодолеть эту сложность, мы собираемся с помощью Arduino построить простой измеритель сопротивления. Основным принципом данного проекта является использование схемы делителя напряжения. Значение неизвестного сопротивления будет отображаться на LCD дисплее 16x2. Данный проект также служит примером взаимодействия Arduino с символьным LCD дисплеем.

Измеритель сопротивления на Arduino
Измеритель сопротивления на Arduino

Необходимые компоненты

Принципиальная схема

Принципиальная схема измерителя сопротивления на Arduino
Принципиальная схема измерителя сопротивления на Arduino

Arduino Uno

Arduino Uno – это открытая микроконтроллерная плата на базе микроконтроллера ATmega328p. Она имеет 14 цифровых выводов (из которых 6 выводов можно использовать в качестве выходов ШИМ), 6 аналоговых входов, встроенные стабилизаторы напряжения и так далее. Arduino Uno имеет 32 КБ флэш-памяти, 2 КБ SRAM и 1 КБ EEPROM. Она работает с тактовой частотой 16 МГц. Для связи с другими устройствами Arduino Uno поддерживает последовательный интерфейс, I2C, SPI. В таблице ниже приведены технические характеристики Arduino Uno (более подробное техническое описание можно посмотреть здесь).

МикроконтроллерATmega328P
Рабочее напряжение5 В
Входное напряжение (рекомендуемое)7-12 В
Цифровые входные/выходные выводы14
Аналоговые входные выводы6
Флэш-память32 Кбайт, из которых 0,5 Кбайт используются загрузчиком
Оперативная память SRAM2 Кбайт
Энергонезависимая память EEPROM1 Кбайт
Тактовая частота16 МГц

LCD дисплей 16x2

LCD дисплей 16x2 – это широко используемый во встраиваемых приложениях дисплей. Ниже приведено краткое описание выводов и работы LCD дисплея. В нем используется два важных регистра. Это регистр данных и регистр команд. Регистр команд используется для отправки таких команд как очистка дисплея, перемещение курсора и так далее. Регистр данных используется для отправки данных, которые должны быть отображены на LCD дисплее. Ниже приведена таблица описания выводов символьного LCD дисплея 16x2.

Назначение выводов LCD дисплея на HD44780
Номер выводаОбозначениеВход/выходНазначение вывода
1VssЗемля
2VddПитание +5В
3VeeСредний вывод потенциометра (для регулировки контрастности)
4RSвходВыбор регистра (RS=0 для регистра команд, RS=1 для регистра данных)
5RWвходЧтение/Запись (RW=0 для записи, RW=1 для чтения)
6Eвход/выходВключение
7D0вход/выход8-разрядная шина данных (младший значащий бит)
8D1вход/выход8-разрядная шина данных
9D2вход/выход8-разрядная шина данных
10D3вход/выход8-разрядная шина данных
11D4вход/выход8-разрядная шина данных
12D5вход/выход8-разрядная шина данных
13D6вход/выход8-разрядная шина данных
14D7вход/выход8-разрядная шина данных (старший значащий бит)
15A+4.2–5 В для подсветки
16Kземля

Концепция цветового кода резисторов

Чтобы определить сопротивление резистора, мы можем использовать следующую формулу:

\(R = AB \cdot 10^C \pm T\%\)

где

  • A – значение для цвета первой полосы
  • B – значение для цвета второй полосы
  • C – значение для цвета третьей полосы
  • T – значение для цвета четвертой полосы

Таблица ниже показывает цветовой код резисторов.

Цветовая маркировка резисторов
ЦветЧисловое значение кодаСтепень десяти (10C)Точность (T)
черный0100
коричневый1101± 1%
красный2102± 2%
оранжевый3103
желтый4104
зеленый5105
синий6106
фиолетовый7107
серый8108
белый9109
золотой10-1± 5%
серебряный10-2± 10%
нет полосы± 20%

Например, если цветовые коды на резисторе будут коричневый – зеленый – красный – серебряный, то номинал резистора рассчитывается следующим образом:

коричневый = 1
зеленый = 5
красный = 2
серебряный = ±10%

Первые три полосы соответствуют R = AB*10C

\(R = 15 \cdot 10^{+2}\)

R = 1500 Ом

Четвертая полоса указывает на точность ±10%

10% от 1500 = 150
Для +10%, значение составляет 1500 + 150 = 1650 Ом
Для -10%, значение составляет 1500 - 150 = 1350 Ом

Таким образом, сопротивление реального резистора может быть где-то между 1350 Ом и 1650 Ом.

Расчет сопротивления с помощью измерителя сопротивления на Arduino

Работа измерителя сопротивлений довольно проста и может быть объяснена с помощью формулы для простого резисторного делителя напряжения, который показан на схеме измерителя сопротивления (рисунок выше).

Выходное напряжение делителя напряжения из резисторов R1 и R2 составляет

\[V_{вых} = V_{вх} \cdot { R2 \over R1 + R2}\]

Из этой формулы мы можем вывести R2:

\[R2 = R1 \cdot { V_{вых} \over V_{вх} - V_{вых}}\]

где

  • R1 – известное сопротивление;
  • R2 – неизвестное сопротивление;
  • Vвх – напряжение, создаваемое на выводе 5V Arduino;
  • Vвых – напряжение на резисторе R2 относительно земли.

Примечание: значение известного резистора (R1) выбрано 3,3 кОм, но пользователи могут заменить его резистором с другим номиналом.

Измеритель сопротивления на Arduino в действии
Измеритель сопротивления на Arduino в действии

Поэтому, если мы получим значение напряжения на неизвестном сопротивлении (Vвых), мы сможем легко рассчитать неизвестное сопротивление R2. В данном случае мы считывали значение напряжения Vвых, используя аналоговый вывод A0 (смотрите принципиальную схему), и преобразовывали эти цифровые значения в напряжение, как описано в приведенном ниже коде.

Если значение известного сопротивления намного больше или меньше неизвестного сопротивления, ошибка будет больше. Поэтому рекомендуется поддерживать значение известного сопротивления ближе к неизвестному сопротивлению.

Объяснение кода

Полный код программы для Arduino и демонстрационное видео к этому проекту приведены в конце статьи. Код разбит на небольшие важные фрагменты, которые объясняются ниже.

В данном фрагменте кода мы собираемся определить выводы, к которым на Arduino подключен LCD дисплей 16x2. Вывод RS LCD дисплея подключен к цифровому выводу 2 Arduino. Вывод включения LCD дисплея подключен к цифровому выводу 3 Arduino. Выводы данных (D4-D7) LCD дисплея подключены к цифровым выводам 4, 5, 6 и 7 Arduino.

LiquidCrystal  lcd(2,3,4,5,6,7);   //rs,e,d4,d5,d6,d7

В этом фрагменте кода мы определяем некоторые переменные, которые используются в программе.

  • Vin – это напряжение, обеспечиваемое на выводе 5V Arduino;
  • Vout – это напряжение на резисторе R2 относительно земли;
  • R1 – значение известного сопротивления;
  • R2 – значение неизвестного сопротивления.
int Vin=5;        // напряжение на выводе 5V arduino
float Vout=0;     // напряжение на выводе A0 arduino
float R1=3300;    // значение известного сопротивления
float R2=0;       // значение неизвестного сопротивления

В этом фрагменте кода мы собираемся инициализировать LCD дисплей 16x2. На LCD дисплей передаются команды таких настроек, как очистка дисплея, отображение и мигание курсора и так далее.

lcd.begin(16,2);

В этом фрагменте кода аналоговое напряжение на резисторе R2 (вывод A0) преобразуется в цифровое значение (от 0 до 1023) и сохраняется в переменной.

a2d_data = analogRead(A0);

В этом фрагменте кода цифровое значение (от 0 до 1023) преобразуется в значение напряжения для будущих расчетов.

buffer=a2d_data*Vin;
Vout=(buffer)/1024.0;

В следующем фрагменте кода с помощью процедуры, объясненной ранее, рассчитывается реальное значение неизвестного сопротивления.

buffer=Vout/(Vin-Vout);
R2=R1*buffer;

В следующем фрагменте значение неизвестного сопротивления выводится на LCD дисплей.

lcd.setCursor(4,0);
lcd.print("ohm meter");
lcd.setCursor(0,1);
lcd.print("R (ohm) = ");
lcd.print(R2);

Так легко с помощью Arduino мы рассчитали сопротивление неизвестного резистора.

Полный код программы

#include<LiquidCrystal.h>

LiquidCrystal lcd(2,3,4,5,6,7);   //rs,e,d4,d5,d6,d7

int Vin=5;        // напряжение на выводе 5V arduino
float Vout=0;     // напряжение на выводе A0 arduino
float R1=3300;    // значение известного сопротивления
float R2=0;       // значение неизвестного сопротивления

int a2d_data=0;    
float buffer=0;            

void setup()
{
  lcd.begin(16,2);
}

void loop()
{
  a2d_data=analogRead(A0);
  if(a2d_data)
  {
    buffer=a2d_data*Vin;
    Vout=(buffer)/1024.0;
    buffer=Vout/(Vin-Vout); 
    R2=R1*buffer;

    lcd.setCursor(4,0);
    lcd.print("ohm meter");

    lcd.setCursor(0,1);
    lcd.print("R (ohm) = ");
    lcd.print(R2);
    
    delay(1000);
  }
}

Видео

Теги

ArduinoArduino UnoИзмерениеИзмеритель сопротивленияСопротивление

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.


  • 2022-01-25Виталий Шваб

    Подскажите пожалуйста я так и не понял какая погрешность будет, или пока не попробуешь не узнаешь?

  • 2022-01-19Владимир Uglevod

    ушел от темы в понты с дисплеем) можно и через порт инфу выводить)
    но тем неменее (просто хотелось бы больше понимания за счет чего работает изм сопрот)
    у меня получился вывод - в % типа во сколько поддтяг сопротивление больше измеряемого

  • 2019-12-25Евгений

    Что-то умное написано, но я не осилил... что есть А3?
    Можете пример расчета привести?

    Т.е. вся суть измерения, как я понимаю, сводится к преобразованию полученного значения измерения через эталонное?

    Спасибо

  • 2019-07-14Андрей

    Лучше всего для расчета использовать формулу вычисления без использования опорного напряжения. Фактически это метод расчета через соотношения
    R.Изм=((1023*Rэт)/A3)-Rэт

  • 2019-07-09antzol

    Статья показывает просто отправную точку для старта измерений с помощью Arduino.
    Дальше, если не устраивает стабилизированное напряжение питания Arduino, можно использовать в качестве эталона какую-либо микросхему источника опорного напряжения, контролировать напряжение не только на неизвестном резисторе, но и на всем делителе, самим формировать напряжение на делителе, чтобы оно было меньше опорного напряжения и т.д. и т.п.
    Но это просто статья для начинающих. :)

  • 2019-07-09Андрей

    Неплохая статья, но удивляет метод расчета сопротивления. Так как питание плавающая величина, это даст существенную погрешность измерений.