Потенциометром называют переменный (подстроечный) резистор включенный как
делитель напряжения:
Сопротивление переменного резистора между выводами 1 и 2 - постоянно, так как
длина резистивного вещества между выводами 1 и 2 постоянна, примем
его равным R. А вот сопротивление между выводами 1 и 3, а также между 2 и 3
зависит от угла поворота ручки, так как длина резистивного вещества между
движком, который подключен к выводу 3 и выводами 1 и 2 зависит от угла
поворота ручки. Причем, при повороте из крайнего левого положения
по часовой стрелке в крайнее правое, сопротивление между выводом 1 и выводом
3 увеличивается, а между выводом 3 и выводом два уменьшается. При вращении
ручки против часовой стрелки наоборот, сопротивление между выводом 1 и 3
уменьшается, а между выводом 3 и 2 увеличивается.
Если подключить резистор к источнику напряжения так, как показано на схеме,
то напряжение между выводом 2 и выводом 3 будет зависеть от угла поворота
ручки. Рассмотрим эквивалентную схему. Общее сопротивление двух резисторов
равно R и оно постоянно, а сопротивление нижнего по схеме резистора r
меняется от 0 до R, соответственно сопротивление верхнего по схеме резистора
меняется от R до 0. Так как величина Up/R постоянная, то напряжение Ur
прямопропорционально сопротивлению r, которое в свою очередь пропорционально
углу поворота ручки переменного резистора. Таким образом, подключенный
таким образом переменный резистор представляет собой не просто делитель
напряжения, а делитель, коэффициент деления которого можно плавно изменять,
получая напряжение от 0 до Up.
Проверим это утверждение на практике. Для этого соберем следующую схему:
Используем программу вольтметра с предыдущего урока:
void setup() {
Serial.begin (9600);
pinMode(14, INPUT);
}
void loop() {
float x; // вводим переменную x, типа float (переменная с плавающей точкой)
x = float (analogRead(14))/(1023/5); // делим считанное значение на (1023/5), и преобразуем в тип float
Serial.print(x); // выводим измеренное напряжение в монитор порта
Serial.println("V"); // выводим букву V, чтобы было понятно, что это напряжение
delay(1000); // просто подождем секундочку :)
}
Запустив программу, в мониторе порта можно наблюдать измеренное напряжение и
убедиться, что напряжение зависит от угла повороту ручки переменного резистора.
void setup() {
pinMode(9, OUTPUT); // пин 9 программируем как выход
pinMode(14, INPUT); // пин А0 программируем как вход
}
void loop() {
int x = analogRead(14)/4; // Так как считываемое функцией analogRead значение может иметь
// значение от 0 до 1023, а для формирования сигнала ШИМ
// необходимо значение от 0 до 255, поэтому считанное
// значение нужно разделить на 4.
analogWrite(9, x); // выводим новое значение x на вывод 9.
}
void setup() {
pinMode(9, OUTPUT);
pinMode(14, INPUT);
}
void loop() {
int x = analogRead(14);
x = map(x, 0, 1023, 0, 255); // переносим значение x пропорционально из диапазона
// от 0 до 1023 в новый диапазон от 0 до 255
analogWrite(9,x);
}
Чем же удобнее применение функции map()? Ну например тем, что можно "перевернуть"
диапазон. В примере выше, при повороте ручки резистора по часовой стрелке
яркость светодиода будет уменьшаться, но если функцию map() переписать так:
void setup() {
pinMode(9, OUTPUT);
pinMode(14, INPUT);
}
void loop() {
int x = analogRead(14);
x = map(x, 0, 1023, 255, 0); // переносим значение x пропорционально из диапазона
// от 0 до 1023 в новый диапазон от 255 до 0
analogWrite(9,x);
}
То при повороте ручки резистора по часовой стрелке - яркость светодиода будет
увеличиваться.