Содержание статьи
Содержание

Главная / Датчики и Arduino / Резистивный датчик давления и Arduino

Резистивный датчик давления и Arduino

Резистивные датчики давления (Force Sensitive Resistors(FSRs)) - это датчики, которые позволяют вам оценить уровень давления, силу нажатия и вес. Они просты в использовании и недорого стоят. Ниже приведено фото датчика силы от Interlink, модель 402. Чувствительный элемент - окружность диаметром 1/2 дюйма.

Резистивный датчик давления Резистивный датчик давления - вид сзади

Датчик состоит из двух слоев, которые разделены специальной прокладкой (spacer). Чем сильнее мы на него давим, тем лучше становится контакт между рисками активных элементов и полупроводником. В результате сопротивление начинает уменьшается.

Резистивный датчик давления - принцип действия

Резистивные датчики давления по по сути являются резисторами, которые меняют значение своего сопротивления (в Ом) в зависимости от силы нажатия на чувствительный элемент. Эти сенсоры недорогие, легки в использовании, но не очень точные. Разброс в точности показаний подобных датчиков давления может составлять до 10%. То есть, подобные датчики не помогут вам точно определить силу (или вес), но однозначно дадут понять, приложено ли усилие на чувствительный элемент.

В любом случае, такие датчики силы отлично подойдут для проектов на Arduino вроде "была ли приложена нагрузка и примерно какая она была".

Основные технические характеристики резистивных датчиков давления

Эти характеристики относятся к модели датчика давления Interlink 402, но практически все остальные датчики (недорогой Китай в том числе) обладают похожими параметрами. Естественно, уточнение характеристик по даташиту вашей модели не помешает.

Как измерять силу/давление с помощью резистивного датчика давления

Как было сказано выше, сопротивление резистивного датчика давления меняется в зависимости от приложенного давления. Когда внешняя нагрузка отсутствует, сенсор представляет из себя резистор с бесконечным сопротивлением (не замкнутая цепь). С увеличением давления, сопротивление уменьшается. На графике ниже приведены приблизительные значения сопротивления датчика в зависимости от приложенной силы (обратите внимание, что сила не измеряется в граммах. Эти значения соответствуют Н*100!).

Резистивный датчик давления - изменение сопротивления в зависимости от силы

Вы заметили, что зависимость нелинейная? То есть, при измерении небольшой силы, значения очень быстро переходят от бесконечности к 100 КОм.

Проверка резистивного датчика давления

Самый простой способ проверить ваш резистивный датчик давления - воспользоваться мультиметром в режиме проверки сопротивления. Щупы мультиметра подключатся к ногам датчика и напрямую снимаются показания сопротивления. Так как сопротивление изменяется в большом диапазоне, рекомендуется использовать масштаб в автоматическом режиме.

Проверка резистивного датчика давления

Подключение резистивного датчика давления

Так как резистивные датчики давления по сути являются резисторами, у них нет полярности. Это значит, что вы вы можете подключать контакты, не выясняя, где минус, а где плюс.

Резистивные датчики давления часто изготавливаются из полимера с токопроводящим покрытием. Один из самых лучших и простых вариантов - установить сенсор на монтажную плату:

Резистивный датчик давления на макетной плате

Можно использовать клипсы ("крокодилы") или разъемы мама-мама:

Резистивный датчик давления и разъемы мама-мама

Еще один вариант - блок терминалов как на рисунке снизу:

Резистивный датчик давления и блок терминалов

Контакты резистивного датчика давления можно паять, но надо быть предельно осторожным! Припаивать надо очень быстро. Промедление в несколько секунд - и вы расплавите пластик. После этого резистивный датчик давления не будет работать! То есть, не рекомендуется припаивать контакты к сенсору, если у вас нет качественных инструментов и опыта пайки.

Использование резистивного датчика давления с Arduino

Считывание аналоговых значений

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

Резистивный датчик давления подключение к Arduino Резистивный датчик давления подключение к Arduino - электросхема

