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


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

Резистивные датчики давления по по сути являются резисторами, которые меняют значение своего сопротивления (в Ом) в зависимости от силы нажатия на чувствительный элемент. Эти сенсоры недорогие, легки в использовании, но не очень точные. Разброс в точности показаний подобных датчиков давления может составлять до 10%. То есть, подобные датчики не помогут вам точно определить силу (или вес), но однозначно дадут понять, приложено ли усилие на чувствительный элемент.
В любом случае, такие датчики силы отлично подойдут для проектов на Arduino вроде "была ли приложена нагрузка и примерно какая она была".
Основные технические характеристики резистивных датчиков давления
Эти характеристики относятся к модели датчика давления Interlink 402, но практически все остальные датчики (недорогой Китай в том числе) обладают похожими параметрами. Естественно, уточнение характеристик по даташиту вашей модели не помешает.
- Размер: 1/2" (12.5 мм) чувствительной поверхности. Толщина - 0.02" (Interlink выпускает некоторые модели, размер которых составляет 1.5"x1.5")
- Цена: около 7 долларов от западных производителей. 2-3 доллара в Китае.
- Диапазон сопротивлений: бесконечность/разомкнутая цепь (нет внешнего давления), от 100 КОм (легкое давление) до 200 Ом (максимальное давление)
- Диапазон силы: от 0 до 20 lb. (0 - 100 Ньютонов) на каждый 0.125 квадратный дюйм поверхности
- Источник питания: любой! Использует силу тока менее 1 мА (зависит от резисторов и напряжения питания)
Как измерять силу/давление с помощью резистивного датчика давления
Как было сказано выше, сопротивление резистивного датчика давления меняется в зависимости от приложенного давления. Когда внешняя нагрузка отсутствует, сенсор представляет из себя резистор с бесконечным сопротивлением (не замкнутая цепь). С увеличением давления, сопротивление уменьшается. На графике ниже приведены приблизительные значения сопротивления датчика в зависимости от приложенной силы (обратите внимание, что сила не измеряется в граммах. Эти значения соответствуют Н*100!).

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

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

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

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

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


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

В таблице выше приведены приблизительные значения аналогового напряжения при работе резистивного датчика давления с питанием от 5 В и понижающим резистором 10 КОм в электрической цепи.
Обратите внимание, что приведенная методика использует линейную зависимость сопротивления, но не обеспечивает линейную характеристику изменения напряжения! Это происходит из-за того, что уравнение для расчета напряжения имеет вид:
Vo=Vcc(R/(R+FSR))
То есть, напряжение пропорционально обратному сопротивлению чувствительного элемента резистивного датчика давления.
Простой пример использования резистивного датчика давления с Arduino
Подключите резистивный датчик давления так же как в примере выше и добавьте в схему светодиод на 11 пине Arduino.


В скетче, который приведен ниже, считываются аналоговые значения с резистивного датчика давления и используются для управления яркостью светодиода на 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 этого вполне достаточно.
/* простой скетч для проверки работоспособности датчика силы
Подключите один контакт датчика силы к источнику питания, второй - к контакту Analog 0 на Arduino.
После этого подключите резистор на 10 КОм от пина Analog 0 к пину GND
Более детальная информация на: /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. В данной программе на выходе вы получите приблизительные значения силы, приведенной к стандартным единицам измерения - Ньютон. Очень полезный скетч для предварительной калибровки резистивного датчика давления - определения, в каких диапазонах нагрузки будет в дальнейшем работать ваш сенсор.



/* резистивный датчик давления - расчет силы в Ньютонах.
Подключите первый контакт резистивного датчика давления к питанию, второй - к пину Analog 0 на Arduino.
После этого через резистор подключается контакт от Analog 0 к земле
Более детальная информация на сайте: /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 мс)

Если попытаться привести аналогию, то конденсатор служит емкостью, а резистор - это тонкая трубка. Для того, чтобы заполнить емкость с помощью тонкой трубки, требуется некоторое время. На основании этого времени вы можете вычислить ширину трубки.
В нашем случае емкость - это керамический конденсатор емкостью 0.1 мкФ. Вы можете поставить конденсатор с другим номиналом, время тогда тоже изменится.
/* резистивный датчик давления и Arduino - проверочный скетч.
Один контакт с резистивный датчика давления подключается к питанию, второй - к пину 2 на Arduino.
После этого подключите конденсатор с емкостью 0.1 мкФ между контактом GND и пином 2.
Более детальная информация на сайте: /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).
Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!