Привет. Сегодня начнем разбираться с датчиками для ардуино. Всевозможных датчиков для ардуино существует очень много. А самый простой пример, который мы разберем — это подключение потенциометра к ардуино.
Потенциометр — это резистор с переменным сопротивлением. Обычно сопротивление регулируется в ручном режиме. Но существуют и программируемые цифровые потенциометры.
Содержание
В предыдущем уроке мы рассматривали возможность вывода информации в последовательный порт. Сейчас мы будем использовать эти возможности ардуино. Так что, если вы уже забыли, или пропустили тот пост, пожалуйста, посмотрите его.
Итак, план на сегодня такой. Подключим к ардуино несколько разных потенциометров. Измерим сопротивление на каждом из них. Выведем полученные данные в последовательный порт. И настроим яркость светодиода с помощью ШИМ и данных с потенциометра.
Для того, чтобы выполнить этот урок нам понадобиться.
- Ардуино UNO
- Макетная плата
- Перемычки
- Потенциометры разного сопротивления
- Светодиод 5 мм
- Резистор номиналом 220 Ом
- Кабель USB
Потенциометры действуют как регулируемые делители напряжения. Они могут быть разных размеров и форм, но всегда имеют три вывода.
Подключаем один крайний вывод потенциометра к земле, а другой к шине 5 В. Потенциометры симметричны, так что не имеет значения, с какой стороны вы подключите шину питания, а с какой землю. Средний вывод соединяем с одним из аналоговых контактов на плате ардуино.
При повороте ручки потенциометра аналоговый входной сигнал будет плавно меняться от 0 до 5 В.
analogRead()
Для того, чтобы считать сигнал от датчика в программу, нам понадобится функция analogRead(). Она принимает номер порта в качестве аргумента. А пины, которые можно использовать для аналогового входа помечены на плате ардуино как ANALOG IN.
Напряжение поданное на аналоговый вход, обычно от 0 до 5 вольт будет преобразовано в значение от 0 до 1023, это 1024 шага с разрешением 0.0049 Вольт. Разброс напряжение и шаг может быть изменен функцией analogReference().
Считывание значение с аналогового входа занимает около 100 микросекунд (0.0001 сек), Значит, максимальная частота считывания приблизительно 10,000 раз в секунду.
Программа
Тестовая программа уже есть в стандартной библиотеке, так что, сегодня не будем писать собственную. Только немного изменим стандартную.
Откроем программу AnalogInOutSerial из меню File — Examples — Analog. Добавим константу и переменную для подключения потенциометра и получаемого значения от него.
const int analogInPin1 = A0;
const int analogInPin2 = A1;
const int analogOutPin = 9;
int sensorValue1 = 0;
int sensorValue2 = 0;
int outputValue = 0;
В функции setup() откроем последовательный порт. А в функции loop() добавим считывание сигнала со второго подключенного потенциометра.
void loop() {
// read the analog in value:
sensorValue1 = analogRead(analogInPin1);
sensorValue2 = analogRead(analogInPin2);
Map()
Когда мы используем данные от аналоговых датчиков и выводим напряжение на пин в зависимости от этих датчиков, необходимо позаботиться о преобразовании чисел из одного диапазона в другой.
Данные с потенциометра будут приходить от 0 до 1023, а на светодиод мы может подать напряжение от 0 до 255. Такое преобразование просто сделать с помощью функции map().
Она пропорционально переносит значение из текущего диапазона значений в новый диапазон. Например,
outputValue = map( (sensorValue1+sensorValue2)/2 , 0, 1023, 0, 255);
В данном случае, среднее значение с двух подключенных потенциометров мы получаем в диапазоне от 0 до 1023. Но преобразуем в новый диапазон от 0 до 255. Который уже можно вывести на светодиод через ШИМ.
Сonstrain()
Так же можно использовать функцию constrain(). Она принимает три параметра и выводит значения границ диапазона, если проверяемое значение выходит за границы этого диапазона. Например,
sensVal = constrain(0, 5, 150); // 5
sensVal = constrain(200, 5, 150); // 150
sensVal = constrain(95, 5, 150); // 95
// ограничиваем значения sensVal диапазоном от 5 до 150
Полный текст программы
// These constants won't change. They're used to give names to the pins used:
const int analogInPin1 = A0; // Analog input pin that the potentiometer is attached to
const int analogInPin2 = A1;
const int analogOutPin = 9; // Analog output pin that the LED is attached to
int sensorValue1 = 0; // value read from the pot
int sensorValue2 = 0;
int outputValue = 0; // value output to the PWM (analog out)
void setup() {
// initialize serial communications at 9600 bps:
Serial.begin(9600);
}
void loop() {
// read the analog in value:
sensorValue1 = analogRead(analogInPin1);
sensorValue2 = analogRead(analogInPin2);
// map it to the range of the analog out:
outputValue = map( (sensorValue1+sensorValue2)/2 , 0, 1023, 0, 255);
// change the analog out value:
analogWrite(analogOutPin, outputValue);
// print the results to the Serial Monitor:
Serial.print("sensor1 = ");
Serial.print(sensorValue1);
Serial.print("\t sensor2 = ");
Serial.print(sensorValue2);
Serial.print("\t output = ");
Serial.println(outputValue);
// wait 2 milliseconds before the next loop for the analog-to-digital
// converter to settle after the last reading:
delay(2);
}
В результате выполнения программы мы получим управление яркостью светодиода от двух потенциометров. А в мониторе последовательного порта данные от обоих подключенных датчиков и новое значение передаваемое на светодиод.
Заключение
Сегодня мы рассмотрели подключение потенциометра к ардуино. Использовали еще одну стандартную программу из библиотеки ide. И разобрали две новые функции map() и constrain(), которые помогут нам в работе со всеми датчиками и ардуино. В следующий раз рассмотрим датчик измерения расстояния.