Продолжаем изучать и тестировать замечательную плату Arduino Rich Uno от китайского сумрачного гения, в этот раз речь пойдет о поворотном потенциометре на 10 кОм(далее - просто потенциометр) который имеется на борту данной платы.

         Конечно же, в тесте будет задействован дисплей на базе драйвера TM1637, именно на него будет выводиться текущее положение потенциометра. Также будет задействована библиотека RichUno от производителя платы, в ней содержится заголовочный файл RichUNOKnob.h который содержит базовый функционал для работы с потенциометром. Хотя... Кроме использования библиотечных функций от производителя платы, можно добавить пару тестов так сказать "от себя", данный вид потенциометров не такой уж и сложный в освоении компонент. Итак, как уже упоминалось ранее, во всех тестах задействуем дисплей TM1637, в первом тесте будут использованы библиотечные функции от производителя платы. Для начала, нужно установить DIP переключатели подключения потенциометра в положение ON, тем самым задействовав его подключение к контроллеру Atmega на пин A0, как это выглядит можно увидеть на фото ниже:

 

 

         Также необходимо убедиться что DIP переключатели подключения дисплея тоже установлены в положение ON. И только после этого можно "заливать" скетч в контроллер. Листинг первого тестового скетча приведён ниже:

/*Подключаем необходимые библиотеки*/
#include "RichUNOTM1637.h"
#include "RichUNOKnob.h"

/*Назначаем пин подключения потенциометра*/
#define KNOB_PIN A0

/*Объявляем объект knob класса Knob*/
Knob knob(KNOB_PIN);

/*Назначаем пины подключения дисплея*/
#define CLK 10
#define DIO 11

/*Объявляем объект TM1637_Display класса TM1637*/
TM1637 TM1637_Display(CLK, DIO);

void setup()
{
  /*Инициализация дисплея TM1637*/
  TM1637_Display.init();
}

void loop()
{
  /*Переменная для сохранения угла поворота потенциометра*/
  int angle;
  /*Считываем и сохраняем текущее положение потенциометра*/
  angle = knob.getAngle();
  /*Выводим на дисплей*/
  TM1637_Display.display(angle);
  delay(50);
}

         В результате, при вращении потенциометра, на дисплее можно видеть диапазон значений от 0 до 280. Неожиданно, не правда ли? Возможно что многие ожидали увидеть другие значения, но библиотечная функция getAngle() возвращает именно этот диапазон значений. Связано это с тем, что, само вращение рукоятки потенциометра конструктивно выполнено именно на данный диапазон в градусах поворота. Вот поэтому упомянутая функция getAngle() масштабирует и возвращает значения в пределах данного диапазона.

    Следующий тестовый скетч, демонстрирует вывод значения напряжения с пина, к которому подключен потенциометр. Аналогово-цифровой преобразователь преобразует входное напряжение из диапазона 0..5В в целочисленное значение от 0 до 1023. Разрешающая способность АЦП составляет 5 Вольт / 1024 целочисленного значения, или 0.0049 Вольт на единицу целочисленного значения. Входной диапазон и разрешающая способность могут изменяться при помощи функции analogReference().

 

#include "RichUNOTM1637.h"

#define KNOB_PIN A0

/*Назначаем пины подключения дисплея*/
#define CLK 10
#define DIO 11

/*Объявляем объект TM1637_Display класса TM1637*/
TM1637 TM1637_Display(CLK, DIO);

void setup()
{
  /*Инициализация дисплея TM1637*/
  TM1637_Display.init();
}

void loop()
{
  /*Переменная для сохранения угла поворота потенциометра*/
  int aValue;
  /*Сохраняем значение АЦП в переменную*/
  aValue = analogRead(KNOB_PIN);
  /*Выводим на дисплей*/
  TM1637_Display.display(aValue);
  delay(100);
}

        В результате работы второго тестового скетча, на дисплее можно видеть вывод значений в диапазоне от 0 до 1023. В третьем тестовом скетче применена функция масштабирования значений map(). Масштабировать по сути можно в любые единицы, в тесте реализовано масштабирование в проценты, в диапазоне от 0 до 100 соответственно. Что бы увидеть работу скетча, нужно просто в очередной раз "залить" его в контроллер:

#include "RichUNOTM1637.h"

#define KNOB_PIN A0

/*Назначаем пины подключения дисплея*/
#define CLK 10
#define DIO 11

/*Объявляем объект TM1637_Display класса TM1637*/
TM1637 TM1637_Display(CLK, DIO);

void setup()
{
  /*Инициализация дисплея TM1637*/
  TM1637_Display.init();
}

void loop()
{
  /*Переменная для сохранения угла поворота потенциометра*/
  int aValue;
  /*Масштабирование значения с АЦП в проценты*/
  aValue = map(analogRead(KNOB_PIN), 0, 1022, 0, 100);
  /*Выводим на дисплей*/
  TM1637_Display.display(aValue);
  delay(50);
}

           Синтаксис функции map(), возможно кому то очень пригодится:

map(Value, minValue, maxValue, minScale, maxScale);

где:

  • Value - переменная, значение которой нужно отмасштабировать(в данном случае значение АЦП аналогового входа А0)
  • minValue - минимальное значение которое может принимать переменная Value(0)
  • maxValue - максимальное значение которое может принимать пееременная Value(1023)
  • minScale - минимальное значение масштабирования(0)
  • maxScale - максимальное значение масштабирования(100)

         В конце конечно же вашему вниманию предлагается обзорное видео по работе с данным потенциометром в составе платы Arduino Rich Uno. Всем приятного просмотра !!!