Подключение датчика изгиба к Arduino
Датчик изгиба, также известный как датчик сгиба — это недорогой и простой в использовании датчик для измерения степени отклонения или изгиба.
Он приобрёл популярность в 1990-х годах благодаря включению в Nintendo Power Glove. С тех пор его используют как гониометр для измерения движения суставов, датчик двери, бамперный переключатель для обнаружения стен и датчик давления на захватах роботов.
Обзор датчика изгиба
Датчик изгиба — это, по сути, переменный резистор, сопротивление которого меняется при изгибе. Поскольку сопротивление прямо пропорционально степени изгиба, его часто называют гибким потенциометром.
Датчики изгиба обычно доступны в двух размерах: 2,2 дюйма (5,588 см) и 4,5 дюйма (11,43 см) в длину.
Конструкция
Датчик изгиба на основе проводящих чернил изготавливается из подложки из фенольной смолы, на которую наносятся проводящие чернила. Затем сверху размещается сегментированный проводник для создания гибкого потенциометра.
Правила использования
Датчик изгиба предназначен для сгибания только в одном направлении — от чернил, как показано на изображении ниже. Если вы согнёте датчик в противоположном направлении, вы не получите точных данных и можете даже повредить его.
Также избегайте сгибания датчика слишком близко к основанию (где зажаты выводы), так как это может вызвать перегиб и выход из строя.
Как работают датчики изгиба?
Проводящие чернила на датчике служат резистором. Когда датчик прямой, сопротивление составляет около 25 кОм.
При сгибании датчика проводящий слой растягивается, что приводит к уменьшению поперечного сечения (представьте растягивание резинки) и увеличению сопротивления. При угле 90° это сопротивление составляет приблизительно 100 кОм.
Когда датчик выпрямляется, сопротивление возвращается к исходному значению. Измеряя сопротивление, вы можете определить, насколько датчик изогнут.
Считывание данных с датчика изгиба
Самый простой способ считать данные с датчика изгиба — объединить его со статическим резистором для создания делителя напряжения, который выдаёт переменное напряжение, которое может быть считано аналого-цифровым преобразователем микроконтроллера.
Важно отметить, что выходное напряжение, которое вы измеряете — это падение напряжения на стягивающем резисторе, а не на датчике изгиба.
Мы можем использовать эту формулу для расчёта выходного напряжения (Vo).
В этой конфигурации выходное напряжение уменьшается с увеличением радиуса изгиба.
Например, при питании 5 В и стягивающем резисторе 47 кОм, когда датчик плоский (0°), сопротивление относительно низкое (около 25 кОм). Это даёт следующее выходное напряжение:
При полном изгибе (90°) сопротивление увеличивается приблизительно до 100 кОм. В результате выходное напряжение становится:
Схема подключения датчика изгиба к Arduino
Подключение датчика изгиба к Arduino очень простое.
Вам нужно подключить стягивающий резистор 47 кОм последовательно с датчиком изгиба для создания схемы делителя напряжения. Аналоговый вход A0 Arduino подключается к точке соединения стягивающего резистора и датчика изгиба.
Имейте в виду, что датчики изгиба — это по сути просто резисторы, поэтому их можно подключать в любом направлении, и они всё равно будут работать.
Пример кода Arduino
Вот простой скетч, который считывает данные датчика с аналогового вывода Arduino и отображает их в мониторе последовательного порта. Для большинства проектов это, в принципе, всё, что нужно.
const int flexPin = A0; // Pin connected to voltage divider output
// Change these constants according to your project's design
const float VCC = 5; // voltage at Ardunio 5V line
const float R_DIV = 47000.0; // resistor used to create a voltage divider
const float flatResistance = 25000.0; // resistance when flat
const float bendResistance = 100000.0; // resistance at 90 deg
void setup() {
Serial.begin(9600);
pinMode(flexPin, INPUT);
}
void loop() {
// Read the ADC, and calculate voltage and resistance from it
int ADCflex = analogRead(flexPin);
float Vflex = ADCflex * VCC / 1023.0;
float Rflex = R_DIV * (VCC / Vflex - 1.0);
Serial.println("Resistance: " + String(Rflex) + " ohms");
// Use the calculated resistance to estimate the sensor's bend angle:
float angle = map(Rflex, flatResistance, bendResistance, 0, 90.0);
Serial.println("Bend: " + String(angle) + " degrees");
Serial.println();
delay(500);
}
Если всё в порядке, вы должны увидеть следующий вывод в мониторе последовательного порта.
Объяснение кода:
Скетч начинается с объявления вывода Arduino, к которому подключён датчик изгиба.
const int flexPin = A0;
Затем определяются несколько констант, включая напряжение системы (VCC), резистор для создания делителя напряжения (R_DIV) и сопротивление датчика изгиба в плоском и изогнутом состояниях (flatResistance и bendResistance соответственно). Убедитесь, что эти константы установлены правильно.
const float VCC = 5;
const float R_DIV = 47000.0;
const float flatResistance = 25000.0;
const float bendResistance = 100000.0;
В разделе setup мы устанавливаем последовательную связь и настраиваем вывод flexPin как INPUT.
void setup() {
Serial.begin(9600);
pinMode(flexPin, INPUT);
}
В цикле мы начинаем с считывания АЦП.
int ADCflex = analogRead(flexPin);
Когда Arduino преобразует аналоговое выходное напряжение датчика в цифровое значение, он преобразует его в 10-битное число от 0 до 1023. Поэтому для вычисления фактического выходного напряжения мы используем следующую формулу:
float Vflex = ADCflex * VCC / 1023.0;
Затем вычисляется сопротивление датчика изгиба по формуле, полученной из формулы делителя напряжения, и отображается в мониторе последовательного порта.
float Rflex = R_DIV * (VCC / Vflex - 1.0);
Serial.println("Resistance: " + String(Rflex) + " ohms");
Затем мы используем вычисленное сопротивление для оценки угла изгиба датчика. Для этого мы используем встроенную функцию map() среды разработки.
Функция map() отображает и преобразует сопротивление датчика в его угол изгиба. Когда мы вызываем map(Rflex, flatResistance, bendResistance, 0, 90.0), значение flatResistance отображается в 0°, значение bendResistance — в 90°, а промежуточные значения — в промежуточные углы.
float angle = map(Rflex, flatResistance, bendResistance, 0, 90.0);
Serial.println("Bend: " + String(angle) + " degrees");
Serial.println();