В примере на рисунке выше используется источник питания 5 В с Arduino. Не забывайте, что вы с тем же успехом можете использовать контакт 3.3 В. В нашем примере аналоговые значения напряжения будут находится в диапазоне от 0 В (земля) до 5 В (такое же значение, что и напряжение источника питания).

Работает это следующим образом: когда сопротивление резистивного датчика давления уменьшается, общее сопротивление датчика и понижающего резистора уменьшается от 100 КОм до 10 КОм. Это значит, что ток, проходящий через оба резистора, увеличивается. Соответственно, будет увеличиваться и напряжение на резисторе 10 КОм.

Резистивный датчик давления таблица значений

В таблице выше приведены приблизительные значения аналогового напряжения при работе резистивного датчика давления с питанием от 5 В и понижающим резистором 10 КОм в электрической цепи.

Обратите внимание, что приведенная методика использует линейную зависимость сопротивления, но не обеспечивает линейную характеристику изменения напряжения! Это происходит из-за того, что уравнение для расчета напряжения имеет вид:

Vo=Vcc(R/(R+FSR))

То есть, напряжение пропорционально обратному сопротивлению чувствительного элемента резистивного датчика давления.

Простой пример использования резистивного датчика давления с Arduino

Подключите резистивный датчик давления так же как в примере выше и добавьте в схему светодиод на 11 пине Arduino.

Резистивный датчик давления подключение к Arduino 1 Резистивный датчик давления подключение к Arduino - электросхема 2

В скетче, который приведен ниже, считываются аналоговые значения с резистивного датчика давления и используются для управления яркостью светодиода на 11 пине Arduino. Чем сильнее вы будете давить на сенсор, тем ярче будет гореть светодиод! Обратите внимание, что светодиод необходимо подключать к ШИМ контакту на Arduino. 11 - ШИМ на Arduino Uno.

/* проверка работы датчика силы.

Подключите один контакт датчика силы к 5 В, второй - к аналоговому пина Arduino Analog 0.

Потом подключите один конец резистора 10 КОм между аналоговым пином 0 и землей. Подключите светодиод через резистор к земле.

Для более детальной информации смотрите статью на сайте: www.ladyada.net/learn/sensors/fsr.html */

int fsrAnalogPin = 0; // датчик силы подключен к пину analog 0

int LEDpin = 11; // подключаем красный светодиод к контакту 11 (ШИМ выход)

int fsrReading; // аналоговые значения с датчика силы

int LEDbrightness;

void setup(void) {

Serial.begin(9600); // будем отправлять информацию в серийный монитор в Arduino IDE

pinMode(LEDpin, OUTPUT);

}

void loop(void) {

fsrReading = analogRead(fsrAnalogPin);

Serial.print("Analog reading = ");

Serial.println(fsrReading);

// надо масштабировать диапазон аналоговых значений (0-1023) к диапазону,

// который используется функцией analogWrite (0-255) с помощью команды map!

LEDbrightness = map(fsrReading, 0, 1023, 0, 255);

// светодиод горят ярче, если вы прилагаете большую нагрузку

analogWrite(LEDpin, LEDbrightness);

delay(100);

}

Простой скетч для измерения аналоговых значений с резистивного датчика давления

Ниже приведен скетч для снятия аналоговых значений с резистивного датчика давления с использованием Arduino Uno.

Резистивный датчик давления подключение к Arduino 2 Резистивный датчик давления подключение к Arduino - электросхема 3 Резистивный датчик давления серийный монитор

В программе не проводятся никакие математические операции. Просто выводятся значения, которые можно в дальнейшем интерпретировать как уровень давления на чувствительный элемент резистивного датчика давления. Для многих проектов на Arduino этого вполне достаточно.

/* простой скетч для проверки работоспособности датчика силы

Подключите один контакт датчика силы к источнику питания, второй - к контакту Analog 0 на Arduino.

После этого подключите резистор на 10 КОм от пина Analog 0 к пину GND

Более детальная информация на: http://arduino-diy.com/arduino-rezistivnyy-datchik-davleniya */

int fsrPin = 0; // датчик силы и понижающий резистор на 10 КОм подключены к a0

int fsrReading; // переменная для хранения аналоговых значений с датчика силы

