Потенциометром называют переменный (подстроечный) резистор включенный как
делитель напряжения:
Сопротивление переменного резистора между выводами 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); }То при повороте ручки резистора по часовой стрелке - яркость светодиода будет увеличиваться.