Измеритель сопротивления на Arduino
Данная статья является первой в серии статей про измерение с помощью Arduino параметров различных компонентов и физических величин, используемых в радиоэлектронике. Начнем с самого простого – с измерения сопротивления.
Определение сопротивления резистора по цветовому коду может вызывать некоторые трудности. Чтобы преодолеть эту сложность, мы собираемся с помощью Arduino построить простой измеритель сопротивления. Основным принципом данного проекта является использование схемы делителя напряжения. Значение неизвестного сопротивления будет отображаться на LCD дисплее 16x2. Данный проект также служит примером взаимодействия Arduino с символьным LCD дисплеем.
Необходимые компоненты
- плата Arduino Uno;
- LCD дисплей 16x2;
- потенциометр 1 кОм;
- резисторы;
- макетная плата;
- перемычки.
Принципиальная схема
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 Кбайт используются загрузчиком |
Оперативная память SRAM | 2 Кбайт |
Энергонезависимая память EEPROM | 1 Кбайт |
Тактовая частота | 16 МГц |
LCD дисплей 16x2
LCD дисплей 16x2 – это широко используемый во встраиваемых приложениях дисплей. Ниже приведено краткое описание выводов и работы LCD дисплея. В нем используется два важных регистра. Это регистр данных и регистр команд. Регистр команд используется для отправки таких команд как очистка дисплея, перемещение курсора и так далее. Регистр данных используется для отправки данных, которые должны быть отображены на LCD дисплее. Ниже приведена таблица описания выводов символьного LCD дисплея 16x2.
Номер вывода | Обозначение | Вход/выход | Назначение вывода |
---|---|---|---|
1 | Vss | – | Земля |
2 | Vdd | – | Питание +5В |
3 | Vee | – | Средний вывод потенциометра (для регулировки контрастности) |
4 | RS | вход | Выбор регистра (RS=0 для регистра команд, RS=1 для регистра данных) |
5 | RW | вход | Чтение/Запись (RW=0 для записи, RW=1 для чтения) |
6 | E | вход/выход | Включение |
7 | D0 | вход/выход | 8-разрядная шина данных (младший значащий бит) |
8 | D1 | вход/выход | 8-разрядная шина данных |
9 | D2 | вход/выход | 8-разрядная шина данных |
10 | D3 | вход/выход | 8-разрядная шина данных |
11 | D4 | вход/выход | 8-разрядная шина данных |
12 | D5 | вход/выход | 8-разрядная шина данных |
13 | D6 | вход/выход | 8-разрядная шина данных |
14 | D7 | вход/выход | 8-разрядная шина данных (старший значащий бит) |
15 | A | – | +4.2–5 В для подсветки |
16 | K | – | земля |
Концепция цветового кода резисторов
Чтобы определить сопротивление резистора, мы можем использовать следующую формулу:
\(R = AB \cdot 10^C \pm T\%\)
где
- A – значение для цвета первой полосы
- B – значение для цвета второй полосы
- C – значение для цвета третьей полосы
- T – значение для цвета четвертой полосы
Таблица ниже показывает цветовой код резисторов.
Цвет | Числовое значение кода | Степень десяти (10C) | Точность (T) |
---|---|---|---|
черный | 0 | 100 | – |
коричневый | 1 | 101 | ± 1% |
красный | 2 | 102 | ± 2% |
оранжевый | 3 | 103 | – |
желтый | 4 | 104 | – |
зеленый | 5 | 105 | – |
синий | 6 | 106 | – |
фиолетовый | 7 | 107 | – |
серый | 8 | 108 | – |
белый | 9 | 109 | – |
золотой | – | 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 кОм, но пользователи могут заменить его резистором с другим номиналом.
Поэтому, если мы получим значение напряжения на неизвестном сопротивлении (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);
}
}