void setup(void) {

// передаем информацию на серийный монитор Arduino IDE

Serial.begin(9600);

}

void loop(void) {

fsrReading = analogRead(fsrPin);

Serial.print("Analog reading = ");

Serial.print(fsrReading); // последовательность аналоговых значений

// выставляем несколько диапазонов с соответствующими сообщениями

if (fsrReading < 10) {

Serial.println(" - No pressure");

} else if (fsrReading < 200) {

Serial.println(" - Light touch");

} else if (fsrReading < 500) {

Serial.println(" - Light squeeze");

} else if (fsrReading < 800) {

Serial.println(" - Medium squeeze");

} else {

Serial.println(" - Big squeeze");

}

delay(1000);

}

Более продвинутый код для работы с резистивным датчиком давления

Скетч для Arduino предполагает, что вы подключили резистивный датчик давления как это рассмотрено выше с понижающим резистором 10 КОм и сигналом с сенсора, который идет к пину Analog 0. В данной программе на выходе вы получите приблизительные значения силы, приведенной к стандартным единицам измерения - Ньютон. Очень полезный скетч для предварительной калибровки резистивного датчика давления - определения, в каких диапазонах нагрузки будет в дальнейшем работать ваш сенсор.

Резистивный датчик давления подключение к Arduino 4 Резистивный датчик давления подключение к Arduino - электросхема 4 Резистивный датчик давления серийный монитор 4

/* резистивный датчик давления - расчет силы в Ньютонах.

Подключите первый контакт резистивного датчика давления к питанию, второй - к пину Analog 0 на Arduino.

После этого через резистор подключается контакт от Analog 0 к земле

Более детальная информация на сайте: http://arduino-diy.com/arduino-rezistivnyy-datchik-davleniya */

int fsrPin = 0; // резистивный датчик давления и понижающий резистор на 10 КОм подключены к контакту a0

int fsrReading; // считываем аналоговые значения с датчика

int fsrVoltage; // конвертируем аналоговые значения в напряжение

unsigned long fsrResistance; // преобразуем напряжение в сопротивление. Значение может быть достаточно большим, так что используем тип данных "long"

unsigned long fsrConductance;

long fsrForce; // последний этап - конвертируем сопротивление в силу

void setup(void) {

Serial.begin(9600); // мы будем передавать данные в окно серийного монитора Arduino IDE

}

void loop(void) {

fsrReading = analogRead(fsrPin);

Serial.print("Analog reading = ");

Serial.println(fsrReading);

// аналоговые значения напряжения будут в диапазоне от 0 до 1023. Масштабируем полученные данные к диапазону от 0 В до 5000 В (= 5000 мВ) с помощью функции map

fsrVoltage = map(fsrReading, 0, 1023, 0, 5000);

Serial.print("Voltage reading in mV = ");

Serial.println(fsrVoltage);

if (fsrVoltage == 0) {

Serial.println("No pressure");

} else {

// напряжение = Vcc * R / (R + FSR), где R = 10 КОм, а Vcc = 5 В

// то есть FSR = ((Vcc - V) * R) / V

fsrResistance = 5000 - fsrVoltage; // напряжение на резистивном датчике давления в милливольт: В = 5000 мВ

fsrResistance *= 10000; // резистор на 10 КОм

fsrResistance /= fsrVoltage;

Serial.print("FSR resistance in ohms = ");

Serial.println(fsrResistance);

fsrConductance = 1000000; // мы измеряем в микроом, так что:

fsrConductance /= fsrResistance;

Serial.print("Conductance in microMhos: ");

Serial.println(fsrConductance);

// используем две зависимости для резистивных датчиков давления, чтобы аппроксимировать полученные значения

if (fsrConductance <= 1000) {

fsrForce = fsrConductance / 80;

Serial.print("Force in Newtons: ");

Serial.println(fsrForce);

} else {

fsrForce = fsrConductance - 1000;

fsrForce /= 30;

Serial.print("Force in Newtons: ");

Serial.println(fsrForce);

}

}

Serial.println("--------------------");

delay(1000);

}

Считывем значения с резистивного датчика давления без аналоговых пинов

Так как резистивные датчики давления по сути являются резисторами, их можно использовать без аналоговых пинов Arduino. Для этого воспользуемся базовыми электрическими свойствами резисторов и конденсаторов: если вы возьмете конденсатор, на котором нет напряжения и подключите его к источнику питания через резистор, напряжение постепенно начнет расти. Чем больше резистор, тем медленнее будет расти напряжение.

На рисунке ниже показан скриншот с осцилограммы. Желтой линией показан характер изменения напряжения на цифровом пине. Голубая линия отражает, когда скетч начал работу и завершил работу (по времени это около 1.2 мс)

Осцилограмма с цифрового пина Arduino

Если попытаться привести аналогию, то конденсатор служит емкостью, а резистор - это тонкая трубка. Для того, чтобы заполнить емкость с помощью тонкой трубки, требуется некоторое время. На основании этого времени вы можете вычислить ширину трубки.

В нашем случае емкость - это керамический конденсатор емкостью 0.1 мкФ. Вы можете поставить конденсатор с другим номиналом, время тогда тоже изменится.

/* резистивный датчик давления и Arduino - проверочный скетч.

Один контакт с резистивный датчика давления подключается к питанию, второй - к пину 2 на Arduino.

После этого подключите конденсатор с емкостью 0.1 мкФ между контактом GND и пином 2.

Более детальная информация на сайте: http://arduino-diy.com/arduino-rezistivnyy-datchik-davleniya */

int fsrPin = 2; // резистивный датчик давления и конденсатор подключены к пину 2

int fsrReading; // считываем цифровые значения

int ledPin = 13; // вы можете использовать встроенный на Arduino светодиод

void setup(void) {

// отправляем полученные данные в окно серийного монитора

Serial.begin(9600);

pinMode(ledPin, OUTPUT); // в качестве выхода используется светодиод

}

void loop(void) {

// считываем значения с резистора с использованием функции RCtime

fsrReading = RCtime(fsrPin);

if (fsrReading == 30000) {

// если полученное значение дошло до 30000, выводим сообщение о том, что ничего не подключено

Serial.println("Nothing connected!");

} else {

Serial.print("RCtime reading = ");

Serial.println(fsrReading); // столбец аналоговых значений

// дополнительная обработка для того, чтобы светодиод продолжал мигать

fsrReading /= 10;

// чем большее усилие вы прилагаете к чувствительному элементу резистивного датчика давления, тем чаще мигает светодиод!

digitalWrite(ledPin, HIGH);

delay(fsrReading);

digitalWrite(ledPin, LOW);

delay(fsrReading);

}

delay(100);

}

// используется цифровой пин для измерения сопротивления

// реализуется с помощью передачи силы тока на конденсатор и

// подсчета времени, которое понадобится для достижения напряжения Vcc/2 (для большинства плат Arduino это напряжение равно 2.5 В)

int RCtime(int RCpin) {

int reading = 0; // начинаем с 0

// устанавливаем режим работы пина на выход и присваиваем значение LOW (земля)

pinMode(RCpin, OUTPUT);

digitalWrite(RCpin, LOW);

// теперь устанавливаем режим работы пина на вход и...

pinMode(RCpin, INPUT);

while (digitalRead(RCpin) == LOW) { // считаем сколько времени надо, чтобы мы достигли значения HIGH

reading++; // инкремент для отслеживания времени

if (reading == 30000) {

// если значение настолько большое, сопротивление тоже очень большое.

// скорее всего, у нас просто ничего не подключено!

break; // выходим за пределы цикла

}

}

// если мы достигли значения 30000 и сняли показания, возвращаем значения

return reading;

}

Можно рассчитать текущее фактическое значение сопротивления, но, к сожалению, эти значения зависят от версий Arduino IDE или платы Arduino. То есть, будет разница во времени считывания данных с пина, если вы используете Arduino 3.3 В вместо Arduino 5 В или, например, модели с различной частотой 16 МГц или 8 МГц (как, например, в LilyPad Arduino).

Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!